注:本文只针对RK3568开发板Android 11系统进行定制,在其它系统上兼容性未经验证。
Android系统自带应用一般是以有源码的形式内置在系统中,本文是以无源码的形式进行应用内置(即直接将apk文件内置)。
在Android 11上要实现预装App到系统中,需要在Framework中进行以下修改(这里我以TeamViewerHost
应用为例):
无源码内置
使用
Android.mk
编译方式,在系统源码目录下创建文件夹和对apk进行编译,可以对应生产系统apk,普通apk和动态库编译等操作。
新建应用文件夹
进入到OK3568-android11-source/packages/apps
目录,新建TeamViewerHost
文件夹拷贝应用安装包到指定目录
将应用安装包TeamViewerHost.apk
文件拷贝到OK3568-android11-source/packages/apps/TeamViewerHost
目录下-
新建
Android.mk
配置文件
在该目录新建Android.mk
文件,输入如下内容:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #TeamViewerHost为应用名称 LOCAL_MODULE := TeamViewerHost # TeamViewerHost.apk为安装包文件名,这里也可以用$(LOCAL_MODULE).apk代替 LOCAL_SRC_FILES := TeamViewerHost.apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := .apk LOCAL_BUILT_MODULE_STEM := package.apk #LOCAL_CERTIFICATE 参数说明 #1.testkey:普通APK,默认情况下使用。 #2.platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。 #3.shared:该APK需要和home/contacts进程共享数据。 #4.media:该APK是media/download系统中的一环。 #5.PRESIGNED:使用apk原来的签名(这里应为是第三方应用,所以直接使用原签名)。 LOCAL_CERTIFICATE := PRESIGNED LOCAL_PROGUARD_ENABLED := disabled LOCAL_DEX_PREOPT := false LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PREBUILT)
属性说明:
属性名 含义 LOCAL_PATH := $(call my-dir) 固定开头,定义当前模块的相对路径,每个 Android.mk
文件必须以定义LOCAL_PATH
为开始,它用于在开发Tree
中查找源文件。include $(CLEAR_VARS
)固定内容,紧跟 LOCAL_PATH
。CLEAR_VARS
变量由Build System
提供,并指向一个指定的GNU Makefile
,由它负责清理除LOCAL_PATH
以外的LOCAL_**
变量。LOCAL_MODULE_TAGS: user/eng/tests/optional
,一般默认optional
就行,表示在什么版本情况下编译该版本,用于指定模块的标签。这些标签可以组合使用,例如user、eng、tests
等。每个模块可以有多个标签,而且不同的标签会决定该模块在哪些版本下编译。例如,如果一个模块被标记为user
,则只会在该模块所属版本的用户版本中编译;如果该模块被标记为eng
,则只会在该模块所属版本的eng
版本中编译,以此类推。LOCAL_MODULE 模块名,和其他模块不能重名,如果定义了 LOCAL_PACKAGE_NAME
就可以不用定义,因为默认赋值LOCAL_PACKAGE_NAME
。LOCAL_SRC_FILES 编译该模块所需的源文件:使用连接符“\”连接多个源文件。 LOCAL_CERTIFICATE testkey/platform/shared/media/PRESIGNED
,表示apk的签名方式:testkey
:普通apk,默认情况下使用;platform
:该apk完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system,可以参见Settings;shared
:该apk需要和 home/contacts 进程共享数据,可以参见 Launcher;media
:该apk是 media/download系统中的一环,可以参见 Gallery;PRESIGNED
:使用apk原来的签名。LOCAL_MODULE_CLASS 指定模块的类型,可用于生成 LOCAL_MODULE_PATH
的默认值。可以不指定,因为BUILD_PACKAGE
这些代码有指定,但是如果使用的是BUILD_PREBUILT
代码,同时没有指定LOCAL_MODULE_PATH
,那么应该是要指定的。include $(BUILD_PACKAGE) 表示生成一个 apk,它可以是多种类型,具体如下: BUILD_PACKAGE
(既可以编apk,也可以编资源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true);BUILD_JAVA_LIBRARY
(java共享库);BUILD_STATIC_JAVA_LIBRARY
(java静态库);BUILD_EXECUTABLE
(执行文件);BUILD_SHARED_LIBRARY
(native共享库);BUILD_STATIC_LIBRARY
(native静态库)。LOCAL_PROGUARD_ENABLED := disabled
指定不混淆代码,如果需要混淆可以通过LOCAL_PROGUARD_FLAGS
配置混淆规则。LOCAL_MODULE_SUFFIX 模块名后缀(可选),可以不指定。 LOCAL_PRIVILEGED_MODULE := true
表示apk
将预装到system/priv-app/
下 -
将
TeamViewerHost
添加到系统编译配置文件中
打开/OK3568-android-source/device/rockchip/rk356x/ok3568_r/ok3568_r.mk
问价,在PRODUCT_PACKAGES
中添加自己的app
名称:
重新编译烧录即可完成应用内置
拓展阅读
参考文章:
android 11(R)预装APP到data/app目录
android 11源码预置应用到系统中
Android mk预置系统app 安卓系统预装软件