在基本模块中找不到动态功能模块中的 Android 提供程序

标签 android android-manifest android-app-bundle dynamic-feature dynamic-delivery

我在我的动态功能模块中使用了一些库。这些库正在向 list 中添加一些提供程序。

例如在我的动态模块中的build.gradle文件中:

dependencies {
    ...
    implementation 'com.github.esafirm.android-image-picker:imagepicker:1.11.1'
    ...
}

此库将以下标记添加到 list 中:

<provider
        android:name="com.esafirm.imagepicker.helper.ImagePickerFileProvider"
        android:authorities="{$applicationId}.imagepicker.provider"
        android:exported="false"
        android:grantUriPermissions="true" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/image_picker_provider_paths" />
</provider>

问题是当我构建我的基本模块时,应用程序崩溃了,因为它找不到提供者。我该如何解决这个问题?

如前所述here :

The manifest for your app’s base module is similar to that of any other app module. Keep in mind, when Google Play generates your app’s base APK, it merges manifests for all modules into that of the base APK.

但为什么只有供应商受到影响? Activity 是否被忽略?

这是我得到的堆栈跟踪:

java.lang.RuntimeException: Unable to get provider com.esafirm.imagepicker.helper.ImagePickerFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.esafirm.imagepicker.helper.ImagePickerFileProvider" on path: DexPathList[[zip file "/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/base.apk"],nativeLibraryDirectories=[/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/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 "com.esafirm.imagepicker.helper.ImagePickerFileProvider" on path: DexPathList[[zip file "/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/base.apk"],nativeLibraryDirectories=[/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/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)
    at android.support.v4.app.CoreComponentFactory.instantiateProvider(CoreComponentFactory.java:62)
    at android.app.ActivityThread.installProvider(ActivityThread.java:6380)
    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) 

最佳答案

试试这个解决方案。

在您的应用程序 build.gradle 中使用 tools:node="remove" 添加提供程序

<provider
        android:name="com.esafirm.imagepicker.helper.ImagePickerFileProvider"
        android:authorities="{$applicationId}.imagepicker.provider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:node="remove" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/image_picker_provider_paths" />
</provider>

在 Android Studio 中它会被标记为红色但是当你构建 bundle 时

./gradlew clean bundleRelease 

它应该以成功结束。

现在您可以生成 .apks 文件并解压它:

java -jar bundletool-all-0.10.2.jar build-apks --bundle=app.aab --output=release.apks --ks=release.keystore --ks-pass=pass:xxxxxx --ks-key-alias=xxxxxxkey --key-pass=pass:xxxxxx

unzip release.apks

在此之后,您可以解码您的 .apk 文件(例如使用 apktool)以查看它们的 list 。 现在在 base-master.apk 中你不应该看到你的提供者条目,而在 {dynamic-module}master.apk 中它应该是可用的。

java -jar apktool_2.4.0.jar d release/splits/base-master.apk

关于在基本模块中找不到动态功能模块中的 Android 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55772461/

相关文章:

java - 模块中的不同 Google Play 服务

android - 在 Google Play 中发布新版应用

java - 如何使用retrofit 2在android中的数组中发布数据

android - 在 Chrome 自定义选项卡的标题中插入参数

安装时的 Android 配置屏幕

java.net.UnknownHostException 与 Android 应用程序

android - Google Play 64 位要求问题

android - 是否应授权测试人员进行内部应用共享以使用链接安装应用?

android - 在动态特性模块中无法访问资源文件

android - 如何在我的 Android 应用程序中添加继续语音识别?