NativeScript / NativeScript/plugins

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

Ouverte
#554 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
TypeScript
Étoiles
206
Forks
123
Merge moyen
2 j 1 h
PR mergées (30 j)
1

Description

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.

  • Code:
    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);
      });
  • Log:
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.

  • Files that does not appear in --release
androidx.cardview_cardview.version
androidx.coordinatorlayout_coordinatorlayout.version
androidx.documentfile_documentfile.version                     # <-- at least this one seems missing for bad reasons
androidx.dynamicanimation_dynamicanimation.version
androidx.legacy_legacy-support-core-utils.version
androidx.localbroadcastmanager_localbroadcastmanager.version
androidx.print_print.version
com.google.android.material_material.version

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

  • For files that exists in both side, versions does not match

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! :-)

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le flux authorize/present de Imagepicker et comparez le contenu de META-INF des APK dev et release, en particulier androidx.documentfile_documentfile.version. Examinez les versions de package.json, les paramètres Android de app.gradle et AndroidManifest.xml ; le travail est terminé lorsque le packaging de la dépendance propre à la release a été identifié et corrigé afin que DocumentFile soit résolu.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
android, typescript, webpack
Domaine
build-system, mobile
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.