MultiDex 的使用与反编译

Android 反编译 Apk

环境安装

brew install apktoolHomebrew 安装 apktool

下载JD-GUI

jd-gui 主要是为了方便查看 dex2jar 转换的jar文件结构和部分代码(未混淆)

  • jd-gui github地址 官网地址

下载 dex2jar

dex2jar 主要用于将解压后的 Apk 包中 classes.dex 转换为 classesdex.jar 包便于 jd_gui 查看

  • dex2jar 下载地址

dex2jar使用说明

  • 使用说明地址

工具使用

Apktool 反编译和二次打包

  • apktool d -f demo.apk -o 存放反编译文件路径
apktool d -f /Users/boomhe/debug.apk -o Game/Apk
  • apktool b -f 二次打包文件路径 -o demo.apk
apktool b -f /Users/boomhe/Game/Apk -o /Users/boomhe/Game/debug.apk

MultiDex 使用

MultiDex 是什么

MultiDex 就是分包、解决项目中 65535 问题

什么是 .dex 文件

Dalvik VM executes : Android Dalvik 虚拟机执行文件

什么是 art

Android Runtime :Android 运行时、Android 4.4 引入

直接对 .apk 文件解压会保留 META-INF 签名信息文件

unzip /Users/boomhe/Game/GWT.apk -d /Users/boomhe/Game/unzipGWT

采用 ApkTool 工具反编译的文件没有 META-INF 签名信息文件

apktool d -f /Users/boomhe/Game/GWT.apk  -o Game/apktoolApk

apk 解压后的项目结构

  • AndroidManifest.xml 配置信息
  • META-INF 签名信息
  • classes.dex Java 字节码文件
  • res 资源文件
  • resources.arsc 二进制资源文件

Java 中常见的类加载器

  • BootstrapClassLoader:纯 C++ 实现的、没有对应的 Java 类、主要加载 jre/lib/目录下的核心库
  • ExtClassLoader:主要加载 jre/lib/ext/ 目录下的扩展包
  • AppClassLoader:主要加载 ClassPath 路径下的包

Android 中常见的类加载器

  • ClassLoader:加载器 是父委托加载机制
  • PathClassLoader:加载 /data/app 目录下的 apk 文件、从这个目录可以看出、PathClassLoader 主要用来加载已经安装过的 apk
  • DexClassLoader:加载路径需要在创建 DexClassLoader 时传入、也就是说可以加载任何路径下的 apk/dex/jar

两种分包方案

  • Ant:Eclipse 工具
  • Gradle:Android Studio 工具

Android Studio 集成 MultiDex

引入依赖和开启multiDex

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        // 第一步 开启 multiDex
        multiDexEnabled true
    }
    ...
}

dependencies {
    // 第二步:引入依赖
  compile 'com.android.support:multidex:1.0.1'
}

重写 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包

// 第三步:重写 attachBaseContext()
public class MyApplication extends Application {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(context);
     Multidex.install(this);
  }
}

配置 manifest 文件

// 第四步:配置
"1.0" encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    "com.czcg.qlsct.MyApplication" >
        ...
    

动态加载分 Dex

  • 将 DexClassLoader 插入到 PathClassLoader 和 BootClassLoader 中间
  • DexClassLoader 中的 dex 追加到 PathClassLoader 中

参考文献

Mac下配置Apktool反编译环境

郭霖

鸿洋

任玉刚

你可能感兴趣的:(Android,gradle,打包)