【转】 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参数代表检查对齐,可看作是只读执行
【转】 Apk文件及其编译过程的更多相关文章
- c++应用程序文件的编译过程
这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程. 一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件 ...
- Android测试(三)——APK文件反编译
APK文件反编译: 在进行反编译操作前,先简单介绍下smali文件: smali是一种文件格式,语法和Jasmine的语言类似,这些smali文件包含开发应用程序时编写的java类的代码. 工具:ja ...
- [转]c++应用程序文件的编译过程
原文地址 这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程. 一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开inclu ...
- [转]结合HierarchyViewer和APK文件反编译获得APP元素id值
背景: 最近在使用Robotium进行Android自动化测试.遇到了一个问题:我需要获得一个View的id(int型数值).此前我在http://maider.blog.sohu.com/25544 ...
- apk文件反编译
apk文件的反编译,需要的工具apktool(反编译资源文件)和dex2jar-0.0.7.9-SNAPSHOT(反编译源码) 1. 下载相关软件 1)Apktool,下载地址:http://cod ...
- android apk 文件反编译
最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar 获取源码工具 地 ...
- 【Android】apk文件反编译
工具: 压缩软件:用于解压apk包 dex2jar:*.dex反编译为Jar包 jd-gui:查看Jar文件 (PS:不知道博客园如何上传附件,只能把工具挂到百度网盘了:http://pan.baid ...
- 反编译APK文件
有时源代码丢失了,这时如果有apk文件的话,是可以对apk文件反编译得到源文件的,本文介绍一下简单的反编译apk文件的过程. 1.工具 反编译apk需要的工具有两个:apk2java和apktool, ...
- 只需三步--轻松反编译Android Apk文件
安卓程序是通过java语言进行编写的,可以很容易进行反编译.很多apk文件被反编译后再二次打包,就成了自己的产品,很是流氓.下面我们来看看如何进行apk的反编译,以及常用的防反编译手段. 一.反编译A ...
随机推荐
- selenium+java+chrome 自动化测试环境搭建
安装jdk (jdk 配置环境变量) eclipse(可用免安装的) 安装谷歌浏览器 下载chorme driver (chorme driver 也要配置环境变量,将chormedriv ...
- JAVA 8 主要新特性 ----------------(二)JDK1.8优点概括
一.JDK1.8优点概括 1.速度更快 由于底层结构和JVM的改变,使得JDK1.8的速度提高. 2.代码更少(增加了新的语法 Lambda 表达式) 增加新特性Lambda表达式的 ...
- 20155339 Exp9 Web安全基础
Exp9 Web安全基础 基础问题回答 (1)SQL注入攻击原理,如何防御 原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语句得到 ...
- FreeRTOS移植到STM32上的移植过程
所有的单片机都是顺序执行的,而对于多任务而言就显得力不从心了,虽然在一些小项目中可以通过定时器来实现,但这种实现方式没有实时性,一旦任务需要在规定时间内做出响应,那只能通过实时操作系统来完成了.在很多 ...
- uniDBGrid实行多选表格行
http://blog.csdn.net/shuiying/article/details/11374655 uniDBGrid本身是支持checkBox多选的,但必须是Boolean的字段才行,只要 ...
- Centos安装Grafana
下载:https://grafana.com/grafana/download $ wget wget https://s3-us-west-2.amazonaws.com/grafana-relea ...
- 十进制转化为二进制Java实现
提取2的幂 这个方法用代码实现貌似有点麻烦,需要探测大小,我只实现了整数十进制到二进制的转化 /* * 提取2的幂 */ public static String TenToBin1(int ten) ...
- Android Bitmap操作问题之Canvas: trying to use a recycled bitmap
一.Bitmap.recycle 方法被弃用 在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用.在Android2.3时代,Bitmap的引用是 ...
- 腾讯大数据之TDW计算引擎解析——Shuffle
转自 https://www.csdn.net/article/2014-05-19/2819831-TDW-Shuffle/1 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,T ...
- mysql常用function
前言: 本文主要是参考mysql官方文档,并加上自己的测试用例,来加深自己对mysql函数的理解,也借此平台与大家分享,如有不妥和错误之处欢迎读者评论,我会及时改正,愿与大家一起学习进步. 概述: 所 ...