一.编译版本和测试版本冲突:
Conflict with dependency 'com.android.support:support-annotations' in project ':app'. Resolved versions for app (26.1.0) and test app (27.1.1) differ.编译版本和测试版本冲突
解决办法:在 build.gradle 添加
android {
...
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:27.1.1'
}
}
dependencies {
...
}
二.okhttp数据流关闭
okhttp java.lang.IllegalStateException: closed 因调用response.body().string()后数据流已经关闭。
解决办法:重新创建response
private class HeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("content-type","application/json;charset=UTF-8")
.addHeader("access-token", "")
.addHeader("provider","android")
.addHeader("clientType","app")
.build();
Response response = chain.proceed(request);
MediaType contentType = response.body().contentType();
String content = response.body().string();
Log.i(TAG,"response = "+content);
return response.newBuilder().body(ResponseBody.create(contentType,content)).build();
}
}
三.三方库的依赖关系
三方库通过远端仓库、本地jar包、library依赖时,在dependencies中会声明三方库的依赖关系。依赖关系如下:
下面是2.x版本依赖的说明,括号里对应的是3.0版本的依赖方式。
compile(api)
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
provided(compileOnly)
只在编译时有效,不会参与打包,可以在自己的moudle中使用该方式依赖。比如com.android.support,gson这些使用者常用的库,避免冲突。
apk(runtimeOnly)
只在生成apk的时候参与打包,编译时不会参与,很少用。
testCompile(testImplementation)
testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。
debugCompile(debugImplementation)
debugCompile 只在debug模式的编译和最终的debug apk打包时有效。
releaseCompile(releaseImplementation)
releaseCompile 仅仅针对Release模式的编译和最终的Release apk打包。
dependencies {
implementation files('libs/test.jar')
compile project(':test')
api files('libs/test.jar')
provided 'com.alipay.android.phone.mobilesdk:framework-build:2.5.0.170621123127:api@jar'
}
四.关于动态库so的使用问题:
java.lang.UnsatisfiedLinkError: No implementation found for int cn.passguard.PassGuardEncrypt.makeKey() (tried Java_cn_passguard_PassGuardEncrypt_makeKey and Java_cn_passguard_PassGuardEncrypt_makeKey__)
提示找不到makeKey()方法的实现,是因为该方法的实现是在so库中的jni方法,jni方法命名中包含包名,而我在引用时包名与jni方法包名不一致,所以提示找不到。
解决方案:
修改so库中的方法名或者把.so库放在.so库接口对应的包名里。