一、帶源碼的apk/不帶源碼的apkjava
二、帶so庫/不帶so庫bash
三、用戶能夠卸載,恢復出廠設置時不能恢復/恢復出廠設置時可以恢復app
四、預置的位置ide
首先看兩個簡單的系統自帶的apk的Android.mk函數
一、包含源碼的apk package/app/Music
ui
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/Chrome
google
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)
複製代碼
內置Apk的關鍵點在於配置編譯文件,即Android.mk文件,下面介紹一部分Android.mk中的相關配置項,更多的能夠去網上尋找:spa
決定編譯後apk的位置,若是設置爲true,則生成在/system/priv-app,若是不設置或false,則生成在/system/app。
複製代碼
LOCAL_CERTIFICATE可設置的值以下:
testkey 默認使用,普通的apk
platform APK所在進程的UID爲system,完成一些系統的核心功能
shared
media
複製代碼
獲取當前文件夾的路徑
複製代碼
獲取src目錄下全部java文件
複製代碼
獲取local_path目錄下全部Make文件
複製代碼
LOCAL_PATH := $(call my-dir)
此變量指示源文件在開發樹中所處的位置。 在這裏,構建系統提供的宏函數 my-dir 將返回當前目錄(Android.mk 文件自己所在的目錄)的路徑。
複製代碼
include $(CLEAR_VARS)
由構建系統提供, CLEAR_VARS 變量指向一個特殊的 GNU Makefile,後者會清除許多 LOCAL_XXX 變量,GNU Makefile 不會清除 LOCAL_PATH
複製代碼
LOCAL_MODULE := ApkTest
存儲您要構建的模塊的名稱,每一個模塊名稱必須惟一,且不含任何空格.若是未設置,則默認使用LOCAL_PACKAGE_NAME
複製代碼
LOCAL_PACKAGE_NAME:= ApkTest
編譯出來的apk名稱
複製代碼
LOCAL_MODULE_TAGS := optional
指定在什麼版本下才會編譯該模塊,多是eng、user、debug、development、optional。
其中,optional是默認標籤,指該模塊在全部版本下都編譯。
複製代碼
LOCAL_MODULE_CLASS := APPS
標識所編譯模塊放置的位置, APPS表示放置在/system/app目錄下。
複製代碼
LOCAL_SRC_FILES := $(call all-java-files-under, src)或者
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
源文件列表
複製代碼
在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 整個工程
在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下。
複製代碼
待更新