Platform:MT6762
Kernel:4.19.127
Android Version:11

常规预制配置

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := XXXXXXXX   
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

其中LOCAL_MODULE填入文件夹内app的名称,最终组成LOCAL_SRC_FILES对应的apk源文件。
这部分可以说随处找个系统源码的.mk文件都能了解到。
但是往往问题没那么简单,这样预制进去的APK,容易出现几种问题,以下来进行分类:

签名不当或预制位置不对

这里主要看三个配置:
LOCAL_CERTIFICATE代表签名种类,具体有:platform,testkey,shared,media几种,一般用的多的也就platform,或者已签过名则使用PRESIGNED,这个需要结合客需使用对应签名,用错了自然会有权限相关的问题。

LOCAL_PRIVILEGED_MODULE比起签名针对性更强,如果不设置或者设置为false,安装位置为system/app;如果设置为true,安装位置为system/priv-app。

LOCAL_MODULE_PATH则代表应用安装的位置,添加此项多是考虑将应用预制到比如vendor下,$(TARGET_OUT_VENDOR)/app,这类应用多数不考虑系统提权,多为第三方厂商特制APP。

可能出现的问题:
1.第三方应用预制为系统应用没签名platform,丢失各种权限。
2.使用了PRESIGNED签了第三方签名,还添加LOCAL_PRIVILEGED_MODULE为true,将APK
预制进priv-app目录内,可能会导致无法开机,系统签名与第三方出现冲突。
3.LOCAL_MODULE_PATH添加非system路径,使用平台签名等,一样会影响系统运行,可能情况
比较多,需要结合项目分析。

权限不够

这类打包APP多是报错为Permission denied,结合具体内容分析,比如shell命令无法使用,则需要提权root,又比如操作sys/下某个节点无法读写,则需要在系统rc文件中添加chmod来赋权,又比如so库找不到,可以考虑将so库单独拿出来,通过PRODUCT_COPY_FILES拷贝到system/lib以及system/lib64下

特殊报错

这个也是要特别注意的,有时候直接预制,会出现APP打不开,或者部分so调用失败,比如以下log信息:

Warning: "/system/app/Aiservice/Aiservice.apk!/lib/armeabi-v7a/libTHLive.so"
unused DT entry: DT_RPATH (type 0xf arg 0x8bf6) (ignoring)

网上关于unused DT没有给出特别好的解决方式,但是实际通过预制so库是可以解决的,该部分看分析
说是APP内so库与系统内kernel支持存在区分,交叉编译不对之类(其实也没很理解啥意思–汗)。
下面是Android.mk添加内容:

###清空临时变量JNI_LIBS
JNI_LIBS :=
###当前目录递归搜索
$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/armeabi-v7a/ -name *.so), $(eval JNI_LIBS += $(FILE)))
###获取搜索文件目录集(相对目录)
LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))

就客户说法是,预制在lib/arm下验证可行,结合具体平台,或为arm64。直接安装能打开而预制不行多可以使用此方法。

如果还有什么情况后续会继续添加,未完…