6.6.2 - Alpha - 更新 ApkSig 源代码; APK 文件类型增加文件大小与签名方案信息

This commit is contained in:
SuperMonster003
2025-01-03 16:34:44 +08:00
parent 6216e648d7
commit 0ccee0b288
112 changed files with 11158 additions and 4958 deletions

View File

@@ -763,7 +763,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
private fun showInfo() {
when {
mExplorerItem.isInstallable -> {
ApkInfoDialogManager.showApkInfoDialog(context, mExplorerItem)
ApkInfoDialogManager.showApkInfoDialog(context, mExplorerItem.toScriptFile())
notifyItemOperated()
}
mExplorerItem.isMediaMenu || mExplorerItem.isMediaPlayable -> {

View File

@@ -18,8 +18,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.autojs.autojs.model.explorer.ExplorerItem
import org.autojs.autojs.pio.PFiles
import org.autojs.autojs.runtime.api.AppUtils
import org.autojs.autojs.util.IntentUtils
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ApkFileInfoDialogListItemBinding
import java.io.File
@@ -28,28 +29,30 @@ object ApkInfoDialogManager {
@JvmStatic
@SuppressLint("SetTextI18n")
fun showApkInfoDialog(context: Context, explorerItem: ExplorerItem) {
fun showApkInfoDialog(context: Context, apkFile: File) {
val binding = ApkFileInfoDialogListItemBinding.inflate(LayoutInflater.from(context))
val root = binding.root as ViewGroup
val apkFilePath = apkFile.absolutePath
val dialog = MaterialDialog.Builder(context)
.title(explorerItem.name)
.title(apkFile.name)
.customView(root, false)
.autoDismiss(false)
.iconRes(R.drawable.transparent)
.limitIconToDefaultSize()
.positiveText(R.string.text_install)
.positiveColorRes(R.color.dialog_button_attraction)
.onPositive { materialDialog, _ ->
materialDialog.dismiss()
explorerItem.install(context)
IntentUtils.installApk(context, apkFilePath)
}
.positiveColorRes(R.color.dialog_button_attraction)
.negativeText(R.string.text_cancel)
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
.negativeColorRes(R.color.dialog_button_default)
.neutralColorRes(R.color.dialog_button_hint)
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
.show()
val apkFilePath = explorerItem.toScriptFile().absolutePath
val packageManager = context.packageManager
CoroutineScope(Dispatchers.Main).launch {
@@ -67,6 +70,10 @@ object ApkInfoDialogManager {
}
}
val fileSize = withContext(Dispatchers.IO) { PFiles.getHumanReadableSize(apkFile.length()) }
val signatureScheme = withContext(Dispatchers.IO) { getApkSignatureInfo(apkFile) }
withContext(Dispatchers.Main) {
// @Hint by SuperMonster003 on Nov 27, 2024.
// ! Prioritize handling "installed version" to determine whether to display its content view.
@@ -85,12 +92,15 @@ object ApkInfoDialogManager {
binding.deviceSdkValue.text = "${Build.VERSION.SDK_INT}"
bindVersionInfo(binding, context, versionName, versionCode)
binding.fileSizeValue.setTextIfAbsent { fileSize }
binding.signatureSchemeValue.setTextIfAbsent { signatureScheme }
dialog.setIcon(applicationInfo?.apply {
sourceDir = apkFilePath
publicSourceDir = apkFilePath
}?.loadIcon(packageManager) ?: context.getDrawable(R.drawable.ic_packaging))
val apkInfo = getApkInfo(explorerItem.toScriptFile())
val apkInfo = getApkInfo(apkFile)
binding.labelNameValue.setTextIfAbsent { apkInfo?.label }
binding.packageNameValue.setTextIfAbsent { apkInfo?.packageName }
@@ -153,24 +163,22 @@ object ApkInfoDialogManager {
}
private fun restoreEssentialViews(binding: ApkFileInfoDialogListItemBinding, context: Context) {
binding.labelNameLabel.text = context.getString(R.string.text_label_name)
binding.labelNameColon.isVisible = true
binding.labelNameValue.isVisible = true
binding.packageNameLabel.text = context.getString(R.string.apk_info_package_name)
binding.packageNameColon.isVisible = true
binding.packageNameValue.isVisible = true
binding.versionPlaceholderLabel.text = context.getString(R.string.text_version)
binding.versionPlaceholderColon.isVisible = true
binding.versionPlaceholderValue.isVisible = true
binding.minSdkLabel.text = context.getString(R.string.apk_info_min_sdk)
binding.minSdkColon.isVisible = true
binding.minSdkValue.isVisible = true
binding.targetSdkLabel.text = context.getString(R.string.apk_info_target_sdk)
binding.targetSdkColon.isVisible = true
binding.targetSdkValue.isVisible = true
binding.deviceSdkLabel.text = context.getString(R.string.apk_info_device_sdk)
binding.deviceSdkColon.isVisible = true
binding.deviceSdkValue.isVisible = true
listOf(
Triple(binding.labelNameLabel, binding.labelNameColon, binding.labelNameValue) to R.string.text_label_name,
Triple(binding.packageNameLabel, binding.packageNameColon, binding.packageNameValue) to R.string.apk_info_package_name,
Triple(binding.versionPlaceholderLabel, binding.versionPlaceholderColon, binding.versionPlaceholderValue) to R.string.text_version,
Triple(binding.fileSizeLabel, binding.fileSizeColon, binding.fileSizeValue) to R.string.apk_info_file_size,
Triple(binding.signatureSchemeLabel, binding.signatureSchemeColon, binding.signatureSchemeValue) to R.string.apk_info_signature_scheme,
Triple(binding.minSdkLabel, binding.minSdkColon, binding.minSdkValue) to R.string.apk_info_min_sdk,
Triple(binding.targetSdkLabel, binding.targetSdkColon, binding.targetSdkValue) to R.string.apk_info_target_sdk,
Triple(binding.deviceSdkLabel, binding.deviceSdkColon, binding.deviceSdkValue) to R.string.apk_info_device_sdk,
).forEach { pair ->
val (triple, labelTextRes) = pair
val (labelView, colonView, valueView) = triple
labelView.text = context.getString(labelTextRes)
colonView.isVisible = true
valueView.isVisible = true
}
}
private fun updateGuidelines(binding: ApkFileInfoDialogListItemBinding) {
@@ -178,6 +186,8 @@ object ApkInfoDialogManager {
binding.labelNameLabel to binding.labelNameGuideline,
binding.packageNameLabel to binding.packageNameGuideline,
binding.versionPlaceholderLabel to binding.versionPlaceholderGuideline,
binding.fileSizeLabel to binding.fileSizeGuideline,
binding.signatureSchemeLabel to binding.signatureSchemeGuideline,
binding.minSdkLabel to binding.minSdkGuideline,
binding.targetSdkLabel to binding.targetSdkGuideline,
binding.installedVersionLabel to binding.installedVersionGuideline,
@@ -194,8 +204,8 @@ object ApkInfoDialogManager {
}
}
private fun getApkSignatureInfo(apkFilePath: String): String? = runCatching {
ApkVerifier.Builder(File(apkFilePath)).build().verify().run {
private fun getApkSignatureInfo(apkFile: File): String? = runCatching {
ApkVerifier.Builder(apkFile).build().verify().run {
listOfNotNull(
"V1".takeIf { isVerifiedUsingV1Scheme },
"V2".takeIf { isVerifiedUsingV2Scheme },

View File

@@ -54,7 +54,7 @@ open class ExplorerFragment : ViewPagerFragment(0), OnFloatingActionButtonClickL
override fun onItemClick(view: View?, item: ExplorerItem) {
when {
item.isTextEditable -> Scripts.edit(requireActivity(), item.toScriptFile())
item.isInstallable -> ApkInfoDialogManager.showApkInfoDialog(requireActivity(), item)
item.isInstallable -> ApkInfoDialogManager.showApkInfoDialog(requireActivity(), item.toScriptFile())
item.isMediaMenu || item.isMediaPlayable -> MediaInfoDialogManager.showMediaInfoDialog(requireActivity(), item)
else -> viewFile(item)
}

View File

@@ -42,6 +42,7 @@ import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.common.NotAskAgainDialog;
import org.autojs.autojs.ui.filechooser.FileChooserDialogBuilder;
import org.autojs.autojs.ui.keystore.ManageKeyStoreActivity;
import org.autojs.autojs.ui.main.scripts.ApkInfoDialogManager;
import org.autojs.autojs.ui.shortcut.AppsIconSelectActivity;
import org.autojs.autojs.ui.viewmodel.KeyStoreViewModel;
import org.autojs.autojs.ui.widget.RoundCheckboxWithText;
@@ -880,8 +881,13 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa
.title(R.string.text_build_succeeded)
.content(getString(R.string.format_build_succeeded, outApk.getPath()))
.positiveText(R.string.text_install)
.negativeText(R.string.text_cancel)
.positiveColorRes(R.color.dialog_button_attraction)
.onPositive((dialog, which) -> IntentUtils.installApk(BuildActivity.this, outApk.getPath()))
.negativeText(R.string.text_cancel)
.negativeColorRes(R.color.dialog_button_default)
.neutralText(R.string.dialog_button_file_information)
.neutralColorRes(R.color.dialog_button_hint)
.onNeutral((dialog, which) -> ApkInfoDialogManager.showApkInfoDialog(dialog.getContext(), outApk))
.show();
}

View File

@@ -237,7 +237,7 @@
android:layout_marginTop="4sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/version_placeholder_parent"
app:layout_constraintBottom_toTopOf="@id/min_sdk_parent"
app:layout_constraintBottom_toTopOf="@id/file_size_parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.constraintlayout.widget.Guideline
@@ -295,6 +295,151 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/file_size_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
android:layout_marginTop="4sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/installed_version_parent"
app:layout_constraintBottom_toTopOf="@id/signature_scheme_parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/file_size_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<TextView
android:id="@+id/file_size_label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:text="@string/ellipsis_six"
tools:text="@string/apk_info_file_size"
android:lineSpacingExtra="2dp"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/file_size_guideline" />
<TextView
android:id="@+id/file_size_colon"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:layout_marginHorizontal="4sp"
android:text="@string/symbol_colon"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toEndOf="@id/file_size_label"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/file_size_value" />
<TextView
android:id="@+id/file_size_value"
android:visibility="gone"
tools:visibility="visible"
android:text="@string/ellipsis_six"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:maxLines="2"
android:ellipsize="end"
android:paddingBottom="0dp"
android:paddingTop="0dp"
android:lineSpacingExtra="2dp"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toEndOf="@id/file_size_colon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/signature_scheme_parent"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
android:layout_marginTop="4sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/file_size_parent"
app:layout_constraintBottom_toTopOf="@id/min_sdk_parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/signature_scheme_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<TextView
android:id="@+id/signature_scheme_label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:text="@string/ellipsis_six"
tools:text="@string/apk_info_signature_scheme"
android:lineSpacingExtra="2dp"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/signature_scheme_guideline" />
<TextView
android:id="@+id/signature_scheme_colon"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:layout_marginHorizontal="4sp"
android:text="@string/symbol_colon"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toEndOf="@id/signature_scheme_label"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/signature_scheme_value" />
<TextView
android:id="@+id/signature_scheme_value"
android:visibility="gone"
tools:visibility="visible"
android:text="@string/ellipsis_six"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
android:textAlignment="viewStart"
android:maxLines="2"
android:ellipsize="end"
android:paddingBottom="0dp"
android:paddingTop="0dp"
android:lineSpacingExtra="2dp"
android:textSize="@dimen/ref_md_listitem_textsize"
app:layout_constraintStart_toEndOf="@id/signature_scheme_colon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/min_sdk_parent"
android:visibility="visible"
@@ -304,7 +449,7 @@
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
android:layout_marginTop="4sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/installed_version_parent"
app:layout_constraintTop_toBottomOf="@id/signature_scheme_parent"
app:layout_constraintBottom_toTopOf="@id/target_sdk_parent"
app:layout_constraintEnd_toEndOf="parent">

View File

@@ -890,5 +890,8 @@
<string name="text_package_name_with_computing" tools:ignore="TypographyEllipsis">包名 (计算中...)</string>
<string name="text_version_name_with_computing" tools:ignore="TypographyEllipsis">版本名称 (计算中...)</string>
<string name="text_version_code_with_computing" tools:ignore="TypographyEllipsis">版本号 (计算中...)</string>
<string name="apk_info_file_size">文件大小</string>
<string name="apk_info_signature_scheme">签名方案</string>
<string name="dialog_button_file_information">文件信息</string>
</resources>

View File

@@ -1123,5 +1123,8 @@
<string name="text_version_code_with_computing" tools:ignore="TypographyEllipsis">Version code (computing...)</string>
<string name="default_build_apk_version_name" translatable="false">1.0.0</string>
<string name="default_build_apk_version_code" translatable="false">1</string>
<string name="apk_info_file_size">File size</string>
<string name="apk_info_signature_scheme">Signature</string>
<string name="dialog_button_file_information">File info</string>
</resources>