2017-10-16 29 views
4

我在2010年發佈了一個應用程序。那時候,我創建了一個本地密鑰庫和一個密鑰,這是我從未更改過的,用於所有我從那時起發佈的這個應用程序的(約30個)版本。上傳新APK版本時簽名錯誤信息(API級別8不支持SHA1)

我從來沒有遇到任何問題,在我用Eclipse開發的那些日子裏,一直工作得很好,在過去的幾年裏,當我切換到Android Studio時都沒有問題。

我發佈的最後一個版本2016-12-23。現在我想發佈一個新的APK,並將其上傳到開發者控制檯...並獲得以下錯誤消息:

上傳失敗 - 您上傳了帶有無效簽名的APK詳細瞭解簽名)。來自apksigner的錯誤:ERROR(Jar簽名者CERT.DSA):JAR簽名META-INF/CERT.DSA使用摘要算法SHA-1和帶有DSA的簽名算法SHA-1,而API Level 8不支持此DSA APK正在驗證

我試過的(新的可用)的簽名版本選項(總是以相同的結果)這些組合:

  • 唯一的 「V1(JAR簽名)」
  • 既「 V1(Jar Signature)「和」V2(Full APK Signature)「

我正在使用Android Studio 2.3.3與buildToolsVersion 25.0.0和Gradle版本3.3。

回答

2

您看到的錯誤消息是此APK不會安裝在Android Froyo(API級別8)上。 APK的JAR簽名(META-INF/CERT.DSA)使用OID 1.2.840.10040.4.3(帶DSA的SHA-1)來指定簽名算法。 Android僅在API級別9的JAR簽名中支持此OID,但您的APK的AndroidManifest.xml指定 - 通過android:minSdkVersion屬性 - 該APK支持API級別8.對於DSA,用於JAR簽名的最佳簽名算法OID爲1.2。 840.10040.4.1(DSA,而不是帶有DSA的SHA-1)。得到的加密簽名完全相同,只是所有Android版本都支持JAR簽名中的此OID。雖然簽名工具通常不提供這種級別的控制,但他們應該選擇一個可用的OID。

Android Studio,Android插件for Gradle和apksigner都應該生成正確簽名的APK,除非您指定自定義參數。例如,您的build.gradle文件是否指定了minSdkVersion 9或更高?或者,也許,你放開簽約使用jarsigner不知道Android的規則APK ...

思路:

  • 如果你簽署發佈,使用jarsigner,切換到apksigner或使用Android Studio/Android插件Gradle進行發佈簽名。例如,要重新簽訂的APK使用apksigner:

    apksigner sign --ks my.keystore app.apk 
    
  • 如果你使用的是Android工作室/ Android的插件搖籃,在你的build.gradle文件發佈簽約,指定相同minSdkVersionAndroidManifest.xml。或者,也許從構建中刪除minSdkVersion。gradle文件將使Android Studio/Android插件使用AndroidManifest.xml中的minSdkVersion?我對這個有點可疑,因爲Android的工作室2.3.3應該使用正確的/安全OID 1.2.840.10040.4.1簽署這樣的APK ...

  • AndroidManifest.xml調整minSdkVersion 9或更高,如果你」重新放棄對Froyo的支持。

P. S.要檢查您的APK是否正確簽署,並看到,將有可能被谷歌報告的錯誤在上傳時播放:

apksigner verify my.apk 
+1

感謝您詳細的解答。在我的情況下,選項2適用,我使用AndroidStudio/Android插件爲Gradle簽名。據我瞭解,根據build.gradle條目,Gradle會自動覆蓋AndroidManifest.xml中的minSdkVersion條目(如果您在AndroidManifest.xml中的「android:minSdkVersion」行上懸停在AndroidStifest.xml中,而它在AndroidStudio編輯器中打開,則您得到一個工具提示信息說)。但是我總是在這兩個文件中使用8,從來沒有問題。我現在將它切換到9,解決了問題。但這意味着我的應用程序不再支持Froyo(您的選項3)。 – Nemax

相關問題