建置 apk 中會用到的 mk 大致如下
- package.mk
- package_internal.mk
- java.mk
- dex_preopt_odex_install.mk
- install_jni_libs.mk
- install_jni_libs_interal.mk
開頭是 package.mk
package.mk, package_internal.mk 用於打包 apk
在 package.mk 中會引用 package_internal.mk
include $(BUILD_SYSTEM)/package_internal.mkpackage_internal.mk 這隻裏頭會看到一堆處理打包事情的指令
例如處理 resource(前置), proguard(前置), compile, signkey, zipalign, include jni
前置設定完成後,開始進行編譯(使用 java.mk 這隻 script)
java.mk 把 source 編譯成 jar 跟 dex (class.dex 就是在這邊產生的),如果是 RenderScript 跟 FilterScript 在中間也會被轉成 .java 和 .bc 檔案, 這隻也會執行 proguard
編譯完成後,最後是很重要的打包動作 ( 此時已跳出java.mk 回到 package_internal.mk)
$(LOCAL_BUILT_MODULE): $(all_res_assets) $(jni_shared_libraries) $(full_android_manifest) @echo "target Package: $(PRIVATE_MODULE) ($@)" $(create-empty-package) $(add-assets-to-package) ifneq ($(jni_shared_libraries),) $(add-jni-shared-libs-to-package) endif ifneq ($(full_classes_jar),) $(add-dex-to-package) endif $(add-carried-java-resources) ifneq ($(extra_jar_args),) $(add-java-resources-to-package) endif $(sign-package) ifdef LOCAL_DEX_PREOPT ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif endif @# Alignment must happen after all other zip operations. $(align-package)
順帶一提是很多 function 的定義都是在 definition.mk
下圖簡單的展示整個建置流程
No comments:
Post a Comment