NativeScript / NativeScript/plugins

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

未關閉
#554 3 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

主要語言
TypeScript
星號
206
分支
123
平均合併
2 天 1 小時
30 天內合併 PR
1

描述

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

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 Imagepicker 的 authorize/present 流程開始,比較 dev 和 release APK 的 META-INF 內容,尤其是 androidx.documentfile_documentfile.version。檢查 package.json 中的版本、app.gradle 中的 Android 設定以及 AndroidManifest.xml;完成標準是識別並修正僅 release 使用的相依性封裝問題,使 DocumentFile 得以解析。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
android, typescript, webpack
領域
build-system, mobile
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
需要釐清
新手友好度
30/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。