Android一套程式碼打不同的包工程配置詳解_下-gradle配置高階使用
本節是基於前面兩節來講,如果沒有看的話建議先看上面的基礎知識,有個整體瞭解以後本章理解起來會更容易。
第一節的連結: https://blog.csdn.net/helloworld19870427/article/details/83071728
第二節的連結: https://blog.csdn.net/helloworld19870427/article/details/83072282
前面第二節講過,一套程式碼可以根據變數配置打多個包,但是依據第二節的做法雖然打了多個包,但是多個包的程式碼都是一樣的,只是裡面配置不一樣, 如果有一個功能只有在A工程中有,在B工程中沒有,這樣的做法明顯B裡面有了多餘的程式碼,這樣B包會變大,有沒有辦法我寫的程式碼只給A不給B, 某個功能只給某一個工程使用? 還有工程中依賴了很多library,無論是aar還是程式碼依賴的library我們能不能配置A工程依賴哪幾個庫,B工程依賴另外幾個庫,只要四個變數(第二節中有解釋)一選,立刻就能提取出來A工程,包括A工程依賴的包, 切換到B工程B工程就會依賴它自己的包,跟A工程不影響,當然有, 請往下看:
一、針對某個工程寫程式碼
1、回憶一下以前的配置:
productFlavors { own { applicationId "com.proj.config.projectconfig" manifestPlaceholders = [ umeng_app_key: "這是own工程使用的key" ] } vores { applicationId "com.proj.vores.projectconfig" manifestPlaceholders = [ umeng_app_key: "這是vores工程使用的key" ] } }
有了上面程式碼我們同步gradle以後左下角會產生四個變數:
這時候我們在src上面點選右鍵:依次選擇New/Folder/ ,下面會出現紅框部分
紅框中我們先選擇Java Folder,會出現讓你選擇給某個應用建立資料夾:
own和vores就是我們productFlavors裡面的變數, 我們選擇own, 然後再重複上面的步驟,選擇vores, 兩個資料夾都建立起來:
上圖中own是我們自己的工程, 它裡面是我們自己工程獨有的功能,vores是另外一個工程, 如果vores中獨有的功能就寫在這個資料夾下,不限於Java檔案,同樣支援string.xml,圖片等跟外面main裡面的結構一樣, 都支援,此處我沒有建res等資料夾,大家可以自己建立試試,main裡面是兩個應用都有的功能。
比如要修改應用程式的名字:
可以在vores和own底下建立和main一樣的Java、資原始檔夾, 因為vores的app名字肯定和我們的應用不一樣, 所以要重新設定名稱。當左下角變數選擇了voresRelease它就啟用了。 雖然vores和own在不同的資料夾中, 但是無論在哪裡都可以訪問到裡面的程式碼, 就像在同一個資料夾下一樣。
二、根據配置不同的工程載入不同的庫
1、首先我們看看一般的引用:
compile 'com.alibaba:fastjson:1.1.54.android' // 線上引用
compile fileTree(include: ['*.jar'], dir: 'libs') // 引用工程中所有libs目錄下的jar檔案
compile files('libs/AMap_Location_V2.4.1_20160414.jar') // 依賴單個jar檔案
compile(name:'lib_common', ext:'aar') // 依賴aar檔案
compile(':lib_module') // 引用一個module庫工程
2、必須有以下配置:
productFlavors {
own {
applicationId "com.proj.config.projectconfig"
}
vores {
applicationId "com.proj.vores.projectconfig"
}
}
有productFlavors下own和vores兩個變數後,我們就可以通過重組新的變數來引用其他庫
3、重組規則, 先看下面程式碼
ownCompile project(path: ':carddesk_module', configuration: 'ownRelease')
voresCompile project(path: ':task_center', configuration: 'voresRelease')
ownCompile(name: 'financial_center_own', ext: 'aar')
voresCompile(name: 'contract_vores', ext: 'aar')
ownCompile 'com.github.helloworldjie:TestProj:0.6'
重組規則是productFlavors下的變數名+Release/Debug(可選)+Compile:
own+Compile, vores+Compile,這樣就組成了ownCompile和voresCompile兩個新的關鍵字, 上面有"carddesk_module"、"task_center"兩個library和"financial_center"、"contract_vores"兩個aar,總共四個庫,當選擇左下角的變數切換工程以後,own工程只依賴"carddesk_module"和"financial_center",vores工程只依賴"task_center"和"contract_vores",這樣就不會出現同一個工程一次依賴四個庫的情況, 注意:在依賴aar時候,一定要在aar名字後面加"_own"和"_vores”,否則aar依賴不到。
引用library的時候,後面一個引數configuation引數表示庫的編譯方式是release或者debug,他的取值就是配置productFlavors以後生成的四個變數:voresDebug、voresRelease、ownDebug、ownRelease。
4、宣告組合變數
到此為止,執行程式碼以後會發現報錯,ownCompile和voresCompile找不到,需要我們在android {}下方進行宣告才可以:
android {
}
configurations {
ownCompile
voresCompile
}
5、補充
當android studio升級到3.0以後,相應的gradle也升級到了4.0,我們新建工程的時候會發現引用包由compile變成了implementation, 這兩個的區別是compile可以隔代引用,implementation是不允許隔代引用的,但是它們有一點是不變的, 那就是變種,它依然支援productFlavors下的變數名+Release/Debug(可選)+Implementation這樣的組合:
還有一點要注意,當android studio升級到3.0以後,使用productFlavors會報錯,需要指定flavorDimensions