Android 系统预置 APP 是做 Framework 应用开发经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP。
预置 apk
示例说明
以 Shadowsocks.apk 示例,在 AOSP/packages/apps
新建名为 Shadowsocks 的文件,放入 Shadowsocks.apk,再新建 Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := < your app folder name >
# 签名
LOCAL_CERTIFICATE := < desired key >
# 指定 src 目录
LOCAL_SRC_FILES := < app apk filename >
LOCAL_MODULE_CLASS := APPS
# 该模块的后缀,不用定义
#LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)
解释:
1、LOCAL_PATH := $(call my-dir)
每个 Android.mk 文件必须以定义 LOCAL_PATH 为开始,它用于在开发 tree 中查找源文件。
2、include $(CLEAR_VARS)
CLEAR_VARS 变量由 Build System 提供,并指向一个指定的 GNU Makefile,由它负责清理很多 LOCAL_xxx
。
例如:LOCAL_MODULE
, LOCAL_SRC_FILES
, LOCAL_STATIC_LIBRARIES
等等,但不清理LOCAL_PATH
。
3、LOCAL_MODULE_TAGS := user eng tests optional
可选定义,表示在什么版本情况下编译该版本,默认 optional。
- user: 指该模块只在 user 版本下才编译
- eng: 指该模块只在 eng 版本下才编译
- tests: 指该模块只在 tests 版本下才编译
- optional:指该模块在所有版本下都编译
4、LOCAL_MODULE
模块名,可不用定义,默认 = $(LOCAL_PACKAGE_NAME)
,不能和既有模块相同,如果该变量未设置,则使用 LOCAL_PACKAGE_NAME
,如果再没有,就会编译失败。
5、LOCAL_CERTIFICATE
在什么情况下签名。
- testkey:普通 APK,默认情况下使用。
- platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,
这种方式编译出来的 APK 所在进程的 UID 为 system,可以参见 Settings。 - shared:该 APK 需要和
home/contacts
进程共享数据,可以参见 Launcher。 - media:该 APK 是
media/download
系统中的一环,可以参见 Gallery。
6、LOCAL_MODULE_CLASS
指定模块的类型,可不用定义。
# 编译 apk 文件
LOCAL_MODULE_CLASS := APPS
# 编译 jar 包
LOCAL_MODULE_CLASS := JAVA_LIBRAYIES
# 定义动态库文件
LOCAL_MODULE_CLASS := SHARED_LIBRAYIES
# 编译可执行文件
LOCAL_MODULE_CLASS := EXECUTABLES