预签名 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)