【转】 Apk文件及其编译过程

Apk文件概述

Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包。

注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开。
Apk包中的内容

解压缩一个apk文件后,目录结构一般如下:

*.apk
├-res
│ ├+layout
│ └+drawable
├-META-INF
│ ├-MANIFEST.MF
│ ├-CERT.SF
│ └-CERT.RSA
├-resources.arsc
├-classes.dex
└-AndroidManifest.xml

META-INF目录

该目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。

Android应用程序发布都是一个包的方式,里面有很多文件。为了保证其包文件是完全出自开发人员之手,以及验证这份安装程序没有被修改过,就需要在开 发人员编译时,同时生成相应的签名文件,也就是认证信息文件。但是签名文件只能用来判断程序是否有被别人修改过,而并不能阻止别人去修改,然后再生成一份 新的签名,比如对英文软件进行汉化。

在这个目录下面三个文件:

 CERT.RSA
 CERT.SF
 MANIFEST.MF

其中:

CERT.RSA和CERT.SF文件可以用来判断程序程序是否被别人修改。
MANIFEST.MF是对所有文件的SHA1算法的签名。

关于CERT.RSA采用的算法:

该文件是采用PKCS#7格式进行数字签名的。

PKCS#7是由RSA安全体系在公钥加密系统中交换数字证书产生的一种加密标准。最近本的标准有PKCS#1、#3、#5、#6、#7、#8、#9 和#10,分别定义不同的协议标准。PKCS#7为密码信封封装标准,描述了密码操作(例如数字签名和数字信封)的数据的通用语法。该语法允许递归,例如 一个数字信封可以嵌套在另一个数字信封里面,或者一个实体可以在一个已经封装的数据上签名。该语法同时允许添加任意属性,比如签名时间等。该标准和保密增 强邮件(PEM)是兼容的,如果以PEM兼容形式构建,那么被签名后的数据和签名后又封装的数据内容可以很容易地被转化成PEM格式。

关于创建PKCS#7格式的数字签名:

如果按照PKCS#7格式标准自己写的话将是很复杂很麻烦的一件事,但是微软已经给出了封装好了一个COM–CAPICOM,这里面的数字签名就是符合PKCS#7格式的;另外还有一个开源的代码就是OpenSSL。
Res目录

这个目录主要保存资源的图片和窗口布局xml文件。
AndroidManifest.xml文件

该文件主用来描述应用程序名称、权限、版本、引用的库文件等信息。它的内容跟开发目录里的一样,但格式不一样。它是经过压缩的二进制文件,经过压缩大大减 少了占用的存储空间,这对于移动应用程序来说是非常重要的。因为移动网络带宽有限,下载速度慢,使用费用高,设备的存储空间也比较小。
classes.dex文件

该文件是java源码编译后生成的java字节码文件,最后经dx工具处理后生成的Dalvik虚拟机机可执行的字节码。
Resources.arsc文件

该文件是编译后的二进制资源文件。
Apk的编译过程

Apk的编译主要分为以下几步:
编译资源文件

主要负责编译资源文件(如xml、图片等文件),需要通过aapt工具来编译,最终生成资源文件表“resources.arsc”和资源关系文件 “R.java”。Java编译器连接代码里访问资源时,就会通过R.java来访问,同时aapt工具还负责把所有资源生成二进制文件,以应用程序运行 时方便访问。
编译Java源码

主要负责编译Java源码文件。所有java源码都是通过javac来编译的,包括上面编译出来的R.java,经过这一步所有的.java文件都会编译成.class文件。
生成dex文件

主要负责把各个单独的class文件,通过dx工具编译为Dalvik虚拟机可运行的dex文件。dex文件的格式详见Dex文件结构
生成apk文件

主要负责把资源文件和dex文件生成包文件,通过apkbuilder工具来完成。
关于Zipalign

Android SDK中包含了一个名为Zipalign工具,它可以优化APK程序包。APK的MIME其实就是一个Zip压缩文件,通过Zipalign可以让应用程序运行更快。

在Android平台中,数据文件存储在apk文件中,可以多进程的访问,类似于Win32程序的粒度对齐问题,zip虽然不是PE格式的文件,但是资源 的访问同样可以通过更好的对齐来优化,Zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式来提高执行效率。 Zipalign使用的例子:

Zipalign位于android sdk的tools目录下,windows操作系统可以通过cmd来执行它:

完整的命令行说明为:

Usage:
zipalign [-f] [-v] infile.zip outfile.zip
zipalign -c [-v] infile.zip

: alignment in bytes, e.g. ‘4‘ provides 32-bit alignment
-c: check alignment only (does not modify file)
-f: overwrite existing outfile.zip
-v: verbose output

使用方法如下:

./zipalign -v 4 source.apk destination.apk

其中这里-v代表详细输出,4代表以4个字节对齐,如果添加-f参数则会覆盖存在的输出文件。如

./zipalign -f -v 4 source.apk destination.apk

可以通过下面的命令检查文件是否已优化:

./zipalign -c -v 4 destination.apk

这里-c参数代表检查对齐,可看作是只读执行

时间: 2024-10-10 18:28:05

【转】 Apk文件及其编译过程的相关文章

[转]c++应用程序文件的编译过程

原文地址 这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.    一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件. 将每个cpp文件编译为一个对应的obj文件. 连接obj文件成为一个exe文件(或者其它的库文件). 下面分别描述这几个阶段.1.include文件的展开.    include文件的展开是一个很简单的过程,只是将include文件包含的代码拷贝到包含该文件的cpp文件(或者其它头文件)

APK文件反编译

上次看了两篇反编译APK文件的文章,反编译了几个音乐播放器,自己借用其中一个应用的界面做了一个相应播放器.近期有比较多的空闲时间,所以打算做一个LBS旅行应用.但目前发现又不会反编译了,所以还是记录下来,下次再忘直接看自己的文章比较快.(注:以下为Windows环境下) 1:反编译Java源码(从dex文件->jar文件->java文件) 利用工具(1)dex2jar,下载地址:http://code.google.com/p/dex2jar/(不知道能不能连上) (2)jd-gui,下载地址

关于APK文件反编译方法(图文详解)

今天晚上利用个把小时,终于把apk反编译彻底弄明白了,现在详细讲解一下apk反编译的具体过程. 1.下载三个工具 APK Multi-Tool    作用:获取apk的配置资源文件 dex2jar-0.0.9.15  作用:将apk反编译成java源码(classes.dex转化成jar文件) jd-gui 作用:打开上面生成的jar文件(把.apk文件改成.zip或者.rar文件后,用压缩文件打开只能看到大量的.java文件,此时就可以利用此工具打开,就可以看到源代码已经所用到的库文件) [三

[转]结合HierarchyViewer和APK文件反编译获得APP元素id值

背景: 最近在使用Robotium进行Android自动化测试.遇到了一个问题:我需要获得一个View的id(int型数值).此前我在http://maider.blog.sohu.com/255448342.html和http://maider.blog.sohu.com/255485243.html两篇文章中讲述了如何打开手机上的View Server来使用HierarchyViewer.HierarchyViewer对查看UI组件固然有帮助,但要想获取一个元素的id还是不行的.请看下图:

class文件的编译过程

编译器主要分为3类:前端编译器.JIT编译器.AOT编译器 前端编译器:把*.Java文件转变成*.class文件--Sun的Javac JIT编译器:就是即时编译器,将class文件转变成机器码的过程--HotSpotVM的C1.C2 AOT编译器:直接把*.java文件编译成本地代码的过程--Excelsior JET Javacde 编译过程主要分为以下3种 ①解析与填充符号的过程 1.词法.语法分析 词法分析是将源代码的字符流转变为标记集合(单个字符是程序编写过程的最小元素.而标记则是编

android apk 文件反编译

最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar  获取源码工具  地址:https://sourceforge.net/projects/dex2jar/   下载 jd-gui     查看源码工具     地址:http://jd.benow.ca/ 2.解压 dex2jar  . 3.修改 apk 文件后缀为 .rar 或 .zip ,然后解压文件,找到解压文

【Android】apk文件反编译

工具: 压缩软件:用于解压apk包 dex2jar:*.dex反编译为Jar包 jd-gui:查看Jar文件 (PS:不知道博客园如何上传附件,只能把工具挂到百度网盘了:http://pan.baidu.com/s/1jIwb3MY) 0x01:用压缩软件解压apk 0x02:dex2jar把*.dex编译jar包 (1)把需要反编译的*.dex文件拷贝到dex2jar根目录 (2)通过命令行cd进入dex2jar根目录 (3)执行命令 d2j-dex2jar.bat *.dex 编译成功后会发

apk去广告工具(利用apktool去除apk文件里的广告)

基本知识 apk安装包的文件结构 以知名桌面软件“LauncherPro”为例,apk安装包文件目录: 文件目录如下: - META-INF - res - anim - color - drawable - drawable-hdpi - drawable-land - drawable-land-hdpi - drawable-mdpi - drawable-port - drawable-port-hdpi - layout - layout-land - layout-port - xm

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h