一鍵快速多渠道打包經常使用配置java
github.com/sky8650/Cha…android
不安全,由於是手動註釋,不可避免的發生人爲的失誤git
重複的工做,每次都要打開配置文件浪費時間github
增長代碼量,並且不優雅api
配置manifest中的佔位符安全
配置gradle的各類環境信息。例如是否須要混淆,讀取不一樣的簽名等bash
配置多渠道打包app
配置並讀取簽名文件信息學習
經過代碼讀取環境信息並進行判斷測試
輸出當前渠道環境下的apk文件
<meta-data
android:name="server_mode"
android:value="${SERVER_MODE}"/>
複製代碼
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"));
}
複製代碼
//生成文件的名稱
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
複製代碼
至此,若是再須要打不一樣的環境安裝包只須要一行命令便可完成