AOSP12内置三方apk
一、准备工作
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的情况属于违规了。
那么具体怎么解决呢?
最终在网上找到了解决方案(https://blog.csdn.net/learnframework/article/details/123547033)

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

四、来个效果图:

五、参考资料
【Android 12 AOSP学习】Android内置第三方apk到系统
Android 12 S artifact_path_requirements Offending entries Build failed ckati failed with/ aosp预制apk
AOSP12内置三方apk的更多相关文章
- mtk预装apk 方案公司内置预装apk
mtk预装apk 方案公司内置预装apk 韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha == MTK 预知第三方的APK 流程_yua ...
- Android开发中内置apk程序
首先申明,这里的方法介绍是针对我司自己项目中的具体开发板而做的. Mg701内置APK有三种方式 一. 这种方法必须要自己编写Android.mk文件(关于Android.mk可以参考 ...
- Android:源码环境下移植第三方的apk内置到ROM(System Image)中
1. 首先在vendor目录下新建一个the3rdapk的目录,将需要内置的apk丢进去,目录名自己随意定. 2. 在 build/target/product/common.mk最后面,在$(cal ...
- android在Data目录内置可删除的APP
一.准备工作:make_ext4fs.mkuserimg.sh.simg2img,把它们跟要修改的 .img.ext4(或.img)文件放置到同一个目录下 二.转换源文件为img格式( .img则略过 ...
- Android源码中内置包含so文件的APK文件
方法一: 在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例 将Test.apk放到packages/apps/Test下面 在packages/ap ...
- android 怎样内置/预置/预编译文件(运行程序,应用程序,apk, jar, lib 等随意文件)到系统中
方法一: 如果要内置的软件名称为iperf.exe 1. 将iperf.exe放到Codebase的随意一个文件夹下(该文件夹必须可以在搜索Android.mk时被搜索到),比方system/ipe ...
- 第三方apk内置因签名导致SystemUI未启动启动问题案例分析
这个问题是刷完机正常开机后,发现手机无状态栏,下拉通知栏,按音量键也无法出现VolumeDialog,开始看到这个现象感觉是systemUI未编译到版本中去?或者是在systemserver中syst ...
- adb将Apk内置到系统中(system/priv-app)
https://blog.csdn.net/starhosea/article/details/78697007 so文件的处理是目前遇到过的问题.文章中解释了. 正文: 有时候我们在Android ...
- 微信内置浏览器不支持APK附件下载的原因
由于微信的限制,应用文件在内置浏览器中下载全部被屏蔽掉,造成很多人用微信扫描二维码下载时点击下载按钮没反应,我想到的是做一个提示用户在浏览器中打开下载.其实原来很简单,就是判断当前是在微信内置浏览器中 ...
- PHP内置Web Server探究(一)启动Cli_Server
自PHP5.4之后 PHP内置了一个Web 服务器(cli_server),类似于Python的内置server一样,方便我们开发阶段的调试 主要使用场景: 1,没有搭建nginx或apache等第三 ...
随机推荐
- 欢迎加入 DotNet NB 交流学习群
目录 起因 创建群组 群成员 技术交流 社区推广 社区前辈 欢迎加入 起因 自从2019年参加 .NET Conf China 大会之后,我创办了一个公众号 DotNet NB,内容主要是 关于 .N ...
- HBase Shell将命令执行结果导出到文件
1.将Hbase shell执行结果输出到文件 echo "scan 'test'" | hbase shell>my.txt 2.查看表的region数 list_regi ...
- Linux服务器查看端口是否开启或占用
一.查看端口是否启用 (1)lsof -i :8080 查看8080端口被哪个进程占用 (2)netstat -lnp|grep 8080 查看8080端口被哪个进程占用 (3)ss -nlap | ...
- CF739A Alyona and mex 题解
题目传送门 前置知识 贪心 | 构造 解法 从贪心的角度分析,最小的 \(\operatorname{mex}\) 仅会与长度最小的区间有关:另外为使得 \(\operatorname{mex}\) ...
- UVA1108 Mining Your Own Business 题解
题目传送门 题意 在一个无向图上选择尽量少的点涂黑,使得删除任意一个点后,每个连通分量里都至少有一个黑点(多组数据). 正文 观察题意,发现这是个 Tarjan 求点双连通分量的板子. 考虑在求点双连 ...
- Spring Boot整合Postgres实现轻量级全文搜索
有这样一个带有搜索功能的用户界面需求: 搜索流程如下所示: 这个需求涉及两个实体: "评分(Rating).用户名(Username)"数据与User实体相关 "创建日期 ...
- NVME(学习笔记_杂谈)
NVME 协议中一些概念的理解: 1.Namespace :可以将Namespace 理解为一片Logic Block的区域,一个Controller可以支持多个Namespace,每个Namespa ...
- 惠普CP1025后盖传感器松导致不停自检或打印中掉电, 跳闪三角灯
上次修了离合器, 没出两星期又出问题了. CP1025这个型号就是出名的开机特别慢, 正常自检是1分钟, 但是前天我在给机器换完粉盒后, 自检似乎进入了死循环, 一直在自检. 周末才有空看看能不能解决 ...
- 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据
1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中 ...
- springboot项目读取自定义的properties文件
现在我们要在某个地方读取config.properties里的这几个属性值 这里使用三个注解即可读取自定义的配置文件内容(注意这里需要写他的setter和getter方法) @Component #注 ...