Не удалось получить поставщика androidx.core.content.FileProvider ClassNotFoundException при попытке создать подключаемый модуль Android для Unity.

Я пытаюсь создать подключаемый модуль Android для unity3d, который просто передает снимок экрана другому приложению через 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 нужно добавить multiDexEnabled true в defaultConfig в файле build.gradle для указанный модуль.
Примечание: в документации сказано, что это единственный шаг, необходимый для включения MultiDex, если минимальный SDK установлен на API 21 или выше.
2. Проблема с неправильным пакетом (думаю, проблема в этом).
до androidx мы использовали этот пакет: com.android.support:support-v4 согласно этой странице вы должны заменить предыдущий пакет на: androidx.legacy:legacy-support-v4:1.0.0, а также заменить android.support.v4.content.FileProvider на androidx.core.content.FileProvider.
вот мой манифест Android:

<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 находится как в Unity, так и в студии Android, установленной на 28 "Android Pie".
Примечание: мой вопрос отличается от этого один, поскольку я уже включил в манифест androidx.core.content.FileProvider


person Hks.Adohkd    schedule 22.12.2018    source источник
comment
Возможный дубликат ClassNotFoundException: класс android.support не найден. v4.content.FileProvider после переноса androidx   -  person Alex Kolydas    schedule 23.12.2018
comment
@AlexKolydas Нет, это не дубликат, потому что я избежал этой ошибки в вопросе (и это ясно из моего манифеста Android).   -  person Hks.Adohkd    schedule 23.12.2018
comment
Я почти уверен, что вам нужно реализовать androidx.core:core:1.10-alpha02 в вашем build.gradle.   -  person TheWanderer    schedule 23.12.2018
comment
@Hks.Adohkd это 1.1.0   -  person TheWanderer    schedule 23.12.2018
comment
@TheWanderer К сожалению, мой друг, я тоже пробовал, без надежды   -  person Hks.Adohkd    schedule 23.12.2018


Ответы (2)


Наконец-то я нашел решение, оно такое простое. Просто скопируйте вручную «support-v4-24.1.1.aar» в папку проекта плагина Unity. Или другой файл поддержки aar android. Он поставляется с SDK. В моем случае файл находился в "C:\AndroidSDK\extras\android\m2repository\com\android\support\support-v4\24.1.1"

Независимо от версии, вы должны быть уверены, что класс «FileProvider» находится внутри файла. Вы можете просто разархивировать файл aar с помощью winrar и быть уверенным, что класс там.

---ОБНОВЛЕНО---

Подводя итог: внутри /yourProjectFolder/Assets/Plugins скопируйте скомпилированный модуль Android с unity-release.aar и вручную также support-v4-24.1.1.aar (или другую версию, размер моей около 1 МБ)

Вот мой манифест:

<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'
}

Я надеюсь, что это поможет вам и другим.

person juanram0n    schedule 22.01.2019
comment
у меня тоже не сработало, вы уверены, что ничего не меняли в манифесте или build.gradle для этой библиотеки? не могли бы вы проверить эти файлы и убедиться, что они такие же, как у меня? если нет, пожалуйста, обновите свой ответ. - person Hks.Adohkd; 23.01.2019
comment
О, да! Я прикасаюсь ко всему, чтобы это работало, но, в конце концов, это работает. Ах да... Я видел, что вы используете androidx... Сначала я использовал это, но, в конце концов, я снова сделал плагин с самого начала, используя поддержку v4. Возможно, что если вы поместите androidx в манифест и поместите поддержку Android в каталог плагинов, будет такая же каша, нет? Может быть, я мог бы помочь вам дополнить мой ответ моим манифестом и зависимостями, хорошо? - person juanram0n; 23.01.2019
comment
Хорошо, пожалуйста, обновите свой ответ, показав свой манифест и файлы build.gradle, чтобы я мог пометить ваш ответ как принятый. - person Hks.Adohkd; 23.01.2019
comment
Извините, я усердно работал. Вы уже обновили мой ответ - person juanram0n; 25.01.2019

Изменить на

реализация '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>
person Ahmer Afzal    schedule 09.01.2019
comment
Извините за опоздание, ваш ответ мне тоже не помог - person Hks.Adohkd; 23.01.2019