轉載:Android studio gradle中分渠道加載res、libraries及Classjava
前段時間遇到這樣的需求,在App裏使用了地圖功能,對應海外版使用Android內置google的地圖服務。而對於國內版(你們都知道的),咱們使用了高德地圖。而在導入高德地圖的時候須要加入對應的sdk及.so文件,這樣最後打包的大小會增長2M左右。但海外版並不須要這部分資源,故須要根據不一樣的渠道加載不一樣的jar、res、及不一樣的類,有助於保持代碼的乾淨,控制包的大小。node
很少說了,直接上步驟!android
1)首先要獲建立不一樣的productFlavors,便於分渠道打包和調試;api
productFlavors { // Define separate dev and prod product flavors. dev { minSdkVersion 21 ... } Chinese_dev { minSdkVersion 21 ... }
2)要獲取當前Flavor(),用於選擇相應的資源:markdown
def getCurrentFlavor() { Gradle gradle = getGradle() String taskStr = gradle.getStartParameter().getTaskRequests().toString() println("taskStr:" + taskStr) println() Pattern pattern; if (taskStr.contains("assemble")) { pattern = Pattern.compile("assemble(\\w+)(Release|Debug)") } else { pattern = Pattern.compile("generate(\\w+)(Release|Debug)") } Matcher matcher = pattern.matcher(taskStr) if (matcher.find()) { returnmatcher.group(1); } return "" }
3)判斷是不是本身須要的Flavor,並選擇libs的路徑(這裏須要建立不一樣名字的libs包,如這裏能夠把高德的相關jar放入cn_libs目錄下):app
def buildLibs() { String currentFlavor = getCurrentFlavor() println("current Flavor:" + currentFlavor) booleanisChinese = "Chinese_dev".equalsIgnoreCase(currentFlavor)) println("--- is Chinese ---" + isChinese) if (isChinese) { return'cn_libs' } return 'libs' }
4)在dependencies中加載時調用buildLibs方法來取出要加載的資源包:gradle
dependencies { compile fileTree(dir: buildLibs(), include: ['*.jar’]
5)爲了完整的讓不一樣的資源分開,還須要把AndroidManifest.xml及resource文件都分開。在main目錄的同級目錄下可建立兩個單獨的目錄,如分別是cn及en,並放入對應的代碼及資源。
對於AndroidManifest.xml,關鍵資源使用 tools:node=「merge」:ui
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="merge"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" tools:node="merge"/> <application tools:node="merge"> <meta-data android:name="com.amap.api.v2.apikey" android:value="key"/> <service android:name="com.amap.api.location.APSService"/> </application> </manifest>
2.對於代碼class的替換,若要根據flavor來切換代碼,則須要不一樣的flavor的java包,並在其下建立下建立相同的類名,而且在main下不能再有該類,則在打包時只打對應的class文件,其餘的則丟棄。如:
| Flavor A
| ——-> com.fan.util
| ————> class A
| main
| ——>com.fan.util
| ————>不能再有class A
| Flavor B
| ——>com.fan.util
| ————->class Agoogle
建立好後的目錄大概長這樣:spa
3.在gradle文件中配置java.srcDirs,AndroidManifest.xml及resource的位置:
sourceSets { main { jniLibs.srcDirs = ['libs'] java.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] } dev { java.srcDirs = ['src/us/java/'] } Chinese_dev { jniLibs.srcDirs = ['libs-zh'] manifest.srcFile 'src/cn/AndroidManifest.xml' java.srcDirs = ['src/cn/java/'] res.srcDirs = ['src/cn/res'] } }
而後就能夠經過Build Variants愉快的玩耍了!!!