问题描述
如题,想要在安卓中内置一个apk,叫gamepadtester.apk,常规的像apk本身、对应的Android.mk文件和PRODUCT_PACKAGES +=都已经添加了,但仍然没有在桌面显示。但如果在adb shell中执行以下命令又能看到结果,这说明APK 在 system/priv-app 里,但 PackageManager 完全没有安装它。
# 这是我添加的对应Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GamepadTester
LOCAL_MODULE_CLASS := APPS
# LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_SRC_FILES := gamepadtester.apk
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
而且在log中搜索gamepadtester相关内容,会发现以下报错:
01-01 08:26:14.431 1939 1939 W PackageManager:
Failed to scan /system/priv-app/GamepadTester: No APK Signature Scheme v2 signature in package /system/priv-app/GamepadTester/GamepadTester.apk
对于这个log,AI的说明是:
APK 签名方案过旧
Android 11 及以后的版本(包括你的 Android 15)对 `priv-app` 分区(私有核心应用)的安全性检查非常严格。系统要求内置的 APK 必须包含 **V2 或更高版本的签名方案**。
你的 `GamepadTester.apk` 目前可能只使用了 V1 签名(Jar 签名),或者签名在打包过程中被破坏了。由于它没有 V2 签名,PackageManager 会直接跳过这个 APK,导致它不会被安装,界面上也看不到。
解决办法
修改Android.mk中的LOCAL_CERTIFICATE,从PRESIGNED改为platform, 如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GamepadTester
LOCAL_MODULE_CLASS := APPS
LOCAL_SRC_FILES := gamepadtester.apk
LOCAL_PRIVILEGED_MODULE := true
# 修改这里:不再使用 PRESIGNED,改用系统平台签名
# 这样编译系统会拆掉原签名,并使用 AOSP 的 platform 签名重新打包并生成 V2 签名
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
然后再编译刷机,就可以在说明看到预置的这个apk了