Android系统开发 Android10_添加预装应用

发布时间 2023-11-30 20:13:31作者: 观心静

前言

  此博客以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

LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置: 如果不设置或者设为false,安装位置为system/app; 如果设置为true,安装位置为system/priv-app。

配置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