这是预编译工具生成的文件_组件化架构 10.编译优化
软件研发中,耗费最多时间的并不是编写代码,而是代码编译和代码不断调试的过程
软件试错时间
Android基础编译流程
编译构建的四个步骤:
代码编译:将源代码,R文件,AIDL生成的文件等 编译成.class文件
代码合成: 通过dex工具将.class文件和工程依赖的第三方库文件生成虚拟机可执行的.dex文件,如果使用了MultiDex会产生多个dex文件;
资源打包:apkbuilder工具将.dex文件,apt编译后的资源文件,三方库中的资源文件打包生成签名对齐的apk文件
签名和对齐:使用Jarsigner和Zipalign对文件进行签名和对齐,生成最终的apk文件
以下是gradle编译一个app module debug版的task链
gradle clean assembleDebug -x lint check –stacktrace
:app:clean //清理上次编译的遗留,删除module下的build文件夹:app:preDebugBuild //debug版本预编译:app:checkDebugManifest //AndroidManifest检查:app:prepareDebugDependencies //检查debug版本的依赖:app:compileDebugAidl // 编译debug版本的aidl文件:app:compileDebugRenderscript //编译Renderscript文件:app:generateDebugBuildConfig //generated/source文件夹下,生成buildConfig文件夹:app:generateDebugAssets //生成Assets文件到generated下的asset文件夹:app:mergeDebugAssets //在intermediates下生成assets文件夹,将其他module/aar中的assets文件拷贝过来:app:generateDebugResValues //生成res value文件:app:generateDebugResources //生成Resources文件:app:mergeDebugResources //merge(合并)资源文件:app:processDebugManifest //将merge后的Manifest文件放在intermediates/manifests文件夹下:app:processDebugResources //处理资源文件,生成R.txt文件,同时也生成对应的multidex文件夹:app:generateDebugSources //合成资源文件在generated文件夹下生成对应的R.java文件:app:compileDebugJavaWithJavac //使用javac生成java文件:app:compileDebugNdk //ndk编译:app:compileDebugSources //编译资源文件:app:transformClassesWithDexForDebug //将.class文件转换成.dex文件:app:mergeDebugJniLibFolders //合并jni(.so)文件:app:transformNative_libsWithMergeJniLibsForDebug //转换jni文件:app:processDebugJavaRes //处理java资源:app:transformResourcesWithMergeJavaResForDebug //转换java资源文件:app:validateSigningDebug //验证签名:app:packageDebug //打包:app:assembleDebug //apk编译完成复制代码
InstantRun
AndroidStudio 2.0 推出了InstantRun,意为瞬间编译,在编译开发时减少应用的部署及构建时间
需要Gradle2.0以上,minSdkVersion15以上
构建流程:代码变更-->编译-->应用构建-->应用部署-->app重启-->activity重启-->完成修改变更
实现即时运行的机制:修改代码后,增量构建(产生增量dex),然后通过判断更新资源的复杂度去选择执行热更新,温更新或者冷更新;
热部署:生效时不需要重启app,也不需要重启activity
温部署:重启activity后才能看到更新
冷部署:app需要重启,但不是重新安装
运行原理:2,代码修改后,通过javac将java文件编译成class文件,然后打包成dex文件,同样放置在增量apk中;
使用manifest-merger整合项目的manifest,通过aapt工具将合成的AndroidManifest.xml文件与res资源编译到增量apk中;
优化gradle编译
properties配置优化
#开启并行编译,相当使用了多线程,仅仅适用于模块化项目(存在多个 Library 库工程依赖主工程) org.gradle.parallel=true # 使用编译缓存android.emableBuildCache=true# 开启构建缓存,Gradle 3.5新的缓存机制,可以缓存所有任务的输出, # 不同于buildCache仅仅缓存dex的外部libs,它可以复用任何时候的构建缓存,设置包括其它分支的构建缓存 org.gradle.caching=true# 构建初始化需要执行许多任务,例如java虚拟机的启动,加载虚拟机环境,加载class文件等等,# 配置此项可以开启线程守护,并且仅仅第一次编译时会开启线程(Gradle 3.0版本以后默认支持) # 保证jvm编译命令在守护进程中编译apk,daemon可以大大减少加载jvm和classes的时间org.gradle.daemon=true # 最大的优势在于帮助多 Moudle 的工程提速,在编译多个 Module 相互依赖的项目时,# Gradle 会按需选择进行编译,即仅仅编译相关的 Module org.gradle.configureondemand=true # 配置编译时的虚拟机大小,加大编译时AndroidStudio使用的内存空间# -Xmx2048m:指定 JVM 最大允许分配的堆内存为 2048MB,它会采用按需分配的方式。#-XX:MaxPermSize=512m:指定 JVM 最大允许分配的非堆内存为 512MB,同上堆内存一样也是按需分配的。org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8复制代码
task任务过滤
选择性的去除并不需要运行的gradle task任务
tasks.whenTaskAdded(new Action() { @Override void execute(Task task) { if (task.name.contains("lint")//不扫描潜在bug可以使用该项 || task.name == "clean" || task.name.contains("Aidl")//项目中用到Aidl则不可以舍弃这个任务 || task.name.contains("mockableAndroidJar")//用不到测试时可以先关闭 || task.name.contains("UnitTest")//用不到测试时可以先关闭 || task.name.contains("AndroidTest")//用不到测试时可以先关闭 || task.name.contains("Ndk") || task.name.contains("Jni")//用不到NDK和jni时关闭 ) { task.enabled = false } }})复制代码
极速
增量编译 freeline:
由蚂蚁聚宝 Android 团队开发,它可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时 (方案不错,不再多说,已经凉了)
组件化分发
串行的优化规则是 减少重复操作--缓存,减少重复造轮子 并行的优化规则是 分离业务耦合度--解耦,将注意力放到更小的模块中 分发意味着更深度的解耦,对事物粒度进行更细致的分裂,对组件进行扩展
我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号接收我的最新文章
这是预编译工具生成的文件_组件化架构 10.编译优化相关推荐
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件.将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提 ...
- java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?
在大家编译完java程序的时候,都是会生成一个文件的,作为java新手不清楚java编译后生成什么文件?那么今天我们就给大家讲解一下这方面的内容,大家可以参考下文哦! java文件编译过后会生成一个c ...
- Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
首先先说一下Linux吧因为这也是博主最早接触的编程开发环境所以比较熟悉的! Linux下就说GCC GCC编译如果不指定编译选项的话是一步到位没有额外的后缀名文件! .i文件:.i文件是GCC -E ...
- VCS仿真和多个test用urg工具生成coverage文件verdi查看--转载
VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三步法.我呢,因为运用都是简单的非mix language,所以经常用一步法,因为这样省劲,但是对于跑regression最好还 ...
- keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错
keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错 解决方案: 第一种:后续编译不能生成.o文件而报错 右键出现感叹号的文件 点击第一个" ...
- 将idea中编译输出目录 classes 里的文件删掉,发现再次编译不能生成class文件
将idea中编译输出目录 classes 里的文件删掉,发现再次编译不能生成class文件. 其他UP主给的解决方法如下: 解决方案:settings -> compiler 勾选自动编译选项 ...
- 单文件组件的组件传值_移动端组件化架构(下)
我的组件化方案 对于项目架构来说,一定要建立于业务之上来设计架构.不同的项目业务不同,组件化方案的设计也会不同,应该设计最适合公司业务的架构. 架构设计 以我之前公司项目为例,项目是一个地图导航应用, ...
- FISCO BCOS 控制台 console solidity合约编译工具 生成abi bin java文件
下载控制台 https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console_of_java_sdk. ...
最新文章
- 【Git】git的基本使用
- Ubuntu上安装Hadoop集群
- 【Linux】Linux中文本编辑器和系统管理命令
- 不小心发现谷歌 Firebase 消息服务的漏洞,获奖3万+美元
- 计算机视觉实战 (一) 开个视觉实战专栏
- modbus学习笔记——帧
- 无人机航模新手100 问
- 一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导
- 华为手机怎么打开位置服务器,华为手机怎么开启远程定位服务器
- java的reveserOder_reverse是什么意思_reverse的用法
- 现代硬件技术的发展与未来趋势
- Java趣味编程案例12----孪生素数
- eps倾斜摄影矢量化采集毕业设计_eps倾斜摄影矢量化dlg采集#知识参考
- ROS导航小车0 代价地图(仅作个人记录)
- autojs自动滑屏脚本_创造与魔法脚本软件autojs上下滑动
- easypoi导出excel不设置样式_POI Excel导出样式设置
- windows bat批处理解压文件
- 人工智能前沿——深度学习热门领域(确定选题及研究方向)
- 如何对PDF文献做可视化分析?
- android倒计时录制视频下载,什么软件可以制作倒计时视频?安卓手机制作倒计时片头的方法...
热门文章
- 【收藏】C# 2.03.0新特性总结
- Go开发之路 -- Go语言基本语法 - 作业
- php文章付费阅读系统球料付费阅读系统
- Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则
- 页面刷新vuex数据消失问题解决方案
- js温故而知新8(浏览器)——学习廖雪峰的js教程
- iOS摄像头和相册-UIImagePickerController-浅析(转)
- jQuery源码-jQuery.fn.each jQuery.each
- SCCM2012R2之五创建系统集合
- Ubuntu/Debian 系统切换Java(JVM),修改Java版本,JAVA_HOME