Gradle動態配置專案

heinika1476775901521發表於2017-12-14

可以使用三種方式來通過gradle改變專案資訊。

編譯時動態改變Manifest

例如,在manifest下配置友盟的渠道:

<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}"/>
複製程式碼

然後在gradle的 product flavor 中寫上:

manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"]
複製程式碼

在編譯後value的值就會變為GooglePlay了。

編譯時動態改變resValue

在你的 gradle 內容 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:

resValue "string", "AppName", "imag"
複製程式碼

這樣就可以修改,strings.xml

編譯時動態改變BuildConfig

要想通過編譯生成程式碼中可以獲取的資料,那我們需要通過一個介質。那就是BuildConfig類。
他是編譯的時候動態生成的。 在相同的地方新增:

buildConfigField "String", "name", "\"value\""
複製程式碼

在專案中可以這樣使用build.gradle

通過讀取一個配置檔案,來改變java程式碼中屬性的值。

檔案相對路徑為“../script/build.properties”,內容如下:

appName=test
versionCode=5.0.0
mapApiKey=CeFoDLBAGKbbvpa4EFTiFuugpPjdxT1f
複製程式碼

那麼就可以通過讀取這個檔案來進行配置了:

//宣告檔案路徑
def pFile = file("../script/build.properties")

def Properties p = new Properties()
//讀取檔案內容
def loadProperties = {
    pFile.withInputStream { stream->
        InputStreamReader read = new InputStreamReader(stream, "utf-8");
        BufferedReader bf = new BufferedReader(read);
        p.load(bf)
    }
}

android {
    buildTypes {
        //正式打包
        release {
          loadProperties()
          //動態建立res-values值
          resValue "string", "app_name", p.appName
          //動態建立常量
          buildConfigField 'String', 'versionCode', '"' + p.versionCode + '"'
          //動態建立manifest中meta的值
          manifestPlaceholders = [MAP_API_KEY:p.mapApiKey]
    }
}
複製程式碼

讀取資料夾下的檔名稱,動態載入arr庫檔案

def loadPluginNames = {
    String pluginNames = "";
    def pluginFiles = file('../plugins').listFiles().sort()
    pluginFiles.each { File file ->
        if (file.isFile()) {
            String baseName = file.name.subSequence(0, file.name.indexOf('.'));
            String pluginName = baseName.replaceAll('(Plugin)$', '');
            pluginNames = pluginNames + pluginName + ","
        }
    }
    return pluginNames;
}

//引入aar外掛
fileTree(dir: 'plugins', include: '**/*.aar').each { File file ->
    dependencies.add("compile", [
        name: file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name },
        ext: 'aar'
    ])
}

android{
  defaultConfig {
        //動態建立plugins的name
        buildConfigField "String", "PLUGIN_NAMES", "\"" + loadPluginNames() + "\""
    }
}
複製程式碼

相關文章