android 编写 MK文件 预装到系统

Android预置Apk到系统,有以下几种情况:

1、带源码的apk/不带源码的apk
2、带so库/不带so库
3、用户可以卸载,恢复出厂设置时不能恢复/恢复出厂设置时能够恢复
4、预置的位置

预置到system/app/目录 (不可卸载)
预置到system/priv-app/目录 (不可卸载,系统核心应用)
预置到data/app/目录 (可卸载)

#Android.mk文件
首先看两个简单的系统自带的apk的Android.mk
1、包含源码的apk package/app/Music
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := Music
LOCAL_SDK_VERSION := current
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)

# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))


2、不带源码的apk google/apps/Chrome
LOCAL_PATH := $(call my-dir)

my_archs := arm arm64  
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))

include $(CLEAR_VARS)
LOCAL_MODULE := Chrome
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 := WebViewGoogle Browser Browser2 MtkBrowser MtkBrowserAutoTests BrowserSanityTest
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
LOCAL_REQUIRED_MODULES := WebViewStub BookmarkProvider PartnerBookmarksProvider
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)

Android.mk中的相关配置项

1.LOCAL_PRIVILEGED_MODULE
决定编译后apk的位置,如果设置为true,则生成在/system/priv-app,如果不设置或false,则生成在/system/app。

2.LOCAL_CERTIFICATE可设置的值如下:
testkey 默认使用,普通的apk
platform APK所在进程的UID为system,完成一些系统的核心功能
shared
media
PRESIGNED 表示APK签名使用原来签名,即第三方签名

3.$(call my-dir)
获取当前文件夹的路径

4.$(call all-java-files-under, src)
获取src目录下所有java文件

5.$(call all-makefiles-under,local_path)
获取local_path目录下所有Make文件

6.LOCAL_PATH
LOCAL_PATH := $(call my-dir)
此变量指示源文件在开发树中所处的位置。 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径。

7.CLEAR_VARS
include $(CLEAR_VARS)
由构建系统提供, CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,GNU Makefile 不会清除 LOCAL_PATH

8.LOCAL_MODULE
LOCAL_MODULE := ApkTest
存储您要构建的模块的名称,每个模块名称必须唯一,且不含任何空格.如果未设置,则默认使用LOCAL_PACKAGE_NAME

9.LOCAL_PACKAGE_NAME
LOCAL_PACKAGE_NAME:= ApkTest
编译出来的apk名称

10.LOCAL_MODULE_TAGS
LOCAL_MODULE_TAGS := optional
指定在什么版本下才会编译该模块,可能是eng、user、debug、development、optional。
其中,optional是默认标签,指该模块在所有版本下都编译。

11.LOCAL_MODULE_CLASS
LOCAL_MODULE_CLASS := APPS
标识所编译模块放置的位置, APPS表示放置在/system/app目录下。

12.LOCAL_SRC_FILES

LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk源文件列表

将带源码的APK预置进系统(默认放在package/app下面)

1.在packages/apps下面以需要预置的APK的名字创建一个新文件夹,以预置一个名为ApkTest的APK 为例

2.将ApkTest APK的源码拷贝ApkTest文件夹下

3.在ApkTest目录下创建一个名为 Android.mk的文件,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := ApkTest
LOCAL_SDK_VERSION := current
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)

# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

打开文件 device/mediatek/common/devices.mk , 将ApkTest添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += ApkTest

重新 build 整个工程

将无源码的 APK 预置进系统(默认放在package/app下面)

1.在packages/apps下面以需要预置的 APK 名字创建文件夹,以预置一个名为ApkTest的APK为例

2.将ApkTest.apk放到packages/apps/ApkTest下面

3.在packages/apps/ApkTest下面创建文件Android.mk,文件内容如下:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)

    # Module name should match apk name to be installed
    LOCAL_MODULE := ApkTest
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

    LOCAL_CERTIFICATE := PRESIGNED
    include $(BUILD_PREBUILT)

4.打开文件device\mediatek\common\device.mk,将ApkTest添加到PRODUCT_PACKAGES里面
PRODUCT_PACKAGES += ApkTest

重新build整个工程

如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。

修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335