• 软件研发中,耗费最多时间的并不是编写代码,而是代码编译和代码不断调试的过程

  • 软件试错时间

  1. 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编译完成复制代码
  1. InstantRun

AndroidStudio 2.0 推出了InstantRun,意为瞬间编译,在编译开发时减少应用的部署及构建时间

  • 需要Gradle2.0以上,minSdkVersion15以上

  • 构建流程:代码变更-->编译-->应用构建-->应用部署-->app重启-->activity重启-->完成修改变更

  • 实现即时运行的机制:修改代码后,增量构建(产生增量dex),然后通过判断更新资源的复杂度去选择执行热更新,温更新或者冷更新;

    • 热部署:生效时不需要重启app,也不需要重启activity

    • 温部署:重启activity后才能看到更新

    • 冷部署:app需要重启,但不是重新安装

  • 运行原理:2,代码修改后,通过javac将java文件编译成class文件,然后打包成dex文件,同样放置在增量apk中;

  1. 使用manifest-merger整合项目的manifest,通过aapt工具将合成的AndroidManifest.xml文件与res资源编译到增量apk中;

  1. 优化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        }    }})复制代码
  1. 极速

  • 增量编译 freeline:

由蚂蚁聚宝 Android 团队开发,它可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时 (方案不错,不再多说,已经凉了)

组件化分发

串行的优化规则是 减少重复操作--缓存,减少重复造轮子 并行的优化规则是 分离业务耦合度--解耦,将注意力放到更小的模块中 分发意味着更深度的解耦,对事物粒度进行更细致的分裂,对组件进行扩展

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号接收我的最新文章

这是预编译工具生成的文件_组件化架构 10.编译优化相关推荐

  1. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  2. eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件

    导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件.将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提 ...

  3. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?

    在大家编译完java程序的时候,都是会生成一个文件的,作为java新手不清楚java编译后生成什么文件?那么今天我们就给大家讲解一下这方面的内容,大家可以参考下文哦! java文件编译过后会生成一个c ...

  4. Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用

    首先先说一下Linux吧因为这也是博主最早接触的编程开发环境所以比较熟悉的! Linux下就说GCC GCC编译如果不指定编译选项的话是一步到位没有额外的后缀名文件! .i文件:.i文件是GCC -E ...

  5. VCS仿真和多个test用urg工具生成coverage文件verdi查看--转载

    VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三步法.我呢,因为运用都是简单的非mix language,所以经常用一步法,因为这样省劲,但是对于跑regression最好还 ...

  6. keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错

    keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错 解决方案: 第一种:后续编译不能生成.o文件而报错 右键出现感叹号的文件 点击第一个" ...

  7. 将idea中编译输出目录 classes 里的文件删掉,发现再次编译不能生成class文件

    将idea中编译输出目录 classes 里的文件删掉,发现再次编译不能生成class文件. 其他UP主给的解决方法如下: 解决方案:settings -> compiler 勾选自动编译选项 ...

  8. 单文件组件的组件传值_移动端组件化架构(下)

    我的组件化方案 对于项目架构来说,一定要建立于业务之上来设计架构.不同的项目业务不同,组件化方案的设计也会不同,应该设计最适合公司业务的架构. 架构设计 以我之前公司项目为例,项目是一个地图导航应用, ...

  9. FISCO BCOS 控制台 console solidity合约编译工具 生成abi bin java文件

    下载控制台 https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console_of_java_sdk. ...

最新文章

  1. 【Git】git的基本使用
  2. Ubuntu上安装Hadoop集群
  3. 【Linux】Linux中文本编辑器和系统管理命令
  4. 不小心发现谷歌 Firebase 消息服务的漏洞,获奖3万+美元
  5. 计算机视觉实战 (一) 开个视觉实战专栏
  6. modbus学习笔记——帧
  7. 无人机航模新手100 问
  8. 一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导
  9. 华为手机怎么打开位置服务器,华为手机怎么开启远程定位服务器
  10. java的reveserOder_reverse是什么意思_reverse的用法
  11. 现代硬件技术的发展与未来趋势
  12. Java趣味编程案例12----孪生素数
  13. eps倾斜摄影矢量化采集毕业设计_eps倾斜摄影矢量化dlg采集#知识参考
  14. ROS导航小车0 代价地图(仅作个人记录)
  15. autojs自动滑屏脚本_创造与魔法脚本软件autojs上下滑动
  16. easypoi导出excel不设置样式_POI Excel导出样式设置
  17. windows bat批处理解压文件
  18. 人工智能前沿——深度学习热门领域(确定选题及研究方向)
  19. 如何对PDF文献做可视化分析?
  20. android倒计时录制视频下载,什么软件可以制作倒计时视频?安卓手机制作倒计时片头的方法...

热门文章

  1. 【收藏】C# 2.03.0新特性总结
  2. Go开发之路 -- Go语言基本语法 - 作业
  3. php文章付费阅读系统球料付费阅读系统
  4. Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则
  5. 页面刷新vuex数据消失问题解决方案
  6. js温故而知新8(浏览器)——学习廖雪峰的js教程
  7. iOS摄像头和相册-UIImagePickerController-浅析(转)
  8. jQuery源码-jQuery.fn.each jQuery.each
  9. SCCM2012R2之五创建系统集合
  10. Ubuntu/Debian 系统切换Java(JVM),修改Java版本,JAVA_HOME