如何在Android Studio中禁用MultiDex?

4
我知道如何启用MultiDex支持,但我的问题是相反的。似乎我的Android Studio的MultiDex选项默认已启用。当我解压APK文件并检查内部时,发现有两个文件:classes.dex和classes2.dex。你可能会说我的项目可能达到64K的限制,但事实并非如此。我还尝试了没有任何依赖项和其他gradle设置,但结果都一样。我甚至加入了代码“multiDexEnabled false”,但也没有帮助。所以这次我创建了另一个新的空项目,并按下“运行”按钮,没有做任何修改。结果?一样。

enter image description here

enter image description here

正如你所看到的,我有两个.dex文件,引用量非常低。 我不明白这里发生了什么...
我试图禁用MultiDex的原因是:
首先,我的应用程序非常简单,只有几个依赖项,所以不需要它。
其次,应用程序需要支持甚至更旧的Android操作系统。
第三,我想避免在旧的Android设备中出现Dalvik linearAlloc限制。
最后,我想知道这个问题的确切原因。
还有一个有趣的事实。我反编译并查看了apk文件,但找不到默认情况下在我的手机上运行时创建的名为MainActivity的类。 对于我的真实项目也是如此。应用程序运行良好,但classes*.dex中没有我的代码。如果应用程序没有任何问题,则可以忽略,但有时我想反编译并查看生成的代码,这有点烦人。

1
我刚在Android Studio 3.0中创建了一个抓取项目(minSdkVersion 21,空活动,没有appcompat-v7),通过主菜单的Build > Build APK(s)构建APK,但我无法重现你的问题。我将minSdkVersion更改为9,但仍无法重现该问题。尝试使用Build > Build APK(s)而不是Run,看看是否会改变你的行为。 - CommonsWare
@CommonsWare 多傻啊,我以为这完全是一样的过程。但是像你说的那样,生成APK解决了问题。非常感谢。顺便问一下,你的“播放”按钮有同样的问题吗? - Jenix
1
假设你所说的“Play”是指带有“运行'app'”工具提示的那个,那么不,我得到的结果与使用Build APK(s)相同。但是,我已经禁用了即时运行。对于像即时运行这样的东西,从运行过程中获得的APK将与从Build APK(s)获得的APK不同--请参见此博客文章以了解另一个区别。因此,请尝试暂时禁用即时运行,并查看发生了什么。 - CommonsWare
@CommonsWare 首先,感谢您提供的链接。即使我仍在使用Android Studio 2.2,它真的很有帮助,否则我永远不会知道。但是当我检查APK中生成的AndroidManifest.xml时,它没有android:testOnly属性。也许这是因为它不是3.0的版本。是的,关闭Instant Run就可以了!如果您发布您的答案,我会接受它。 - Jenix
1
“可能是因为它不是3.0的原因” - 是的,这种行为是3.0中的新功能。 - CommonsWare
1个回答

1

Instant Run这样的工具改变了APK的性质。当你从IDE运行应用程序时,得到的结果与通过其他方式构建应用程序(在菜单中生成APK(s),gradle任务等)得到的结果不同。

这就是我禁用Instant Run的原因之一,因为我是那些希望运行与用户运行相同的应用程序的疯狂人之一。

与您的用户将要运行的版本相比,Android Studio 3.0对APK进行了另一种更改: 它添加了android:testOnly="true",防止该APK被正常安装。可能这是一项安全措施,以便您只分发通过其他构建机制制作的APK。

根据评论,您的情况似乎是Instant Run导致多dex样式行为的原因。这可能与Instant Run尝试修补已安装的APK而不是将新鲜的APK推送到设备或模拟器有关。

因此,要么禁用Instant Run,要么不要分析Run输出,而是专注于通过其他方式构建的APK。


我不知道是否只有我这样,但是出于好奇心,我又进行了另一次测试,结果发现无论是全新安装还是非全新安装,使用Instant Run并按下运行按钮总是会创建MultiDex文件 :) - Jenix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接