如何在发布模式下使用"minifyEnabled true"和禁用MultiDexApplication来调试应用程序

3

build.gradle 文件中有以下代码行:

buildTypes {
    debug{
        minifyEnabled true
    }

我们无法调试应用程序。一个解决方法是编写:

    ...
    multiDexEnabled true
}
buildTypes {
    debug{
        minifyEnabled false
        debuggable true
    }

...
implementation 'com.android.support:multidex:1.0.3'

在MyApplication文件中编写:

public class MyApplication extends MultiDexApplication

但是当我们转到发布模式时,应用程序仍然继承自MultiDexApplication。因此,旧设备可能存在一些兼容性问题。例如,在Gradle中是否有一种方法可以避免在发布模式下使用MultiDexApplication,并仅在调试模式下保留它?我阅读了https://xrubio.com/2016/10/disabling-removing-code-on-release-builds/,但不确定它是否有帮助。

2
Android 5.0(API级别21)及更高版本使用名为ART的运行时,该运行时本地支持从APK文件加载多个DEX文件。只有当针对“旧设备”(<API级别21)时,才需要com.android.support:multidex。请参考:https://developer.android.com/studio/build/multidex - Martin Zeitler
@MartinZeitler,谢谢,你说得对,但我旨在针对API级别为15的设备。 - CoolMind
1个回答

2
一种选择是使用构建变体。基本上,这会让您指定仅包含在应用程序的调试或发布版本中的代码。您可以通过将您只想要在一个版本中的代码放入src/debugsrc/release而不是src/main来实现此目的。哪些代码放在哪里完全取决于您。您在这里有几个选项。 1. 您可以有两份MyApplication副本,一份在src/debug中扩展MultiDexApplication,另一份在src/release中扩展基本Application类。这样,多 dex 代码仅包含在调试构建中,而不包含在发布构建中。您仍然需要在src/main/AndroidManifest.xml中指定应用程序类。如果您的 Application 类中没有其他内容,则此选项最佳。 2. 如果您的应用程序类除了multi-dex之外还有重要的代码,那么最好有一个包含其他所有内容的基础抽象类,并在src/debugsrc/main中扩展它,在调试版本中添加以下内容(如此处所述):
public class MyApplication extends BaseApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

第三个选项是实际上在调试和发布中声明不同的Application类。这可以通过在src/debug/AndroidManifest.xml和发布版本中具有该声明来完成。然后,您可以做任何想做的事情,包括在一个版本中不声明应用程序类。如果您的类中有几个不同的部分在发布和调试之间不同,或者其中一个不需要应用程序类,则此方法非常有效。

谢谢!非常棒的答案!我稍后会尝试一下。 - CoolMind
很好,如果有任何问题需要改进这个答案,请告诉我!我觉得这是一个相当普遍的问题,我想把它完善一下。 - emerssso

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