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/

  引入:

相關文章
相關標籤/搜索