美文网首页
关于编译

关于编译

作者: 34sir | 来源:发表于2019-03-01 15:47 被阅读0次

什么是编译

高级语言转化为机器或者虚拟机能识别的低级语言的过程
对于Android 这个过程就是把Java或者Kotlin转变为Dalvik字节码的过程

基础知识

编译构建流程

包括三个部分:1⃣️代码 2⃣️资源 3⃣️Native Library


构建流程.png

编译速度

包含两个时间:
1⃣️ 编译时间 2⃣️ 安装时间


时间.png
  • 编译时间
    Java或者Kotlin编译成.class文件 通过dx编译成Dex文件
    增量编译希望编译更少的模块 Implementation 代替 Compile就是优化依赖关系
  • 安装时间
    先进过签名校验-->拷贝文件(比如APK文件 Library文件 Dex文件) -->编译Odex文件(Android5.0和6.0非常耗时) 对于增量编译 最好的优化是直接应用新的代码 无需重新安装新的APK

增量编译

Gradle的官方方案 Instant Run Android Plugin2.3之前 使用Multidex实现 2.3之后使用Android 5.0新增的Split APK机制
如图所示 应用本身的代码都在Split APKBase APK中只有Instant Run 框架 资源和Manifest

增量编译图解.png
Instant Run 中有三种模式:1⃣️热交换 2⃣️温交换 3⃣️冷交换
前两种不需要重启应用
大型项目还是存在性能问题:
  • 多进程 热交换 温交换都不能生效
  • Split APK安装 Split APK安装不会生成Odex文件 但是依然会有签名校验和文件拷贝 需要几秒到几十秒
  • javac问题 在 Gradle 4.6 之前 如果项目中运用了 Annotation Processor 本次修改以及它依赖的都要全量编译

修改public static final 修饰的变量 也需要全量编译 常量池会值编译到其他类中 Gradle 事先并不能知道哪些类使用这些常量

ProGuard

三个功能:1⃣️混淆 2⃣️ 裁剪 3⃣️优化(内联 修饰符 合并类 方法)

d8

.class 文件编译为Dex文件 取代之前的dx工具

编译流程.png

R8

取代ProGuardd8 直接使用R8.class编译生成Dex 更强大的代码优化工具

ReDex

Facebook 内部框架 已经完成R8的功能

持续交付

常用的持续集成工具:
Jenkins GitLab CI Travis CI

拓展

  • 自定义代码检查 例如美团拓展Findbugs插件实现Android 漏洞扫描工具 Code Arbiter
  • 第三方代码检查
    收费的 Coverity 以及 Facebook 开源的Infer
  • Code Review
    GitLab Phabricator 或者 Gerrit

Desugar、Dexlayout、JVM TI、App Bundle等工具的使用

相关文章

  • armv7,armv7s,arm64,i386,x86_64

    关于architecture以及xcode编译 xcode编译选项中,有几个关于architecture的选项,x...

  • 关于编译

    什么是编译 高级语言转化为机器或者虚拟机能识别的低级语言的过程对于Android 这个过程就是把Java或者Kot...

  • 改善Java程序建议17

    建议 17: 慎用动态编译。 关于动态编译的代码: 只要静态编译能做的事情,动态编译就能实现。 动态编译时,需要注...

  • 会写 TypeScript 但你真的会 TS 编译配置吗?

    最近遇到了挺多涉及到前端“编译”方面的工作,其中关于 TypeScript 的编译会涉及到关于 tsconfig....

  • 关于JIT编译

    参考 http://blog.csdn.net/sunxianghuang/article/details/520...

  • 关于scss编译。

    近两个月在用ionic2+angualr2搭了一个商城。其中用到了scss,恍然悟道,scss或者less这样的语...

  • iOS打包32 64位ipa(随记)

    关于Build Active Architecture Only属性 时候编译速度更快,它只编译当前的archi...

  • yolov4安装配置及测试

    下载yolov4 编译darknet 更改Makefile里面关于cuda、opencv,.so编译。本地环境为单...

  • iOS 中特殊变量定义

    1. 关于宏 预编译 编译器在编译源码之前会进行预编译,在预编译之前也会进行一些操作,如:删除 反斜线+换行符的组...

  • iOS编译与链接六:预编译指令和Clang 语言扩展

    一.预编译指令 预编译指令一般分为文件包含,条件编译,宏定义,和编译选项 1.文件包含关于文件包含在上一篇[htt...

网友评论

      本文标题:关于编译

      本文链接:https://www.haomeiwen.com/subject/jbgruqtx.html