gradle 问题总结

403 阅读2分钟

gradle 任务中断后,再次执行命令会被 block 的解决方法:

./gradlew --status PID STATUS INFO 8210 STOPPED 4.4 9320 IDLE 4.4

kill 8210 // 干掉 stopped的进程就可以了.


gradle 编译出现 oom 的问题

vim ~/.gradle/gradle.properties 增加: org.gradle.jvmargs=-Xmx4096M 参考链接


注意事项

  • 子 module 的包名不能相同, 否则会生成重复的两个 BuildConfig 无法编译通过

  • gradle 配置增加的 aar 依赖找不到需要在 app 的 build.gradle 中也配置一下参考链接


D8: Program type already present

Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:76)
        at com.android.tools.r8.utils.ExceptionUtils.withD8CompilationHandler(ExceptionUtils.java:45)
        at com.android.tools.r8.D8.run(D8.java:67)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:107)
        ... 7 more
Caused by: com.android.tools.r8.utils.AbortException
        at com.android.tools.r8.utils.Reporter.failIfPending

Caused by: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:

> Task :app:transformDexArchiveWithDexMergerFor DebugQA FAILED

出现此 trace 通常是因为重复依赖, 可搜索 以下关键字查看重复类:

D8: Program type already present: xxxClass

根据重复类, 解决重复依赖编译的问题.

查看 lib 依赖关系的方法

./gradlew -q app:dependencies

64K 方法数问题

change api or implementation to compileOnly if possible.

error

12-13 16:38:09.673 E/CrashReport( 6074):    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:91)
12-13 16:38:09.673 E/CrashReport( 6074):    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
12-13 16:38:09.673 E/CrashReport( 6074):    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
12-13 16:38:09.673 E/CrashReport( 6074):    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
12-13 16:38:09.673 E/CrashReport( 6074):    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)

猜测 ClassLoader 不同导致的无法转换, 追加 log 查看这两个 class 的 ClassLoader:

ClassLoader of StethoInterceptor: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.xxxx.xxxx-1/base.apk"],nativeLibraryDirectories=[/data/app/com.xxxx.xxxx-1/lib/arm, /system/fake-libs, /data/app/com.xxxx.xxxx-1/base.apk!/lib/armeabi, /system/lib, /vendor/lib]]]

ClassLoader of Interceptor: com.xxx.ljplugin.PluginDexClassLoader[DexPathList[[zip file "/data/user/0/com.xxxx.xxxx/app_p_a/609796977.jar"],nativeLibraryDirectories=[/data/user/0/com.xxxx.xxxx/app_p_n/609796977, /system/lib, /vendor/lib]]]

正常情况下? Interceptor应该由宿主加载,此处却是由插件加载的,说明插件编译时将Interceptor加入了编译. Interceptor 所在 lib 为 com.squareup.okhttp3:okhttp. 通过命令查看 project 的依赖关系:

debugQARuntimeClasspath - Resolved configuration for runtime for variant: debugQA
+--- project :xxxx
|    +--- com.xxxx.common.android:ljplugin-plugin-lib:1.0.3-SNAPSHOT
|    +--- project :midlib
|    |    \--- com.xxxx.common.android:lib_utils:1.8.2-SNAPSHOT
|    |         +--- com.android.support:support-v4:25.3.1
|    |         |    +--- com.android.support:support-compat:25.3.1
|    |         |    |    \--- com.android.support:support-annotations:25.3.1
|    |         |    +--- com.android.support:support-media-compat:25.3.1
|    |         |    |    +--- com.android.support:support-annotations:25.3.1
|    |         |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |         |    +--- com.android.support:support-core-utils:25.3.1
|    |         |    |    +--- com.android.support:support-annotations:25.3.1
|    |         |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |         |    +--- com.android.support:support-core-ui:25.3.1
|    |         |    |    +--- com.android.support:support-annotations:25.3.1
|    |         |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |         |    \--- com.android.support:support-fragment:25.3.1
|    |         |         +--- com.android.support:support-compat:25.3.1 (*)
|    |         |         +--- com.android.support:support-media-compat:25.3.1 (*)
|    |         |         +--- com.android.support:support-core-ui:25.3.1 (*)
|    |         |         \--- com.android.support:support-core-utils:25.3.1 (*)
|    |         +--- io.reactivex:rxjava:1.2.9
|    |         +--- io.reactivex:rxandroid:1.2.1
|    |         |    \--- io.reactivex:rxjava:1.1.6 -> 1.2.9
|    |         \--- com.google.code.gson:gson:2.7
|    +--- :indexlib-release
|    +--- :card-release
|    +--- :liveness-interactive-online-release_v3_6
|    +--- com.android.support:cardview-v7:25.3.1
|    |    \--- com.android.support:support-annotations:25.3.1
|    +--- **com.xxxx.soundlib:LJVRRecord:1.2.0**
|    |    +--- com.xxxx:httpservice:1.5.5 -> 1.5.6
|    |    |    +--- com.google.code.gson:gson:2.7
|    |    |    +--- com.squareup.retrofit2:retrofit:2.1.0
|    |    |    |    \--- com.squareup.okhttp3:okhttp:3.3.0 -> 3.5.0
|    |    |    |         \--- com.squareup.okio:okio:1.11.0
|    |    |    +--- **com.squareup.okhttp3:okhttp:3.5.0 (*)**
|    |    |    +--- io.reactivex:rxjava:1.2.9
|    |    |    \--- io.reactivex:rxandroid:1.2.1 (*)
|    |    \--- com.xxxx.soundlib:MP3Recorder:1.2.0
|    |         \--- com.xxxx.common.android:lib_utils:1.7.0 -> 1.8.2-SNAPSHOT (*)
|    +--- com.xxxx.common.android:lib_vr:1.6.8-SNAPSHOT
|    |    +--- com.android.support:support-v4:25.3.1 (*)
|    |    +--- com.android.support:appcompat-v7:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    +--- com.android.support:support-v4:25.3.1 (*)
|    |    |    +--- com.android.support:support-vector-drawable:25.3.1
|    |    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    |    \--- com.android.support:animated-vector-drawable:25.3.1
|    |    |         \--- com.android.support:support-vector-drawable:25.3.1 (*)
|    |    +--- com.xxxx.common.android:basewebview:1.0.5
|    |    \--- com.xxxx.common.android:VRLoadingViewLib:1.1.0
|    +--- com.xxxx.sdk:analytics-visual-mapping:1.3.7
|    |    +--- com.android.support:appcompat-v7:25.3.1 (*)
|    |    +--- io.reactivex:rxjava:1.2.9
|    |    +--- io.reactivex:rxandroid:1.2.1 (*)
|    |    +--- com.jraska:falcon:1.0.4
|    |    +--- org.greenrobot:eventbus:3.0.0
|    |    +--- com.xxxx.common.android:lib_ui:1.2.8
|    |    |    +--- com.xxxx.common.android:lib_utils:1.3.0 -> 1.8.2-SNAPSHOT (*)
|    |    |    +--- com.android.support:recyclerview-v7:25.2.0
|    |    |    |    +--- com.android.support:support-annotations:25.2.0 -> 25.3.1
|    |    |    |    +--- com.android.support:support-compat:25.2.0 -> 25.3.1 (*)
|    |    |    |    \--- com.android.support:support-core-ui:25.2.0 -> 25.3.1 (*)
|    |    |    +--- com.android.support:support-v4:25.2.0 -> 25.3.1 (*)
|    |    |    +--- in.srain.cube:ultra-ptr:1.0.11
|    |    |    +--- com.squareup.picasso:picasso:2.5.2
|    |    |    \--- com.xxxx.common.android:lib_imageloader:0.1.0
|    |    |         +--- com.android.support:support-annotations:23.2.1 -> 25.3.1
|    |    |         \--- com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2
|    |    |              +--- com.squareup.picasso:picasso:2.5.2
|    |    |              \--- com.squareup.okhttp3:okhttp:3.0.1 -> 3.5.0 (*)
|    |    \--- com.xxxx.sdk:analytics-sdk:1.3.3
|    |         +--- com.android.support:support-annotations:25.3.1
|    |         +--- com.xxxx.common.android:lib_log:1.1.0
|    |         |    +--- com.xxxx:httpservice:1.5.1 -> 1.5.6 (*)
|    |         |    +--- com.xxxx.common.android:lib_utils:1.4.0 -> 1.8.2-SNAPSHOT (*)
|    |         |    +--- com.xxxx.common.android:lib_xlog:0.9.0
|    |         |    \--- com.android.support:support-annotations:25.2.0 -> 25.3.1
|    |         \--- com.xxxx.common.android:lib_dig:1.10.1
|    |              +--- com.squareup.okhttp3:okhttp:3.5.0 (*)
|    |              +--- com.squareup.retrofit2:retrofit:2.1.0 (*)
|    |              +--- com.xxxx.common.android:lib_utils:1.7.0 -> 1.8.2-SNAPSHOT (*)
|    |              +--- com.xxxx:httpservice:1.5.6 (*)
|    |              +--- com.xxxx.common.android:lib_log:1.2.1-SNAPSHOT -> 1.1.0 (*)
|    |              \--- com.android.support:support-annotations:25.3.1
|    +--- project :core
|    |    +--- com.xxxx.common.android:lib_ui:2.0.0-SNAPSHOT -> 1.2.8 (*)
|    |    \--- project :midlib (*)
|    \--- project :alivideosdk
|         +--- :AlivcPlayer
|         \--- :AliyunVodPlayer
\--- com.xxxx:xxxxbase:1.1.0-SNAPSHOT

可以看出部分没有占位编译的 lib 引用了 okhttp,需要在排除编译:

    implementation('com.xxxx.soundlib:LJVRRecord:1.2.0@aar') {
        **exclude group: "com.squareup.okhttp3", module: "okhttp"**
        transitive = true
        changing = true
    }