android APK打包过程学习_艾伦蓝的博客-程序员秘密

技术标签: java  android  移动开发  c/c++  

[size=medium][b]流程概述:[/b][/size]
1、打包资源文件,生成R.java文件
2、处理aidl文件,生成相应java 文件
[color=red]3、编译工程源代码,生成相应class 文件[/color]
4、转换所有class文件,生成classes.dex文件
5、打包生成apk
6、对apk文件进行签名
[b]7、对签名后的apk文件进行对齐处理[/b]

[img]http://dl2.iteye.com/upload/attachment/0113/5808/40a8bb77-30d3-3638-9751-4ff321ecc545.png[/img]

[size=medium][b]第一步:打包资源文件,生成R.java文件。[/b][/size]
【[b]输入[/b]】Resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)
【[b]工具[/b]】aapt工具
【[b]输出[/b]】打包好的资源(bin目录中的resources.ap_文件)、R.java文件(gen目录中)
打包资源的工具aapt,大部分文本格式的XML资源文件会被编译成二进制格式的XML资源文件,除了assets和res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理。 。
生成过程主要是调用了aapt源码目录下的Resource.cpp文件中的buildResource()函数,该函数首先检查AndroidManifest.xml的合法性,然后对res目录下的资源子目录进行处理,处理的函数为makeFileResource(),处理的内容包括资源文件名的合法性检查,向资源表table添加条目等,处理完后调用compileResourceFile()函数编译res与asserts目录下的资源并生成resources.arsc文件,compileResourceFile()函数位于aapt源码目录的ResourceTable.cpp文件中,该函数最后会调用parseAndAddEntry()函数生成R.java文件,完成资源编译后,接下来调用compileXmlfile()函数对res目录的子目录下的xml文件分别进行编译,这样处理过的xml文件就简单的被“加密”了,最后将所有的资源与编译生成的resorces.arsc文件以及“加密”过的AndroidManifest.xml文件打包压缩成resources.ap_文件(使用Ant工具命令行编译则会生成与build.xml中“project name”指定的属性同名的ap_文件)。
关于这一步更详细的流程可阅读[url]http://blog.csdn.net/luoshengyang/article/details/8744683[/url]

[size=medium][b]第二步:处理aidl文件,生成相应的java文件。[/b][/size]
【[b]输入[/b]】源码文件、aidl文件、framework.aidl文件
【[b]工具[/b]】aidl工具
【[b]输出[/b]】对应的.java文件
对于没有使用到aidl的android工程,这一步可以跳过。aidl工具解析接口定义文件并生成相应的java代码供程序调用。

[size=medium][b]第三步:编译工程源代码,生成下相应的class文件。[/b][/size]
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【工具】javac工具
【输出】.class文件
这一步调用了javac编译工程src目录下所有的java源文件,生成的class文件位于工程的bin\classes目录下,上图假定编译工程源代码时程序是基于android SDK开发的,实际开发过程中,也有可能会使用android NDK来编译native代码,因此,如果可能的话,这一步还需要使用android NDK编译C/C++代码,当然,编译C/C++代码的步骤也可以提前到第一步或第二步。

[size=medium][b]第四步:转换所有的class文件,生成classes.dex文件。[/b][/size]
【[b]输入[/b]】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【[b]工具[/b]】javac工具
【[b]输出[/b]】.dex文件
前面多次提到,[color=red]android系统dalvik虚拟机的可执行文件为dex格式[/color],程序运行所需的classes.dex文件就是在这一步生成的,使用的工具为dx,dx工具主要的工作是将java字节码转换为dalvik字节码、压缩常量池、消除冗余信息等。

[size=medium][b]第五步:打包生成apk。[/b][/size]
【[b]输入[/b]】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)
【[b]工具[/b]】apkbuilder工具
【[b]输出[/b]】未签名的.apk文件
打包工具为apkbuilder,[color=red]apkbuilder为一个脚本文件[/color],实际调用的是android-sdk\tools\lib\sdklib.jar文件中的com.android.sdklib.build.ApkBuilderMain类。它的代码实现位于android系统源码的sdk\sdkmanager\libs\sdklib\src\com\android\sdklib\build\ApkBuilderMain.java文件,代码构建了一个ApkBuilder类,然后以包含resources.arsc的文件为基础生成apk文件,这个文件一般为ap_结尾,接着调用addSourceFolder()函数添加工程资源,addSourceFolder()会调用processFileForResource()函数往apk文件中添加资源,处理的内容包括res目录与asserts目录中的文件,添加完资源后调用addResourceFromJar()函数往apk文件中写入依赖库,接着调用addNativeLibraries()函数添加工程libs目录下的Native库(通过android NDK编译生成的so或bin文件),最后调用sealApk()关闭apk文件。

[size=medium][b]第六步:对apk文件进行签名。[/b][/size]
【[b]输入[/b]】未签名的.apk文件
【[b]工具[/b]】jarsigner
【[b]输出[/b]】签名的.apk文件
[color=red]android的应用程序需要签名才能在android设备上安装[/color],签名apk文件有两种情况:一种是在调试程序时进行签名,使用eclipse开发android程序时,在编译调试程序时会自己使用一个debug.keystore对apk进行签名;另一种是打包发布时对程序进行签名,这种情况下需要提供一个符合android开发文档中要求的签名文件。签名的方法也分两种:一种是使用jdk中提供的jarsigner工具签名;另一种是使用android源码中提供的signapk工具,它的代码位于android系统源码build\tools\signapk目录下。

[size=medium][b]第七步:对签名后的apk文件进行对齐处理。[/b][/size]
【[b]输入[/b]】签名后的.apk文件
【[b]工具[/b]】zipalign工具
【[b]输出[/b]】对齐后的.apk文件
这一步需要使用的工具为zipalign,它位于android-sdk\tools目录,源码位于android系统源码的build\tools\zipalign目录,它的主要工作是将spk包进行对齐处理,使spk包中的所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时速度会更快,验证apk文件是否对齐过的工作由ZipAlign.cpp文件的verify()函数完成,处理对齐的工作则由process()函数完成。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lan12334321234/article/details/84754848

智能推荐

Zabbix-架构与部署_CN-FuWei的博客-程序员资料_zabbix架构

一、zabbix结构组成zabbix软件结构组成:1.Zabbix Web GUI: 提供Web界面2.Zabbix Database:提供数据存储功能,专用于存储配置信息,以及采集到的数据3.Zabbix Server: 接收Agent采集数据的核心组件。4.Zabbix Agent: 部署在被监控主机上,用于采集本地数据。5.Zabbix Proxy: 当被监控节点较多时,用于减轻Server压力的组件,也用于分布式监控系统。由Proxy接收数据后统一发送至Server。二、

cisco交换机Telnet配置_weixin_34357436的博客-程序员资料

cisco交换机Telnet配置 switch>en ;第一次密码为空switch#conf t ;进入全局配置模式switch(config)#hostname swa ;设置交换机名swa(config)...

MacOs M1芯片iTerm安装lrzsz_不想上班只想摸鱼的程序员的博客-程序员资料

首先是iterm的下载和lrzsz的安装,这类文章很多,附上一个自认为比较全面的MAC iTerm2 下 使用 lszrz_lightWay的博客-程序员资料_lszrzMAC iTerm2 下 使用 lszrzMAC iTerm2 下 使用 lszrz需要什么什么是 lrzsz为什么需要lszrz具体过程安装lrzsz下载iterm2-zmodem移动到指定位置并赋予可执行权限给iTerm2添加触发器需要什么homebrew包管理工具iTerm2终端命令行wget命令行工具什么是 lrzsz Lrz

Robot Framework学习(8):Web自动化测试_csdn怀的博客-程序员资料

web自动化测试用到的库是Selenium2Library与浏览器相关的关键字1. Open Browser    https://www.baidu.com  ff/chrome    # 打开浏览器注:要想通过不同的浏览打开URL地址,一定要安装浏览器相对应的驱动2. Close Browser        # 关闭浏览器3. Close All Browser   ...

超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!_程序员书单的博客-程序员资料

​之前写过很多次关于Java学习指南、Java技术路线图的文章。但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃。于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来,做成一份非常硬核的Java学习指南+路线图,一篇文章搞定Java学习,360度无死角(可能)如果你们喜欢这类硬核的文章,以后我也会继续这么硬核下去的!不要忘了分享噢。以下就是本文的主要内容,万字长文,你可悠着点看,拒绝到收藏夹吃灰!一、Java学习路线图1 计算机基础**2**Java.

pycharm在import第三方包时出错/import requests等等出错_苏道丶的博客-程序员资料

我原本已经在cmd里设置在python安装目录下的scripts里运行了pip install requests,也已经安装成功,但是在用pycharm import 时却仍是报错说无此module。主要是使用pycharm新建工程后库不一样了。1/create new project2/选择pure python起任意文件名create3/等待加载完成4/打开lib库发现site-package...

随便推点

背包 DP 背包_melo melo的博客-程序员资料_背包dp

背包 题目 是dp中较为常见的题目分为 0--1 背包 ,完全背包 和多重背包这三类 是越来越深入的首先来介绍一下 0--1背包 ; 首先 0 --1 背包的含义是 给你一个容量位M的背包 然后给你n个物品 ,每个物品具有一定价值和一定重量 会站一定的背包空间答案是在n个物品中那几个 然后使得到的价值最大 首先0 --1入门 首先...

单文件程序库2_yazhouren的博客-程序员资料

Packageshtmk edited this page 5 days ago · 253 revisions Pages 3HomeExplanation of package.jsonPackagesClone this wiki locally Clone in DesktopLis

Android学习——控件ListView的使用_anjiukonghe77852的博客-程序员资料

一、ListView的简单用法首先新建一个ListViewTest项目,并让Android Studio自动创建好活动。然后修改activity_main.xml中的代码,如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.a...

ABAP ALV显示简单例子_土星环的土的博客-程序员资料_abap alv 例子

*&---------------------------------------------------------------------**&ReportZ_210113_02*&---------------------------------------------------------------------**&*&---------------------------------------------------------------..

【数据库】查询和01号学生学习的课程完全相同的其他同学的信息_Angusis的博客-程序员资料_查询和01学生课程完全相同

今天读了几篇博客:https://blog.csdn.net/qq_41080850/article/details/84593860https://www.cnblogs.com/fengyunlishi/archive/2012/10/18/2730051.htmlhttps://blog.csdn.net/qq_41080850/article/details/84648897#co...

推荐文章

热门文章

相关标签