Android App 主要采用Java 编程语言编写, 包括Activity、Service、Broadcast Receiver 、 Content Provider 四大组件。Android App 的编译过程与一般的 Java App 不同,但开始方式是一样的:使用 Javac 命令将 Java源代码文件编译成class 文件,如下所示:
例如,创建一个测试程序 Test.java ,在cmd 环境下使用 Javac Test.java 命令将下面的Test.java 源代码生成Test.class 文件( 该文件属于标准的Oracle Jvm Java字节码)
public
class
Test
{
public
int
add
(
int
a ,
int
b){
return
a + b;
}
public
static
void
main
(String[] args) {
Test test =
new
Test();
System.
out
.printf(test.
add
(
1
,
2
));
}
}
然后使用javap -c Test.class 命令查看上面的Java代码对应的Java 字节码,示例如下
但是,Android 系统APP 并没有使用标准的Java 虚拟机来运行, 而是通过自带的 Dalvik 虚拟机来运行。与 Java虚拟机的字节码不同, Dalvik 虚拟机有自己独特的字节码格式,即两个虚拟机的机器指令集不同, 因此 , 通过 javac 编译生成的 class 文件无法在 Dalvik 虚拟机上运行。
开发者需要使用Android 系统的 dx 命令(位于 sdkbuild-tools路径下), 将 class 文件和所有的jar包转成符合 Dalvik 字节码格式的 classes .dex 文件。
在这里我采用降低jdk版本的方式, 不然的话会报错,版本不支持
javac
-source
1
.6
-target
1
.6
first
.java
然后使用dx命令把生成的class文件编译成classes.dex 文件
dx
--dex --output=classes.dex Test.class
注意:--dex 这是双横线, 需要把 class 文件放在dx 的目录下
使用 jadx-gui 打开dex文件, classes.dex 对应的 Dalvik字节码形式如下
classes.dex 文件可以理解为 Android APP的可执行文件,核心的代码都在这个文件中。不过classes.dex 文件并不是安装文件, 为了便于安装,Android 将APP打包成类似于 Zip压缩文件的 APK文件。
一个APK文件并不仅包含APP的所有代码,而且还包含所有的非代码资源,如图片、声音等等。使用 Android SDK 中的打包工具或者 Android 系统的 aapt 命令, 能够将 classes.dex 文件和 APP 涉及的资源(如图片文件和 布局描述文件等)打包成 APK 文件(即安装包)
通过Google Play 或者第三方应用商店发布APP安装文件之前, Android 系统要求开发者对APP文件进行数字签名:一面对APP 负责, 实现APP的可溯源;另一方面,便于操作系统在安装时利用数字签名校验文件的完整性和准确性,实现APP的防篡改。
对于APP包进行签名的过程是,使用开发者的私钥对 APK 安装包中的所有文件进行校验,并将生成的校验信息作为一个附加的签名文件内置于 APK 安装包中。
jarsigner 是 Java 开发工具包中常用的签名工具, 专门为 jar 包进行签名而创建,也可以用于对 APK 文件进行签名。Android 系统中压缩文件的字节是对齐的, 可以在不解压文件的情况下读取文件的内容, 所以在APK签名之后, 开发者需要使用压缩文件对齐工具 zipalign 进行处理,保证 APK 文件的压缩部分在字节边界上是对齐的。
原文始发于微信公众号(无界信安):Android App的安全基础
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论