我想用resdle重寫res/strings.xml中的一些字符串。根據buildType覆蓋gradle資源
我知道since Android Gradle Plugin 0.7.+ theres可能性具有變體特定的源文件夾。 但我的應用程序有很多風味,我不想額外添加變體特定的文件夾。
UPDATE 2014年1月17日
我想詳細:
我有我的一些資源變量由buildType(例如「發佈」),僅僅依靠。 首先,我認爲我的SOLUTION_1(覆蓋資源合併後的數據)是很好的,因爲如果我必須更改這些變量,我只需要在build.config(只是一個地方)中更改它們。 但是正如Scott Barta在下面的評論中所寫的那樣,這個解決方案不是一個好主意,有一些很好的理由。
所以我嘗試了另一個解決方案SOLUTION_2(只是合併正確的資源)根據this GitHub project of shakalaca。我認爲這種方式更優雅,我仍然有優勢,只是改變一個地方的變量!
SOLUTION_1(資源後,覆蓋的數據合併):
我所做的在AS 0.4.2:
在
build.gradle
我試圖重寫字符串 「Hello World」 到「越權」(based on my answer at this post):android.applicationVariants.all{ variant -> // override data in resource after merge task variant.processResources.doLast { overrideDataInResources(variant) } } def overrideDataInResources(buildVariant){ copy { // *** SET COPY PATHS *** try { from("${buildDir}/res/all/${buildVariant.dirName}") { // println "... FROM: ${buildDir}/res/all/${buildVariant.dirName}" include "values/values.xml" } } catch (e) { println "... EXCEPTION: " + e } into("${buildDir}/res/all/${buildVariant.dirName}/values") // println "... INTO: ${buildDir}/res/all/${buildVariant.dirName}/values" // --- override string "hello_world" filter { String line -> line.replaceAll("<string name=\"hello_world\">Hello world!</string>", "<string name=\"hello_world\">OVERRIDE</string>"); } // *** SET PATH TO NEW RES *** buildVariant.processResources.resDir = file("${buildDir}/res/all/${buildVariant.dirName}/values/values/values.xml") // println "... NEW RES PATH: " + "${buildDir}/res/all/${buildVariant.dirName}/values/values/values.xml" } }
複製和篩選任務工作正常,但我無法將「新」values.xml設置爲字符串資源。
SOLUTION_2(只是合併了正確的資源)
- 定義特定buildType一個floavor(如 「releaseRes」)
合併要建立這個資源的開發與味:
android.applicationVariants.all{ variant -> variant.mergeResources.doFirst{ checkResourceFolder(variant) } } def checkResourceFolder(variant){ def name = variant.name; if(name.contains("Release")){ android.sourceSets.release.res.srcDirs = ['src/releaseRes/res'] android.sourceSets.flavor1.res.srcDirs = ['src/flavor1/res'] } }
這一般只是不是一個很好的主意。如果您嘗試在構建系統中執行重要的體操操作來修改資源,那麼整個項目的維護和調試將非常困難。這將會非常脆弱,因爲對該插件的更改可能會破壞它,或者對Android Studio的更改可能會使其無法使用。這是值得發佈的問題,解釋你到底想要完成什麼,並列出你考慮的方法,包括這一個。 –
感謝您的回答。我編輯了我的問題,並詳細解釋了我想要的內容。我想我爲我的問題找到了一個很好的解決方案(SOLUTION_2)! – owe
斯科特是對的:)我已經實施了solution_1,一年後我用更新的IDE返回了我的項目,更新了插件,它全部壞掉了。 –