Apktool源码解析——第一篇

本文主要探讨Apktool的源码结构,重点关注brut.apktool下的核心代码,包括apktool-cli、apktool-lib以及androlib目录。androlib是研究的重点,ApkDecoder类含有反编译的核心方法,提供了高质量的代码实现。
摘要由CSDN通过智能技术生成
著名的apktool是android逆向界用的最普遍的一个工具,这个项目的原始地址在这里 http://code.google.com/p/android-apktool/,但是你们都懂的在天朝谷歌是无法访问的,所以直接上github的 https://github.com/brutall/brut.apktool。

在brut.apktool路径是主要代码所在,当然还有brut.apktool.smali是反编译smali的目录,目测还有brut.j.common,brut.j.dir,brut.j.utils是用到java的一些类。

brut.apktool路径下的apktool-cli还不知道是干嘛的,总之下面的apktool-lib正是我们最需要了解的。

 

android目录是利用XmlPullParser实现的专门用于android当中xml的解码工具包。

brut/androlib目录正是我们研究的主题。

com/mindprod/ledatastream目录是le数据支持库。

org/xmlpull/mxp1_serializer目录是XmlPullParser的Xml解析库。

androlib目录一览。

先看一下ApkDecoder这个类。

    public ApkDecoder(File apkFile, Androlib androlib) {
        mAndrolib = androlib;
        setApkFile(apkFile);
    }

    public void setApkFile(File apkFile) {
        mApkFile = new ExtFile(apkFile);
        mResTable = null;
    }
mResTable这个一直很迷惑,很多地方用到了它,但是目前还不住到具体是干嘛的,先不研究这个,继续往下看。
   public void setOutDir(File outDir) throws AndrolibException {
        mOutDir = outDir;
    }

    public void setApi(int api) {
        mApi = api;
    }

这两个方法一看名字就不言而喻,这里就不啰嗦了。多看了几行代码发现,这代码质量相当高,简直不要太优质,比起什么AxmlPrinter2的代码好看多了,呵呵!

下面就是反编译的核心方法了,客观请往下看。

 public void decode() throws AndrolibException, IOException,DirectoryException {
        File outDir = getOutDir();

        if (!mForceDelete && outDir.exists()) {//如果输出目录不是因为删除而不存在就抛出异常
            throw new OutDirExistsException();
        }

        if (!mApkFile.isFile() || !mApkFile.canRead()) {//如果apk文件不是文件类型或者不能读也抛出异常
            throw new InFileNotFoundException();
        }

        try {
            OS.rmdir(outDir);//暂不明
        } catch (BrutException ex) {
            throw new AndrolibException(ex);
        }
        outDir.mkdirs();

        LOGGER.info("Using Apktool " + Androlib.getVersion() + " on " + mApkFile.getName());

        if (hasResources()) {//判断依据mApkFile.getDir().contraincontainsFile("resources.arsc")
            setTargetSdkVersion();
            setAnalysisMode(mAnalysisMode, true);//如果后面的参数为true,将会影响mResTable的取值
            setCompressionMode()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值