標籤:version 作用 each 檔案 java 技術 ctf 檔案中 groov
android 多渠道打包原理
在manifest檔案中,application標籤內部設定不同的metadata標籤即可,可以通過java api擷取這個matedata內的值
友盟提供的多渠道打包技術
按照umeng的要求,在manifest檔案中添加如下代碼
<meta-data android:name="UMENG_CHANNEL" android:value="你自己申請的key" />
如果在value的地方寫死了一個值,會使得每次打包只能固定一個渠道,所以更改為如下方式
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
使用預留位置,在build.gradle的android標籤內添加如下代碼,區分渠道資訊。這個預留位置和spring架構中的ognl運算式作用有點像
productFlavors{ huawei{ manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"] } xiaomi{ manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"] } }
可以簡寫為以下內容
productFlavors{ huawei{ } xiaomi{ } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
如果要包含版本資訊,可以修改為如下配置
productFlavors{ huawei{ } xiaomi{ } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk") output.outputFile = new File(outputFile.parent, fileName) } } }
只有是在代碼中擷取渠道資訊,方便發送到伺服器進行資料統計
private String getChannel() { try { PackageManager pm = getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("UMENG_CHANNEL"); } catch (PackageManager.NameNotFoundException ignored) { } return "";}
附加小知識
當電腦串連了多個android裝置的時候,使用adb shell時進入不同的裝置,可以添加參數
adb -s 序號 install/shell 等命令
查看序列好
adb devices
顯示結果的第一列就是序號
android 多渠道打包