1. 程式人生 > >Android中如何不編譯源生模組

Android中如何不編譯源生模組

來源:

前言:

最近碰到一個問題,公司內部的app需要替換源生的app,也就是說不編譯源生的app,而編譯後的out下只能由公司指定的app,沒有源生的app。例如,源生的Launcher2。

網上搜了一下,並沒有多少相關的文章,後來就此問題研究了一下,這裡做個總結,如果有哪裡不對的請不吝賜教。

對於這個問題,有三種解決方案:

1、直接刪掉Launcher2這個目錄方案

2、Android中源生給出的替換方案

3、統一管理方案

1、直接刪掉Launcher2這個目錄方案

這是個暴力的解決辦法,但是移植性、維護性差一些。如果有的板卡需要,有的不需要,這樣就不能刪除了。

這個方案有利有弊,結合工程管理方便來。

2、Android中源生給出的替換方案

這個方案Android源生是存在的,仔細看下build/core/*.mk 就會發現有個變數叫LOCAL_OVERRIDES_PACKAGES

這個變數跟LOCAL_PACKAGE_NAME一樣,在app的Android.mk中新增需要替換掉什麼app(讓此app不參與編譯)只需要設定這個變數即可。

例如,


這裡設定好LOCAL_OVERRIDES_PACKAGES 就可以讓Launcher2不參與編譯。

3、統一管理方案

對於第2點的方案似乎已經達到目的了,但是如果不是替換,而是簡單的控制不讓其參與編譯,這個變數是無法設定的。

來看下這裡統一管理的方案,在Android中的makefile中有個變數PRODUCT_PACKAGES,這個變數是控制模組是否參與編譯,我們在device目錄下看到很多這樣的設定,這時候如果為了專案或者板卡維護,直接修改device下的PRODUCT_PACKAGES變數就可以了。但是有時候會看到有些模組不是在device下面控制,而是放在了build下面,這個時候為了專案維護性,不能直接修改build下的變數。

有了這樣的顧慮,為了以後專案維護性,想了一個辦法,那就是用一個變數統一管理,以後不管是什麼專案不需要源生的或者device下面已經設定好的PRODUCT_PACKAGES,只需要設定這個變數就可以了。

首先來看下PRODUCT_PACKAGES是怎麼使用的。

在build/core/product.mk中看到這樣的一個變數:


在makefile 中會將定義PRODUCT_PACKAGES的makefile通過 inherit-product或者 inherit-product-if-exists的函式傳入。

來看下 inherit-product 函式:


首先,通過normalize-paths 確定想要的path,這個函式最終呼叫的是一個python指令碼,感興趣可以跟一下。

接著,將_product_var_list中定義的字串中每個子串為名字的變數後面加上字尾,這個字尾就是需要inherit的makefile的路徑。

例如,這個makefile的路徑為device/common/hehe.mk,那最後變數的後面會加上@inherit:device/common/hehe.mk,表示該變數繼承自哪裡。

從這裡看,以後PRODUCT_PACKAGES這個變數後面會跟很多mk

第3步,將變數PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM 加入inherit的makefile的路徑(這裡為device/common/hehe.mk)排序後重新賦值。

第4步,最後統一為ALL_PRODUCTS。

這其中有個地方需要另外研究,就是變數 _include_stack,詳細看build/core/node_fns.mk 中的處理部分。

函式inherit-product-if-exists:


這個函式會先判斷inherit的makefile 是否存在。

上面只是前期的準備工作,主要的解析是在函式import-products中


這裡就不詳細說明,有興趣可以看下build/core/node_fns.mk 中的過程。

最終在main.mk中會做一個過濾:


上面的第2點就是這樣來的,詳細第2點的解析可以看下package.mk中的執行過程。

所以,最後如果想要達到統一的管理,可以在這裡做一個過濾,用一個變數統一管理。

假定這個變數的名字為PRODUCT_DEL_PACKAGES,表示需要刪掉的module,那新增後的過濾程式碼為:


新增後編譯就會把不需要編譯的module去掉。

當然,這個變數是需要跟PRODUCT_PACKAGES新增到 _product_var_list 中,詳細看 build/core/product.mk中:


Android 的build 過程比較複雜,這裡只針對這3中辦法做個簡單的總結,後期後持續總結build下編譯過程。請大神不吝賜教。

參考: