接入第三方库时遇到一些兼容性问题,总结汇总如下:
1、SDK最低支持版本冲突
编译时,Android Studio控制台报如下异常:
Manifest merger failed : uses-sdk:minSdkVersion 21 cannot be smaller than version 23 declared in library [:upgrade-1.0.11:] C:\Users\heiyulong\.gradle\caches\transforms-2\files-2.1\b00ccd2adbc43657c326c62176fbea22\jetified-upgrade-1.0.11\AndroidManifest.xml as the library might be using APIs not available in 21
Suggestion: use a compatible library with a minSdk of at most 21,
or increase this project's minSdk version to at least 23,
or use tools:overrideLibrary="com.vector.update_app" to force usage (may lead to runtime failures)
如上错误信息,可以得知编译报错的原因以及三种解决方案:
错误原因:
Manifest merger failed : uses-sdk:minSdkVersion 21 cannot be smaller than version 23 declared in library [:upgrade-1.0.11:]
引入的第三方库 [:upgrade-1.0.11:]最低支持版本为23高于我的项目的最低支持版本21,所以抛出了这个异常。
解决方案:
方案1:
Suggestion: use a compatible library with a minSdk of at most 21
修改你所引入的第三方库的最低支持版本,确保和自己项目的最低版本保持一致。
++但是,如果你所引入的第三方库没有源码,并非开源的时,该方案就无法执行了++
方案2:
or increase this project's minSdk version to at least 23,
修改自己主项目的最低支持版本和第三方库的最低支持版本保持一致。
但是,该方案可能不是我们想要的,因为我们想要兼容更低的版本++。++
apply plugin: 'android'
android {
compileSdkVersion 21
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.test.app"
// 修改最低SDK支持版本
minSdkVersion 23
targetSdkVersion 30
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
方案3:
如果不想修改自己主项目的最低支持版本,也无法修改第三方库的最低支持版本时,可以参看如下方案
or use tools:overrideLibrary="com.vector.update_app" to force usage
在AndroidManifest.xml文件中 标签中添加
<uses-sdk tools:overrideLibrary="com.vector.update_app/>
其中的com.vector.update_app为第三方库包名,如果存在多个库有此异常,则用逗号分割它们,例如:
<uses-sdk tools:overrideLibrary="com.vector.update_app, xxx.xxx.xxx"/>
这样项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略最低版本限制。
to force usage (may lead to runtime failures)
但是方案都可能导致运行时错误,因为运行第三库时没有兼容SDK为23以下的版本,导致运行时异常,最好是兼容统一最低版本的支持。
2、FileProvider冲突适配
接入第三方库后,Android Studio编译异常,控制台错误信息如下:
> Task :app:processDevDebugManifest FAILED
D:\project\test\android\app\src\main\AndroidManifest.xml:44:13-59 Error:
Attribute provider#androidx.core.content.FileProvider@authorities value=(com.test.app.FileProvider) from AndroidManifest.xml:44:13-59
is also present at [:thirdsdk-3.1.4:] AndroidManifest.xml:41:13-65 value=(com.test.app.file.provider).
Suggestion: add 'tools:replace="android:authorities"' to <provider> element at AndroidManifest.xml:42:9-51:20 to override.
D:\project\test\android\app\src\main\AndroidManifest.xml:50:17-50 Error:
Attribute meta-data#android.support.FILE_PROVIDER_PATHS@resource value=(@xml/filepaths) from AndroidManifest.xml:50:17-50
is also present at [:thirdsdk-3.1.4:] AndroidManifest.xml:46:17-58 value=(@xml/sdk_file_provider).
Suggestion: add 'tools:replace="android:resource"' to <meta-data> element at AndroidManifest.xml:48:13-50:53 to override.
See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.
Execution failed for task ':app:processDevDebugManifest'.
> Manifest merger failed with multiple errors, see logs
错误原因:
根据错误日志分析,出现的原因是因为引入的第三方库的清单文件里也添加了provider这段代码,导致了冲突。如下是自己项目中provider的配置:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${packName}.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name=