React Native Android gradle multiDexKeepFile和multiDexKeepProguard属性 - 如何包含来自第三方库的类?

时间:2017-08-16 20:01:55

标签: android android-multidex

最近的Android应用更新后,第一次打开后崩溃了。这是由于根据日志文件输出的multiDex问题。在Play开发者控制台中,我收到 java.lang.NoClassDefFoundError这样的错误:

java.lang.NoClassDefFoundError: 
  at com.google.android.gms.internal.zzcel.zzxK (Unknown Source)
  at com.google.android.gms.internal.zzcfv.<init> (Unknown Source)
  at com.google.android.gms.internal.zzcgk.<init> (Unknown Source)
  at com.google.android.gms.internal.zzcgk.zzbj (Unknown Source)
  at com.google.android.gms.internal.zzcgb.onReceive (Unknown Source)
  at com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver.onReceive (Unknown Source)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:2725)
  at android.app.ActivityThread.-wrap14 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1421)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:148)
  at android.app.ActivityThread.main (ActivityThread.java:5417)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

我试图遵循Android developer Multidex page的建议。我的minSdkVersion为16,因此我包含了multiDexEnabled true配置和compile 'com.android.support:multidex:1.0.1'依赖项。我的Application类扩展了MultiDexApplication

在应用级build.gradle中,我在android&gt;中同时拥有multiDexKeepFile file('multidex-config.txt')multiDexKeepProguard 'multidex-config.pro' buildTypes&gt;发布部分。

app build.gradle所在目录中的multidex-config.pro文件由一行组成:

-keep com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver.class

该目录中的multidex-config.txt包含:

com/google/android/gms/measurement/AppMeasurementInstallReferrerReceiver.class

然而,当我尝试通过运行npm run build-android-prod(我的npm脚本为export ENVFILE=.env.prod && cd android && ./gradlew assembleRelease && cd ..)来创建发布版本apk时,它最终失败了,最后几行是:

  Copying resources from program directory [/Users/patneedham/Desktop/dev/react-native/MyApp/android/app/build/intermediates/transforms/mergeJavaRes/release/folders/2/1f/main] (filtered)
  Copying resources from program directory [/Users/patneedham/Desktop/dev/react-native/MyApp/android/app/build/intermediates/classes/release] (filtered)
Printing classes to [/Users/patneedham/Desktop/dev/react-native/MyApp/android/app/build/outputs/mapping/release/dump.txt]...
:app:transformClassesWithMultidexlistForRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesWithMultidexlistForRelease'.
> com.android.build.api.transform.TransformException: proguard.ParseException: Unexpected keyword 'com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver.class' in line 1 of file '/Users/patneedham/Desktop/dev/react-native/MyApp/android/app/multidex-config.pro'

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1 mins 29.609 secs

npm ERR! Darwin 16.7.0
npm ERR! argv "/usr/local/Cellar/node/7.8.0/bin/node" "/usr/local/bin/npm" "run" "build-android-prod" "--stacktrace" "--debug"
npm ERR! node v7.8.0
npm ERR! npm  v4.2.0
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! MyApp@0.0.1 build-android-prod: `export ENVFILE=.env.prod && cd android && ./gradlew assembleRelease && cd ..`
npm ERR! Exit status 1
...

让我感到困惑的是:com.android.build.api.transform.TransformException: proguard.ParseException: Unexpected keyword 'com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver.class' in line 1 of file '/Users/patneedham/Desktop/dev/react-native/MyApp/android/app/multidex-config.pro'

好的,我意识到我忘记了class关键字,因此我在-keepcom.google...之间添加了该关键字,构建成功,并上传到Google Play Alpha通道,但第一次 - 打开应用程序崩溃。为了更清楚这一点,当我点击&#34;打开&#34;来自Google Play商店屏幕的按钮,在一两秒之后,我看到另一秒钟的白色屏幕,然后它会以默认的应用程序崩溃警报关闭,说不过,不幸的是,MyApp已停止。&#39;

如何在应用首次打开时阻止此NoClassDefFoundError

0 个答案:

没有答案