AOSP12内置三方apk

发布时间 2023-05-29 20:06:19作者: 咸鱼Jay

一、准备工作

1、可正常编译的Android12的源码
2、三方apk:我这里选择的是一个ChatGPT的apk(下载地址:https://aigcfun.com/app-download),选择这个就是因为其so的平台比较多,可以很好的兼容模拟器,我们下载下来apk后解压可以看到lib目录下支持的so平台有哪些

二、内置

在源码packages/apps目录下以我们需要内置的APK名字来创建一个新的文件夹(我命名其为AiEdu),并将其apk也命名为AiEdu.apk,放入此目录中。在此目录中创建Android.mk文件

2.1、编写Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AiEdu
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
#module的后缀,可不设置
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

#获得apk中各个平台下所有的so
ifeq ($(strip $(TARGET_ARCH)), arm64)
    CPU_ARCH  := arm64-v8a
else ifeq ($(strip $(TARGET_ARCH)), x86_64)
    CPU_ARCH  := x86_64
else ifeq ($(strip $(TARGET_ARCH)),arm)
    CPU_ARCH  := armeabi-v7a
else
    CPU_ARCH  := x86
endif
 
define get-all-libraries-module-name-in-subdirs
$(sort $(shell cd $(LOCAL_PATH) ; rm -rf lib >/dev/null ; unzip $(LOCAL_MODULE).apk 'lib/${CPU_ARCH}/*.so' -d . >/dev/null ; find -L $(1) -name "*.so"))
endef
ALL_LIBRARIES_MODULE_NAME := $(call get-all-libraries-module-name-in-subdirs, lib/${CPU_ARCH})
LOCAL_PREBUILT_JNI_LIBS := $(ALL_LIBRARIES_MODULE_NAME)

#可以为testkey、platform、shared、media、PRESIGNED(使用原签名),platform代表为系统应用
LOCAL_CERTIFICATE := PRESIGNED
#不设置或者设置为false,安装位置为system/app,如果设置为true,则安装位置为system/priv-app
#LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)

当我们加入到这个地方之后,是可以进行编译,但是无法加入到系统编译中,还需要修改另一个地方配置。

2.2、加入到编译系统

下面我们需要将将创建的AiEdu编译模块加入到编译系统,我们找到/Android-12.1.0_r5/build/make/target/product/handheld_product.mk文件,在文件下面这个位置加入AiEdu模块

2.3、编译

上面配置完成之后,进入源码根目录,重新编译

source build/envsetup.sh # 导入环境
lunch sdk_phone_x86_64  # 选择系统,这里直接使用模拟器sdk_phone_x86_64
make -j4  # 编译

三、问题记录

执行make -j4后会报错

这里乍一看估计99%的人都不知道怎么回事,这里其实可以从提示是可以看出来:
大概是因为新版本artifact_path_requirements有对预装相关东西进行了规则检测,发现system/app/AiEdu/AiEdu.apk这种预制到system/app的情况属于违规了。
那么具体怎么解决呢?

3.1、解决方案一:

最终在网上找到了解决方案(https://blog.csdn.net/learnframework/article/details/123547033)

build/envsetup.sh 加上export DISABLE_ARTIFACT_PATH_REQUIREMENTS="true"就可以顺利编译通过不再报artifact_path_requirements错误,这里其实就相当于把新版本编译系统中artifact_path_requirements检测关闭就可以

3.2、解决方法二:

将上面Android.mk脚本文件里的LOCAL_PRIVILEGED_MODULE := true注释打开,使其安装位置为system/priv-app

3.3、附一下编译成功图片:

四、来个效果图:

五、参考资料

AOSP Android 10.0无源码内置apk到系统

【Android 12 AOSP学习】Android内置第三方apk到系统

Android 12 S artifact_path_requirements Offending entries Build failed ckati failed with/ aosp预制apk