文档章节

Android构建打包过程

k
 kim366
发布于 2016/05/13 19:17
字数 1209
阅读 7
收藏 0
点赞 2
评论 0

        Google推出AS已经有一段时间,官方文档中也已经开始推荐使用AndroidStudio。不过,从eclipse转向AndroidStudio似乎并没有那么容易,最近开始尝试用AndroidStudio进行开发,各种问题层出不穷。其中,AS中使用Gradle进行构建,使用DSL语言进行配置脚本编写是最难理解的地方。下面是从官网找到的apk程序构建打包的详细说明,补充一下这些知识点或许可以更好地理解何为构建,对AS中的Gradle也会更容易接受。

        

         构建系统概况

         新的Android SDK构建系统

    Android构建是用于构建测试运行和打包应用程序的工具套件。 这个构建是一个综合的工具,可以从as的菜单栏或者从命令行独立运行。这个构建系统可以完成如下工作:

  • 定制,配置,和继承构建过程
  • 使用相同的项目和模块,通过不同的特征创建多个apk
  • 重复使用资源集中代码和资源

    Android构建系统的灵活性,使你可以完成上面的工作,而不用修改你的核心资源文件。

         构建过程详解

        在生成.apk的构建过程中涉及到很多工具和步骤,各个步骤会生成对应的中间文件,如果使用AS的话,完整的构建过程在每次运行项目(project)或者模块(module)的task任务时都会发生。 构架过程非常灵活, 需要理解的是各个阶段所发生的事情都是可配置和可扩展的。下图描述了在一次构建过程中涉及到的不同的工具和过程。

    

    典型的构建过程如下所示,构建系统会合并来自配置文件中的所有资源,如flavors, build types, dependencies等节点下的内容, 如果不同的文件夹包含具有相同名字和设置的资源,则覆盖优先级顺序是:dependencies 覆盖build types, build type 覆盖 flavors, flavors覆盖主要资源目录。 

    Android Asset Package Tool(aapt)会获取所有的应用程序资源文件,并进行编译,如AndroidManifest.xml, R文件会在此阶段生成,使你可以从java代码中引用。  

    aidl工具转换所有的.aidl接口,所有的R文件和.aidl文件被编译,并输出.class文件。

    dex工具将所有的.class文件转换成dalvik字节码,module中包含的所有第三方库和.class文件也会被转换成.dex文件,以使他们能够被打包进.apk文件中。

    所有没有编译过的资源(如图片),编译过的资源,以及.dex文件会被发送到apkbuilder工具中被打包进.apk文件中。

         一旦.apk文件被构建完成,就使用debug模式或者release模式的签名key进行签名,然后安装进设备中。最后,如果程序使用release模式签名的,则必须通过zipalign工具进行排列。排列最终的.apk文件会在程序运行时节省内存。

    

    注: App有64k的方法引用限制,如果app达到这个限制,构建过程就会输出下面的错误信息:
    Unable to execute dex: method ID notin[0,0xffff]:65536.
    要避免这个错误,可以查看Building Apps with Over 65K Methods.


    如果对上面的内容还是不太理解的话,可以再看看《Android软件安全与逆向分析》中第四章第一节,对这个过程的详细分析,基本概念如下,七个步骤(参考图与上图一样):

    第一步: 打包资源文件生成R文件。这个过程由sdk\platform-tools下的aapt工具完成。反编译过app的同学应该知道,反编译出来会有个resources.arsc文件,这个文件也是在这个生成的。

    第二步: 处理aidl文件,生成相应的java文件。这个过程由sdk\platform-tools下的aidl工具完成。

    第三步: 编译工程源代码,生成相应的class文件。这一步由javac编译src目录下的所有java代码,如果需要的话,NDK中的本地代码也是在这一步中被编译的。

    第四步: 转换所有的class文件,生成classes.dex文件。使用到的工具为sdk\platform中的dx。

    第五步: 打包生成apk文件。打包工具为apkbuilder。

    第六步: 对apk进行签名。

    第七步: 对签名后的apk文件进行对齐处理。需要用到的工具为zipalign。对其的原理为,使apk中的所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。

    


本文转载自:http://blog.csdn.net/oyangyujun/article/details/46934487

共有 人打赏支持
k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
读书笔记--Android Gradle权威指南(下)

前言 最近看了一本书《Android Gradle 权威指南》,收获挺多,就想着来记录一些读书笔记,方便后续查阅。 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南(上) 上一篇中我们讲了:...

请叫我大苏 ⋅ 05/27 ⋅ 0

React Native 【学习总结】-【Jenkins集成】

简述 Jenkins是一个持续集成工具,它本身有很丰富的插件提供使用,方便持续集成,为开发省时省力,下面是项目中对新的RN项目做的持续集成例子,通过该例子学会如何使用jenkins。 Jenkins安装...

Pape ⋅ 05/18 ⋅ 0

Android动态化框架App Bundles

Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用...

code_xzh ⋅ 05/16 ⋅ 0

Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

皮肤包项目的 Gradle 脚本演化

我在做的一个项目需要有换肤功能,换肤的方案是采用第三方库 ThemeSkinning 的实现(在其基础上修复若干 bug)。皮肤的制作是把相关的资源放在一个 app module 中打包成 apk,当然资源的命名...

maosidiaoxian ⋅ 04/11 ⋅ 0

使用gradle进行构建打包操作

由于我们部署的jenkins执行的Android构建操作就是由Gradle来实现,所以以下是我们在使用gradle在执行构建操作时,gradle的构建原理 一.Gradle的安装和配置 1. 我们要从Gradle的官网,去下载g...

awesome@qa ⋅ 05/15 ⋅ 0

Flutter学习总结----第一章、Flutter基础

Flutter学习总结: 更多相关内容和示例代码,请看我的github: https://github.com/AweiLoveAndroid/Flutter-learning 第1章、基础入门 1.1 Flutter简介 1.1.1 跨平台框架的发展历史 详情请看...

AWeiLoveAndroid ⋅ 昨天 ⋅ 0

Gradle实现Android多渠道定制化打包

最近在项目中遇到需要实现 Apk 多渠道、定制化打包, Google 、百度查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~ 需求可以总结如下: 如何实现多个 ...

玄学酱 ⋅ 2017/08/03 ⋅ 0

【译】Gradle 的依赖关系处理不当,可能导致你编译异常

文章 | Ashesh Bharadwaj 翻译 | 承香墨影 授权 承香墨影 翻译、编辑并发布 在 Android Studio 中,Gradle 构建过程对于开发者来说,很大程度上是抽象的。作为一个新的 Android 开发者,我们...

承香墨影 ⋅ 04/03 ⋅ 0

自动化构建Android项目 ---- Jenkins自动化部署学习笔记(二)

  上篇文章跟大家分享了在Windows上安装Jenkins的方法,这篇文章来跟大家分享一下利用Jenkins自动化构建Android项目: 一、所需准备: Android项目上传至版本管理平台,这里我准备了Githu...

onestravel ⋅ 05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 30分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部