必须建立签名APK两次,以避免损坏文件?

时间:2013-11-01 23:12:53

标签: android eclipse apk

正在运行Eclipse Kepler。我的应用程序有以下项目:

  1. FacebookSDK(图书馆)
  2. com.myapp.main(图书馆)
  3. com.myapp.main.free(申请)
  4. com.myapp.main.pro(申请)
  5. 附加说明:

    • 所有项目都依赖于Android Support Library v4
    • 这两个应用程序都依赖于这两个库。
    • 所有项目都禁用Proguard。
    • 目标是 android-19 用于我的项目, android-8 用于FacebookSDK。

    当我想发布我的两个应用程序中的任何一个时,我右键单击应用程序项目并选择:

    Android Tools - > Export Signed Application Package...

    问题

    APK安装正确,但应用程序立即崩溃。现在,如果我使用Export Application Package...命令再次构建已签名的APK ,则该应用程序可以正常运行。很明显,我的项目设置以某种方式欺骗了编译器来构建一个损坏的文件。我用谷歌搜索了这个。没事!

    造成这种奇怪行为的原因是什么?

    了解运行此导出向导时运行的确切命令会很有帮助。

    更新

    当我激活ProGuard时,我收到一些可能表示存在问题的警告:

     [proguard] Preparing output jar [C:\App\com.myapp.main.pro\bin\proguard\obfuscated.jar]
     [proguard]   Copying resources from program jar [C:\App\com.myapp.main.pro\bin\proguard\original.jar]
     [proguard]   Copying resources from program jar [C:\App\com.myapp.main\bin\classes.jar]
     [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
     [proguard]   Copying resources from program jar [C:\App\facebook-android-sdk-3.0.1\facebook\bin\classes.jar]
     [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
     [proguard]   Copying resources from program jar [C:\App\facebook-android-sdk-3.0.1\facebook\libs\android-support-v4.jar]
     [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v4.jar:META-INF/MANIFEST.MF])
    

    更新2

    我整天用Google搜索了这一天。我能找到的唯一相关信息是: http://code.google.com/p/android/issues/detail?id=27612

    project.properties文件包含此行(请注意,删除此行不能解决原始问题):

    proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
    

    proguard-project.txt包含这些额外的参数:

    -keepattributes Signature
    -keep class com.facebook.** {
       *;
    }
    
    -dontwarn android.support.**
    -keep class android.support.v4.** {
        *;
    }
    

2 个答案:

答案 0 :(得分:2)

根据我的经验,我强烈建议您每次要构建已签名的APK时清理并重建项目。如果我忘记清理项目,我也会不时得到奇怪的例外。

这通常是由于自动生成的文件(如R.java)未正确更新,但有时会发生在库项目中,因为编译器预编译(pre-dex)它们。在这里,它可能使用了过时的预编译版本的库而不是新版本。

不知道为什么会发生这种情况。

答案 1 :(得分:1)

正确答案非常简单。从Facebook SDK中删除支持库,并将其指向应用程序中的支持库。