版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17855805.html
前言
此博客以Android10为准,请注意在预装应用根据不同平台(MTK、展讯、瑞芯微),也是有所区别的,所以实际导入细节请你的平台文档为准。此篇博客只讲解原生AOSP的预装应用。
将应用添加到系统中,编译前只有2个目录可以存放应用vendor/apps与packages/apps
这两个目录其实没啥区别,甚至存放应用就没有目录的限制,理论你随意创建一个文件夹都可以,因为识别路径的关键是PRODUCT_PACKAGES配置(这个后面会讲到)。但是这不符合规则默契,所以我们还是得老老实实的放到上面2个目录中。
vendor/apps目录是厂商的客制化目录,存放一些第三方厂商的配置文件、firmware以及动态库等等,其中也包括了应用。vendor这个目录在原生aosp里是不存在的,它需要你自己创建。但是如果你是用MTK或者展讯、瑞芯微的这些厂商的aosp,那么 vendor目录他们早就创建好了。
packages/apps目录,完全是Android原生的应用目录,里面包含了Email、Music、Gallery、Launcher3 等等系统应用,你也可以在这个目录下添加自己的应用。
所以这边推荐是将自己的应用放到vendor客制化目录下,方便与原生的应用隔开管理。至于有些人担心应用的是否可卸载、是否是系统级应用,这与在不在vendor或者packages等等无关。 有关系的是Android.mk文件的配置,所以这点无需苦恼。
所以下面的博客中将讲解如何将应用添加到vendor/apps。不讲解如何将应用添加到packages/apps目录,因为操作上与添加到vendor/apps没区别,只是路径不同。
上面是编译前的目录,这里是编译后的目录,在配置Android.mk文件,可以将应用编译到如下目标文件:
- /system/framework 用于存放资源型应用(系统框架)
- /system/app 用于存放系统应用,不能卸载
- /systme/priv-app Android4.4+ 新增,系统 [ 核心 ] 应用存放路径(最高权限)
- /vendor/app 用于存放厂商应用,可以卸载,恢复出厂时恢复
- /data/app 用于存放用户应用,可以卸载,恢复出厂时不能恢复
- /data/app-private Android4.4+ 新增,受 DRM 保护的应用存放路径
注意事项
应用架构
因为Android模拟器为了在电脑上流畅运行所以大部分人会选择x86_64架构,而实体机大部分是ARM架构, 所以在添加预装应用前,请先判断自己的app选择了什么架构,因为架构不支持会导致应用无法安装。而现在的大部分主流的应用都只支持ARM架构,如果你是用模拟器正在学习framework开发,这里建议自己用Android studio编译一个支持x86_64的应用。
将应用添加到data_无源码_无法卸载
创建目录
这里的vendor目录其实是需要你自己在aosp根目录下创建的(原生的aosp不自带这个目录),你可以通过下面这个命令一次性创建好全部目录。
mkdir -p vendor/apps
接下来进入这个目录,创建一个你需要导入的应用目录,用来存放.apk与.mk文件,如下我创建了一个叫Calligraphy的应用目录
~/aosp/vendor/apps$ mkdir Calligraphy
配置apk与android.mk文件
将apk文件cp到你创建目录下,并且创建Android.mk文件
$ touch Android.mk
在Android.mk 填入如下内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := Calligraphy.apk
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_PREBUILT)
最后目录下的2个文件
Android.mk的参数解释
LOCAL_MODULE
用来指定模块的名称,该模块名称需要加入到PRODUCT_PACKAGES(加入这参数下面会说)
LOCAL_MODULE_TAGS
用来指定该app在编译什么样子的版本的时候会被安装到机器上;
- user: 指该模块只在user版本下才编译
- eng: 指该模块只在eng版本下才编译
- tests: 指该模块只在tests版本下才编译
- optional:指该模块在所有版本下都编译
LOCAL_MODULE_CLASS
在采用预装这种形式的时候,该变量来指定预装的模块的类型,此处为APPS;
LOCAL_CERTIFICATE
用于设置APK的签名模式,一共有如下四种:
- media 使用media签名文件签名
- platform 使用平台签名文件签名,也就是系统签名
- shared使用shared签名文件签名
- PRESIGNED 如果文件已经签过名,不需要重新签名,则使用PRESIGNED
LOCAL_SRC_FILES
要预装的APK源文件;
LOCAL_PROPRIETARY_MODULE
配置device.mk文件
这里可以搜索下device.mk,会发现device.mk会有很多同名文件,如下图:
首先,我们需要修改目标在build/make目录下,所以把目标缩小到这些目录下,其次你会发现这些目录下也有很多device.mk,这是是与你需要编译的cpu架构有关,与你的在编译时选择lunch有关。 我自己这边是选择编译的是lunch 24 所对应的就是x86_64.
所以,我这边是打开generice_x86_64目录下的device.mk进行修改。增加需要编译的apk目录,如果是第一次配置,没有PRODUCT_PACKAGES配置项,你需要自己添加上去,并且增加上面的应用目录名称,如下图片:
执行编译后,查看结果
在编译后的out文件查看结果
刷机查看结果
在设置中查看
用adb查看结果
$ adb shell
my_device_01:/ # cd vendor/app/
my_device_01:/vendor/app # ls
BiliBili Bing Calligraphy
将应用添加到vendor_无源码_无法卸载
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/app
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
end
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17855805.html