android編譯時如何決定一個APK等Module是否被自動編譯到system.img中
來源:程序員人生 發(fā)布時間:2016-07-06 08:22:00 閱讀次數(shù):2730次
??
android在全局履行make時,編譯目標的1個入口files是依賴于modules_to_install的
818 .PHONY: files
819 files: prebuilt \
820 $(modules_to_install) \
821 $(INSTALLED_ANDROID_INFO_TXT_TARGET)
而modules_to_install變量的組成定義以下:
719 modules_to_install := $(sort \
720 $(ALL_DEFAULT_INSTALLED_MODULES) \ //包括Product_copy_file的入口dst
721 $(product_FILES) \ //包括變量PRODUCT_PACKAGES定義的變量
722 $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \ //eng_MDOULES/debug_MODULES 變量PRODUCT_PACKAGES_ENG入口
723 $(CUSTOM_MODULES) \
724 )
即如果上面的變量中要是沒有定義對應的目標模塊,則即便加載了對應模塊的Android.mk文件(加載Android.mk文件只是建立了模塊編譯和安裝所需要的各種依賴關系),但在全局編譯時終究還是不會履行build和install操作的,由于該module編譯入口并沒有存在于modules_to_install變量當中:
704 eng_MODULES := $(sort \
705 $(call get-tagged-modules,eng) \
706 $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \
707 )
671 product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
690 product_FILES := $(call module-installed-files, $(product_MODULES))
這里需要區(qū)分于單個Android.mk模塊的mm/mmm指令,他的make編譯進程時是直接將all_modules(本質也就是Andorid.mk中定義的LOCAL_MODULE變量)變量作為編譯的入口,而該入口all_modules 又是依賴于LOCAL_BUILT_MODULE和LOCAL_INSTALLED_MODULE這兩個變量的,故每次全新的mm操作肯定會履行built和install的操作。
QA: 如何讓系統(tǒng)中的某個默許模塊不被安裝到system.img中去,最根本的方法是:
android系統(tǒng)默許的PRODUCT_PACKAGES的變量配置mk文件1般存在于build/target/product下,另外和自己hardware平臺相干的模塊需求1般是定義到device目錄下的product.mk或device.mk文件中。如果不想讓某個系統(tǒng)模塊如apk等編譯進入system下,則需要定位到PRODUCT_PACKAGES 變量并刪除bypass相應的module名字(1般加在PRODUCT_PACKAGES變量中的模塊名字就是定義在android.mk中的LOCAL_MODULE變量值)。
ps:固然如果Android.mk中的模塊存在依賴關系,則對應的依賴目標模塊所在的android.mk定義的LOCAL_MODULE也是會編譯和安裝輸出的,無需在變量PRODUCT_PACKAGES指定。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈