【发布时间】: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