关闭

Android美团多渠道打包

108人阅读 评论(0) 收藏 举报
分类:

以umeng为例,官方的渠道配置方式:

[html] view plain copy
  1. <!-- 友盟API Key -->  
  2. <meta-data  
  3.     android:name="UMENG_APPKEY"  
  4.     android:value="***************">  
  5. </meta-data>  
  6.  <!--umeng 渠道 -->  
  7.  <meta-data   
  8.      android:name="UMENG_CHANNEL"   
  9.      android:value="baidu" />   


其中“UMENG_CHANNEL”字段为渠道信息,使用美团的方式这里可以注释掉,只需填写api key。

然后在MyApplication中添加如下代码

[java] view plain copy
  1. public class MyApplication extends Application {  
  2.   
  3.     @Override  
  4.     public void onCreate() {  
  5.         super.onCreate();  
  6.          
  7.         String channel=ChannelUtil.getChannel(this"default channel");//获取渠道名  
  8.         AnalyticsConfig.setChannel(channel);//调用umeng api设置umeng渠道  
  9.   
  10.     }  
  11.   
  12. }  


然后是ChannelUtil.java,这个是在别的博客弄来的,至于来源我是找不到了,所有才写了这篇博客做笔记 ^_^

[java] view plain copy
  1. import java.io.IOException;  
  2. import java.util.Enumeration;  
  3. import java.util.zip.ZipEntry;  
  4. import java.util.zip.ZipFile;  
  5.   
  6. import android.content.Context;  
  7. import android.content.SharedPreferences;  
  8. import android.content.SharedPreferences.Editor;  
  9. import android.content.pm.ApplicationInfo;  
  10. import android.content.pm.PackageManager.NameNotFoundException;  
  11. import android.preference.PreferenceManager;  
  12. import android.text.TextUtils;  
  13.   
  14. public class ChannelUtil {  
  15.       
  16.     private static final String CHANNEL_KEY = "cztchannel";  
  17.     private static final String CHANNEL_VERSION_KEY = "cztchannel_version";  
  18.     private static String mChannel;  
  19.     /** 
  20.      * 返回市场。  如果获取失败返回"" 
  21.      * @param context 
  22.      * @return 
  23.      */  
  24.     public static String getChannel(Context context){  
  25.         return getChannel(context, "");  
  26.     }  
  27.     /** 
  28.      * 返回市场。  如果获取失败返回defaultChannel 
  29.      * @param context 
  30.      * @param defaultChannel 
  31.      * @return 
  32.      */  
  33.     public static String getChannel(Context context, String defaultChannel) {  
  34.         //内存中获取  
  35.         if(!TextUtils.isEmpty(mChannel)){  
  36.             return mChannel;  
  37.         }  
  38.         //sp中获取  
  39.         mChannel = getChannelBySharedPreferences(context);  
  40.         if(!TextUtils.isEmpty(mChannel)){  
  41.             return mChannel;  
  42.         }  
  43.         //从apk中获取  
  44.         mChannel = getChannelFromApk(context, CHANNEL_KEY);  
  45.         if(!TextUtils.isEmpty(mChannel)){  
  46.             //保存sp中备用  
  47.             saveChannelBySharedPreferences(context, mChannel);  
  48.             return mChannel;  
  49.         }  
  50.         //全部获取失败  
  51.         return defaultChannel;  
  52.     }  
  53.     /** 
  54.      * 从apk中获取版本信息 
  55.      * @param context 
  56.      * @param channelKey 
  57.      * @return 
  58.      */  
  59.     private static String getChannelFromApk(Context context, String channelKey) {  
  60.         //从apk包中获取  
  61.         ApplicationInfo appinfo = context.getApplicationInfo();  
  62.         String sourceDir = appinfo.sourceDir;  
  63.         //默认放在meta-inf/里, 所以需要再拼接一下  
  64.         String key = "META-INF/" + channelKey;  
  65.         String ret = "";  
  66.         ZipFile zipfile = null;  
  67.         try {  
  68.             zipfile = new ZipFile(sourceDir);  
  69.             Enumeration<?> entries = zipfile.entries();  
  70.             while (entries.hasMoreElements()) {  
  71.                 ZipEntry entry = ((ZipEntry) entries.nextElement());  
  72.                 String entryName = entry.getName();  
  73.                 if (entryName.startsWith(key)) {  
  74.                     ret = entryName;  
  75.                     break;  
  76.                 }  
  77.             }  
  78.         } catch (IOException e) {  
  79.             e.printStackTrace();  
  80.         } finally {  
  81.             if (zipfile != null) {  
  82.                 try {  
  83.                     zipfile.close();  
  84.                 } catch (IOException e) {  
  85.                     e.printStackTrace();  
  86.                 }  
  87.             }  
  88.         }  
  89.         String[] split = ret.split("_");  
  90.         String channel = "";  
  91.         if (split != null && split.length >= 2) {  
  92.             channel = ret.substring(split[0].length() + 1);  
  93.         }  
  94.         return channel;  
  95.     }  
  96.     /** 
  97.      * 本地保存channel & 对应版本号 
  98.      * @param context 
  99.      * @param channel 
  100.      */  
  101.     private static void saveChannelBySharedPreferences(Context context, String channel){  
  102.         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);  
  103.         Editor editor = sp.edit();  
  104.         editor.putString(CHANNEL_KEY, channel);  
  105.         editor.putInt(CHANNEL_VERSION_KEY, getVersionCode(context));  
  106.         editor.commit();  
  107.     }  
  108.     /** 
  109.      * 从sp中获取channel 
  110.      * @param context 
  111.      * @return 为空表示获取异常、sp中的值已经失效、sp中没有此值 
  112.      */  
  113.     private static String getChannelBySharedPreferences(Context context){  
  114.         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);  
  115.         int currentVersionCode = getVersionCode(context);  
  116.         if(currentVersionCode == -1){  
  117.             //获取错误  
  118.             return "";  
  119.         }  
  120.         int versionCodeSaved = sp.getInt(CHANNEL_VERSION_KEY, -1);  
  121.         if(versionCodeSaved == -1){  
  122.             //本地没有存储的channel对应的版本号  
  123.             //第一次使用  或者 原先存储版本号异常  
  124.             return "";  
  125.         }  
  126.         if(currentVersionCode != versionCodeSaved){  
  127.             return "";  
  128.         }  
  129.         return sp.getString(CHANNEL_KEY, "");  
  130.     }  
  131.     /** 
  132.      * 从包信息中获取版本号 
  133.      * @param context 
  134.      * @return 
  135.      */  
  136.     private static int getVersionCode(Context context){  
  137.         try{  
  138.             return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;  
  139.         }catch(NameNotFoundException e) {  
  140.             e.printStackTrace();  
  141.         }  
  142.         return -1;  
  143.     }  
  144. }  

到这里我们在项目中的工作完成了,然后需要安装一下python环境 (安装过程中有问题的自行百度)

  登录CSDN  下载py脚本  (这个东西也是从别人那弄来的,由于时间长了,找不到来源了。。。所以才有了这篇博客做笔记)    解压出来

打开文件PythonTool\info\channel.txt,把需要的渠道写在这里面,每个渠道名占一行,就是回车,像这个样子:


上面说的都弄好之后,就开始打包工作了。

1、先使用android studio  或者 eclipse 打一个正常发布用的安装包出来。

2、把上一步的apk包放到PythonTool目录下(就是MultiChannelBuildTool.py同级目录)

3、鼠标双击MultiChannelBuildTool.py,呵呵,一眨眼的功夫,完事了

4‘、新生成了一个文件夹,里面就是所有的渠道包了,拿去发布吧


出处:http://blog.csdn.net/u012390044/article/details/50585792

我觉得说的够简单明了吧,具体原理请看着个 http://tech.meituan.com/mt-apk-packaging.html

有知道以上资源原作者的请告知 ^_^

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6020次
    • 积分:120
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:18篇
    • 译文:2篇
    • 评论:0条
    文章分类