繁体   English   中英

尝试为 Unity 构建 Android 插件时无法获取提供程序 androidx.core.content.FileProvider ClassNotFoundException

[英]Unable to get provider androidx.core.content.FileProvider ClassNotFoundException when trying to build an Android Plugin for Unity

我正在尝试为 unity3d 构建一个 android 插件,它只是通过 FileProvider 将屏幕截图分享给另一个应用程序。
我将我的项目迁移到 androidx。
我使用了 androidx.core.content.FileProvider 类。
每当我启动它时,我的应用程序都会崩溃,并显示以下 Logcat:

2018-12-22 21:46:13.678 14755-14755/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.anascompany.testandroidplugin, PID: 14755
java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]]
    at android.app.ActivityThread.installProvider(ActivityThread.java:6396)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
    at android.app.ActivityThread.access$1100(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:121)

我搜索了这个问题并尝试了以下方法:
1.MultiDex 问题。
为了在我的项目中轻松包含 MultiDex,我将最小 SDK 更改为 API 23 Marshmallow 6.0。
Android文档说要包含 MultiDex,您需要在 build.gradle 文件的 defaultConfig 中为指定模块添加multiDexEnabled true
注意:文档说如果最小 SDK 设置为 API 21 或更高版本,这是包含 MultiDex 所需的唯一步骤。
2. 错误的包问题(我猜这就是问题所在)。
在 androidx 之前,我们使用了这个包: com.android.support:support-v4 androidx.legacy:legacy-support-v4:1.0.0所以根据这个页面,你应该用: androidx.legacy:legacy-support-v4:1.0.0替换之前的包,并替换android.support.v4.content.FileProviderandroidx.core.content.FileProvider
这是我的安卓清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anascompany.unity">
<application>
    <provider
        android:authorities="com.anascompany.unity.fileprovider"
        android:name="androidx.core.content.FileProvider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>
</application>


这是我的模块的 build.gradle 文件:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    defaultConfig {
    minSdkVersion 23
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
    }
}
productFlavors {
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}

task copyPlugin(type: Copy){
    dependsOn assemble
    from ('build/outputs/aar')
    into ('../../Assets/Plugins/Android')
    include (project.name + '-release.aar')
}


注意:目标 SDK 是统一的,android studio 设置为 28“Android Pie”。
注:我的问题是与此不同的一个,因为我已经列入清单androidx.core.content.FileProvider

改成

实现'androidx.core:core:1.0.1'

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider_paths" />
</provider>

终于我得到了解决方案,它是如此的简单。 只需将“ support-v4-24.1.1.aar”手动复制到插件unity项目文件夹中即可。 或其他支持Aar的android文件。 它随SDK一起提供。 在我的情况下,文件位于“ C:\\ AndroidSDK \\ extras \\ android \\ m2repository \\ com \\ android \\ support \\ support-v4 \\ 24.1.1”中

无论版本如何,但您都应确保“ FileProvider”类位于文件内部。 您可以使用winrar简单地解压缩aar文件,并确保该类在其中。

- -更新 - -

总结:在/ yourProjectFolder / Assets / Plugins内部,复制您的unity-release.aar编译的android模块,并手动也将support-v4-24.1.1.aar(或其他版本,我的大小接近1MB)

这是我的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.unity">
<application>
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.unity.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
 </provider>
</application>
</manifest>

这是我的模块build.gradle:

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
  implementation 'com.android.support:appcompat-v7:28.0.0'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'com.android.support.test:runner:1.0.2'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

希望对您和其他人有帮助。

如果您想使用较新的实现 (androidx.core.content.FileProvider) 并且它仍然崩溃,您可能还需要手动将库放入项目中。

我下载了 aar 文件( https://mvnrepository.com/artifact/androidx.core/core/1.0.1 ),因为我正在处理一个 unity3d 项目,所以我把它放到文件夹“Assets\\Plugins\\Android\\libs”中. 对于 Android,它可能是“Android\\lib”。

希望对某人有帮助

我有同样的初始化错误。 我将 Android Project Property 中的 Code Shrinker 属性从 ProGuard 和 R8 更改为 EMPTY。 这解决了这个问题。 只需删除 ProGuard 属性即可。 我稍后会尝试找到另一种解决方法,但就目前而言,这对我来说没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM