Bash玩转脚本4之搞一套完整的Android反编译与分包工具

本文介绍了如何使用Bash脚本和相关工具(apktool, jarsigner)创建一个自动化Android分包工具。通过修改apk的包名、Meta信息并签名,确保生成的多个包不能覆盖安装。详细讲解了解包、修改标识、防止覆盖安装的步骤,并展示了脚本的两种调用模式和配置文件的读取方法。" 111946311,10542515,SteamVR自定义皮肤教程:DIY你的虚拟现实手柄,"['SteamVR', 'VR自定义', '虚拟现实', '手柄皮肤', '3D贴图']

一、前言


正在搞IOS的微信支付和支付宝支付,焦头烂额之时,天上掉下来一个Android分包工具的需求,觉得还蛮有意思,其实之前一直想搞一个类似的东西,正好趁着这次机会实践一下。

[原文地址]
(http://blog.csdn.net/yang8456211/article/details/52513354 )

(先说清楚需求,这个分包工具要干什么)

从产品角度

拿到一个apk安装包,然后用这个包去生成n个包,这n个包需要有特定的标示,能够根据包的标示去收集信息,而且这个n个包彼此不能覆盖安装。

从技术角度

对于这个需求,关键点在于三个点
1. 怎么去生成n个包?
2. 怎么修改apk的标示?
3. 怎么使得这n个包不能覆盖安装?

二、Just do it

2.1 首先我们自己制作一个简单的apk包

这个apk包包含两个功能点:

  • 获取一些包的基本信息,例如应用包名
  • 获取一些Meta信息,用来区分我们所打的包

因为这篇文章主要在讲bash和apk打包,对于Android代码就不赘述了,贴出来参考。

(获取应用包名)

        PackageInfo info = null;
        try {
            // 获取包名
            info = this.getPackageManager()
                    .getPackageInfo(this.getPackageName(), 0);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 当前版本的包名
        pgName = info.packageName;

(获取Meta信息)

        PackageManager pm = this.getPackageManager();

        ApplicationInfo appInfo = null;
        try {
            appInfo = pm.getApplicationInfo(this.getPackageName(),
                    PackageManager.GET_META_DATA);
        } catch (NameNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        // 读取meta的内容
        msg.append(appInfo.metaData.getString("SDK_CHANNEL"));

这里我们读取了SDK_CHANNEL这个信息作为包的标示,需要在Android Manifest中配置好相关的Meta data。

    <meta-data android:name="SDK_CHANNEL" android:value="天降正义" />

运行时截图

可以看到现在的包名是com.example.testmultipac,渠道是天降正义~

接下来我们就开始着手一个一个解决问题

三、开始处理我们的包

3.1 怎么去生成这个n个包?

想要生成多个包,必须涉及到需要把apk进行反编译,然后重新生成apk包的过程,因此我使用了apktool这个工具。

注:apktool 有1和2两个版本,两者语法有些许不同,在这里使用了apktool_2.1.0这个jar,当然你也可以使用apktool1;window可以直接调用apktool.bat的批处理,事实上也是调用了apktool.jar。


apktool指令:

解开apk包:
java -jar apktool d -f 输入的apk路径 -o 输出的文件夹路径

重新生成apk包:
java -jar apktool b 上一步解出的文件夹路径 -o 输出apk路径

注:这里使用的apktool2,因此有-o这个参数,apktool是没有的,请注意。

了解了apktool的指令后,我们便可以方便的实现apk的解包和组包,在组包的会后通过修改包的名称,就可以生成多个不同名的包了。

例如:

do_repac(){

    outapk=$apkpacpath"/"$game_package_name".apk"

    # apktool重新回包 以免apktoo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值