当`preDexLibraries`为真时,应用程序在棒棒糖上崩溃

时间:2017-11-21 12:49:05

标签: android performance android-layout unity3d multidex

我在项目中添加了aar个文件。 aar文件的大小约为50 MB,它是在应用程序内部运行的统一游戏。我当前应用的apk大小约为82 MB,因此使用此Unity library,其大小为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,它会在棒棒糖+设备上构建并成功运行,但在棒棒糖上失败并显示以下错误消息。

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

延伸

我用Google搜索了这个,但仍无法理解preDexLibraries实际上做了什么。

  

preDexLibraries (你的第三个Q的答案):它从库中构建dex文件,因此它可以用于增量构建(不构建)   每次为图书馆提供dex文件)。所以在清洁时使用这个项目   构建使一切变慢。

1 个答案:

答案 0 :(得分: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"
       }

并在依赖项中添加编译'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">