【问题标题】:Application crashes on lollipop when `preDexLibraries` is true当 `preDexLibraries` 为真时,应用程序在棒棒糖上崩溃
【发布时间】:2017-11-21 12:49:05
【问题描述】:

我在我的项目中添加了一个aar 文件。 aar文件的大小在50 MB左右,它是一个在应用程序内部运行的统一游戏。我当前应用程序的apk 大小约为82 MB,因此使用此Unity library,它将apk 大小变为130 MB

默认情况下,我使用这些 dex 选项。

dexOptions {
    javaMaxHeapSize "4g" //specify the heap size for the dex process
    preDexLibraries false
}

现在当 preDexLibraries 设置为 false 时,gradle 操作将失败并显示以下错误消息。

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.RuntimeException: Translation has been interrupted

如果我将 preDexLibraries 设置为 true,它会在 lollipop+ 设备上成功构建和运行,但在 lollipop 上失败并显示以下错误消息。

11-21 17:43:25.229 14213-14213/com.myapp.app E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.myapp.app, PID: 14213
  java.lang.RuntimeException: Unable to instantiate application com.myapp.app.AnalyticsSampleApp: java.lang.ClassNotFoundException: Didn't find class "com.myapp.app.AnalyticsSampleApp" on path: DexPathList[[zip file "/data/app/com.myapp.app-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.app-2/lib/arm, /vendor/lib, /system/lib]]
    at android.app.LoadedApk.makeApplication(LoadedApk.java:628)
   android.app.ActivityThread.handleBindApplication(ActivityThread.java:4966)
   at android.app.ActivityThread.access$1600(ActivityThread.java:177)
   android.app.ActivityThread$H.handleMessage(ActivityThread.java:1493)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5912)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

AnalyticsSampleApp 是我的 Application 类,它从 Application 扩展而来

我用谷歌搜索了这个,但仍然无法理解preDexLibraries 的实际作用。

preDexLibraries(第三个问题的答案):它从库中构建 dex 文件,因此可以在增量构建中使用(不是构建 dex 文件每次都用于库)。所以在清洁时使用这个项目 build 让一切都变慢了。

【问题讨论】:

  • 既然你扩展了 Application,你必须重写 attachBaseContext 函数,然后在其中调用 super.attachBaseContext(base);,然后调用 MultiDex.install(this);
  • @Programmer:我的目标是棒棒糖+设备,我还需要这样做吗?我刚刚从 gradle 启用了 multidex

标签: android performance android-layout unity3d android-multidex


【解决方案1】:

请在 gradle 的 defaultConfig {...} 中添加 multiDexEnabled true。

例如:

defaultConfig {
        applicationId 'com.savingyou.android'
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
       }

并在依赖项中添加 compile 'com.android.support:multidex:1.0.1'{.....}

例如:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    compile project(':aars')
    compile 'com.yalantis:ucrop:2.2.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support:cardview-v7:25.3.1'
}

如果不锻炼,请创建一个类

import android.content.Context;
import android.support.multidex.MultiDexApplication;

    public class EnableMultiDex extends MultiDexApplication {
        private static EnableMultiDex enableMultiDex;
        public static Context context;

        public EnableMultiDex(){
            enableMultiDex=this;
        }

        public static EnableMultiDex getEnableMultiDexApp() {
            return enableMultiDex;
        }

        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();

        }
    }

在你的清单中给出 android:name="packagename.EnableMultiDex"

例如:

<application
    android:name="YourPakageName.EnableMultiDex"
    android:hardwareAccelerated="true"
    android:icon="@drawable/wowio_launch_logo"
    android:label="@string/app_name"
    android:largeHeap="true"
    tools:node="replace">

【讨论】:

  • 谢谢,但添加后崩溃仍然存在。
  • 是的,同样的错误日志,这只发生在棒棒糖设备中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多