Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 区分Android应用程序的调试和生产构建_Java_Android_Debugging_Maven - Fatal编程技术网

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

Java 区分Android应用程序的调试和生产构建,java,android,debugging,maven,Java,Android,Debugging,Maven,我最近开始学习Android应用程序开发。这也是我第一次使用Java语言 我想将一些调试工具以Java包依赖的形式整合到我的应用程序开发中。出于显而易见的原因,我只想在调试构建中包含它 在iOS中,我们可以使用构建配置仅为调试构建链接调试库,并使用宏删除处理调试的部分代码。这使得在调试构建和生产构建之间切换非常容易。无论如何,Android也要实现同样的目标吗 到目前为止,我得到的最接近的方法是使用Maven概要文件覆盖应用程序加载的属性文件,但这需要仍然导入调试库 为了澄清我的问题,以下是我

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

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

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

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


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

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

  • 生产:故障报告打开,更新通知关闭
  • 贝塔:两个都打开了
  • 调试:两个都关闭

除了Maven之外,一种方法是使用依赖注入程序,如

通过构建标准javax.inject注释(JSR-330),每个类都很容易测试。您不需要一堆样板文件就可以将RpcCreditCardService换成伪造的CreditCardService

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

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

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

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

您是否使用过BuildConfig.DEBUG,这是由android adt工具创建的


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

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


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

这对测试很有用,但我想问一下实际的应用程序。我想要开发人员构建、QA测试构建和生产构建。我已经更新了我的答案。它本质上是一个代码生成器。使用它,您可以为开发人员生成一个构建,一个用于调试,一个用于QA,一个用于生产,等等?它为依赖项注入生成代码,但我不知道如何告诉它在不同的构建环境中使用不同的依赖项。“你能详细说明一下吗?”大卫科登和巴伦罗,对不起。恐怕我说得太快了。我上个星期刚了解了这个图书馆,我只依赖于我对图书馆的第一印象。在我能为它创建一个好的例子之前,我需要先了解它。希望我能够创建这样一个例子。事实上,他们制作的咖啡机的例子似乎没有什么帮助。@Stephanbraczyk是的,我认为这看起来也很有趣,我认为有一种方法可以实现OP想要的。我只是没有马上看到,不知道你是否有更多的见解。如果你能举出一个好的例子,请告诉我——我也会仔细考虑。这可能是最接近的答案。我只是希望它有更多的灵活性。另一个人提到proguard,它去掉了未使用的类。
BuildConfig
和proguard的组合可能会去掉只调试的类,但我不喜欢这种不确定性。