Android 8.0 deodex教程

以及反编译等

Posted by Nathaniel on 2018-08-29

Android 8.0 deodex方法

本文目标在于为广大Android开发者,ROM制作爱好者,喜欢瞎折腾的刷机爱好者提供一份简明而全面的deodex方法。注意,由于机器版本、硬件设施以及软件版本等变化万千,本人不对以下方法执行后造成的任何手机问题负责。

什么是deodex?

如果你连deodex是什么都不清楚的话,那么下面我推荐你仅以知识获取的心理状态来阅读本文余下的部分,而不要实际去尝试。

Android5.0以前

这个时候的Android虚拟机为Dalvik,这是一个专门为Android移动平台设计的虚拟机。目标系统是RAM有限,数据存储在缓慢的内部闪存上,每一个Dalvik应用作为独立的Linux进程执行,依靠一个Just-In-Time(JIT)编译器去解释字节码。这个时候的Android应用中仅有dex文件,dex对应于Dalvik,正如jar对应于jvm。它就是数据结构特殊的可在Dalvik上执行的文件。

Android5.0以后

在Android5.0时,Android虚拟机正式更换为了ART,ART的特殊之处,就是在于它在应用安装的时候就预编译字节码到机器语言,这样可以加快每次应用开启以及运行的速度,为此Andoird也引入了odex和oat文件。oat文件比较直接,直接包含了可在ART下运行的机器码,odex则是优化过的dex,它根据目标机器进行预编译,ART环境下odex中直接为机器码,Dalvik则为字节码,在运行时生成机器码速度更快。

这样的优化过后,apk中是不含dex文件的,这样如果提取了apk后,因为缺少对应的dex文件,该应用无法在其他的机器上运行,因此我们便需要将其反编译,即deodex,来获取dex文件,然后并入apk文件中,这样我们就能得到完整的可运行的apk文件了。

为什么要deodex

我个人的原因是要使用Xposed框架,必须在deodex化的环境下才能使用。

当然你想要提取系统应用而想要其在其他机器上也能够运行,那么就需要deodex。

或者是你的/system/分区极小,需要deodex以节省空间。

deodex工具

古人云:“工欲善其事,必先利其器”。我们要进行deodex,首先得准备要deodex的工具,互联网上提供的大部分user-friendly的GUI工具基本都不支持Android8.0,因而要对Android8.0进行deodex操作,需要使用smali/baksmali, 以及vdex处理工具。但是并非人人都是Android开发者,unix指令操作对于不少用户来说还是颇具难度的。因此,在此我分享一个由战斗民族兄弟开发的Batch ApkTool,说明均是俄语,自行Google翻译后基本上能知道deodex的方法。

  • 首先,我们使用adb获取我们要deodex的内容

  • ./adb pull /system/app
    ./adb pull /system/framework
    ./adb pull /system/priv-app
  • 一般来说需要deodex的就是这些内容,可根据需要自行改动。

  • 将所有的pull出的文件放入Batch ApkTool目录下的_system文件夹中。

  • 根据工具提示,更改API level为你对应的API level(8.0 对应 26)

  • 使用01指令开始deodex

  • 完成后的_system文件夹中内容即为deodex后的内容。

MIUI用户专属步骤

这个不能算特权了,得多进行几步:

  1. 首先将deodex后的services.jar放入INPUT_JAR文件夹中,进行Decomplie.
  2. 打开 services 文件夹 在文件夹搜索SecurityManagerService.smali,使用文本编辑器打开。
  3. 使用 Ctrl+F 搜索.method private checkSystemSelfProtection(Z)V.
  4. 删除后面 .line * 和.line* 之间的代码后保存关闭。
  5. 最后进行Recomplie,从OUTPUT_JAR中获取修改后的services.jar.

FAQ

某某App在Deodex时出现Warning

A: 请无视它,不影响odex后的结果

某某App在Deodex时出现Error

A: 可能是缺少某些文件,考虑将整个/system/拖入_system文件夹后再进行deodex。

Batch ApkTool选了中文看不懂

A: 该战斗民族少年目测使用了Google机翻,请重新选择英文。

可我还想修改deodex之后的apk

A: 请使用该工具提供的Decomple/Recompile功能,以修改中间的smali代码。