Android 让你一分钟打一千个渠道包,丢掉该死的打包工具!

如题所示,相信很多程序员开发完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之后,你就可以丢掉该死的脚本打包工具了,慢不说,还占用电脑,说不准还会出现打包出错的情况。用这种方式即快速又不会出错还不会影响你正常使用电脑。

如果还有其他实现方式的,欢迎大神下边留言交流哈………..

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本人第一个Android程序,支持抓(pcap)和对抓文件进行分析(只支持http分析,自动解压gzip), 本程序无广告,无恶意代码, 如果不能用请告知手机信息和具体问题. Email: [email protected] 更新说明: V1.0.4 1.兼容Android4.2 V1.0.3 1.处理展示时间bug V1.0.2 1.增加部分机型适配 2.增加封解析时间展示 3.处理长连接解析问题 说明: 1.请确认你的手机已ROOT 或者 能够在电脑上连接ADB 2.请确认你的手机有储存卡(/sdcard) 3.如果你的手机已经有ROOT权限,可以直接使用此应用进行抓 4.如果没有获取ROOT权限,请使用 ADB命令 将应用生成的[/sdcard/tcpdump]复制到[/ststem/xbin/]目录下,并修改权限为6755后再次运行此应用抓。 5.抓文件保存在/sdcard/目录下,文件格式为.pcap 6.所抓取的数据可以直接打开分析或者在电脑上使用Wireshark打开分析 7.注意在抓过程中不要切换网络,否则会导致切换后的网络访问无法被抓取 ADB命令示例: adb root adb remount adb pull /sdcard/tcpdump c:\\ adb push c:\\tcpdump /system/xbin/ adb shell chmod 6755 /system/xbin/tcpdump 相关命令备注: 抓命令:/system/xbin/tcpdump -p -s 0 -w /sdcard/xxxxxx.pcap 查看网卡:/system/xbin/tcpdump -D 或者 netcfg (查看状态为UP的网卡) 复制文件:cp 不成功可以使用 dd if=/sdcard/tcpdump of=/system/xbin/tcpdump 没有写权限:mount -o remount,rw / 和 mount -o remount,rw /system 参考代码: 手机抓工具V2.0 pyhttpcap-master

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值