Discriminate Market apk和debug apk

时间:2011-01-12 05:36:03

标签: android apk


有2个API,一个用于QA(测试和调试),另一个用于Production 我需要在不更改代码的情况下创建市场apk时运行QA api进行调试(我们使用eclipse创建)和Production api。有没有办法检查使用代码是否是调试apk或目前正在运行的市场apk。或者我可以在清单中设置的任何内容 谢谢

4 个答案:

答案 0 :(得分:1)

当您对应用程序进行签名时,您可以在调试模式下对其进行签名。准备好发布时,可以更改签名。以下是来自Google文档Signing Your Application

的更多信息

答案 1 :(得分:1)

您可以在XML文件中存储布尔值以及字符串:

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

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

答案 2 :(得分: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的调试版本以将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>

您可以调整自己的版本,在其中一个元素中添加一些标识文字或颜色,以表示您的设备上正在运行的版本

答案 3 :(得分: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());