Android Studio开发Gradle编译遇到的坑!

1、More than one file was found with OS independent path 'META-INF/rxjava.properties'

解决办法是添加

packagingOptions { 
exclude ‘META-INF/替换为有冲突的依赖’ 
}

packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }

2、Cannot fit requested classes in a single dex file. Try supplying a main-dex list.

#方法:66657 > 65536。

这个报错是因为你的项目里单个dex文件的函数超过了65536个,随着应用功能越来越复杂,代码量不断地增大,
引入的库也越来越多,可能会报这个异常

Cannot fit requested classes in a single dex file. Try supplying a main-dex list. 
# methods: 66657 > 65536


这说明应用中引用的方法数超过了最大数65536个。产生这一问题的原因就是系统的65536限制,65536限制的主要原因是DVM Bytecode的限制,
DVM指令集的方法调用指令invoke-kind索引为16bits,最多能引用 65535个方法。


可以尝试着用一下方法解决这个问题

?


在你的app.gradle下写如下方法


defaultConfig {      
multiDexEnabled true    
}


buildTypes {? ? ? ? 
debug{? ? ? ? ? ? 
lintOptions {? ? ? ? ? ? ? ? 
checkReleaseBuilds false? ? ? ? ? ? ? ? 
abortOnError false? ? ? ? ? ? 
}? ? ? ? 
}? ? ? ?
 release {? ? ? ? ? ? 
lintOptions {? ? ? ? ? ? ? ? 
checkReleaseBuilds false? ? ? ? ? ? ? ? 
abortOnError false? ? ? ? ? ? 
}? ? ? ? 
}? ? 
}

implementation 'com.android.support:multidex:1.0.3'

#方法:66657 > 65536。


导入上面的依赖

?

把你原来的继承的Application类,换成MultiDexApplication

---------------------


3、 Multiple dex files define Lokhttp3/internal/wsWebSocketProtocol 或 Program type already present: okhttp3.internal.ws.RealWebSocket$1
To fix this on your end, include the following in your build.gradle:

configurations.all {
    // OkHttp 3.5.0+ includes the websockets API, so we need this to prevent a conflict
    exclude module: 'okhttp-ws'
}

4、使用socket.io和Retrofit出现Program type already present: okhttp3.internal.ws.RealWebSocket问题

这个问题用了exclude排除okhttp-ws也不行,还是重复,用configurations.all {
    // OkHttp 3.5.0+ includes the websockets API, so we need this to prevent a conflict
    exclude module: 'okhttp-ws'
}会导致websocket找不到库包出错,最后改成compileOnly('com.squareup.retrofit2:retrofit:2.2.0')才解决。

备注:Android gradle provided、implementation等指令注意点

一、Android Studio 3.0开始使用了新的指令,原来的很多被弃用了,总的来说是为了加快构建编译速度。

下面是一个总结表格:

Android Studio 2.X Android Studio 3.X
apk runtimeOnly
provided compileOnly
compile api
没有对应 implementation
debugCompile debugImplementation
releaseCompile releaseImplementation
androidTestCompile androidTestImplementation

需要解释的主要是implementation系列指令:

implementation:注意compile是和api对应的,效果相同。implementation的区别在于对外可见性,而且可以加快编译速度(原理在于减少不必要的重复编译过程)。举个例子如下:

A module 依赖 B module,B 依赖 C module。
Android Studio 2.X使用compile:
A compile B
B compile C
A module不仅可以引用B module,还可以引用C module的接口和类。
Android Studio 3.X使用implementation:
A implementation B
B implementation C
A module只可以引用B module,不可以引用C module。C 对 A 是不可见的!

简单来说,从Android Studio 3.X开始,依赖首先应该设置为implement,如果没有错,那就用implement,如果有错,那么使用api指令,这样会使编译速度有所增快。(就这样理解够了,很多文章又是画图又是长篇大论的,完全没有必要,本来就不是多么复杂的东西)。

二、provided(compileOnly)和compile(api)区别

按照几乎所有文章的说法:

provided只提供编译支持,但是不会写入apk。使用provide可以避免支持包版本冲突和重复打包导致安装包体积徒增。

但就我的实践来说(支持包V7,V4之类):

1、不使用provided也不会导致支持包重复,依赖module编译出来的aar并不包含那些多个module(包括app module)重复使用的支持包。

2、如果依赖module使用的style中引用了支持包(V7,V4之类的)中的主题,那么,使用provided会报错(找不到主题资源)。如果只是引用支持包中的类和接口是可以使用provided的(但意义也不大,反正也不会重复)。

3、可能直接引用jar包的方式会重复把,但现在这种场景不多了。

 

 

 

你可能感兴趣的:(Android学习笔记)