目錄:andorid jar/庫原始碼決議
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/
引入:
無
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/2540.html
標籤:Android
