android开发aosp内置apk到系统rom
1. 创建目录
模仿其他app的内置情况,比如Calendar应用程序的,在aosp10.0.17/packages/apps目录下创建一个目录Helloworld
2. 在Helloworld目录下创建Android.mk文件,内容可以模仿其他内置apk的编写,具体内容大致如下:

#LOCAL_PATH变量指出了当前目录的位置。$(call my-dir)是一个NDK中预定义的函数,用于获取包含当前Android.mk文件的目录路径。
LOCAL_PATH:= $(call my-dir)
#包含CLEAR_VARS变量指向的文件,通常是build/core/clear_vars.mk
#清除许多 LOCAL_XXX 变量,确保它们为空或默认值,以便为新模块的定义提供一个干净的环境
include $(CLEAR_VARS)
#打印一个警告信息到编译日志中,显示LOCAL_PATH的当前值。这是一种调试手段,帮助开发者确认脚本中的路径设置是否正确。
$(warning "Helloworld of LOCAL_PATH is $(LOCAL_PATH)")
#定义了要构建的模块名称为Helloworld。在这个上下文中,它指的是将要被安装的APK名称。
LOCAL_MODULE := Helloworld
#设置模块标签为optional。这意味着该模块默认不会被包含在某些构建变体中,特别是那些通过makedist目标构建的发行版,默认只会编译标记为required或未标记的模块,但可以通过指定标签来包含。
LOCAL_MODULE_TAGS := optional
#指定模块的源文件,这里是Helloworld.apk。这意味着我们不是从源代码编译生成APK,而是直接使用一个已经预编译好的APK文件
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#指定模块的类型为APPS,意味着这是一个应用(APK),而不是库或其他类型的模块。
LOCAL_MODULE_CLASS := APPS
#设置模块的后缀为$(COMMON_ANDROID_PACKAGE_SUFFIX),通常定义为.apk,这里是为了兼容性预留的写法,明确指出模块产物是一个APK文件。
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#指出APK已经是预先签名的。这意味着构建系统不会尝试重新签名这个APK,预期这个APK在加入到系统映像前就已经携带了有效的签名。
LOCAL_CERTIFICATE := PRESIGNED
#包含了BUILD_PREBUILT变量指向的Makefile脚本(通常位于build/core/build-binary.mk),
#告诉构建系统这个模块是一个预编译的二进制文件(在这里是APK),应直接拷贝而不进行编译处理。
include $(BUILD_PREBUILT)
3. 往product packages添加Helloworld,告知系统打包我们的apk到系统里面去,这里以Calendar为例搜索定位到到配置模仿编写


网上说直接编译会报错,需要添加系统app白名单
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST,我没有添加直接编译也成功,可能是不同版本系统编译有区别,如果编译报错了再搜索一下怎么添加吧
4. 重新编译系统
参考android系统开发修改桌面Launcher3代码编译安装验证:https://www.cnblogs.com/yongfengnice/p/18246626
source build/envsetup.sh
lunch aosp_sailfish-userdebug
make -j4

如果更新了apk后再次编译的时候无效的话,可以先手动删除out/target/product/.../Helloworld.apk文件 ,同时删除out/target/product/sailfish/obj/APPS/Helloworld_intermediates文件夹
浙公网安备 33010602011771号