frameworks 之预装系统应用

基于 Android 12 探索如何编译集成系统应用

如何查找添加新增的mk文件

运用命令 cd 到对应的文件夹 source/packages/app 可以看到里面有自带的系统应用,用 Launcher3 为例,打开文件目录下的 Android.mk 。可以看到该模块名为 Launcher3QuickStep 代码如下。

LOCAL_PACKAGE_NAME := Launcher3QuickStep

查看到对于的模块名后,可以 cd build/make/target/product 目录下 执行查找命令

grep Launcher3QuickStep ./ -rn

执行后可以看到打印了 该模块名位于 ./handheld_system_ext.mk 文件下。
在这里插入图片描述
到此我们可以知道要添加新应用 引入mk文件如何添加。

新建应用文件夹

我们先准备要预装的APP,可以到该网站下载想要安装的APK(因为该APK 兼容模拟器x86)
http://www.wzzti.com/apps/194011.html 。下载完成后,在对应的 packages/app 下 新建文件夹 AiEdu ,并将该apk也命名为 AiEdu.apk 后放在该文件夹下。

同时在该文件夹新建 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)

mk 文件中 定义该模块名 为 AiEdu ,整体目录结构如下
在这里插入图片描述

集成编译

完成app 和文件准备后, 将该模块名添加到第一步查找到的文件中。执行make编译,编译完成启动模拟器即可看到该app 已经预装完成。

# /system_ext packages
PRODUCT_PACKAGES += \
    Launcher3QuickStep \
    AiEdu \
    Provision \
    Settings \
    StorageManager \
    SystemUI \
    WallpaperCropper \

Android 12 编译问题

在android 12 编译会遇到该报错导致编译不过,搜索得知 是因为新版本artifact_path_requirements有对预装相关东西进行了规则检测。所以我们要允许该Apk 集成。

build/make/core/artifact_path_requirements.mk:26: warning:  build/make/target/product/sdk_phone_x86_64.mk produces files inside build/make/target/product/generic_system.mks artifact path requirement. 
Offending entries:
system/app/AiEdu/AiEdu.apk
In file included from build/make/core/main.mk:1383:
build/make/core/artifact_path_requirements.mk:26: error: Build failed.
00:42:13 ckati failed with: exit status 1

build/envsetup.sh 加上export DISABLE_ARTIFACT_PATH_REQUIREMENTS=“true” 就可以顺利编译通过不再报artifact_path_requirements错误,或者在make指令时候 带上该参数也可以。其实就相当于把新版本编译系统中artifact_path_requirements检测关闭就可以
在这里插入图片描述
注意添加后要关闭窗口 或者重新运行 source build/envsetup.sh 命名加载编译脚本

这样就完成了 第三方应用的预装

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值