[Android]多module合成單一module技巧

weixin_33978044發表於2016-07-27

以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。

[Android]如何做一個崩潰率少於千分之三噶應用app--章節列表

我建立了一個關於Android架構學習的群,裡面可以進一步進行元件化學習的交流。

群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!!

692087-1840850f50935f73.png


為何需要做會出現這樣的需求呢?

我們當時開發的架構就是用多個module作為功能模組載入,所以就會單個專案出現多module的狀態。

抽出sdk生成aar的時候,只能由一個module生成一個aar。


檢視網上很多資料,最終在StackOverflow裡查到只能多個module合併成單一module才能處理生成aar,不然就只能修改android編譯的原始碼了。

但是我們工程業務是在持續開發中迭代的,我們沒可能每次想更新一個sdk的時候都再做這種重複噶工作量。

那要如何處理這種多module合併的問題。

沒錯,我們需要寫一個指令碼。


然後我們選擇了寫一個python的指令碼。

說明一下我的工程架構

1.工程有一個主的工程client入口依賴於各個功能模組

2.工程功能module模組依賴於一個base的模組

3.base的module模組依賴於core和framework的模組。

如下圖:

692087-b5e0cc2395b1291e.png

Q����


首先我們需要了解一下我們考慮的地方

1.如何生成一個總工程的AndroidMainfest呢?因為多個module,裡面肯定有可能載入了很多四大元件的,那麼都需要在各自的module註冊的AndroidMainfest註冊的。

2.假如java檔案有依賴於R.檔案,而java檔案分別在不同的module裡面,合併module,其原來R的索引就會不存在了

3.value裡面的string color等檔案會同名,如何處理呢?

4.build.gradle如何配置呢?


對於上面的問題解決的方案:

1.將本來工程編譯成功後,在build\intermediates\mainifests\full裡面有已經生成好的AndroidMainfest.xml。

這個檔案有全部已經打包好四大元件。所以其實編譯器是有能力將全部的module編譯成單一module的,只是沒有公開這樣的設定

2.對於依賴的R.檔案,工程最終還是要編譯成client的app的,將全部的java檔案有加入import R的依賴移除,再新增成client的R依賴

3.value裡面的檔案可以前部加入一個module的字首(如string.xml,改為base_string.xml),aapt生成string裡面的字元最好不要重複名稱

4.build.gradle 需要手動整合全部module所要依賴的修改(例如分享模組,會需要依賴分享的庫,圖片模組需要加入圖片庫),然後才能實驗編譯


還需要總結一下我之後踩到的一些坑

1.因為python是現學現用的,可能很多技巧也還沒接觸到,例如shutil.copyfile,shutil.copytree,os.system("xcopy")是有很大的區別的,請先嚐試一下這些方法的區別,我一般都是用cmd執行試驗的。

2.Android中請確定資源的名稱一定要是唯一的,例如drawable和layout,其他java檔案等,請儘量名稱不要重名。

3.因為每個module建立的時候都有一個的對應的app_name,可以將其刪除,這樣會避免衝突

4.移植的時候不需要將各個module裡面的AndroidMainfest和build.gradle檔案移到資料夾裡面

5.移植的時候,請先移植client的module(原生成app的module),然後再移植base,core,framework等基礎module,再去移植其他功能模組的module,然後再替換AndroidMainfest和build.gradle等檔案


這些都是總結出來的一些經驗,希望對各位有幫助吧,如果有疑問可以在之下留言。我收到會逐一回復。

相關文章