区分 Android 应用程序的调试和生产构建

9
我最近开始学习Android应用程序开发,这也是我第一次接触Java语言。
有一些调试工具我想以Java包依赖的形式集成到我的应用程序开发中。出于明显的原因,我只想在调试版本中包含它。
在iOS中,我们可以使用构建配置仅链接调试库以进行调试版本,并使用宏来删除处理调试的代码部分。这使得在调试和生产版本之间轻松切换变得非常容易。有没有办法在Android上实现相同的功能?
到目前为止,我找到的最接近的方法是使用Maven配置文件覆盖属性文件,然后由应用程序加载,但这要求调试库仍然被导入。
为了澄清我的问题,这里是我想做的事情: 我构建了一个库,可以让您在浏览器上浏览SQLite数据库。这对于调试非常有用,但我不想将我的应用程序与该库一起发布。
另一个目的是使用HockeyApp。HockeyApp提供两个功能:更新通知和崩溃报告。我需要三种不同的版本才能使其正常工作:
  • 生产版本:开启崩溃报告,关闭更新通知
  • Beta版本:两个都开启
  • 调试版本:两个都关闭
4个回答

4
在清单文件的 <application> 中,您可以设置 debuggable 属性。如果您省略该属性,Eclipse 将自动为您设置。调试版本具有 debuggable=true,精简版本具有 debuggable=false
这会影响 Log.d,并且您可以通过以下方式在代码中进行条件检查:
boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));

1
除了Maven之外,一种方法是使用依赖注入器,例如Dagger
通过基于标准javax.inject注释(JSR-330)构建,每个类都很容易测试。您不需要大量的样板代码来仅仅为了将RpcCreditCardService替换为FakeCreditCardService。
依赖注入不仅用于测试。它还使创建可重用、可互换的模块变得容易。您可以在所有应用程序中共享相同的AuthenticationModule。并且您可以在开发时运行DevLoggingModule,在生产中运行ProdLoggingModule,以获得每种情况下正确的行为。

这对测试很有用,但我问的是实际的应用程序。我希望有开发人员构建,QA测试构建和生产构建。 - Barum Rho
我已经更新了我的回答。它本质上是一个代码生成器。使用它,您可以为开发人员生成一个构建版本,一个调试版本,一个 QA 版本,一个生产版本等。 - Stephan Branczyk
@StephanBranczyk 怎么做呢?它生成依赖注入的代码,但我不知道如何在不同的构建环境中告诉它使用不同的依赖项。您能详细说明一下吗? - dcow
@DavidCowden和Barum Rho,对不起。我害怕我说话太快了。我上周才了解到这个库,我只依赖于对库的第一印象。在我能够为其创建一个好的示例之前,我需要理解它。希望我能够创建这样的示例。他们在那里制作的虚构CoffeeMaker示例似乎并不那么有用。 - Stephan Branczyk
@StephanBranczyk,是的,我也觉得这很有趣,而且我认为可以用它来实现OP想要的功能。只是我一时想不到,想知道你是否有更深入的见解。如果你有好的例子,请告诉我--我也会思考的。 - dcow

1

解决这个问题的方法之一是检查PackageManager#getInstallerPackageName的返回值。如果apk是通过adb、网页或类似HockeyApp的服务手动安装的,则返回null。事实上,最近我在我们的sdk中添加了类似的检查,请参见this commit

请注意,此解决方案仅在您仅通过Google Play分发(付费)应用程序时才可靠。据我所知,像Amazon App Store或AndroidPIT这样的替代商店上次检查时未设置安装程序来源(自API级别11以来可以设置,请参见PackageManager#setInstallerPackageName)。

另一种选择是在运行时检查软件包名称。 对于您的beta版本,您将在软件包名称后附加“.beta”,然后检查此后缀以启用应用内更新或调试内容。 您可以通过将代码库移动到库项目中并设置两个引用此库项目的应用程序项目来实现此目的:一个用于商店应用程序,另一个用于beta应用程序。 或者使用aapt选项--rename-manifest-package更改beta构建的软件包名称(详见此处)。

0
你是否使用了BuildConfig.DEBUG,这是由Android ADT工具创建的。
/gen/BuildConfig

这可能是最接近的答案。我只希望它有更多的灵活性。 - Barum Rho
另一个人提到了Proguard,它可以剥离未使用的类。BuildConfig和Proguard的组合可能会剥离调试时使用的类,但我不喜欢这种不确定性。 - Barum Rho

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