2. 集成apk到系统

本章介绍如何将自己的apk集成到SDK源码中,编译出来的镜像默认带有自己的apk应用。

2.1. 集成apk到SDK源码

以野火综合应用ebf_android_app.apk为例进行说明。

2.1.1. 创建apk存放目录

在SDK源码/vendor/rockchip/common/apps/目录下创建文件夹ebf_android_app,然后把ebf_android_app.apk放进新创建的ebf_android_app文件夹中。

2.1.2. 创建Android.mk

在ebf_android_app文件夹创建Android.mk文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
###############################################################################
# ebf_android_app
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ebf_android_app
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)

参数说明如下:

  • LOCAL_PATH := $(call my-dir) 定义当前模块的路径,$(call my-dir)是Android编译系统提供的函数,返回当前Android.mk文件所在的目录。

  • include $(CLEAR_VARS) 清空所有以LOCAL_开头的变量(如LOCAL_MODULE、LOCAL_SRC_FILES等),避免上一个模块的变量影响当前模块,是多模块编译时的必备语句。

  • LOCAL_MODULE := ebf_android_app 定义模块名称为ebf_android_app,这是编译系统识别模块的唯一标识,最终生成的文件会以此命名。

  • LOCAL_MODULE_CLASS := APPS 指定模块类型为APPS(应用程序),告诉编译系统这是一个Android应用,会被安装到设备的/system/app或/data/app目录。

  • LOCAL_MODULE_TAGS := optional 定义模块的编译标签为optional(可选),表示该模块不会被默认编译,需要通过PRODUCT_PACKAGES显式指定才会被包含到镜像中。

  • LOCAL_BUILT_MODULE_STEM := package.apk 定义编译后生成的模块文件名为package.apk,但最终会被重命名为LOCAL_MODULE指定的名称(即ebf_android_app.apk)。

  • LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 指定模块的文件后缀为.apk(COMMON_ANDROID_PACKAGE_SUFFIX是系统定义的变量,值为.apk),与APPS类型对应。

  • LOCAL_CERTIFICATE := PRESIGNED 指定 APK 的签名方式为PRESIGNED(已签名),表示该 APK 已经用私钥签名过,编译系统不会再对其进行签名。

  • LOCAL_SRC_FILES := $(LOCAL_MODULE).apk 指定源文件路径为当前目录下的ebf_android_app.apk($(LOCAL_MODULE)即模块名),表示这是一个预编译的APK,不需要源码编译,直接打包到系统中。

  • include $(BUILD_PREBUILT) 引入预编译模块的编译规则,告诉编译系统这是一个预编译文件(此处为APK),不需要编译源码,只需按照定义的规则复制到输出目录并打包到系统镜像。

如下图所示:

../../_images/integrate_apk_0.jpg

2.1.3. 修改device.mk

以上LOCAL_MODULE_TAGS配置为optional,需要通过PRODUCT_PACKAGES显式指定才会被包含到镜像中,而PRODUCT_PACKAGES位于SDK源码/device/rockchip/rk[具体芯片]/device.mk中。

以安卓12 SDK源码为例,修改device.mk的PRODUCT_PACKAGES添加apk名字ebf_android_app,如下图所示:

../../_images/integrate_apk_1.jpg

2.2. 编译SDK源码并烧录系统

参考 编译 Android 镜像 章节重新编译镜像并将编译出来的镜像烧录到板卡。

点击桌面底端往上拉打开安卓应用界面,其中应用logo是野火logo以及应用名字为ebf_android_app的应用就是野火安卓综合测试应用App,如下图:

应用搜索栏界面

2.3. 一个Android.mk集成多个apk

如果自己的apk比较多,可将apk都存放到一个目录中,在Android.mk中指定多个apk

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
###############################################################################
LOCAL_PATH := $(call my-dir)
# apk1
include $(CLEAR_VARS)
LOCAL_MODULE := apk1
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)

# apk2
include $(CLEAR_VARS)
LOCAL_MODULE := apk2
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)

# apk3
include $(CLEAR_VARS)
LOCAL_MODULE := jdddz_117603
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)

修改device.mk的PRODUCT_PACKAGES添加全部apk名字:

1
2
3
4
5
6
7
8
PRODUCT_PACKAGES += \
   fsck.exfat \
   mkfs.exfat \
   tune.exfat \
   dump.exfat \
   apk1 \
   apk2 \
   apk3

修改完成后重新编译镜像并烧录到板卡中即可。