diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 90c857b5..45dd6d2f 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -43,6 +43,7 @@ "已忽略更新记录及客户端模式连接地址记录支持清空操作", "版本更新信息支持多语言显示 (与当前显示语言同步)", "使用异步加载方式一定程度提升文件管理器列表滑动流畅性", + "APK 文件签名信息提升检测效率", "APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑", "Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_" ], diff --git a/.readme/README-ar.md b/.readme/README-ar.md index d9f88750..65eee20d 100644 --- a/.readme/README-ar.md +++ b/.readme/README-ar.md @@ -389,7 +389,7 @@ SDK Tools (أدوات SDK) (في النافذة اليمنى) يعتمد مشروع AutoJs6 على إصدار `JDK (مجموعة تطوير جافا)` بإصدار لا يقل عن `17`، ولكن يفضل الإصدار الذي لا يقل عن `19`. -اعتبارًا من 21 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`. +اعتبارًا من 22 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`. > ملاحظة: إذا كان نظام الكمبيوتر يحتوي على JDK والإصدار يفي بالمتطلبات المذكورة أعلاه، فيمكنك تخطي هذا القسم. diff --git a/.readme/README-en.md b/.readme/README-en.md index 47c41e31..85dcd5da 100644 --- a/.readme/README-en.md +++ b/.readme/README-en.md @@ -389,7 +389,7 @@ Check `Show Package Details`, click NDK and CMake respectively to ensure the cor The `JDK (Java Development Kit)` version required for the AutoJs6 project should be at least `17`, but `19` or higher is recommended. -As of May 21, 2025, AutoJs6 supports up to version `24` of the JDK. +As of May 22, 2025, AutoJs6 supports up to version `24` of the JDK. > Note: If the JDK is already installed on the computer system and the version meets the above requirements, this section can be skipped. diff --git a/.readme/README-es.md b/.readme/README-es.md index 67bf23e4..aa922142 100644 --- a/.readme/README-es.md +++ b/.readme/README-es.md @@ -389,7 +389,7 @@ Marca `Show Package Details (Mostrar detalles del paquete)`, haz clic en NDK y C La versión mínima requerida del `JDK (Kit de Desarrollo de Java)` para el proyecto AutoJs6 es `17`, pero se recomienda usar una versión no inferior a `19`. -Hasta el 21 de May de 2025, AutoJs6 soporta hasta la versión `24` de JDK. +Hasta el 22 de May de 2025, AutoJs6 soporta hasta la versión `24` de JDK. > Nota: Si el sistema ya tiene instalado JDK y cumple con los requisitos anteriores, puedes omitir esta sección. diff --git a/.readme/README-fr.md b/.readme/README-fr.md index ace200e3..e7c0a433 100644 --- a/.readme/README-fr.md +++ b/.readme/README-fr.md @@ -389,7 +389,7 @@ Cochez `Show Package Details (afficher les détails du package)`, puis cliquez r La version de JDK (Kit de développement Java) requise pour le projet AutoJs6 doit être au moins `17`, mais il est recommandé d'avoir au moins `19`. -À partir du 21 May 2025, AutoJs6 prend en charge la version maximale de JDK `24`. +À partir du 22 May 2025, AutoJs6 prend en charge la version maximale de JDK `24`. > Note : Si le JDK est déjà installé sur le système informatique et que la version répond aux exigences ci-dessus, vous pouvez ignorer cette section. diff --git a/.readme/README-ja.md b/.readme/README-ja.md index 242998df..4275ce70 100644 --- a/.readme/README-ja.md +++ b/.readme/README-ja.md @@ -389,7 +389,7 @@ SDK Tools (SDK ツール) (右側のウィンドウにあります) AutoJs6プロジェクトが依存する `JDK (Java開発キット)` のリリースバージョンは少なくとも `17` で, それ以下のバージョンは推奨されませんが, 最低でも `19` の使用を推奨します. -2025 年 5 月 21 日 現在, AutoJs6がサポートする最大のJDKバージョンは `24` です. +2025 年 5 月 22 日 現在, AutoJs6がサポートする最大のJDKバージョンは `24` です. > 注: コンピュータシステムに適切なバージョンのJDKがインストールされている場合, この節の内容をスキップできます. diff --git a/.readme/README-ko.md b/.readme/README-ko.md index ec408c7f..ee145075 100644 --- a/.readme/README-ko.md +++ b/.readme/README-ko.md @@ -389,7 +389,7 @@ SDK Tools (SDK 도구) (오른쪽 창에 위치) AutoJs6 프로젝트는 `JDK (Java 개발 도구 키트)` 버전이 `17` 이상이어야 하지만, `19` 이상을 권장합니다. -2025 년 5 월 21 일 기준으로, AutoJs6이 지원하는 최대 JDK 버전은 `24` 입니다. +2025 년 5 월 22 일 기준으로, AutoJs6이 지원하는 최대 JDK 버전은 `24` 입니다. > 메모: 시스템에 JDK가 설치되어 있고, 버전이 위의 요구 사항을 충족하는 경우, 이 섹션을 건너뛸 수 있습니다. diff --git a/.readme/README-ru.md b/.readme/README-ru.md index 9251af01..c4ffcbde 100644 --- a/.readme/README-ru.md +++ b/.readme/README-ru.md @@ -389,7 +389,7 @@ SDK Tools (SDK Инструменты) (находится в правом ок Для проекта AutoJs6 требуется версия `JDK (Java Development Kit)` не ниже `17`, но рекомендуется не ниже `19`. -По состоянию на 21 May 2025 года AutoJs6 поддерживает JDK максимальной версии `24`. +По состоянию на 22 May 2025 года AutoJs6 поддерживает JDK максимальной версии `24`. > Примечание: Если на компьютере уже установлен JDK и версия соответствует указанным требованиям, этот раздел можно пропустить. diff --git a/.readme/README-zh-Hans.md b/.readme/README-zh-Hans.md index 135c612e..5e024f10 100644 --- a/.readme/README-zh-Hans.md +++ b/.readme/README-zh-Hans.md @@ -195,6 +195,8 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 +* `优化` APK 文件签名信息提升检测效率 +* `优化` APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑 * `优化` Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_ * `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_ @@ -342,7 +344,7 @@ SDK Tools (SDK 工具) (位于右侧窗口) AutoJs6 项目依赖的 `JDK (Java 开发工具包)` 发行版本不低于 `17`, 但建议不低于 `19`. -截至 2025 年 5 月 21 日, AutoJs6 可支持 JDK 最高版本为 `24`. +截至 2025 年 5 月 22 日, AutoJs6 可支持 JDK 最高版本为 `24`. > 注: 如果计算机系统已安装 JDK 且版本满足上述要求, 则可跳过此小节内容. diff --git a/.readme/README-zh-Hant-HK.md b/.readme/README-zh-Hant-HK.md index 8bf2d321..23838e0b 100644 --- a/.readme/README-zh-Hant-HK.md +++ b/.readme/README-zh-Hant-HK.md @@ -389,7 +389,7 @@ SDK Tools (SDK 工具) (位於右側窗口) AutoJs6 項目依賴的 `JDK (Java 開發工具包)` 發行版本不低於 `17`, 但建議不低於 `19`. -截至 2025 年 5 月 21 日, AutoJs6 可支持 JDK 最高版本為 `24`. +截至 2025 年 5 月 22 日, AutoJs6 可支持 JDK 最高版本為 `24`. > 注: 如果計算機系統已安裝 JDK 且版本滿足上述要求, 則可跳過此小節內容. diff --git a/.readme/README-zh-Hant-TW.md b/.readme/README-zh-Hant-TW.md index 6901db70..807f61f4 100644 --- a/.readme/README-zh-Hant-TW.md +++ b/.readme/README-zh-Hant-TW.md @@ -389,7 +389,7 @@ SDK Tools (SDK 工具) (位於右側視窗) AutoJs6 專案依賴的 `JDK (Java 開發工具包)` 發行版本不低於 `17`, 但建議不低於 `19`. -截至 2025 年 5 月 21 日, AutoJs6 可支援 JDK 最高版本為 `24`. +截至 2025 年 5 月 22 日, AutoJs6 可支援 JDK 最高版本為 `24`. > 注: 如果計算機系統已安裝 JDK 且版本滿足上述要求, 則可跳過此小節內容. diff --git a/README.md b/README.md index 135c612e..5e024f10 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,8 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 +* `优化` APK 文件签名信息提升检测效率 +* `优化` APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑 * `优化` Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_ * `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_ @@ -342,7 +344,7 @@ SDK Tools (SDK 工具) (位于右侧窗口) AutoJs6 项目依赖的 `JDK (Java 开发工具包)` 发行版本不低于 `17`, 但建议不低于 `19`. -截至 2025 年 5 月 21 日, AutoJs6 可支持 JDK 最高版本为 `24`. +截至 2025 年 5 月 22 日, AutoJs6 可支持 JDK 最高版本为 `24`. > 注: 如果计算机系统已安装 JDK 且版本满足上述要求, 则可跳过此小节内容. diff --git a/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md b/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md index c79c2477..4847d64f 100644 --- a/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md +++ b/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md @@ -44,6 +44,8 @@ * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 +* `优化` APK 文件签名信息提升检测效率 +* `优化` APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑 * `优化` Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_ * `依赖` 本地化 Material Dialogs 版本 0.9.6.0 * `依赖` 本地化 Material Date Time Picker 版本 4.2.3 diff --git a/app/src/main/assets-app/doc/CHANGELOG.md b/app/src/main/assets-app/doc/CHANGELOG.md index c79c2477..4847d64f 100644 --- a/app/src/main/assets-app/doc/CHANGELOG.md +++ b/app/src/main/assets-app/doc/CHANGELOG.md @@ -44,6 +44,8 @@ * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 +* `优化` APK 文件签名信息提升检测效率 +* `优化` APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑 * `优化` Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_ * `依赖` 本地化 Material Dialogs 版本 0.9.6.0 * `依赖` 本地化 Material Date Time Picker 版本 4.2.3 diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt index 3448d257..8b540788 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt @@ -13,7 +13,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog -import com.android.apksig.ApkVerifier import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -34,8 +33,6 @@ import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder import org.autojs.autojs6.R import org.autojs.autojs6.databinding.ApkFileInfoDialogListItemBinding import java.io.File -import java.util.jar.JarEntry -import java.util.jar.JarFile object ApkInfoDialogManager { @@ -229,37 +226,17 @@ object ApkInfoDialogManager { } private fun getApkSignatureInfo(apkFile: File): String? = runCatching { - ApkVerifier.Builder(apkFile).build().verify().run { - listOfNotNull( - "V1".takeIf { isVerifiedUsingV1Scheme || hasV1Signature(apkFile) }, - "V2".takeIf { isVerifiedUsingV2Scheme }, - "V3".takeIf { isVerifiedUsingV3Scheme }, - "V4".takeIf { isVerifiedUsingV4Scheme }, - ).takeUnless { it.isEmpty() }?.joinToString(" + ") - } + // ApkVerifier.Builder(apkFile).build().verify().run { + // listOfNotNull( + // "V1".takeIf { isVerifiedUsingV1Scheme || hasV1Signature(apkFile) }, + // "V2".takeIf { isVerifiedUsingV2Scheme }, + // "V3".takeIf { isVerifiedUsingV3Scheme }, + // "V4".takeIf { isVerifiedUsingV4Scheme }, + // ).takeUnless { it.isEmpty() }?.joinToString(" + ") + // } + ApkSignatureDetector.detectSchemes(apkFile) }.getOrNull() - private fun hasV1Signature(apkFile: File): Boolean { - if (!apkFile.isFile) return false - JarFile(apkFile).use { jar -> - var hasManifest = false - var hasSF = false - var hasRSA = false - for (entry: JarEntry in jar.entries()) { - val name = entry.name.uppercase() - when { - name == "META-INF/MANIFEST.MF" -> hasManifest = true - name.endsWith(".SF") && name.startsWith("META-INF/") -> hasSF = true - name.endsWith(".RSA") && name.startsWith("META-INF/") -> hasRSA = true - } - if (hasManifest && hasSF && hasRSA) { - return true - } - } - return false - } - } - private data class ApkInfo( val label: String?, val packageName: String?, diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkSignatureDetector.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkSignatureDetector.kt new file mode 100644 index 00000000..84fba56e --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkSignatureDetector.kt @@ -0,0 +1,69 @@ +package org.autojs.autojs.ui.main.scripts + +import com.android.apksig.apk.ApkUtils +import com.android.apksig.internal.apk.ApkSigningBlockUtils +import com.android.apksig.util.DataSources +import java.io.File +import java.io.RandomAccessFile +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.util.jar.JarEntry +import java.util.jar.JarFile + +object ApkSignatureDetector { + + private const val BLOCK_ID_V2 = 0x7109871a + private const val BLOCK_ID_V3 = 0xF05368C0.toInt() + private const val BLOCK_ID_V4 = 0x2b09189e + + fun detectSchemes(apkFile: File): String? { + if (!apkFile.isFile) return null + + RandomAccessFile(apkFile, "r").use { raf -> + val dataSource = DataSources.asDataSource(raf, 0, raf.length()) + val signingBlock = ApkUtils.findApkSigningBlock(dataSource).contents + val signingBlockBuffer = signingBlock.getByteBuffer(0, signingBlock.size().toInt()) + + // Duplicate() is called for each detection to prevent position being modified by previous checks. + // zh-CN: 每次检测都 duplicate(), 防止 position 被前一次修改. + val hasV2 = hasScheme(signingBlockBuffer.duplicateAndOrderSignBuffer(), BLOCK_ID_V2) + val hasV3 = hasScheme(signingBlockBuffer.duplicateAndOrderSignBuffer(), BLOCK_ID_V3) + val hasV4 = hasScheme(signingBlockBuffer.duplicateAndOrderSignBuffer(), BLOCK_ID_V4) + val hasV1 = hasV1Signature(apkFile) + + return listOfNotNull( + "V1".takeIf { hasV1 }, + "V2".takeIf { hasV2 }, + "V3".takeIf { hasV3 }, + "V4".takeIf { hasV4 }, + ).takeUnless { it.isEmpty() }?.joinToString(" + ") + } + } + + private fun ByteBuffer.duplicateAndOrderSignBuffer(): ByteBuffer { + return duplicate().order(ByteOrder.LITTLE_ENDIAN) + } + + private fun hasScheme(buf: ByteBuffer, id: Int): Boolean = runCatching { + ApkSigningBlockUtils.findApkSignatureSchemeBlock(buf, id, null) + }.isSuccess + + private fun hasV1Signature(apkFile: File): Boolean { + JarFile(apkFile).use { jar -> + var hasManifest = false + var hasSF = false + var hasRSA = false + for (entry: JarEntry in jar.entries()) { + val n = entry.name.uppercase() + when { + n == "META-INF/MANIFEST.MF" -> hasManifest = true + n.startsWith("META-INF/") && n.endsWith(".SF") -> hasSF = true + n.startsWith("META-INF/") && n.endsWith(".RSA") -> hasRSA = true + } + if (hasManifest && hasSF && hasRSA) return true + } + } + return false + } + +} \ No newline at end of file diff --git a/modules/material-dialogs/src/main/res/layout/md_stub_titleframe.xml b/modules/material-dialogs/src/main/res/layout/md_stub_titleframe.xml index 00183c2f..2eaaa41e 100644 --- a/modules/material-dialogs/src/main/res/layout/md_stub_titleframe.xml +++ b/modules/material-dialogs/src/main/res/layout/md_stub_titleframe.xml @@ -8,9 +8,8 @@ android:baselineAligned="false" android:gravity="center_vertical" android:orientation="horizontal" - android:paddingStart="@dimen/md_dialog_frame_margin" + android:paddingHorizontal="@dimen/md_dialog_frame_margin" android:paddingTop="@dimen/md_dialog_frame_margin" - android:paddingEnd="0dp" android:paddingBottom="@dimen/md_title_frame_margin_bottom">