5

http://developer.android.com/tools/publishing/preparing.html上的说明表明我应该先导出我的 android 应用程序,然后再将其发布给公众。导出中执行的步骤是什么?

以下是我所知道的:

  1. <Application> 中的 android:debuggable 在 AndroidManifest.xml 中设置为 false
  2. APK 由开发者的(我的)密钥签名,而不是内置的调试密钥
  3. zipalign 在该签名的 APK 上运行

    我在我的 AndroidManifest.xml 中手动将 android:debuggable 设置为 false,并比较了调试和导出的 apk。这些是唯一不同的文件:

    Binary files ../../release/x//classes.dex and x/classes.dex differ
    Binary files ../../release/x//META-INF/CERT.RSA and x/META-INF/CERT.RSA differ
    diff -r ../../release/x//META-INF/CERT.SF x/META-INF/CERT.SF
    diff -r ../../release/x//META-INF/MANIFEST.MF x/META-INF/MANIFEST.MF

    那么我上面的清单是否包括所有内容?或者不同的 classes.dex 是否表明调试和导出的 apk 之间存在其他一些差异?

    感谢下面错误 454 的回答,我在每个 apk 中的 classes.dex 文件上运行了 baksmali,我发现了一个不同之处:

    diff -r out/xx/xx/xx/BuildConfig.smali ../../../release/x/out//xx/xx/xx/BuildConfig.smali
    7c7
    < .field public static final DEBUG:Z = true
    ---
    > .field public static final DEBUG:Z

    所以我想我可以在这个列表中添加第四项:

  4. 在 BuildConfig 类 (gen/.../BuildConfig.java) 中,DEBUG 设置为 false。

4

3 回答 3

5

除了您列出的内容之外,proguard 还在导出期间运行。

如果您对 classes.dex 差异的性质非常好奇,您可以获取baksmali,解压缩您的 apk 并反编译 classes.dex 文件:

java -jar baksmali-1.3.3.jar classes.dex

这将创建一个 out/ 文件夹,其中包含您可以在旧/新之间进行区分的内容。

BuildConfig.DEBUG 标志不同的原因是因为您导出了发布版本与调试版本,如SDK 发行说明修订版 17中所述:

添加了一项功能,允许您仅在调试模式下运行某些代码。构建现在会生成一个名为 BuildConfig 的类,其中包含一个根据您的构建类型自动设置的 DEBUG 常量。您可以检查代码中的 (BuildConfig.DEBUG) 常量以运行仅调试功能。

于 2012-07-05T20:07:30.447 回答
1

构建会发生许多步骤,无论目标是debug还是release. 这不是一个直接的答案,但我建议看看android-sdk/tools/ant/build.xml

打开文件后,搜索target name="release". 您将看到该depends属性列出了将被调用的同一文件中的其他目标。您可以将目标与目标进行release比较debug。在每个目标内部,您可以具体查看运行的内容(例如 中的一些实用程序android-sdk/platform-tools),以及确定是否运行的内容。

您还可以查看在目标调用期间将哪些参数传递给外部实用程序,这使您可以阅读有关实用程序的这些参数的文档,以具体了解特定步骤发生的情况。

需要注意的是,虽然您可能在 eclipse 中导出应用程序,但研究 ant build.xml 提供了一种方法来系统地识别将要为完整构建执行的每个步骤。

举例说明这可能会变得多么复杂,如果您查看 target -set-release-mode,您会看到一个实例,您可以在其中生成一个使用发布密钥而不是调试密钥签名的调试包。

于 2012-10-01T17:53:11.000 回答
0

或者不同的 classes.dex 是否表明调试和导出的 apk 之间存在其他一些差异?

即使使用相同的代码,生成的 classes.dex 也不必与以前编译的版本是二进制相同的。这是由于编译器优化代码 AFAIK 的不同方式。

于 2012-07-05T19:58:31.530 回答