Android studio gradle中分渠道加載res、libraries及Class

轉載: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愉快的玩耍了!!!

相關文章
相關標籤/搜索