平台及環境設置

平台

實驗平台:Nexus 5
Android版本:android-4.4_r1
前置知識: Howto Build Android KitKat (4.4) for the Google Nexus 5

環境設置

在AOSP資料夾中

source build/envsetup.sh
lunch aosp_hammerhead-userdebug

目標:在AOSP當中加入一個已經編譯好的apk檔,Hello.apk

手動編譯設置

預設的app放在 AOSP/packages/apps下,任意觀看此目錄下的資料夾,會發現皆有Android.mk此檔案,此為AOSP編譯規則。
參看 Secrets of Android.mk此份文件中的Adding a prebuilt APK章節。

依樣畫葫蘆,在AOSP/packages/apps目錄中手動創造Hello資料夾,放入Android.mk。

Android.mk

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

# Module name should match apk name to be installed.
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

並使用Android Studio(或eclipse)隨便製造出一個Hello.apk,同樣將其放置在AOSP/packages/apps目錄下。
設置好環境後,使用指令mm在Hello資料夾底下進行編譯,即可將檔案複製到AOSP/out/target/product/板子名/system/app/裏面去。
最後執行make snod即可將此apk包入system.img之中。

註:若放置的apk沒簽名,可能會出現

build/core/prebuilt.mk:122: *** No LOCAL_CERTIFICATE specified for prebuilt "packages/apps/Hello/Hello .apk".  Stop.

此錯誤訊息。 關於如何產生簽名過後的apk,可參看Android官網
眼尖的人應該注意到,在上述的Android.mk當中多了一行LOCAL_CERTIFICATE := PRESIGNED,若沒有此行,則即使在Android Studio中已經編譯出簽名過後的apk,依然會出現錯誤訊息。要小心。

自動編譯設置

上述的手動編譯可總結為三步驟

  1. 在AOSP/packages/apps裡新增Hello資料夾,並放入Android.mk與Hello.apk
  2. 在Hello資料夾使用指令mm,檔案會複製到AOSP/out/target/product/板子名/system/app/
  3. 使用指令make snod將檔案打包進system.img之中

想像每次修改檔案,皆需重複執行2,3步驟,不太方便。若有不只一個的pre-built apk,則進入每個資料夾使用mm更是麻煩。所以我們要修改make規則,讓AOSP在執行make時,也能偵測到這些新增資料夾。
修改的地方位在AOSP/build/target/product/generic_no_telephony.mk,可以發現這個檔案中有不少的原生app名稱。
Hello加入PRODUCT_PACKAGES之下。如

generic_no_telephony.mk

(...省略...)
 PRODUCT_PACKAGES := \
      Hello
(...省略...)

如此一來就可以在一般make時偵測到AOSP/packages/apps所新增的Hello資料夾。

Reference