1、 場景
項目裏有一個功能,集成了第三方的sdk,項目很小,所以相關sdk及代碼沒有抽離成module。這個功能找了兩個供應商,兩個廠商的sdk不兼容,所以需要對不同供應商的設備分別打包。決定使用gradle對項目代碼和sdk進行分flavor打包。
2、 首先對lib分flavor
修改gradle.build中的flavor配置。項目本身有一個環境維度的flovar "env",對應測試環境flavor "xxTest"和“xx”,現在需要添加多一個維度"sdk",對應兩家供應商"one","two"。由於考慮到代碼裏面會有根據廠商不同做一些選擇處理的邏輯,所以在裏面又增加了"SDK"常量定義。
apply plugin: 'com.android.application'android { flavorDimensions "env","sdk" productFlavors { subwayTest { buildConfigField "String","SERVER_IP","\"a.com\"" buildConfigField "String","COMMON_SERVER_PORT","\"8080"" dimension "env" } subway { buildConfigField "String","SERVER_IP","\"b.com\"" buildConfigField "String","COMMON_SERVER_PORT","\"8080"" dimension "env" } one { buildConfigField "String", "SDK","\"one\"" dimension "sdk" } two { buildConfigField "String", "SDK","\"two\"" dimension "sdk" } }...}
修改依賴中lib的寫法。第三方sdk有許多 so文件,也有jar,我這裏簡單粗暴的把lib整個複製成兩份,把其中對應的不同的jar包換掉,這樣配gradle就不用一個文件一個文件寫了。我也試過把libs裏面放so,只把jar分開,但是跑不起來,所以就把so文件都copy了。以後可以再研究一下。
repositories { flatDir { dirs 'libs' }}sourceSets.main.jniLibs.srcDirs = ['libs']
dependencies { oneImplementation fileTree(include: ['*.jar'], dir: 'onelibs') twoImplementation fileTree(include: ['*.jar'], dir: 'twolibs')// implementation fileTree(include: ['*.jar'], dir: 'libs')...}
修改文件目錄
前:
後:
3、 對代碼部分分包
添加flavor文件夾與main平級,如下。
把有區別的代碼按原來的包結構拷到對應兩個flavor下面,main下面就不要再留同樣的文件。AndroidManifest.xml也拷進去,可以分別進行配置。如果資源文件也有區別,可以在/java平級建。
爲了防止入口activity創建多個實例,需要修改各個flavor裏面的AndroidManifest.xml,把入口activity標籤裏多加一個屬性
tools:node="replace"
原文鏈接:https://my.oschina.net/u/268088/blog/4317407
關注我獲取更多知識或者投稿