是否可以仅针对特定目标(Android应用程序)编译代码块?

时间:2018-01-19 19:02:58

标签: java android android-studio

我想了解执行一个代码块的最佳方法是什么,它只在Debug目标上,在某个活动上是必需的,而不依赖于'if'语句。此外,如果在为另一个目标编译相同的应用程序时,可以从编译中排除代码块。

2 个答案:

答案 0 :(得分:1)

老实说,最好和最简单的方法是执行以下操作,只能在可调试的应用程序中执行:

if(BuildConfig.DEBUG) {
  // run your piece of code
}

如果您在发布时使用proguard,它将与您应用中的任何其他死代码一起被删除,因为它将评估为" false"发布版本。这是一种简单的方法。

  

不依赖于'如果'语句

在这种情况下,您需要创建2个版本的类,一个在app/src/release,一个在app/src/debug文件夹中。这利用了gradle提供的资源合并,您可以将多个源集合组合成一个。如果您要在/main中放置一个而在/debug中放置一个,则由于您有重复的类而无法编译,因此请确保为每个构建类型定义一个类(或更进一步,并将自己的文件夹添加到某些构建类型,如果有些重用相同的代码...)

// in /release

class MyThing() {

  void doStuff() { /* nothing */ }
}


// in /debug

class MyThing() {

  void doStuff() { 
    actual();
    code();
  }
}

现在你可以从你的Activity调用new MyThing().doStuff(),它将a)在发布中什么也不做,b)在调试中做一些事情。我已经展示了一个例子,你可以将逻辑放在一个重复的类中,但是也可以只复制应该执行代码的整个活动......导致......

这种方法的最大问题是代码重复。 Android Studio不支持使用多个源集进行重构,因此您将在构建类型之间进行大量切换。每隔一段时间就会出现构建错误,因为您忘记在其中一个来源中修复某些内容,而这只是一个真正的痛苦。

你将有效地维护你以这种方式复制的所有代码两次,你应该将受影响的文件保持在最低限度(为了你自己)。

我强烈建议您使用BuildConfig.DEBUG,不要过于担心。

答案 1 :(得分:0)

是的,使用flavor,在与'main'文件夹相同的级别创建一个名为'debug'的文件夹,并在其中添加'/ java',在此处创建仅调试文件类,但要在main中使用这些文件如果没有发布错误,你需要创建调用release / java的相同结构,并添加一些类的空白实现。