Android Studio 多渠道打包(二) —meta-data
ONE Goal ,ONE Passion !
Studio打包步驟詳解:
http://blog.csdn.net/fengltxx/article/details/52816199
在AndroidManifext.xml中配置:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${Pack_CHANNEL}" />
build.gradle中:
productFlavors {
wandoujia {}
youmeng {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [Pack_CHANNEL: name]
}
注意:flavor.manifestPlaceholders = [Pack_CHANNEL: name]中的Pack_CHANNEL 一定要和 AndroidManifext.xml 定義的android:value=”${Pack_CHANNEL}”一致
如果不一致會報錯:
wuli,別急
心中冒出幾個想法.
- 1: meta-data中的name=”UMENG_CHANNEL”是幹嘛的啊?
- 2: value=”${Pack_CHANNEL}” 又是幹嘛的啊?
- 3: value中的值怎麼使用
第一個疑問:
現在name=”UMENG_CHANNEL” 寫成了UMENG_CHANNEL.可以理解爲我們集成了UMENG. 友盟可以根據我們的這個name=”UMENG_CHANNEL”配置獲取對用的value的值.
第二個疑問:
當打包時.會根據productFlavors中的每一個值去替換value中的值
如果打包兩次.每個apk中分別爲:
wandoujia.apk:
<meta-data
android:name="UMENG_CHANNEL"
android:value="wandoujia" />
youmeng.apk
<meta-data
android:name="UMENG_CHANNEL"
android:value="youmeng" />
第三個疑問:
meta-data類似與map集合存儲的鍵值對.每個name對用一個value.
meta-data可以配置在清單文件中Application,Activity,service,receiver中.獲取方式大致雷同.
Application爲例:
package com.example.retrifitdemo.applicaction;
import android.app.Application;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
/**
* ONE Goal,ONE Passion!
* Created by ${PK_Night} on 2016/10/14.
* comment:
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在application應用<meta-data>元素。
ApplicationInfo appInfo = null;
try {
appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String umeng_channel = appInfo.metaData.getString("UMENG_CHANNEL");
System.out.println("--umeng_channel--" + umeng_channel);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
Activity獲取元素
ActivityInfo info = this.getPackageManager()
.getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
service獲取元素
ComponentName cn = new ComponentName(this, MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
receiver獲取元素
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
當集成友盟後,如果是豌豆莢市場發佈的apk出現了問題.那麼 apk中代碼獲得的UMENG對應的value就爲wandoujia 這樣就能統計出是哪個市場的信息了.