目錄:andorid jar/庫源碼解析 Apktool.jar: 作用: 1、用於對APK文件進行解包,成可以讀的smali和xml,png等資源文件。 2、同時,把解碼之後的數據,重新打包成APK文件。 慄子: 使用命令的方式使用 1、apktool d xxx.apk // 解碼 apk文件 ...
Apktool.jar:
作用:
1、用於對APK文件進行解包,成可以讀的smali和xml,png等資源文件。
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.xml)文件。
2.3、創建(AndrolibResources)對象,對AndroidMainifest.xml進行解密(由於,打包的apk中,的AndroidMainifest.xml是特定編碼之後的格式,所以需要調整。
2.3.1、創建(XmlPullStreamDecoder)對象,來處理XML文件。
2.3.2、處理其他文件夾的xml。res.R.r等。
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.xml", "resources.arsc", "res", "r", "R","lib", "libs", "assets", "META-INF", "kotlin")
2.10、記錄特殊文件,圖片,音頻,視頻等。
2.11、創建文件夾(original)。拷貝。AndroidManifest.xml,META-INF中的內容,用於,重新打包使用。
打包文件:
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/
引入:
無