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

目录:andorid jar/库源码解析 html

Apktool.jar:

  做用:

    一、用于对APK文件进行解包,成能够读的smali和xml,png等资源文件。git

    二、同时,把解码以后的数据,从新打包成APK文件。github

  栗子:

     使用命令的方式使用 sass

    一、apktool d xxx.apk    // 解码 apk文件app

    二、apktool b xxx   // 打包 xxx文件称apk文件ui

  源码解读:

  解包文件:this

  一、识别传入的参数,经过(DefaultParser)处理与设定的命令逻辑。编码

  二、建立(ApkDecoder)类对象,执行(decode),用于执行解包spa

    2.一、判断是否存在(resources.arsc)文件。code

    2.二、判断是否存在(AndroidManifest.xml)文件。

    2.三、建立(AndrolibResources)对象,对AndroidMainifest.xml进行解密(因为,打包的apk中,的AndroidMainifest.xml是特定编码以后的格式,因此须要调整。

      2.3.一、建立(XmlPullStreamDecoder)对象,来处理XML文件。

      2.3.二、处理其余文件夹的xml。res.R.r等。

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

    2.五、解密dex文件。

      2.5.一、建立(SmaliDecoder)对象,解密dex文件。

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

      2.5.三、调用,以下顺序,完成整个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.六、判断是否存在多个dex文件。

    2.七、循环执行2.5的操做,直到全部的dex处理完毕。

    2.八、拷贝 assets,lib,libs,kotlin 文件夹的内容

    2.九、拷贝,unknown文件夹内容到unknown文件夹下:除此以外的("classes.dex", "AndroidManifest.xml", "resources.arsc", "res", "r", "R","lib", "libs", "assets", "META-INF", "kotlin")

    2.十、记录特殊文件,图片,音频,视频等。

    2.十一、建立文件夹(original)。拷贝。AndroidManifest.xml,META-INF中的内容,用于,从新打包使用。

  打包文件:

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

    二、按照以下步奏进行操做

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.一、建立一个  DexBuilder,解析smali文件,记录内容。

    3.二、调用build生成dex文件。

  步骤解析:buildApk

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

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

  引入:

相关文章
相关标签/搜索