最近给客户预装系统App 将他们的apk编译到system/app/ 目录开机之后可以看见apk是正常编译到了system/app/SignagePlayer/SignagePlayer.apk但是开机之后发现app没有正常被系统扫描到看了一下apk自带了lib库文件于是修改Android.mk文件把arm64的so库文件编译到system/app/SignagePlayer/lib/arm64/ 目录。LOCAL_PATH : $(call my-dir) # Native libs of the app, extracted from the APK into lib/isa/ below. # PMS never extracts native libs from an APK preinstalled on /system; it # only loads them from the lib/isa/ dir next to the APK (isa dir names: # arm64-v8a - arm64, armeabi-v7a - arm). Without these the package is # dropped at scan time and the app disappears. signage_so_names : \ libapp \ libdartjni \ libdatastore_shared_counter \ libflutter \ libmediakitandroidhelper \ libmpv \ libserialport # Only the 64-bit libs are installed: the device runs a 64-bit primary ABI # (arm64-v8a) and the app never spawns 32-bit processes, so lib/arm/ would # be dead weight (PMS matches the ABI against the so list inside the APK; # only the runtime load path uses these extracted files). Add arm back # here and extract lib/armeabi-v7a if a 32-bit fallback is ever needed. signage_so_abis : arm64 # One ETC prebuilt per .so, installed into system/app/SignagePlayer/lib/isa/ define make-signage-so-module include $$(CLEAR_VARS) LOCAL_MODULE : signage_$(1)_$(2) LOCAL_MODULE_CLASS : ETC LOCAL_MODULE_STEM : $(1).so LOCAL_SRC_FILES : lib/$(2)/$(1).so LOCAL_MODULE_PATH : $(TARGET_OUT_APPS)/SignagePlayer/lib/$(2) include $$(BUILD_PREBUILT) endef $(foreach abi,$(signage_so_abis),\ $(foreach so,$(signage_so_names),\ $(eval $(call make-signage-so-module,$(so),$(abi))))) signage_so_modules : $(foreach abi,$(signage_so_abis),\ $(foreach so,$(signage_so_names),signage_$(so)_$(abi))) include $(CLEAR_VARS) LOCAL_MODULE : SignagePlayer LOCAL_MODULE_CLASS : APPS LOCAL_MODULE_TAGS : optional LOCAL_BUILT_MODULE_STEM : package.apk LOCAL_MODULE_SUFFIX : $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE : PRESIGNED LOCAL_SRC_FILES : Signage_Player_8.2.6_regency.apk LOCAL_MULTILIB : both LOCAL_REQUIRED_MODULES $(signage_so_modules) include $(BUILD_PREBUILT)开机之后app还是没有出现。对比看了一下apk的文件大小和md5发现编译到out目录的apk文件大小和md5 都和原来不一样了。查找了一下发现原来是 这里build/make/core/app_prebuilt_internal.mk对PRESIGNED 预装 APK编译时无条件执行ZIP2ZIP -0把 APK 内所有压缩的 so 重写为未压缩存储之后只做 zipalign、不重新签名。重写 zip 必然破坏 v2/v3 签名块v1签名不受影响 → PMS 扫描时签名收集失败之前pm install测出的NO_CERTIFICATES就是这个→ 包被静默丢弃。修改一下对于保持自身签名的apk不要解压so重写apk这样不会破坏apk签名。apk自带的lib库需要手动解压拷贝到system/app/xxx/lib至于重新签名的apk解压就无所谓破坏签名了反正是重新签名。解压so有个好处是可以不用手动解压apk的lib库不用拷贝so文件到system/app/xxx/lib目录从Android8.0开始就有了这个机制。ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) # ITEMP: rewriting lib entries with ZIP2ZIP breaks the v2/v3 APK Signing # Block of PRESIGNED prebuilts (no re-sign happens for them), so the # package fails PackageManager certificate collection and is silently # dropped from /system. Only uncompress for apks we re-sign ourselves. $(uncompress-prebuilt-embedded-jni-libs) endif这样重新编译之后生成apk文件大小md5都和源文件一致烧录固件开机之后apk正常运行~
阅读完成 · 觉得有帮助?