6.6.3 - Alpha5 - 提升 APK 文件签名信息检测效率

This commit is contained in:
SuperMonster003
2025-05-22 15:49:54 +08:00
parent 3d8e3e28eb
commit e4437fc935
19 changed files with 117 additions and 60 deletions

View File

@@ -43,6 +43,7 @@
"已忽略更新记录及客户端模式连接地址记录支持清空操作",
"版本更新信息支持多语言显示 (与当前显示语言同步)",
"使用异步加载方式一定程度提升文件管理器列表滑动流畅性",
"APK 文件签名信息提升检测效率",
"APK 文件类型信息及媒体文件类型信息优化对话框显示效率及信息展示逻辑",
"Gradle 构建脚本提升版本自适应能力 _[`discussion #369`](http://discussions.autojs6.com/369)_"
],

View File

@@ -389,7 +389,7 @@ SDK Tools (أدوات SDK) (في النافذة اليمنى)
يعتمد مشروع AutoJs6 على إصدار `JDK (مجموعة تطوير جافا)` بإصدار لا يقل عن `17`، ولكن يفضل الإصدار الذي لا يقل عن `19`.
اعتبارًا من 21 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`.
اعتبارًا من 22 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`.
> ملاحظة: إذا كان نظام الكمبيوتر يحتوي على JDK والإصدار يفي بالمتطلبات المذكورة أعلاه، فيمكنك تخطي هذا القسم.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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がインストールされている場合, この節の内容をスキップできます.

View File

@@ -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가 설치되어 있고, 버전이 위의 요구 사항을 충족하는 경우, 이 섹션을 건너뛸 수 있습니다.

View File

@@ -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 и версия соответствует указанным требованиям, этот раздел можно пропустить.

View File

@@ -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 且版本满足上述要求, 则可跳过此小节内容.

View File

@@ -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 且版本滿足上述要求, 則可跳過此小節內容.

View File

@@ -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 且版本滿足上述要求, 則可跳過此小節內容.

View File

@@ -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 且版本满足上述要求, 则可跳过此小节内容.

View File

@@ -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

View File

@@ -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

View File

@@ -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?,

View File

@@ -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
}
}

View File

@@ -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">
<ImageView
@@ -27,18 +26,20 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:maxLines="5"
android:ellipsize="end"
android:textSize="@dimen/md_title_textsize"
tools:text="Title" />
<ImageView
android:id="@+id/md_options"
android:layout_width="47dp"
android:layout_width="27dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:maxHeight="47dp"
android:paddingTop="4dp"
android:paddingStart="5dp"
android:paddingEnd="20dp"
android:layout_marginEnd="-10dp"
android:maxHeight="27dp"
android:paddingTop="3dp"
android:paddingHorizontal="3dp"
android:src="@drawable/md_ic_more"
android:visibility="gone"
app:tint="?android:attr/textColorPrimary"

View File

@@ -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_less">
<ImageView
@@ -27,18 +26,20 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:maxLines="5"
android:ellipsize="end"
android:textSize="@dimen/md_title_textsize"
tools:text="Title" />
<ImageView
android:id="@+id/md_options"
android:layout_width="47dp"
android:layout_width="27dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:maxHeight="47dp"
android:paddingTop="4dp"
android:paddingStart="5dp"
android:paddingEnd="20dp"
android:layout_marginEnd="-10dp"
android:maxHeight="27dp"
android:paddingTop="3dp"
android:paddingHorizontal="3dp"
android:src="@drawable/md_ic_more"
android:visibility="gone"
app:tint="?android:attr/textColorPrimary"

View File

@@ -1,5 +1,5 @@
#Wed May 21 19:59:17 CST 2025
BUILD_TIME=1747828757164
#Thu May 22 15:43:17 CST 2025
BUILD_TIME=1747899797441
COMPILE_SDK_VERSION=35
IMAGE_QUANT_CMAKE_VERSION=3.22.1
IMAGE_QUANT_NDK_VERSION=26.1.10909125
@@ -19,6 +19,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
TARGET_SDK_VERSION=35
TARGET_SDK_VERSION_INRT=29
VERSION_BUILD=3241
VERSION_BUILD=3243
VERSION_NAME=6.6.3 Alpha5
VSCODE_EXT_REQUIRED_VERSION=1.0.8