Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导出Android应用程序的具体用途是什么?_Android_Eclipse_Build_Release_Apk - Fatal编程技术网

导出Android应用程序的具体用途是什么?

导出Android应用程序的具体用途是什么?,android,eclipse,build,release,apk,Android,Eclipse,Build,Release,Apk,上的说明指出,在向公众发布android应用程序之前,我应该先将其导出。导出过程中执行的步骤是什么 以下是我所知道的: android:debugable in在AndroidManifest.xml中设置为false APK由开发人员(my)密钥签名,而不是内置调试密钥 zipalign在已签名的APK上运行 我在AndroidManifest.xml中将android:debugable手动设置为false,并比较了调试和导出的apk。以下是唯一不同的文件: 二进制文件.././releas

上的说明指出,在向公众发布android应用程序之前,我应该先将其导出。导出过程中执行的步骤是什么

以下是我所知道的:

  • android:debugable in在AndroidManifest.xml中设置为false
  • APK由开发人员(my)密钥签名,而不是内置调试密钥
  • zipalign在已签名的APK上运行

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

    二进制文件.././release/x//classes.dex和x/classes.dex不同

    二进制文件.././release/x//META-INF/CERT.RSA和x/META-INF/CERT.RSA不同

    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

    --

    .字段公共静态最终调试:Z

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

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

  • 或者不同的classes.dex是否表示存在其他 调试和导出的apk之间的区别


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

    除了您列出的内容之外,proguard在导出过程中也会运行

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

    java -jar baksmali-1.3.3.jar classes.dex
    
    这将创建一个out/文件夹,其中的内容可以在旧/新之间进行区分

    BuildConfig.DEBUG标志不同的原因是您导出的版本与调试版本不同,如中所述:

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


    无论目标是
    debug
    还是
    release
    ,构建都有许多步骤。这不是一个直接的答案,但我建议看一下
    androidsdk/tools/ant/build.xml

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

    您还可以查看在目标调用期间传递给外部实用程序的参数,该调用允许您阅读有关实用程序这些参数的文档,以查看特定步骤的具体情况

    需要注意的是,当您可能在eclipse中导出应用程序时,研究antbuild.xml提供了一种方法,可以系统地识别完整构建将执行的每个步骤


    例如,如果您查看目标
    -set release mode
    ,您可以看到一个实例,其中可以生成一个使用发布密钥而不是调试密钥签名的调试包。

    谢谢。我运行baksmali并修改了我的问题。BuildConfig被添加到SDK版本17中