apk预装指南
1 方式一
- 这种方式预装的软件在开机自启应用处可能不显示。
- 相比于方式二,方式一安装的应用可获得的权限更高。
- 方式一是Android原生的软件预装方式。
1.1 目录结构
确保在vendor/rockchip/common/apps下创建相应的文件夹,每个APK一个文件夹。例如:
vendor/rockchip/common/apps/
└── Turnstile_APP/
├── Turnstile_APP_v1.0.1_PRO_release.apk
└── Android.mk
1.2 给予应用可执行权限
chmod 644 vendor/<your-vendor>/apps/Turnstile_APP/Turnstile_APP_v1.0.1_PRO_release.apk
1.3 Android.mk 文件配置
Android.mk 文件用于告知编译系统如何处理和编译APK文件。下面是一个示例:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Turnstile_APP
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := Turnstile_APP_v1.0.1_PRO_release.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
Android.mk 解读:
- LOCAL_PATH := $(call my-dir) - 定义当前文件夹的路径。
- include $(CLEAR_VARS) - 清除所有变量,以避免冲突。
- LOCAL_MODULE := Turnstile_APP - 定义模块名,这个名字会在
apps.mk中被引用。 - LOCAL_MODULE_CLASS := APPS - 指定这是一个应用程序模块。
- LOCAL_MODULE_TAGS := optional - 标记为可选模块,通常用于预装APK。
- LOCAL_CERTIFICATE := platform - 使用系统平台证书签名,这通常用于系统级应用。
- LOCAL_SRC_FILES := Turnstile_APP_v1.0.1_PRO_release.apk - 指定源文件,即APK文件。
- LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) - 设置模块后缀为
.apk。 - LOCAL_PRIVILEGED_MODULE := true - 表示此模块是特权模块,可以访问系统级API。
- include $(BUILD_PREBUILT) - 指示系统构建一个预编译模块。
1.4 修改 apps.mk
在vendor/rockchip/common/apps/apps.mk文件中,你需要添加你的应用名称到PRODUCT_PACKAGES列表中:
PRODUCT_PACKAGES += \
Turnstile_APP
确保Turnstile_APP与Android.mk中的LOCAL_MODULE属性值一致。
1.5 方式一总结
- 创建文件夹:在
vendor/rockchip/common/apps下为每个APK创建一个文件夹。 - 放置APK和
Android.mk:在每个文件夹中放入要预装的APK文件和相应的Android.mk文件。 - 修改
apps.mk:在apps.mk中添加应用名称到PRODUCT_PACKAGES列表中。
2 方式二
2.0 更新说明
如果是新版型,直接在device/rockchip/rk3588/rk3588_RB(示例版型)/下,添加下面三个目录,然后直接将apk放到对应的目录中即可,编译过程中会自动处理生成apk对应的Android.mk并提取出库文件:
这三个文件夹分别为:
preinstall:存放不可卸载的应用
preinstall_del_forever:存放可永久卸载的应用
preinstall_del:存放卸载后、 恢复出厂设置可自动恢复的应用
这里使用了device/rockchip/common/auto_generator.py这个脚本自动根据放入的apk生成对应的Android.mk文件。
2.1 目录结构与说明
预装 APK 的目录结构如下:
device/rockchip/rk3399/preinstall_del/
AppName/
AppName.apk
Android.mk
lib/
libExample.so
preinstall/: 不可卸载目录,APK 安装后不可被用户卸载。preinstall_del/: 可卸载目录,用户卸载后不会恢复。preinstall_del_forever/: 可卸载目录,用户卸载后恢复出厂设置也不会恢复。
2.1.1 为什么使用 rk3399 目录
预置 APK 的行为由 device/rockchip/common/device.mk 配置文件决定。部分开发人员迁移项目中,路径被写死为 rk3399,因此需要使用 rk3399 目录结构。(注意,下面修改的auto_generator.py的第一个参数实际上有个多余的preinstall,导致无法正常拼接)
# 配置预置 APK 路径
$(shell python device/rockchip/common/auto_generator.py device/rockchip/rk3399/preinstall preinstall bundled_persist-app $(TARGET_ARCH))
$(shell python device/rockchip/common/auto_generator.py device/rockchip/rk3399/preinstall preinstall_del bundled_uninstall_back-app $(TARGET_ARCH))
$(shell python device/rockchip/common/auto_generator.py device/rockchip/rk3399/preinstall preinstall_del_forever bundled_uninstall_gone-app $(TARGET_ARCH))
-include device/rockchip/rk3399/preinstall/preinstall.mk
-include device/rockchip/rk3399/preinstall_del/preinstall.mk
-include device/rockchip/rk3399/preinstall_del_forever/preinstall.mk
2.2 Android.mk 配置
文件路径:
device/rockchip/rk3399/preinstall_del/AppName/Android.mk
2.2.1 示例配置
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
# 模块名称
LOCAL_MODULE := Turnstile
# 模块类型为 APK
LOCAL_MODULE_CLASS := APPS
# 安装路径(可卸载)
LOCAL_MODULE_PATH := $(TARGET_OUT_ODM)/bundled_uninstall_back-app
# APK 文件名
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
# 使用已有签名
LOCAL_CERTIFICATE := PRESIGNED
# 可选标签
LOCAL_MODULE_TAGS := optional
# APK 后缀
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# JNI 库路径配置
LOCAL_JNI_SHARED_LIBRARIES_ABI := arm64
MY_LOCAL_PREBUILT_JNI_LIBS := \
lib/arm64/libWlt2BmpDemo.so \
lib/arm64/libYSerialPort.so \
lib/arm64/libaikl_calc_arm.so \
lib/arm64/libaikl_cluster_arm.so \
lib/arm64/libbd_unifylicense.so \
lib/arm64/libbdca.so \
lib/arm64/libbdface_sdk.so \
lib/arm64/libbrcrash.so \
lib/arm64/libbrcrash_dumper.so \
lib/arm64/libbronlinetracking.so \
lib/arm64/libc++_shared.so \
lib/arm64/libcrt288xur_drv.so \
lib/arm64/libliantian.so \
lib/arm64/libpaddle_light_api_shared.so \
lib/arm64/libwlt2bmp.so
# 把 JNI 库复制到目标路径
MY_APP_LIB_PATH := $(TARGET_OUT_ODM)/bundled_uninstall_back-app/$(LOCAL_MODULE)/lib/$(LOCAL_JNI_SHARED_LIBRARIES_ABI)
ifneq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI), None)
$(warning MY_APP_LIB_PATH=$(MY_APP_LIB_PATH))
LOCAL_POST_INSTALL_CMD := \
mkdir -p $(MY_APP_LIB_PATH) \
$(foreach lib, $(MY_LOCAL_PREBUILT_JNI_LIBS), ; cp -f $(LOCAL_PATH)/$(lib) $(MY_APP_LIB_PATH)/$(notdir $(lib)))
endif
include $(BUILD_PREBUILT)
2.3 preinstall.mk 配置
文件路径:
device/rockchip/rk3399/preinstall_del/preinstall.mk
2.3.1 示例配置
PRODUCT_PACKAGES += AppName
2.3.2 配置说明
PRODUCT_PACKAGES: 用于声明需要预装的模块名称(即LOCAL_MODULE值)。- 每个需要预装的 APK 都需要在
preinstall.mk中添加一行。
2.4 方式二总结
-
确定目录:选择
preinstall_del/目录以便用户可卸载。 - 配置
Android.mk:- 设置模块名称、安装路径、签名等。
- 配置JNI库路径和复制命令。
- 添加到
preinstall.mk:- 加入模块名称。
留下评论