导出Android应用程序到底做了什么?

cra*_*535 5 eclipse android release build apk

在该指令http://developer.android.com/tools/publishing/preparing.html表明,我应该把它释放到公众面前导出我的Android应用程序.导出中执行的步骤是什么?

这是我所知道的:

  1. Android应用程序中的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.

Err*_*454 5

除了你列出的内容之外,proguard也在导出期间运行.

如果你对classes.dex的差异性质感到非常好奇,你可以抓住baksmali,解压缩你的apk并反编译classes.dex文件:

java -jar baksmali-1.3.3.jar classes.dex
Run Code Online (Sandbox Code Playgroud)

这将创建一个out /文件夹,其内容可以在旧/新之间进行区分.

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

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


Chr*_*ann 0

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

即使使用相同的代码,生成的classes.dex也不必与之前编译的版本具有相同的二进制内容。这是因为编译器优化代码的方式不同。