zoukankan      html  css  js  c++  java
  • andorid jar/库源码解析之apktool.jar

    目录: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/

      引入:

  • 相关阅读:
    加密web.config
    SQL FOR XML
    SQL语句中拆分字段
    Units specified don't exist SHSUCDX can't install
    SQLSERVER与C#中数据类型的对应关系
    使用 FOR XML PATH 產生 XML 格式時,遇到 NULL 該如何處理?
    T_SQL的 FOR XML PATH 用法
    T-SQL with关键字
    Sqlserver获取行号
    win10以太网没有有效的ip配置
  • 原文地址:https://www.cnblogs.com/Supperlitt/p/12905441.html
Copyright © 2011-2022 走看看