目錄:andorid jar/庫源碼解析 html
一、用於對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。
無