Android系统内置应用
背景
客户提供APK,需要集成进系统,并且不可卸载
Android原生是怎么做的?
已Launcher3为例,apk是位于/system/priv-app/Launcher3
目录下
AOSP系统内置app步骤
1.在package/apps/目录
下创建相应的文件夹如:MyApp
2.在build/make/target/product/core.mk
加入该Module名字
3.再进行整体的make
Android系统内置APK作为系统应用,可分为:
- 不带任何so的应用
- 带有so的应用
不带任何so的应用
不带任何so的应用的.mk
文件示例
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")#打印输出
# Module name should match apk name to be installed
LOCAL_MODULE := MyApp
LOCAL_MODULE_TAGS := optional
#不管是user 还是eng 版本都会编译此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
一些说明:
LOCAL_PATH := $(call my-dir)
Android.mk
文件必须先定义LOCAL_PATH
变量。此变量表示源文件在开发树中的位置。在上述命令中,构建系统提供的宏函数my-dir
将返回当前目录(Android.mk
文件本身所在的目录)的路径。
include $(CLEAR_VARS)
CLEAR_VARS
变量指向一个特殊的GNU Makefile
,后者会为您清除许多LOCAL_XXX
变量,例如LOCAL_MODULE
、LOCAL_SRC_FILES
和LOCAL_STATIC_LIBRARIES
。请注意,GNU Makefile
不会清除LOCAL_PATH
。此变量必须保留其值,因为系统在单一GNU Make
执行上下文(其中的所有变量都是全局变量)中解析所有构建控制文件。在描述每个模块之前,您必须声明(重新声明)此变量。
LOCAL_MODULE := MyApp
此变量用于存储模块名称。指定的名称在所有模块名称中必须唯一,并且不得包含任何空格。您必须先定义该名称,然后才能添加任何脚本(
CLEAR_VARS
的脚本除外)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS
模块的tag,为debug eng tests optional samples shell_ash shell_mksh
等tag的组合,一个模块可有多个Tag。
user
:指该模块只在user版本下才编译eng
:指该模块只在eng版本下才编译tests
:指该模块只在tests版本下才编译optional
:指该模块在所有版本下都编译
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
目标文件的后缀。
COMMON_ANDROID_PACKAGE_SUFFIX := .apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_CERTIFICATE := PRESIGNED
表示APK签名使用原来签名,即第三方签名,若要使用系统签名,则可以改为LOCAL_CERTIFICATE := platform
系统前面,可以使apk获得系统权限
include $(BUILD_PREBUILT)
BUILD_PREBUILT
: 该模块已经预先编译
带有so的应用
带有so的应用,相对于不带so的应用,只是多了一步,需要提取apk里面lib的so文件,进行单独的内置
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")
# Module name should match apk name to be installed
LOCAL_MODULE := MyApp_SO
LOCAL_MODULE_TAGS := optional
#不管是user 还是eng 版本都会编译此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := lib/x86_64/libnative-lib.so
#@lib/x86/libtest.so \ //注意前面要用tab键隔开
#@lib/x86/libtest2.so //这是你需要添加的so 如果是 armeabi-v7a 直接替换掉armeabi
LOCAL_CERTIFICATE := platform
#表示app已经签名
include $(BUILD_PREBUILT)