1. 程式人生 > >使用 gradle 在編譯時動態設定 Android resValue BuildConfig Manifes中 m

使用 gradle 在編譯時動態設定 Android resValue BuildConfig Manifes中 m

                     

你也可以檢視我的其他同類文章,也會讓你有一定的收貨

關於使用Gradle來控制版本和生成不同版本的程式碼,我總結了三篇文章,網上關於這些知識,都比較零散,我在學習這些的之前,根本不知道還有這樣的方法。所以說不知道並不可怕,可怕的是不知道自己不知道。相信這三篇文章,會給你不少靈感

前言

在專案中,我們有時會需要根據不同的專案環境,使用不同的專案變數,

舉例:

  • 在測試環境中需要app訪問的伺服器地址是測試伺服器
  • 正式釋出下的app需要訪問正式伺服器。

可以使用下面三種技術來滿足要求:

使用 gradle 在編譯時動態設定 Android resValue

修改 res value 的方式,比如修改 strings.xml 檔案中的 AppName 的值

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

resValue "string", "AppName", "app1"
  • 1

相當於在res/strings.xml 下增加一個名為 AppName,值為app1  的資源。在java中的使用resValue和strings.xml的方法是一樣的,context.getResources().getString(R.string.strKey);

使用 gradle 在編譯時動態設定 Android BuildConfig

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

buildConfigField "String", "ENDPOINT", "\"http://example.com\""
  • 1

gradle sync 一下後,BuildConfig.ENDPOINT 就會被賦值為 http://example.com 就可以供 Java 程式碼呼叫了。

如何使用在java中使用,詳見這篇文章

使用 gradle 在編譯時動態設定 Android Manifest

下面介紹如何設定標籤中的變數,如何使用標籤中的變數,請參考這裡

方法一:(不推薦)

在之前版本的gradle中,大部分的思路都是在AndroidManifest中定義一個變數,然後在編譯的時候,找出那個AndroidManifest中的變數,將它替換掉。

如友盟的多渠道打包,在原來的 AndroidManifest.xml 檔案中新增:

<meta-data android:value="UMENG_CHANNEL_VALUE"               android:name="UMENG_CHANNEL"/>
  • 1
  • 2
  • 3
  • 4

然後使用在build.gradle中找出UMENG_CHANNEL_VALUE這個值,並且替換掉

android.applicationVariants.all{ variant ->    println "${variant.productFlavors[0].name}"    variant.processManifest.doLast{        copy{            from("${buildDir}/manifests"){           include "${variant.dirName}/AndroidManifest.xml"            }            into("${buildDir}/manifests/$variant.name")            filter{     String line ->line.replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")            }            variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")        }   }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

方法二:使用manifestPlaceholders改變< meta-data>(推薦)

而在新版本的gradle中,processManifest這個方法被移除掉了,而提供了一個新的功能manifestPlaceholders,我們可以在AndroidManifest中定義一個變數,在build.gradle中動態的替換掉,十分方便,語法也十分簡單。對比上面的功能,我們需要動態替換友盟的appkey,需要在AndroidManifest中定義一個變數

<meta-data         android:name="UMENG_APPKEY"         android:value="${umeng_app_key}"/>
  • 1
  • 2
  • 3
  • 4

接著,我們在build.gradle檔案中根據不同的環境,生成不同appkey的apk。

buildTypes {        debug {         manifestPlaceholders = [umeng_app_key: "你替代的內容"]        }        release {       manifestPlaceholders = [umeng_app_key: "你替代的內容"]        }        develop {       manifestPlaceholders = [umeng_app_key: "你替代的內容"]        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意:這裡的“你替代的內容”,不能為特殊關鍵詞,比如:TRUE,否則在Java程式碼中獲取不到meta-data中的值,

錯誤示例:

manifestPlaceholders = [oem: "TRUE"]
  • 1

執行gralde clean build,你就可以生成不同的appkey的apk,是不是感覺好多了。^ ^

如果你想要替換多個變數,假如你需要兩個變數要替換,需要按照下面形式進行

<meta-data         android:name="UMENG_APPKEY"         android:value="${umeng_app_key}"/><meta-data          android:name="UMENG_SECRET"    android:value="${umeng_app_secret}"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
buildTypes {        debug {    manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"]        }        ...    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 

關注我的公眾號,輕鬆瞭解和學習更多技術   這裡寫圖片描述