NativeScript / plugins

@nativescript plugins to help with your developments.
https://docs.nativescript.org/plugins/index.html
Apache License 2.0
187 stars 104 forks source link

[imagepicker] Exception if built in --release mode: `Error: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/documentfile/provider/DocumentFile;` #554

Open boutier opened 7 months ago

boutier commented 7 months ago

Hello,

Issue

I have updated Imagepicker on its latest version (3.0.0 / 3.0.1). It worked well in dev mode, but when built with the --release flag, it cease to work.

I patched webpack to re-enable logs in release mode (drop_console: false), and get this one.

    const context = Imagepicker.create({
      mode: 'multiple',
    });

    context
      .authorize()
      .then(() => {
        return context.present();
      })
      .then((selection) => { … })
      .catch(function (e: Error) {
        console.error('on select image', e.toString(), e.stack, e.cause);
      });
JS: CONSOLE ERROR: on select image Error: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/documentfile/provider/DocumentFile; getOrSetHelper(file:///data/data/appid/files/app/vendor.js:2:118868)
JS:     at getFile(file:///data/data/appid/files/app/vendor.js:2:128579)
JS:     at fromPath(file:///data/data/appid/files/app/vendor.js:2:139398)
JS:     at handle(file:///data/data/appid/files/app/vendor.js:2:840987)
JS:     at onResult(file:///data/data/appid/files/app/vendor.js:2:842335)
JS:     at invokeTask(file:///data/data/appid/files/app/vendor.js:2:1240087)
JS:     at onInvokeTask(file:///data/data/appid/files/app/vendor.js:2:1553242)
JS:     at invokeTask(file:///data/data/appid/files/app/vendor.js:2:1240008)
JS:     at runTask(file:///data/data/appid/files/app/vendor.js:2:1235405)
JS:     at invokeTask(file:///data/data/appid/files/app/vendor.js:2:1241184)
JS:     at ZoneTask.i.useG.invoke(file:///data/data/appid/files/app/vendor.js:...

Investigation

So I have extracted and compared the 2 produced APK. Here are some differences that looks suspicious to me in the META-INF directory.

(These files does not have corresponding entries in MANIFEST.MF.)

androidx.customview_customview.version has content 1.1.0 in "dev" and 1.0.0 in "release". androidx.drawerlayout_drawerlayout.version has content 1.1.1 in "dev" and 1.0.0 in "release".

Other informations

Here are some other informations about my config:

package.json extracts

    "@nativescript/core": "~8.6.1",

    "@nativescript/android": "~8.6.2",
    "@nativescript/types": "~8.6.1",
    "@nativescript/webpack": "~5.0.18",

app.gradle

android {
  compileSdkVersion 33
  defaultConfig {
    minSdkVersion 21
    targetSdkVersion 33
    generatedDensities = []
  }
  aaptOptions {
    additionalParameters "--no-version-vectors"
  }
}

AndroidManifest.xml extracts

    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" tools:replace="android:maxSdkVersion" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" tools:replace="android:maxSdkVersion" />

    <application
        android:name="com.tns.NativeScriptApplication"
        android:allowBackup="true"
…
        android:requestLegacyExternalStorage="true">

(I first thought it was a permission problem, that's why I have here the old *_EXTERNAL_STORAGE and requestLegacyExternalStorage but I don't think it changed anything. I should probably just revert this!)

Question

I don't really know how these files are generated and what I should try to go forward at this point. Any help appreciated! :-)

Donkni commented 5 months ago

@boutier I'm seeing this as well and would love an update or workaround.

Donkni commented 5 months ago

@boutier I ended up working around this my following the alterations on this page by adding the following to the dependencies in the gradle file. implementation("androidx.documentfile:documentfile:1.0.1")

boutier commented 5 months ago

Oh, thanks for the workaround!

I admit that I din't found time to dig around this. But I really would like to understand why the versions differ between dev and release mode, and why dependencies are dropped. Maybe is it a more general issue, though: as I mainly test my code with the dev mode… I'm quite afraid about facing unexpected behaviors in prod (release)!