2015/06/01

從 source code 編譯 Android APK 的筆記

以下的 scripts 都在 build/core/ 底下

建置 apk 中會用到的 mk 大致如下
  1. package.mk
  2. package_internal.mk
  3. java.mk
  4. dex_preopt_odex_install.mk
  5. install_jni_libs.mk
  6. install_jni_libs_interal.mk

開頭是 package.mk

package.mk, package_internal.mk 用於打包 apk

在 package.mk 中會引用 package_internal.mk

include $(BUILD_SYSTEM)/package_internal.mk

package_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