android逆向研究[0]:一个app是如何构造出来的----Android编译过程

一个app是如何构造出来的—-Android编译过程

  1. 移动端的apk是什么??
  2. android的apk的整个编译过程

提示
博主:章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041
软件环境:使用androidstudio进行的


移动端的apk是什么??

apk是AndroidPackage的缩写,即Android应用安装包(apk)。

我们看到在android平台上下载的应用都是apk后缀名结尾的,那apk是什么??apk只是针对移动端应用的一种封包格式,它实际上也就相当于一个压缩包,将所有的资源,代码等,进行压缩后,转换成android平台能够识别的一种形式
android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第1张图片

生成的apk所在的地方在
android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第2张图片

关于apk文件格式,可以将其后缀名直接修改成.zip压缩包的格式,然后可以通过压缩包的格式进行解压的。

android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第3张图片

解压后的文件可以看到以下几个文件,关于文件类型,在后续的博客中再去做一些介绍

android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第4张图片

主要分为:META-INF,res,AndroidManifest.xml,class.dex,resource.arsc文件


android的apk的整个编译过程

我们知道在整个android的项目中包含了这样几个重要的文件或文件夹,有以下几种

  1. 资源文件res
  2. assert下面的资源文件
  3. 源代码文件
  4. aidl文件
  5. AndroidManifest.xml文件
  6. 依赖的jar包文件或者so文件
  7. 在打包的时候甚至需要用到签名文件

    而android在整个编译也就是在整个过程中将这些所有的文件打包,然后形成一个虚拟机认识识别,并且允许执行的应用程序,先直接上个图,根据图示中的显示来分析下android是怎样进行打包操作的;

android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第5张图片

根据图示来一步一步的分析:
从最顶层可以看到,它把android源码分成了以下几种

文件类型 文件类型解释
Application resource android的资源文件,即res下的文件
Android Source Code Android中的源码
aidl Files aidl 文件,也可以去生成.java文件
3td party lib or class file 第三方的库或者别的class文件
other resources 其他资源,主要是针对assert文件下的文件
Debug or Release KeyStore 签名是用的keystore文件


整个编译过程分主要为以下几个步骤:
1:打包资源文件,生成R文件
[源文件] Application resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(android.jar文件)
[目标文件] 目标文件主要有两个,一个是R.java文件也就是R文件,还有一个就是在解压后的文件中的resouce.arsc文件,R文件主要是后续需要作为源码中的引用
[使用工具] 这个过程中使用的工具是aapt.exe可执行工具,具体后续讲单独的使用方式

2:处理aidl文件,将aidl文件通过转换工具,转成java的接口
(源文件) aidl文件,这个aidl其实在底层开发中是经常用到的,但是在上层应用的时候,相对会比较少一点,这里不赘述
(目标文件)生成与aidl文件进行相互对应的.java的文件
(使用工具)因为从.aidl文件转换成java文件的时候,是需要工具是做转换的,使用的就是aidl.exe执行程序

3:类似java编译一样,将所有.java文件编译成.class文件
(源文件)这里的源文件包括三块,一个是R.java,一个是Application Source Code(android源码),还有就是aidl生成的.java文件
(目标文件) .java文件的目标文件不用多说,当然是.class文件了啊
(使用工具):如果你连使用javac把.java文件编译成.class文件都不会的吧,那可以gg了

4:将通过javac编译生成的.class文件与第三方相关东西打包
(源文件)源文件包括两块,一个是生成的.class文件包,还有一块就是第三方库或者其他的class文件
(目标文件)目标文件就是生成.dex文件,也就是解压之后可以看到的class.dex文件,当然这里不讲分包处理
(使用工具)使用android自带的工具dex.exe可执行文件,就可以完成将.class文件打包成.dex文件的步骤

5:最主要的合并过程,把所有生成的相关东西直接打包形成一个apk的过程
(源文件) 源文件就是通过aapt生成的source.arsc文件,通过dex生成的.dex文件,还有就是其他的source文件
(目标文件) 目标文件就是生成一个没有签名的.apk的文件
(使用工具) apkbuilder工具

6:未签名的apk正式签名
(源文件) 源文件就是未签名的apk文件以及签名使用的.keystore文件,具体在后续进行讲
(目标文件) 目标文件当然还是一个apk文件。只是添加了签名而已
(使用工具) 使用的是jarsigner工具

7:如果你想在google上进行发布,必须要做的一部就是对齐步骤
(源文件) 签名后的.apk文件
(目标文件) 对齐后的.apk文件
(使用工具) zipalign工具

这里不去对比Eclispe上的工具所在地,只讲androidstudio中相关的工具,众所周知,其实在android studio中是通过gradle去进行项目构建和生成apk的,那么,很重要的一点,就是一个apk的构建肯定是绕不开的,我自己的gradle中
C:\Users\Administrator\AppData\Local\Android\sdk1\build-tools,这是的buildtools所在的地方,所有的构建都在这

android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第6张图片

随便点开一个就可以看到

android逆向研究[0]:一个app是如何构造出来的----Android编译过程_第7张图片

基本上的工具在上面都是可以找到的,当然关于java源码相关的编译操作,可能需要在jdk下面找到相关执行程序

列一下使用的相关工具

工具名字 工具作用
aapt工具 将application source进行编译,生成resource.arsc以及R.java文件
aidl工具 将.aidl文件翻译成.java文件
javac工具 将java文件编译车.class文件
dex工具 以及其他的.class或者jar等打包成虚拟机能识别的.dex文件
apkbuilder工具 将source.arsc,.class,.dex文件,以及其他的资源如assert下的资源打包成apk
jarsigner工具 对apk进行签名的工具
zipalign工具 对apk进行对齐的工具,主要方便在google上面进行上架

以上就是一些工具的介绍,那么我们都已经知道了他们使用的步骤,能不能一部一部手动去把一个源码项目通过命令的形式来生成并且打包形成一个apk呢???答案当然是可以的,也必须是可以的

注意在高版本的tools中apkbuilder.bat其实已经被替换成了android.bat
这个时候需要做以下几个步骤

1:将android.bat拷贝一份重命名为apkbuilder.bat
2:将apkbuilder.bat中使用的
com.android.sdkmanager.Main修改成com.android.sdklib.build.ApkBuilderMain
详细信息可以参考http://www.jianshu.com/p/02e831f6969b

你可能感兴趣的:(Android学习)