预签名 APK 在 AOSP 构建中丢失签名
Presigned APK loses signature in AOSP build
我在我的 AOSP 构建中包含一个预签名的 APK,如下所示:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
APK_VERSION := 0.2.0
LOCAL_MODULE := SomeAPK
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
但是,当设备启动时,未安装 APK,我看到以下日志:
2021-05-25 17:19:02.617 3568-3568/system_process W/PackageManager: Failed to scan /system/priv-app/SomeAPK: Failed to collect certificates from /system/priv-app/SomeAPK/SomeAPK.apk
我试过设置:
LOCAL_DEX_PREOPT := false
和:
LOCAL_DEX_PREOPT := nostripping
但我仍然看到这个问题。
我可以 adb 安装应用程序,我已经使用了所有可用的工具来确认 APK 确实已签名。
我们怎样才能让 AOSP 真正独立于 APK 签名?
我终于找到了解决办法。
使用 gradle 签名的应用程序似乎总是在 AOSP 构建过程后留下其签名。
解决方案是从 gradle 中完全删除签名配置,然后使用 apksigner 手动签署应用程序。
例如:
apksigner sign --ks your-keystore.jks --ks-pass pass:"keystore-password" --ks-key-alias keystore-alias --key-pass pass:"alias-password" --out signed-output.apk input-file.apk
要验证您的 APK 是否已正确签名,应该使用 keytool 验证成功:
keytool -printcert -jarfile signed-apk.apk
当预构建apk时,它会尝试解压缩dex和jni,如果它存储在apk(zip)中并压缩。它由 zipinfo 检查。然后它将解压缩压缩包 dex/jni so,并在不解压缩的情况下再次压缩它。并且 v2/v3 签名将通过再次解压缩和压缩来删除。 v1签名存储为zip条目,将被保留。
no compression
-rw-rw-rw- 0.0 unx 3598524 b- stor 81-Jan-01 01:01 classes.dex
您可以避免处理预构建的 apk
通过 LOCAL_REPLACE_PREBUILT_APK_INSTALLED
include $(CLEAR_VARS)
APK_VERSION := 0.2.0
LOCAL_MODULE := SomeAPK
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/$(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
我在我的 AOSP 构建中包含一个预签名的 APK,如下所示:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
APK_VERSION := 0.2.0
LOCAL_MODULE := SomeAPK
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
但是,当设备启动时,未安装 APK,我看到以下日志:
2021-05-25 17:19:02.617 3568-3568/system_process W/PackageManager: Failed to scan /system/priv-app/SomeAPK: Failed to collect certificates from /system/priv-app/SomeAPK/SomeAPK.apk
我试过设置:
LOCAL_DEX_PREOPT := false
和:
LOCAL_DEX_PREOPT := nostripping
但我仍然看到这个问题。
我可以 adb 安装应用程序,我已经使用了所有可用的工具来确认 APK 确实已签名。
我们怎样才能让 AOSP 真正独立于 APK 签名?
我终于找到了解决办法。
使用 gradle 签名的应用程序似乎总是在 AOSP 构建过程后留下其签名。
解决方案是从 gradle 中完全删除签名配置,然后使用 apksigner 手动签署应用程序。
例如:
apksigner sign --ks your-keystore.jks --ks-pass pass:"keystore-password" --ks-key-alias keystore-alias --key-pass pass:"alias-password" --out signed-output.apk input-file.apk
要验证您的 APK 是否已正确签名,应该使用 keytool 验证成功:
keytool -printcert -jarfile signed-apk.apk
当预构建apk时,它会尝试解压缩dex和jni,如果它存储在apk(zip)中并压缩。它由 zipinfo 检查。然后它将解压缩压缩包 dex/jni so,并在不解压缩的情况下再次压缩它。并且 v2/v3 签名将通过再次解压缩和压缩来删除。 v1签名存储为zip条目,将被保留。
no compression
-rw-rw-rw- 0.0 unx 3598524 b- stor 81-Jan-01 01:01 classes.dex
您可以避免处理预构建的 apk 通过 LOCAL_REPLACE_PREBUILT_APK_INSTALLED
include $(CLEAR_VARS)
APK_VERSION := 0.2.0
LOCAL_MODULE := SomeAPK
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/$(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)