ChangeEnvironment
一鍵快速多渠道打包常用配置
關於打包
在開發客戶端專案的時候經常會遇到開發,測試,正式等環境的來回切換,從而需要切換介面的地址以及不同環境的配置!比如我們需要判斷當前的環境是正式還是開發環境以此來載入不同的推送ID!當然我們可以寫一個配置檔案,每次打包時註釋掉不需要的程式碼。 但這樣做常常會有以下幾個問題
不安全,因為是手動註釋,不可避免的發生人為的失誤
重複的工作,每次都要開啟配置檔案浪費時間
增加程式碼量,而且不優雅
配置環境幾乎是新建專案必做的工作,主要分為以下幾個步驟
配置manifest中的佔位符
配置gradle的各種環境資訊。例如是否需要混淆,讀取不同的簽名等
配置多渠道打包
配置並讀取簽名檔案資訊
通過程式碼讀取環境資訊並進行判斷
輸出當前渠道環境下的apk檔案
配置步驟
第一步:配置manifest中的佔位符
<meta-data
android:name="server_mode"
android:value="${SERVER_MODE}"/>
複製程式碼
第二步:配置manifest中的環境資訊
buildTypes {
release {
debuggable false//是否除錯模式
signingConfig signingConfigs.release//簽名配置
zipAlignEnabled false//是否壓縮
minifyEnabled false//是否混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
manifestPlaceholders = [SERVER_MODE: "RELEASE"]//mainfest的佔位符
buildapkName()
}
_test {
debuggable true//是否除錯模式
signingConfig signingConfigs.release//簽名配置
zipAlignEnabled false//是否壓縮
minifyEnabled false//是否混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
manifestPlaceholders = [SERVER_MODE: "TEST"]//mainfest的佔位符
buildapkName()
}
}
複製程式碼
第三步:配置多渠道打包(如果不需要多渠道打包,此步驟可省略)
//多渠道配置
productFlavors {
_360shouzhu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
}
ali {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
}
oppo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "oppo"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
// productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
複製程式碼
第四步:配置並讀取簽名檔案資訊
signingConfigs {
release {
storeFile
storePassword
keyAlias
keyPassword
}
}
//讀取簽名配置檔案,為保證安全配置檔案可放在本地磁碟中
def getSigningProperties() {
def propFile = file('signing.properties')
if (propFile.canRead()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
if (props != null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
} else {
println 'signing.properties found but some entries are missing'
android.buildTypes.release.signingConfig = null
}
} else {
println 'signing.properties not found'
android.buildTypes.release.signingConfig = null
}
}
複製程式碼
第五步:讀取環境資訊,並進行判斷
/**
* 獲取metaData
* @param context
* @param metaKey
* @return
*/
public static String getMetaValue(Context context, String metaKey) {
Bundle metaData = null;
String apiKey = null;
if (context == null || metaKey == null) {
return null;
}
''''''省略
return apiKey;
}
/**
* 獲取當前的環境
* @param context
*/
public static void init( Context context) {
USE_SERVER_MODE = Enum.valueOf(Mode.class, DeviceUtil.getMetaValue(context, "server_mode"));
}
複製程式碼
第六步: 輸出apk檔案
//生成檔案的名稱
def buildapkName(){
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "evn_${variant.productFlavors[0].name}_${variant.buildType.name}.apk"
outputFileName = new File(fileName)
}
}
}
}
複製程式碼
附命令列打包
//oppo渠道下的正式環境
gradlew assembleoppoRelease
//oppo渠道下的測試環境
gradlew assembleoppo_test
//全渠道正式包
gradlew assembleRelease
//全渠道測試包
gradlew assemble_test
複製程式碼
至此,如果再需要打不同的環境安裝包只需要一行命令即可完成