区分Android应用程序的调试和生产版本

时间:2013-03-29 02:15:36

标签: java android debugging maven

我最近开始学习Android应用开发。这也是我第一次使用Java语言。

我希望以Java包依赖的形式将一些调试工具合并到我的应用程序开发中。出于显而易见的原因,我想将它包含在调试版本中。

在iOS中,我们可以使用构建配置仅与调试版本链接调试库,并使用宏来删除处理调试的部分代码。这使得在调试和生产版本之间切换变得非常容易。无论如何为Android实现相同的目标?

到目前为止,我得到的最接近的是使用Maven配置文件覆盖应用程序加载的属性文件,但这需要仍然导入调试库。


为了澄清我的问题,这是我想要做的: 我构建了一个库,可以让您在浏览器上浏览SQLite数据库。它对于调试非常有用,但我不想将我的应用程序与库一起发送。

另一个目的是使用HockeyApp。 HockeyApp提供两个功能:更新通知和崩溃报告。我需要三种不同的构建才能工作:

  • 生产:崩溃报告开,更新通知关闭
  • Beta:Both On
  • 调试:两者都关闭

4 个答案:

答案 0 :(得分:4)

在清单<application>中,您可以设置debuggable属性。如果省略该属性,Eclipse会自动为您执行此操作。调试版本具有debuggable=true,导出良好的版本具有debuggable=false

这会影响Log.d,您可以使用以下方法有条件地检入代码:

boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));

答案 1 :(得分:1)

除了Maven,一种方法是使用依赖注入器,如Dagger

  

通过构建标准的javax.inject注释(JSR-330),每个类都很容易测试。你不需要一堆样板来将RpcCreditCardService换成FakeCreditCardService。

     

依赖注入不仅仅用于测试。它还可以轻松创建可重复使用的可互换模块。您可以在所有应用中共享相同的AuthenticationModule。您可以在开发期间运行DevLoggingModule,在生产中运行ProdLoggingModule以在每种情况下获得正确的行为。

答案 2 :(得分:1)

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

请注意,只有通过Google Play分发您的(付费)应用时,此解决方案才可靠。上次我检查时,Amazon App Store或AndroidPIT等替代商店没有设置安装程序源(可以自API级别11开始设置它,请参阅PackageManager#setInstallerPackageName)。

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

答案 3 :(得分:0)

你有没有使用BuildConfig.DEBUG,这是由android adt工具

创建的

/根/ BuildConfig