[Android]多module合成單一module技巧
以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。
[Android]如何做一個崩潰率少於千分之三噶應用app--章節列表
我建立了一個關於Android架構學習的群,裡面可以進一步進行元件化學習的交流。
群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!!
為何需要做會出現這樣的需求呢?
我們當時開發的架構就是用多個module作為功能模組載入,所以就會單個專案出現多module的狀態。
抽出sdk生成aar的時候,只能由一個module生成一個aar。
檢視網上很多資料,最終在StackOverflow裡查到只能多個module合併成單一module才能處理生成aar,不然就只能修改android編譯的原始碼了。
但是我們工程業務是在持續開發中迭代的,我們沒可能每次想更新一個sdk的時候都再做這種重複噶工作量。
那要如何處理這種多module合併的問題。
沒錯,我們需要寫一個指令碼。
然後我們選擇了寫一個python的指令碼。
說明一下我的工程架構
1.工程有一個主的工程client入口依賴於各個功能模組
2.工程功能module模組依賴於一個base的模組
3.base的module模組依賴於core和framework的模組。
如下圖:
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等檔案
這些都是總結出來的一些經驗,希望對各位有幫助吧,如果有疑問可以在之下留言。我收到會逐一回復。
相關文章
- Android:一個專案提交多個module到JCenterAndroid
- 多module開發時module模板外掛開發
- module hmrclient is not a registered callable moduleclient
- eclipse中一個project下多個module?EclipseProject
- Android Studio新建module,以及module引用aar等相關問題Android
- Module of ORacleOracle
- Android Studio module 打aar包Android
- TypeScript 裡的 module 解析過程 - Module ResolutionTypeScript
- Go module vendorGo
- Vuex之moduleVue
- exprots && module exportsExport
- 常用Function ModuleFunction
- go vendor moduleGo
- module_softdep
- 如何建立依賴專案工程--android moduleAndroid
- 向kernel module 傳遞引數(Passing Arugments to Kernel Module)
- JS MODULE 大戰JS
- Module的語法
- Module Federation原理剖析
- ImportError: No module named `defusedxml`ImportErrorXML
- Python模組(module)Python
- ImportError: No module named yamlImportErrorYAML
- ImportError: No module named utilsImportError
- ModuleNotFoundError: No module named 'sqlite'ErrorSQLite
- nodejs module/requireNodeJSUI
- ImportError: No module named cElementTreeImportError
- php核心分析(一)-sapi_module_structPHPAPIStruct
- 從module的簡單實現到模組化
- Maven Archetype 多 Module 自定義程式碼腳手架Maven
- maven 包管理平臺-05-multi module 多模組Maven
- [ Module ] 環境變數管理工具 Module 安裝和使用變數
- 解決cannot find module providing package或cannot find main modulePackageAI
- 深入理解es module
- 理解nodejs的moduleNodeJS
- TypeScript 裡的 module 概念TypeScript
- ESCMScript(2)Module語法
- ModuleNotFoundError: No module named 'pyttsx'ErrorTTS
- ImportError: No module named torchvisionImportError