android Q build 變化


一 概述

android Q build變化整體上越來越嚴格,語法上之前能夠使用的Q上將不能使用。

二 主要變化

2.1  'USER' 棄用 ‘USER’后面的值會被設置成‘nobody',android后續的修改都是圍繞着去除掉不同機器不同用戶的差異,使得滿足要求的任何機器或者用戶編譯結果相同。如果必須要使用的話,可以使用’BUILD_USERNAME‘來進行替代 2.2 ’BUILD_NUMBER‘ ’BUILD_NUMBER‘從Android.mk中移除 2.3 DIST_DIR, dist_goal, and dist-for-goals 在android.mk中DIST_DIR and dist_goal 不能再被使用,只能使用dist-for-goals 2.4 .PHONY 偽目標規則更加嚴格 .PHONY使用用戶交互型好的名字替代真是文件,但是使用偽目標每一此編譯都被識別成dirty,需要重新編譯。如果編譯目標是偽目標的話無額外開銷但是如果編譯目標依賴於偽目標的話,可能是一筆不小的開銷。 我們現在在Q上編譯,如果有如下的warning的話,.PHONY目標不允許使用'/'

...mk:42: warning: PHONY target "out/.../foo" looks like a real file (contains a "/") 

如果是如下錯誤的話,有兩個原因1) .PHONY的目標不是一個真正的文件 2) 目標是一個真實文件,但是不在outpu目錄下,在執行m clean的時候不能夠刪除它

...mk:42: warning: writing to readonly directory: "kernel-modules" 

在實際使用中,用的最多的是想bootloader kernel這種不屬於android編譯系統的模塊。他們使用偽目標的目的是在android的makefile中,不知道依賴是否有變化,因此要使用偽目標。谷歌建議此類編譯最好在android系統外進行編譯,以Prebuild的形式存在android的工程中。 總結下來,對於非android編譯系統的編譯問題,建議單獨編譯,如果非要添加進去的話,不要使用.PHONY

out/target/.../zImage: $(sort $(shell find -L $(KERNEL_SRCDIR)))
    ...

谷歌認為像kernel這樣的,如果不是debug kernel的話,不要每次都重新編譯,如果需要重新編譯的話,可以先clean在編譯。 2.5 Makefile中export and unexport  將被棄用 export 和unexport 變量的方式不被使用,如果要使用的話,建議使用方法如下:

$(intermediates)/generated_output.img:
    rm -rf $@ export MY_ENV_A="$(MY_A)"; make ... 

如果要設置很多的變量的話,使用方法如下:

envsh := $(intermediates)/env.sh $(envsh): rm -rf $@ echo 'export MY_ENV_A="$(MY_A)"' >$@ echo 'export MY_ENV_B="$(MY_B)"' >>$@ $(intermediates)/generated_output.img: PRIVATE_ENV := $(envsh) $(intermediates)/generated_output.img: $(envsh) a/b/c/package.sh rm -rf $@ source $(PRIVATE_ENV); make ... source $(PRIVATE_ENV); a/b/c/package.sh ... 

2.6 Module name將不能使用'/' 舉例來說

include $(CLEAR_VARS) LOCAL_MODULE := ver1/code.bin LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/firmware ... include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := ver2/code.bin LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/firmware ... include $(BUILD_PREBUILT) 

上面的LOCAL_MODULE 不應該出現'/',可以將代碼修改成下面這樣

include $(CLEAR_VARS) LOCAL_MODULE := ver1_code.bin LOCAL_MODULE_STEM := code.bin LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/firmware/ver1 ... include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := ver2_code.bin LOCAL_MODULE_STEM := code.bin LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/firmware/ver2 ... include $(BUILD_PREBUILT) 

在修改的同時,要將PRODUCT_PACKAGES和LOCAL_REQUIRED_MODULES對應的名字進行修改 2.7 Module 名字字符選擇 Module的名字從 a-z, A-Z, 0-9, and the special characters _.+-=,@~選取 2.8 PATH Tools android的編譯正朝着可重入性發展,也就是不依賴環境。為了實現這個目標PATH會指向android工程里的工具。目前的唯一區別就是刪除 host GCC工具。對於違反規則使用build server PATH中的工具和命令的話,目前只是記錄到LOG中,后面限制會更加嚴格,可能就無法使用。 在build/soong/ui/build/paths/config.go文件中包含相關配置,包含編譯中使用到的工具,如果不在這個工具列秒中,在out/soong.log文件中將有相關warning顯示。 為了解決這類問題,最好的方法就是使用,將相關tools放到prebuilt下,或者在編譯的時候將他編譯成host tools 可以通過設置TEMPORARY_DISABLE_PATH_RESTRICTIONS=true的方式暫時編譯通過。 2.9 在envsetup.sh中棄用'/' 谷歌那邊的編譯是不需要運行envsetup.sh的,許多odm還是需要運行這個腳本,里面的許多變量使用了絕對路徑

instead of use
OUT {#OUT} OUT_DIR
ANDROID_HOST_OUT {#ANDROID_HOST_OUT} HOST_OUT
ANDROID_PRODUCT_OUT {#ANDROID_PRODUCT_OUT} PRODUCT_OUT
ANDROID_HOST_OUT_TESTCASES {#ANDROID_HOST_OUT_TESTCASES} HOST_OUT_TESTCASES
ANDROID_TARGET_OUT_TESTCASES {#ANDROID_TARGET_OUT_TESTCASES} TARGET_OUT_TESTCASES

上面的envsetup.sh中的變量都取自makefile為,相對路徑。如果要使用絕對路徑的話,下面的方法,在單條規則中export

$(PRODUCT_OUT)/gen.img: my/src/path/gen.sh
    export PRODUCT_OUT=$$(cd $(PRODUCT_OUT); pwd); cd my/src/path; ./gen.sh -o $${PRODUCT_OUT}/gen.img 

2.9 ANDROID_BUILD_TOP 在android.mk文件中,可以設定當前的目錄為代碼目錄,可以使用.來替代或者直接指定文件,如果要使用絕對路徑的話,請參考上節的例子。 2.10 停止使用直接使用PATH 新的soong會修改PATH變量,不建議在Makefile中讀取這個變量。如果要使用的話,建議如下:

$(TARGET): myscript my/path/binary
    PATH=my/path:$$PATH myscript -o $@ 

2.11 不要使用PYTHONPATH 跟PATH變量一樣,PYTHONPATH 變量也是有變化的,不建議在Mafile頻繁讀取。谷歌建議將修改song python building support.這部分主要是 packages the python interpreter, libraries, and script all into one file。不過還是建議使用如下方法,更簡單一點:

$(TARGET): myscript.py $(sort $(shell find my/python/lib -name '*.py')) PYTHONPATH=my/python/lib:$$PYTHONPATH myscript.py -o $@ 

2.12 PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE和USE_CLANG_PLATFORM_BUILD  棄用

3 總結

android Q 主要的變化就是.PHONY偽目標使用更嚴格,除prebuilt下的命令使用除了config.go里面的,將不允許使用。

作者:Little熊貓 鏈接:https://www.jianshu.com/p/658ec93e84fd 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM