区分市场版和调试版APK

3


有两个API,一个是用于测试和调试的QA API,另一个是用于生产的Production API。
我需要运行我们使用Eclipse创建的QA API进行调试,并在不更改代码的情况下创建市场APK时运行Production API。是否有任何方法可以使用代码检查当前正在运行的是调试APK还是市场APK?或者在清单中设置的任何内容吗?
谢谢

4个回答

1

您可以将布尔值与字符串一起存储在XML文件中:

<resources>
  <bool name="debug">true</bool>
</resources>

然后在代码中使用this.getResources().getBoolean(R.debug)访问它(其中this是Activity或其他上下文)。大部分时间保持true,然后在发布时将其设置为false


谢谢MatrixFrog。这是我现在尝试的方法。但是是否有设置文件或其他文件可以自动更改其值以供发布版本使用? - Labeeb Panampullan
1
我想你可以编写一个构建脚本来实现程序切换,但除此之外,我不知道还有其他方法。你可以让它在调试模式下出现“DEBUG MODE”字样,这样就不太可能发布错误的版本了。 - Tyler

1

当您签署应用程序时,可以在调试模式下进行签署。 当您准备发布时,可以更改签名。 这里有更多来自Google文档 签署应用程序


我认为这并没有真正回答问题。OP想要在调试模式和生产模式下公开不同的API。手机将以相同的方式处理两个版本,只是它不会从一个真正签名的版本自动更新到一个为调试模式签名的版本。 - Tyler
我知道这两位专家ninjasense和MatrixFrog,你们正确地理解了我的问题。 - Labeeb Panampullan

1
这就是Ant可以帮助你的地方。我通常使用Eclipse来构建调试版本,然后使用Ant来构建发布版本,主要是因为我需要为每个版本使用不同的Google Maps API密钥。我有两个main.xml版本,即debugmain.xml和releasemain.xml。我修改了build.xml中的发布目标,并添加了两个额外的目标:
<target name="check-release_main">
    <available file="${layout.dir}/releasemain.xml" property="releasemain.present" />
</target>


<target name="-copy-rel-main" depends="check-release_main" if="releasemain.present">
    <echo message="Hit copy rel main" />
    <copy file="${layout.dir}/releasemain.xml" tofile="${layout.dir}/main.xml" overwrite="true"/>
</target>

我已将发布目标的依赖项更改为依赖于copy-rel-main:

<target name="release" depends="clean, -copy-rel-main....... 

最后,在发布目标的末尾,将调试版本的main.xml复制到debug版本中以覆盖main.xml

    ......
    <echo message="Copying the debugmain.xml back to main.xml" />
    <echo message="ALWAYS LEFT IN DEBUG FROR ECLIPSE" />
    <copy file="${layout.dir}/debugmain.xml" tofile="${layout.dir}/main.xml" overwrite="true" />

</target>

你可以将你的版本适应一些识别文本或颜色添加到其中一个元素中,以表示正在设备上运行的版本。


0

你也可以通过编程方式检查应用程序的签名。我使用这种技术来记录版本信息。

final byte[] officalkey = {-58, -42, -44, -106, 90, -88, -87, -88, -52, -124, 84, 117, 66, 79, -112, -111, -46, 86, -37, 109};
final byte[] officaldebugkey = {-99, -69, 45, 71, 114, -116, 82, 66, -99, -122, 50, -70, -56, -111, 98, -35, -65, 105, 82, 43};

Signature raw = c.getPackageManager().getPackageInfo(c.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(raw.toByteArray()));
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] der = cert.getEncoded();
md.update(der);
byte[] digest = md.digest();


if (Arrays.equals(digest, officalkey))
    apksign = c.getString(R.string.official_build);
else if (Arrays.equals(digest, officaldebugkey))
    apksign = c.getString(R.string.debug_build);
else
    apksign = c.getString(R.string.built_by,cert.getSubjectX500Principal().getName());

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