2020-05-24

andorid jar/库源码解析之apktool.jar

andorid jar/库源码解析之apktool.jar


目录:andorid jar/库源码解析 

Apktool.jar:

  作用:

    1、用于对APK文件进行解包,成可以读的smali和

    2、同时,把解码之后的数据,重新打包成APK文件。

  栗子:

     使用命令的方式使用 

    1、apktool d xxx.apk    // 解码 apk文件

    2、apktool b xxx   // 打包 xxx文件称apk文件

  源码解读:

  解包文件:

  1、识别传入的参数,通过(DefaultParser)处理与设定的命令逻辑。

  2、创建(ApkDecoder)类对象,执行(decode),用于执行解包

    2.1、判断是否存在(resources.arsc)文件。

    2.2、判断是否存在(AndroidManifest.

    2.3、创建(AndrolibResources)对象,对AndroidMainifest.

      2.3.1、创建(

      2.3.2、处理其他文件夹的

    2.4、判断是否存在(classes.dex)文件。

    2.5、解密dex文件。

      2.5.1、创建(SmaliDecoder)对象,解密dex文件。

      2.5.2、调用(Baksmali.disassembleDexFile())解密dex文件。成DexFile对象。并且多个集合(ClassDefinition)对象。

      2.5.3、调用,如下顺序,完成整个smali文件的生成。

this.writeClass(writer);this.writeSuper(writer);this.writeSourceFile(writer);this.writeInterfaces(writer);this.writeAnnotations(writer);Set<String> staticFields = this.writeStaticFields(writer);this.writeInstanceFields(writer, staticFields);Set<String> directMethods = this.writeDirectMethods(writer);this.writeVirtualMethods(writer, directMethods);

    2.6、判断是否存在多个dex文件。

    2.7、循环执行2.5的操作,直到所有的dex处理完毕。

    2.8、拷贝 assets,lib,libs,kotlin 文件夹的内容

    2.9、拷贝,unknown文件夹内容到unknown文件夹下:除此之外的("classes.dex", "AndroidManifest.

    2.10、记录特殊文件,图片,音频,视频等。

    2.11、创建文件夹(original)。拷贝。AndroidManifest.

  打包文件:

    1、识别参数,调用(new Androlib(apkOptions).build(new File(appDirName), outFile);),进行打包操作。

    2、按照如下步奏进行操作

buildSources(appDir);buildNonDefaultSources(appDir);buildManifestFile(appDir, manifest, manifestOriginal);buildResources(appDir, meta.usesFramework);buildLibs(appDir);buildCopyOriginalFiles(appDir);buildApk(appDir, outFile);// we must go after the Apk is built, and copy the files in via Zip// this is because Aapt won't add files it doesn't know (ex unknown files)buildUnknownFiles(appDir, outFile, meta);FileUtils.moveFile(manifestOriginal, manifest);

  步骤解析:buildSources

    3.1、创建一个  DexBuilder,解析smali文件,记录内容。

    3.2、调用build生成dex文件。

  步骤解析:buildApk

    3.1、调用 ZipUtils,对文件打包成一个zip。

  源码:https://github.com/iBotPeaches/Apktool/

  引入:


No comments:

Post a Comment