android-discuss
android-discuss copied to clipboard
android studio module 过多
20几个module,运行或打包过慢的问题怎么解决?
调试看看哪里花的时间最长
assembleDebug --profile
常用 配置 Gradle cache、Android build cache 、xmx:
org.gradle.jvmargs=-Xmx8192m -XX\:MaxPermSize\=1024m
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
android.enableBuildCache=true
启动的gradle 任务的时候选择性的 --configure-on-demand 和 --offline
以及 更新到最新的 Android plugin for Gradle
楼上说的很好, 补充一下:
- module稳定后生成aar, 主项目引用aar
- 屏蔽掉一些无用task: http://www.jianshu.com/p/0d67f68beb38
@jp1017 引用 aar 是需要稳定的 module 不经常改变,非业务模块,例如:第三方库的包装 module ,若有修改的时候,需要手动生成
赞一个屏蔽task
@jp1017 有个非常麻烦的是 module 之间如果存在资源 res 互相调用的情况
借此贴提出来,希望有大神解答下:
- module A、B、C 分别为三个 业务模块,互相之间有独立的 res 资源
- module support 为工具类模块,存在了一些公共的 res 资源和工具类
- 由于历史原因,现在的模块依赖非常乱, A、B、C之间互相在
dependencies中使用compile来引用,并且都引用support模块 - 之所以这么作,是因为 A、B、C 的 生成的 R 文件,需要包含所有资源的 id ,那样的话就可以在每个业务模块通过
R.color,R.string去访问别的模块的资源,其实就是将模块内的资源暴露出来了 - 现在依赖配置想升级使用 Android plugin 3.0.1 的
implementation,compileOnly,runtimeOnly,api,但是这些资源依赖导致 R 文件生成的问题怎么处理?
根目录 gradle.build 添加如下配置
allprojects {
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("Test")
|| task.name.contains("mockableAndroidJar")
|| task.name.contains("Lint")
|| task.name.contains("Aidl")
|| task.name.contains("Ndk")
|| task.name.contains("Jni")) {
task.enabled = false
}
}
}
}
去掉没有用的gradle task,可以减少很多时间
@biaomingzhong 既然A、B、C模块资源需要互相调用,那么这些资源直接放到大家都引用的support模块去不就可以了吗?
@csbz17027 普通资源图片之类的可以这样处理,若是自定义 View 需要 attrs 属性这些的引用就尴尬了,现在是按照官方推荐的使用 implementation,不能使用 compileOnly
就算不是自己的模块,引入一个第三方库,第三方库包含了一些自定义 view 的 attrs 配置,也是只能使用 implementation,不能使用 compileOnly