有两个API,一个是用于测试和调试的QA
API,另一个是用于生产的Production
API。
我需要运行我们使用Eclipse创建的QA
API进行调试,并在不更改代码的情况下创建市场APK时运行Production
API。是否有任何方法可以使用代码检查当前正在运行的是调试APK还是市场APK?或者在清单中设置的任何内容吗?
谢谢
您可以将布尔值与字符串一起存储在XML文件中:
<resources>
<bool name="debug">true</bool>
</resources>
然后在代码中使用this.getResources().getBoolean(R.debug)
访问它(其中this
是Activity或其他上下文)。大部分时间保持true
,然后在发布时将其设置为false
。
当您签署应用程序时,可以在调试模式下进行签署。 当您准备发布时,可以更改签名。 这里有更多来自Google文档 签署应用程序
<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>
你可以将你的版本适应一些识别文本或颜色添加到其中一个元素中,以表示正在设备上运行的版本。
你也可以通过编程方式检查应用程序的签名。我使用这种技术来记录版本信息。
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());