当前位置:首页 > 3EDD9C 2019年11月21日
[系列]谈APK——黑魔法直接运行德克斯文件

原标题:“系列”谈APK——黑魔法直接运行德克斯文件

如果你想进入一个大工厂,你应该注意“程序不是猿”。

不时8:38推高质量文章,感觉有用,设置顶部加号星

大家好,我的好朋友双子座老师将会提供一系列关于APK的文章,一共四篇。

介绍

许多人可能不太明白APK要谈些什么。我个人认为,作为一名合格的安卓开发者,对APK的简单了解是至关重要的。就技术深度而言,每个人的认知深度每天都在增长。如果我们每天不着陆就讨论这个计划,对每个独立的人和社区来说都不会有进步。因此,我们写了一系列文章来简要介绍下一个最简单的APK文件的组成,以及每个组成部分是如何形成的。

事实上,如果APK文件仍然被视为黑盒,我们对编译后的产品无能为力,因为格雷尔很好地封装了这个复杂的黑盒,你只会抱怨格雷尔的迟钝和卡,但你不知道它做了多少事情,但这真的不能成为它表现不佳的借口。

APK由Dex文件、资源、资源表和签名摘要信息组成。这四个部分是不可或缺的。否则,任何操作系统都无法正常运行带有活动的安卓应用程序。

两篇文章“直接讨论APK-运行索引”和“讨论APK-索引热修复和类路径”将讨论如何生成索引文件以及如何在没有APK文件的情况下使用它们。它可以帮助您理解从字节码到Dex文件的简单转换。我希望这篇文章能对你将来加深对Dex文件的理解有所帮助。

文章“谈论APK-AAPT编译资源”讲述了aapt2如何编译资源文件和生成资源表。当我们开发安卓应用程序时,我们应该熟悉R.java,但是大多数人不知道R.java和资源之间的关系,甚至不知道资源的存在。

《谈APK——从AS手动创建APK文件》整合了以上两篇文章的内容——在我们编译了Dex、resource files和resources.arsc之后,如何将这三者结合起来产生一个APK,其本质非常简单,只有zip好,但不能直接运行,只能在签名后运行。APK的文件结构就这么简单,我只是想拆开这个大黑匣子。

第一个直接运行Dex,打开。

由于最近的工作已经接触到许多安卓工具链,让我们介绍一下APK,一个熟悉的文档。首先,让我们看看如何使用Dex文件在手机终端上输出一个HelloWorld。

编译和运行工具

任何研究过安卓的人都必须知道,运行在安卓操作系统上的虚拟机曾经被称为达尔维克(dalvik),现在被称为ART(安卓运行时)。为方便起见,以下段落将不再区分这两者之间的区别,以下段落暂时统称为dalvik。

展开全文

如果dalvik被视为黑盒,忽略细节,我们可以把他和jvm进行比较。因此,在开始学习java语言和使用集成开发环境进行java开发之前,我们必须知道有两个二进制文件,一个是将xxx.java源代码编译成xxx.class字节码,另一个是启动虚拟机加载和运行字节码。

在安卓系统中,dx与javac相似,但它的输入不是java源代码,而是类字节码,它的输出是众所周知的dex文件。今天,我们将不讨论dex和类文件之间的区别。只要我们知道,类文件和dex文件指向不同的二进制文件作为输入,我们就可以执行里面的逻辑。Java在jvm中运行类,dalvikvm在安卓中运行dex的二进制文件。

1 >adb外壳

2 >dalvikvm-版本

像往常一样,烦人的横杠

我的手机是运行安卓9的手机,输出结果是:

ART版本2.1.0 arm64

ART版本2.1.0 arm64

如果我们在jvm环境中运行

1 >java版本

那么输出是:

 ~/Desktop/ java -versionjava版本“1 . 8 . 0 _ 77”Java(TM)se运行时环境(构建1.8.0_77-b03)Java HotSpot(TM) 64位服务器虚拟机(构建25.77-b03,混合模式)

 ~/Desktop/ java -versionjava版本“1 . 8 . 0 _ 77”Java(TM)se运行时环境(构建1.8.0_77-b03)Java HotSpot(TM) 64位服务器虚拟机(构建25.77-b03,混合模式)

如您所见,java 8正在我的机器上运行。好的,运行工具暂时介绍到这里。接下来,让我们看看如何让jvm和dalvik运行HelloWorld程序。

编译HelloWorld.java

首先,我们需要写代码,写一个简单的HelloWorld.java文件:

1公共类HelloWorld{

2publicstaticvoidmain(字符串[)参数){

3系统,输出,打印(“你好,世界!”);

4}

5}

这四行java代码再简单不过了。我们不应该更熟悉他们。从上一章我们知道dx的输入格式是一个类文件,javac的输入格式是java源代码,输出是一个类文件。也就是说,无论如何我们都需要生成一个类文件。所以,生成方法非常简单,只需运行Javac HelloWorld.java。在当前目录下,会出现一个HelloWorld.class文件,jvm上需要的文件已经准备好了。接下来,看看达尔维克需要准备什么。

研究过安卓的人可能会知道,class->;工具dex需要的是dx,它是安卓平台构建工具的一部分,将随着软件开发工具包的发布和更新而更新。我正在使用版本28.0.3,所以它的路径是$安卓_家庭/构建-工具/28.0.3/dx,以下简称dx。虽然我们通常每天都使用这个二进制文件,但它不会直接接触,所以我们不熟悉它。了解这个二进制文件的路径,我的第一个习惯是使用-help命令来查看它能做什么(并吐出垃圾java的单个条)并执行dx - help。我们看到以下输出(省略了暂时不重要的部分)

根据本节中的说明,我们知道dx可以接受类文件的集合,并将它们转换成dex文件或jar/zip文件。内容略有不同。然而,不管是jar文件还是zip文件,核心实际上是一个dex文件。为了方便起见,我们将直接传送出dex文件并执行以下命令:

$ ANDROID _ HOME/build-tools/28 . 0 . 3/dx-dex-output = class . dex hello world . class

$ ANDROID _ HOME/build-tools/28 . 0 . 3/dx-dex-output = class . dex hello world . class

当然,这里的名字不一定是classes.dex .在执行之后,我们还可以看到在当前目录下刚刚产生的dex文件。

跑地狱世界

我们得到了类文件和dex文件,所以在jvm上,我们只需要使用java HelloWorld来完成它。

~/桌面/ java -cp。地狱或地狱世界!

~/桌面/ java -cp。地狱或地狱世界!

你好,世界输出。我们都很熟悉,那么如何在dalvik上运行呢?事实上,这也很简单。首先,将所需的索引文件传输到手机(下面以安卓P为例)

ADB push class . dex/sd卡/

ADB push class . dex/sd卡/

然后我们亚洲开发银行的外壳就被/sd卡/。

在运行之前,让我们回想一下,dex文件和类文件的区别是类文件通常最多包含一个公共类,但是dex文件是类文件的集合,有点像jar,但不像jar文件压缩那么简单,它是一个转换后的字节码集合文件。因此,dalvik上的-cp(类路径)参数与jvm上的-cp参数略有不同,只要执行以下命令,dalvik就引用dex:

:/sdcard $ dalvikvm-CP hello World . dex hello World!

:/sdcard $ dalvikvm-CP hello World . dex hello World!

我们输出我们想要的Hello World,其中cp指定类路径和稍后指定的类名。毕竟,一旦dex文件中有多个类,我们不知道选择运行哪个类。之前,如果一些小伙伴听说过安卓上的类加载器,我们也可以故意在这里输入错误的类名,并查看堆栈输出,例如:

我们可以看到这里的类加载器是DexClassLoader,其中有一个DexPathList。

Dalvikvm不仅可以接受公开的索引文件,还可以接受zip文件,只有里面的索引文件名必须是classes.dex。例如,我们可以接受zip/apk/jar,毕竟它们的本质是zip。

这些是jvm和dalvik运行字节码的步骤和一些约定。了解上述情况后,我们将在下面的文章中详细介绍apk的内容,以及我们如何通过手动[/s2/]调用一些命令来为安卓运行生成apk。

船长笔记:这篇文章的内容实际上并不多。有人建议你自己试试,这样你会有更好的体验。船长亲自尝试了一下,将一些产品制作成一个图书馆,放入GitHub中,方便大家尝试。

https://github.com/AlanCheen/TalkAboutApk

一定要试试!不要试图小心地推下船!

下次见,再见!回到搜狐看更多

负责任的编辑:


发表评论: