如题所示,相信很多程序员开发完App之后,然后就是上线到各大应用市场,但是国内这么多应用市场,每个市场的渠道都必须要不一样,才能达到数据分析的结果,往往这个时候,就需要我们去打各种渠道包了,每次把渠道号换一下,就进行一次打包流程,速度实在是慢死人,当然现在也有一些自动化打包工具,进行脚本打包,不过这个也要花很长时间,几十个渠道包,需要打上半小时甚至是一个小时。
没错,今天就说一下如何一分钟就可以打出来一千渠道包,其实,为什么我们每次打渠道包,所属要时间都是很长,因为我们每次都是重新打包,没错…就是重新打包,只是把渠道号换了一下,然后需要重新打包一次。今天我要说这个,不需要你重新打包,只需要你把APK里面某个文件名称改掉,然后就实现修改渠道号的功能…..
第一步
首先我们在apk某个目录下面新建一个文件,文件名称就是我们的渠道号:
如图
在APK解压之后的META-INF目录下面新建一个叫:channel~test的文件,其中test就是我们的渠道号。第二步
然后我们在apk里面读取这个文件名称,代码如下:
/**
* 读取apk解压之后META-INF文件夹下面的chanel开头的文件名称
*
* @param mContext
* @return
*/
private String getChannelFromApk(Context mContext) {
ApplicationInfo appinfo = mContext.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
String key = "META-INF/channel~";
ZipFile zipfile = null;
String res = "";
try {
zipfile = new ZipFile(sourceDir);
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.startsWith(key)) {
String[] names = entryName.split("~");
res = names[1];
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return res;
}
上面的代码就是如何读取这个渠道号,如何使用?看代码:
public class ChanelActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String channelName = getChannel(this);
if (channelName != null && !channelName.equals("")) {
//进行初始化比如:dataEye,talkingdata等等统计平台的初始化方法.
} else {
new ChannelAsyncTask().execute();
}
}
/**
* 写个异步任务类来获取渠道名称
*/
private class ChannelAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected String doInBackground(Object[] params) {
String channelName = getChannelFromApk(ChanelActivity.this);
return channelName;
}
@Override
protected void onPostExecute(String s) {
saveChannel(ChanelActivity.this, s);
//进行初始化比如:dataEye,talkingdata等等统计平台的初始化方法.
Log.i("xw_android", "渠道号:" + s);
}
}
/**
* 读取apk解压之后META-INF文件夹下面的chanel开头的文件名称
*
* @param mContext
* @return
*/
private String getChannelFromApk(Context mContext) {
ApplicationInfo appinfo = mContext.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
String key = "META-INF/channel~";
ZipFile zipfile = null;
String res = "";
try {
zipfile = new ZipFile(sourceDir);
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.startsWith(key)) {
String[] names = entryName.split("~");
res = names[1];
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return res;
}
/**
* 获取渠道号
*
* @param context
* @return
*/
private String getChannel(Context context) {
SharedPreferences mSharedPreferences = context.getSharedPreferences("channel", 0);
return mSharedPreferences.getString("channel", "");
}
/**
* 保存渠道号
*
* @param context
* @param channel
*/
private void saveChannel(Context context, String channel) {
SharedPreferences mSharedPreferences = context.getSharedPreferences("channel", 0);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
mEditor.putString("channel", channel);
mEditor.commit();
}
然后看下运行之后,打印的Log信息:
- 第三步
其实上面就已经基本实现快速打包了,那么为什么还有第三步呢?因为上面的过程需要你手动进行,那么我们可以写个小程序让他自己进行,这里我就不贴代码了。感兴趣的同学可以自己去写一下,就是把APK压缩成ZIP,然后在里面新建一个文件,名称弄成对应的名称,就完事了。怎么打很多个呢?写个循环就可以啦……..
这样就实现了快速的打很多渠道包的需求了,而且也不需要重新签名。非常的快捷、方便。唯一的缺点就是没有进行跟换签名的,如果有需求是要换签名的,这种方式可能就不能实现了。
看到这里是不是觉得非常简单呢?没错….就是非常简单,看了完这篇blog之后,你就可以丢掉该死的脚本打包工具了,慢不说,还占用电脑,说不准还会出现打包出错的情况。用这种方式即快速又不会出错还不会影响你正常使用电脑。
如果还有其他实现方式的,欢迎大神下边留言交流哈………..