今天,简单讲讲android studio如何把写好的工程打包成apk的。

平时开发过程中我们通过android studio编写完成android项目之后直接点击 Run ‘app’就可以在build/outputs/apk生成可以在android设备中安装的apk文件了,那么整个android源码的构建过程是怎么样的呢?

构建过程

项目的构建:当我们打开一个项目,我们可以看到的是我们写的Java Code文件or Other JVM Code,资源文件,Build配置文件,但是通过run the project,我们就可以得到一个在我们的Andoid设备上可以运行的Apk,上线应用市场,还需要我们对其进行签名处理,来确保我们App的唯一性和安全性。整个过程就是所谓的项目构建。

如何实现整个构建的过程,对于每一个构建的步骤,都需要相应的功能模块来进行,比如Java Code编译,如何打成dex包等等,而这Android则为我们提供了相应的工具,在Android Studio命令行窗口中,我们可以通过相应的命令行来进行控制,但是,整个构建过程涉及到很多的步骤,很多的工具的使用,如果都通过命令行来进行控制,势必会相当麻烦,因此Androd Studio等IDE则对整个过程进行了一个打包,当我们在Run project的时候,底层的打包工具就会被调用,打包流程都会自动执行。然后我们只需要对构建文件按照自己的需求进行相应的配置,就可以构建出自己所需要的项目。

我们可以根据Google官方提供的流程图来具体了解构建的过程:

图中绿色标注为其中用到的相应工具,蓝色代表的是中间生成的各类文件类型。

通常的构建过程就是如上图所示,下面是具体描述:

1.AAPT(Android Asset Packaging Tool)工具会打包应用中的资源文件,如AndroidManifest.xml、layout布局中的xml等,并将xml文件编译为二进制形式,当然assets文件夹中的文件不会被编译,图片及raw文件夹中的资源也会保持原来的形态,需要注意的是raw文件夹中的资源也会生成资源id。AAPT编译完成之后会生成R.java文件。

2.AIDL工具会将所有的aidl接口转化为java接口。

3.所有的java代码,包括R.java与aidl文件都会被Java编译器编译成.class文件。

4.Dex工具会将上述产生的.class文件及第三库及其他.class文件编译成.dex文件(dex文件是Dalvik虚拟机可以执行的格式),dex文件最终会被打包进APK文件。

调用dx.bat将所有的class文件转化为classes.dex文件,dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等。由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别,当java程序编译成class后,使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右。

5.ApkBuilder工具会将编译过的资源及未编译过的资源(如图片等)以及.dex文件打包成APK文件。

6.生成APK文件后,需要对其签名才可安装到设备,平时测试时会使用debug keystore,当正式发布应用时必须使用release版的keystore对应用进行签名。

Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名。签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造。对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:

  • MANIFEST.MF

  • NETEASE.RSA

  • NETEASE.SF

Android系统就是根据这三个文件的内容对APK文件进行签名检验的。签名过程主要利用apksign.jar或者jarsinger.jar两个工具。将根据我们提供的Debug和Release两个版本的Keystore进行相应的签名。

7.如果对APK正式签名,还需要使用zipalign工具对APK进行对齐操作,这样做的好处是当应用运行时会提高速度,但是相应的会增加内存的开销。

Zipalign是一个Android平台上整理APK文件的工具,它首次被引入是在Android 1.6版本的SDK软件开发工具包中。它能够对打包的Android应用程序进行优化, 以使Android操作系统与应用程序之间的交互作用更有效率,这能够让应用程序和整个系统运行得更快。用Zipalign处理过的应用程序执行时间达到最低限度,当设备运行APK应用程序时占更少的RAM。

  • Zipalign如何进行优化的呢?

调用buildtoolszipalign,对签名后的APK文件进行对齐处理,使APK中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问APK文件时会更快。同时也减少了在设备上运行时的内存消耗。如果对于为何提速不理解,那么可以看下内存对齐的规则以及作用该篇文章,对于内存对齐的好处有比较生动详细的解释。最终这样我们的APK就生成完毕了

典型的APK中内容

  • AndroidManifest.xml 程序全局配置文件

  • classes.dex Dalvik字节码

  • resources.arsc 资源索引表

  • META-INF该目录下存放的是签名信息

  • res 该目录存放资源文件

  • assets该目录可以存放一些配置或资源文件

android Android项目构建过程就讲完了。

就这么简单。



android Android项目构建过程相关推荐

  1. Maven学习总结(2)——Maven项目构建过程练习

    Maven学习总结(二)--Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建 ...

  2. Maven学习总结(二)——Maven项目构建过程练习

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(二)--Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验 ...

  3. App打包原理——Android项目构建过程

    从开发者直观感受上来说,项目构建就是从Android Studio 点击'run'到生成apk之间的过程.今天我们讲解下这个过程中,用到的构建工具和构建的过程. 一)如下是一个apk解压后的目录,我们 ...

  4. Spring Cloud云服务架构 - common-service 项目构建过程

    2019独角兽企业重金招聘Python工程师标准>>> 我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来参考学习. 首先在构建spr ...

  5. Java B2B2C多用户商城 springcloud架构- common-service 项目构建过程(七)...

    我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来参考学习. 首先在构建spring cloud的common-service之前,我们需要准备的技术: ...

  6. (八)整合spring cloud云服务架构 - commonservice-eureka 项目构建过程

    我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家: 1. 创建一个名为particle-common-eurek ...

  7. Java B2B2C多用户商城 springcloud架构- common-service 项目构建过程(七)

    我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来参考学习. 首先在构建spring cloud的common-service之前,我们需要准备的技术: ...

  8. spring cloud架构 - HongHu common-service 项目构建过程

    2019独角兽企业重金招聘Python工程师标准>>> 我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来参考学习. 首先在构建spr ...

  9. maven snapshot依赖 打包_Maven教程2:Maven项目构建过程练习

    点击上方"Java技术前线",选择"置顶或者星标" 与你一起成长 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化 ...

最新文章

  1. 前端一HTML:十七:背景
  2. python 安装 pip,setuptools
  3. Linux操作系统中内存buffer和cache的区别--从free命令说起(转)
  4. 安装android到u盘安装程序,在u盘内安装android教程
  5. 卷积神经网络结构优化综述
  6. leetcode —— 866. 回文素数
  7. 2.WindowsServer2012R2装完的一些友好化设置
  8. 实验1 201521410028
  9. mysql8019zip安装_Eclipse+java+mysql8019实现数据库连接
  10. 如何搭建自己的第四方支付平台?
  11. 顺序表C语言实现详解
  12. [0.0]-AutoSAR零基础学习-专栏介绍
  13. 云服务器怎么划分虚拟主机,云服务器 划分虚拟主机
  14. IIS部署Silverlight
  15. 实验9 人口预测与数据拟合(最小二乘法)
  16. 防孤岛保护装置在光伏行业的应用
  17. 计算机专业学数电模电哪本书,我该怎么学数电和模电啊?
  18. turtle 画笔设置函数
  19. 再谈哥德尔不完备定理
  20. Mac下卸载java环境

热门文章

  1. iOS - 获取安装所有App的Bundle ID
  2. 【Zookeeper】编程实战之Zookeeper分布式锁实现秒杀
  3. IOS 2D游戏开发框架 SpriteKit--续(创建敌对精灵)
  4. HID 设备(鼠标) report descriptor解析
  5. ApplicationContextAware
  6. 日志配置logback
  7. Jquery plugin template POPUP Plugin
  8. 内网用户之间使用MSN Messenger快速传送文件的小窍门
  9. android 4.0以上WebView不能全屏播放视频的解决办法
  10. php操作redis phpredis扩展