Android预置apk到系统

Android预置Apk到系统,有如下几种状况:

一、带源码的apk/不带源码的apkjava

二、带so库/不带so库bash

三、用户能够卸载,恢复出厂设置时不能恢复/恢复出厂设置时可以恢复app

四、预置的位置ide

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

Android.mk文件

首先看两个简单的系统自带的apk的Android.mk函数

一、包含源码的apk package/app/Musicui

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))
复制代码

二、不带源码的apk google/apps/Chromegoogle

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中的相关配置项

内置Apk的关键点在于配置编译文件,即Android.mk文件,下面介绍一部分Android.mk中的相关配置项,更多的能够去网上寻找:spa

  • LOCAL_PRIVILEGED_MODULE
决定编译后apk的位置,若是设置为true,则生成在/system/priv-app,若是不设置或false,则生成在/system/app。
复制代码
  • LOCAL_CERTIFICATE
LOCAL_CERTIFICATE可设置的值以下:
testkey   默认使用,普通的apk
platform  APK所在进程的UID为system,完成一些系统的核心功能
shared    
media     
复制代码
  • $(call my-dir)
获取当前文件夹的路径
复制代码
  • $(call all-java-files-under, src)
获取src目录下全部java文件
复制代码
  • $(call all-makefiles-under,local_path)
获取local_path目录下全部Make文件
复制代码
  • LOCAL_PATH
LOCAL_PATH := $(call my-dir)      
此变量指示源文件在开发树中所处的位置。 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件自己所在的目录)的路径。
复制代码
  • CLEAR_VARS
include $(CLEAR_VARS)
由构建系统提供, CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,GNU Makefile 不会清除 LOCAL_PATH
复制代码
  • LOCAL_MODULE
LOCAL_MODULE := ApkTest
存储您要构建的模块的名称,每一个模块名称必须惟一,且不含任何空格.若是未设置,则默认使用LOCAL_PACKAGE_NAME
复制代码
  • LOCAL_PACKAGE_NAME
LOCAL_PACKAGE_NAME:= ApkTest
编译出来的apk名称
复制代码
  • LOCAL_MODULE_TAGS
LOCAL_MODULE_TAGS := optional
指定在什么版本下才会编译该模块,多是eng、user、debug、development、optional。
其中,optional是默认标签,指该模块在全部版本下都编译。
复制代码
  • LOCAL_MODULE_CLASS
LOCAL_MODULE_CLASS := APPS
标识所编译模块放置的位置, APPS表示放置在/system/app目录下。
复制代码
  • LOCAL_SRC_FILES
LOCAL_SRC_FILES := $(call all-java-files-under, src)或者
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
源文件列表
复制代码

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

  • 在packages/apps下面以须要预置的APK的名字建立一个新文件夹,以预置一个名为ApkTest的APK 为例debug

  • 将ApkTest APK的源码拷贝ApkTest文件夹下code

  • 在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下面)

  • 在packages/apps下面以须要预置的 APK 名字建立文件夹,以预置一个名为ApkTest的APK为例

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

  • 在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)
复制代码
  • 打开文件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下。
复制代码

待更新

相关文章
相关标签/搜索