Android原生支持组件编译,Android组件化架构 - 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需要重启,但不是重新安装

运行原理:

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

2,代码修改后,通过javac将java文件编译成class文件,然后打包成dex文件,同样放置在增量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 团队开发,它可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时

(方案不错,不再多说,已经凉了)

组件化分发

串行的优化规则是 减少重复操作--缓存,减少重复造轮子

并行的优化规则是 分离业务耦合度--解耦,将注意力放到更小的模块中

分发意味着更深度的解耦,对事物粒度进行更细致的分裂,对组件进行扩展

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值