Android studio多渠道打包,同時附上debug運行正式簽名的apkAnd自定義渠道apk文件名

接手項目後發現公司的渠道信息統計使用的友盟,但是仔細查看代碼後發現打包的方式特別麻煩,換渠道都得手動更改渠道值,於是纔有了更改打包方式的

想法,就以友盟多渠道打包爲例,下面附上代碼.

渠道信息一般在AndroidManifest.xml中的meta-data中更改ChannelID:

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="wandoujia"/>
但是以上方式每次換渠道都需要手動更改.所以改用偷懶的方式:

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}"/>

其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定義配置的值。

在build.gradle中加入渠道列表:
 productFlavors {
        meizu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
        }

        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }

        c360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
        }

        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        huawei {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
        }
        yingyongbao {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
        }
        leshi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "leshi"]
        }

    }
當然,還有另外一種更簡潔的方式:

productFlavors {
 
wandoujia {}
baidu {}
c360 {}
uc {}
 
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
 
}
其他的配置按照開發文檔配置就ok了.再附上獲取渠道的代碼:

public static String getChannelName(Context context) {
		if (context == null) {
			return null;
		}
		String channelName = null;
		try {
			PackageManager packageManager = context.getPackageManager();
			if (packageManager != null) {
				//注意此處爲ApplicationInfo 而不是 ActivityInfo,因爲友盟設置的meta-data是在application標籤中,而不是某activity標籤中,所以用ApplicationInfo
				ApplicationInfo applicationInfo = packageManager.
						getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
				if (applicationInfo != null) {
					if (applicationInfo.metaData != null) {
						channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
					}
				}

			}
		} catch (PackageManager.NameNotFoundException e) {
			e.printStackTrace();
		}
		return channelName;
	}


再來說debug運行正式簽名apk,爲什麼要debug運行正式簽名的apk呢?由於第三方登錄分享和支付需要與正式簽名一致,所以需要debug運行正式

簽名的apk,只是方便測試回調.多的不說直接附上代碼:

在build.gradle中加入signingConfigs:

signingConfigs {
        release {
            storeFile file("簽名key的路徑")
            storePassword "*****"
            keyAlias "****"
            keyPassword "****"
        }
    }
在BuildTypes中加入代碼:

debug {
//            // 顯示Log buildConfigField "boolean", "LOG_DEBUG", "true"
//          versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.release
        }
ok了,測試debug運行的就是正式簽名的apk了.

剩下的就是自定義打包的apk名稱了.

 release {
            // 不顯示Log buildConfigField "boolean", "LOG_DEBUG", "false"
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 輸出apk名稱爲xxx_v1.0_2016-08-26_wandoujia.apk  xxx可以進行自定義
                        def fileName = "我的apk_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
    }
其中releaseTime的方法:

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
OK了.that's all!!!










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章