【问题标题】:Fail Android Release Build if LOCAL_SERVER is True?如果 LOCAL_SERVER 为 True,Android 版本构建失败?
【发布时间】:2014-01-15 03:50:11
【问题描述】:

每隔一段时间,经过一些本地测试后,我会为 Play 商店构建并签署我的 Android 应用版本,该版本的 LOCAL_SERVER 标志仍设置为 true。当然,这会导致应用程序失败,因为一般情况下,我的用户无法访问我的 192.168.1.x 服务器。

有没有办法让发布过程以某种方式自动检测我已将该常量置于“测试”状态并在它被 Google Play 接受之前失败?

  • 我想也许我可以有条件地调用一个虚拟类并 让 ProGuard(仅在“发布”版本上运行)强制剥离该类,然后生成一个 错误,因为它找到了对不存在的类的调用。 但是 ProGuard 没有强制剥离类的选项。

  • 我想也许我可以强制“android:debuggable=true” 然后导致上传到 Play 商店失败。但我找不到任何方法 根据 Java 常量设置 AndroidManifest 标志。

还有其他想法吗? 我正在使用 Eclipse 进行开发。

【问题讨论】:

  • 也许使用生成的BuildConfig.DEBUG 标志。只有false,以防您构建发布版本。

标签: android eclipse google-play proguard


【解决方案1】:
  1. 发布清单。

  2. 在发布之前测试签名版本。

  3. 检查字段值的 JUnit 测试(但您仍然需要记住运行它)。

【讨论】:

  • (1) 我想自动化尽可能多的清单。 (2) 在本地测试它仍然有效,因为它在本地网络上。 (3) 常量的单元测试会在开发过程中失败。
  • 如何将标志保留为 xml 中的布尔资源?那么你可以参考它:android:debuggable="@bool/local_server
  • 这将使其成为运行时检查并消除 ProGuard 等进行静态分析的可能性。我已经考虑过让 LOCAL_SERVER 的用户使用 android:debuggable 标志的运行时获取该值在出现此类错误的情况下仍然做正确的事情(tm),但是在错误情况下也破坏了静态分析。它也可能会混淆测试。
  • 好的,修改eclipse的ADT插件的apk签名部分,检查布尔值即可。检查此以获取来源:stackoverflow.com/questions/3487398/…
  • 我最终选择了#3。该测试仅在我在真实设备上运行的测试“应用程序”中进行,因此在主机上完成的大部分单元测试都不会受到影响。
【解决方案2】:

更好的是,不要设置LOCAL_SERVER

class MyClass
{
    final private boolean USE_LOCAL_SERVER = true;
    void myMethod()
    {
       LOCAL_SERVER = (MyClass.class.getName().equals("mypackagename.MyClass")) ? USE_LOCAL_SERVER : false;
    }
}

由于 proguard 会混淆 MyClass 的名称,所以当 proguard 运行时,LOCAL_SERVER 将始终为 false。

【讨论】:

  • 太酷了!下次我回到那个项目时,我必须尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2022-09-30
相关资源
最近更新 更多