Android編譯gradle 動態修改版本號

在構建代碼的時候不想每次都修改版本號,需能夠增加一個功能在特定的條件下動態的修改版本號

  1. 在manifest裏面加入佔位符號
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       android:versionCode="${versioncode}"
       android:versionName="${versionname}">

  1. 修改build.gradle
import com.google.gson.Gson

class Version {
    int versionCode
    String versionName
}


def versionJsonFile = file('./version.json')//這個文件最好放一個所有項目人員都能夠訪問的地方
    def versionJsonObject = new Gson().fromJson(versionJsonFile.text, Version.class)
    android.applicationVariants.all {
        variant ->
            println("variants name : " + variant.name)
			//只有滿足特定條件的情況下才會版本自增一,這個可以看看各個項目的特定配置
            if (variant.name.toLowerCase().contains("ceshirelease") ) {
                println("variants name : versionCode " +  versionJsonObject.versionCode + "versionname: " + versionJsonObject.versionName)
                versionJsonObject.versionCode = versionJsonObject.versionCode + 1
                int lastIndexPoint = versionJsonObject.versionName.lastIndexOf(".")
                String newStr = versionJsonObject.versionName.substring(0, lastIndexPoint)
                println("newStr" +  newStr)
                versionJsonObject.versionName = newStr + "." + versionJsonObject.versionCode
                println("versonJsonStr.versionName " +   versionJsonObject.versionName)
            }
			//這句是核心,可以調整版本號和版本明,修改了這個會影響到BuildConfig.class裏面的屬性
            variant.mergedFlavor.versionCode = versionJsonObject.versionCode
            variant.mergedFlavor.versionName = versionJsonObject.versionName
			//如果沒有加下面這句,當應用安裝後會出現應用信息沒有版本號的問題,這個必須有
            variant.mergedFlavor.manifestPlaceholders.put("versioncode", versionJsonObject.versionCode)
            variant.mergedFlavor.manifestPlaceholders.put("versionname", versionJsonObject.versionName)
    }
	
	//爲了記住最新的版本號,是需要進行文件的回寫的,什麼時候回寫會好一點
	//個人認爲只有當打包apk的動作執行成功後 回寫文件記錄的版本號最優
	   afterEvaluate {
        project ->
            gradle.taskGraph.afterTask {
                task, taskState ->
				   //這裏如果assembleceshirelease 就具體的打包的變種項目,各個應用肯定不一樣,需要調整下
                    if (task.name.toLowerCase().contains("assembleceshirelease") && taskState.getFailure() == null) {
                        println("try assemble ceshi release" )
						//回寫文件操作
                        versionJsonFile.withPrintWriter { out ->
                                out.println(new Gson().toJson(versionJsonObject))
                        }
                    }
            }
    }
	

給apk重新命名也是同樣的道理

           variant.getOutputs().all {
               File file = it.outputFile;
               println(" file property  file.canRead() " + file.canRead() + " file.canWrite " + file.canWrite())
               String pathString = file.getPath();
               println(" path String : " + pathString + " File.pathSeparator: " + File.separator)
			   //指定最終輸出的文件的目錄和名字
               pathString = file.getParent() + File.separator +  "test.apk";
               println(" path pathString : " + pathString)
               file.renameTo(pathString)
           }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章