9

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

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

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

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


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

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

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

4 回答 4

4

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

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

boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
于 2013-03-29T02:37:40.310 回答
1

除了 Maven,一种方法是使用像Dagger这样的依赖注入器

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

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

于 2013-03-29T02:36:07.557 回答
1

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

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

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

于 2013-04-02T13:11:41.160 回答
0

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

/gen/BuildConfig

于 2013-03-29T02:52:29.167 回答