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