在Lollipop设备上安装为Lollipop编译的apk时会发生什么?

时间:2016-10-20 06:48:09

标签: android dalvik multidex android-multidex

我的应用程序中有超过64k的方法。

当我点击“运行”按钮和一个前Lollipop设备connect4d时,我得到64k方法错误。

当我点击“运行”按钮并连接一个Lollipop或更高版本设备时,就会创建apk。

当我在预制Lollipop设备上安装此apk时会发生什么?它运行正常,但风险很大吗?

2 个答案:

答案 0 :(得分:1)

  

我的应用程序中有超过64k的方法。

如果你的应用程序有超过64k的方法,并且你想在Lollipop之前的设备中运行它,那么你必须启用Multidex。否则,会发生的是你的代码将被编译成几个DEX文件(例如classes.dex,classes2.dex,classes3.dex等),但是前Lollipop设备只会加载第一个DEX文件并忽略二级DEX文件。

  

当我在预棒棒糖设备上安装此apk时会发生什么?

安装将成功。您可能会看到有关"类无法验证的警告消息"在logcat中,但安装仍然会成功。

  

它运行正常,但风险很大吗?

运行正常。应用程序可能会启动甚至运行一段时间,但只要系统尝试加载包含在其中一个辅助DEX文件中的类,该应用程序就会崩溃并显示ClassNotFoundException。如果您尝试打开的ActivityService使用其中一个类,可能会立即发生这种情况,但是当您执行需要其中一个类的代码路径时也可能会发生这种情况。

无论哪种方式,最好的解决方案是使用ProGuard或类似工具来消除未使用的代码,并使您的应用程序低于64k方法限制。如果这不起作用,唯一的另一个选择是按照official guide中的说明和建议继续支持棒棒糖前设备。

答案 1 :(得分:0)

如果你的方法超过64K,请使用MultiDex。

在build.gradle中添加multidex依赖项。

compile 'com.android.support:multidex:1.0.1'

在defalutConfig内添加

multiDexEnabled true

对清单进行更改:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>

如果您已完成上述更改,请按照此 link

进行操作