【RK3568】Android 11预装(内置)应用到系统中

注:本文只针对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_PATHCLEAR_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 安卓系统预装软件

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容