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下。
複製代碼

待更新

相關文章
相關標籤/搜索