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

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

我們當時開發的架構就是用多個module作爲功能模塊加載,所以就會單個項目出現多module的狀態。

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


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

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

那要如何處理這種多

沒錯,我們需要寫一個腳本。


然後我們選擇了寫一個python的腳本。

說明一下我的工程架構

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

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

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

如下圖:



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

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等文件


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章