2010-05-26 96 views
93

我試圖通過編輯androidmanifest.xml文件來更改我的默認/主/啓動(無論您稱之爲)活動。我所做的只是改變android:name屬性。但是,這完全打破了整個應用程序。當我嘗試安裝失敗,並讀取什麼是INSTALL_PARSE_FAILED_NO_CERTIFICATES錯誤?

Installation error: INSTALL_PARSE_FAILED_NO_CERTIFICATES

當我試圖改變它回到它以前的狀態,它仍然給了我同樣的錯誤......我做了什麼!?!?!

回答

39

您是否直接在.apk文件中編輯AndroidManifest.xml?如果是這樣,那是行不通的。

Every Android .apk needs to be signed if it is going to be installed on a phone,即使您沒有通過Market進行安裝。開發工具通過使用開發證書進行簽名來解決此問題,但.apk仍然簽名。

這樣做的一個用途是設備可以判斷.apk是否是已安裝應用程序的有效升級,因爲如果是證書,它將是相同的。

因此,如果您對應用程序進行了任何更改,則需要重新構建.apk,以便正確簽名。

+0

偉大正確的簽名版本謝謝,有沒有一個按鈕來自動重建清單? – mtmurdock 2010-05-26 17:20:39

+3

只需在Eclipse中編輯清單並單擊'保存' – HXCaine 2010-05-26 19:39:31

51

我發現這是由我的JDK版本引起的。

我是有這個問題,「蟻族」,這是由於在文檔中提到了這一點警告:

http://developer.android.com/guide/publishing/app-signing.html#signapp

Caution: As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK.

我有JDK 7.我的Ant日誌中,我用-v爲詳細,它顯示

$ ant -Dadb.device.arg=-d -v release install 
[signjar] Executing 'C:\Program Files\Java\jdk1.7.0_03\bin\jarsigner.exe' with arguments: 
[signjar] '-keystore' 
[signjar] 'C:\cygwin\home\Chloe\pairfinder\release.keystore' 
[signjar] '-signedjar' 
[signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unaligned.apk' 
[signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unsigned.apk' 
[signjar] 'mykey' 
[exec]  pkg: /data/local/tmp/PairFinder-release.apk 
[exec] Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 

我手動簽署的JAR和zipalign處理它,但它給了一個稍微不同的錯誤:

$ "$JAVA_HOME"/bin/jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore release.keystore -signedjar bin/PairFinder-release-unaligned.apk bin/PairFinder-release-unsigned.apk mykey 
$ zipalign -v -f 4 bin/PairFinder-release-unaligned.apk bin/PairFinder-release.apk 
$ adb -d install -r bin/PairFinder-release.apk 
     pkg: /data/local/tmp/PairFinder-release.apk 
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] 
641 KB/s (52620 bytes in 0.080s) 

我發現這裏回答。

How to deal with INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES without uninstallation

我只需要卸載它,然後它的工作!

$ adb -d uninstall com.kizbit.pairfinder 
Success 
$ adb -d install -r bin/PairFinder-release.apk 
     pkg: /data/local/tmp/PairFinder-release.apk 
Success 
641 KB/s (52620 bytes in 0.080s) 

現在我只需要修改build.xml以在簽名時使用這些選項!

確定這裏是:C:\ Program Files文件\的Java \ Android的SDK \工具\螞蟻\ build.xml文件

  <signjar 
        sigalg="MD5withRSA" 
        digestalg="SHA1" 
        jar="${out.packaged.file}" 
        signedjar="${out.unaligned.file}" 
        keystore="${key.store}" 
        storepass="${key.store.password}" 
        alias="${key.alias}" 
        keypass="${key.alias.password}" 
        verbose="${verbose}" /> 
+3

JDK 7也是我的問題。我很懶,卸載了JDK 7並安裝了JDK 6,也工作^^。其他黑客解決方案,但不太激進可以讓兩者都安裝,但將JAVA_HOME設置爲JDK 6,並將PATH中的JDK 6的bin路徑首先放入。 – Ixx 2012-05-11 10:38:55

+1

JDK 8具有相同的問題。將PATH更改爲JDK 6已工作。謝謝救生員! – 2014-08-14 21:56:57

+0

謝謝!我的市場應用程序是用JDK6編譯的。當我使用JDK7編譯應用程序並釋放密鑰庫並嘗試安裝時,它給了我這個問題。 – Sileria 2014-10-17 14:44:07

0

後關於這個問題的一些時間和多線程在線我設法解決我的項目。

它主要考慮您放入的最後一個文件(可能是圖像或佈局)。如果您刪除它們,它將生效,並且您可以再次構建項目。

5

這是一個醜陋但快速的解決方案:使用JDK 6而不是7.

讀Chloe的回答後,我卸載了我的JDK 7(不需要它現在反正),並安裝JDK 6問題解決了。更好的解決方案將使Ant使用JDK 6(不卸載7)。也許可能改變/設置該屬性:

的java.library.path

在local.properties文件。它在項目目錄(root)中。

Android無法使用JDK 7(只有6或5),因此使Ant腳本也使用JDK 6或5可能是一個很好的解決方案。

2

將環境變量JAVA_HOME設置爲JDK 5或6(而不是JDK 7)修復了錯誤。

15

使用密鑰工具的ARGS

-sigalg MD5withRSA -keyalg RSA -keysize 1024 

和使用的jarsigner在

What kind of pitfals exist for the Android APK signing?

+0

謝謝,我也解決了這個問題(我有JDK 7)。 – 2013-11-08 22:41:14

+0

我用相同的方法修復了它,因爲我使用appcelerator titanium並且無法訪問apk生成腳本。請注意,此解決方案需要私鑰的重新生成(更改!)。 – Federico 2014-07-25 20:46:09

6

大部分時間解決發現

-sigalg MD5withRSA -digestalg SHA1 

解決方案解決了(對我來說)對於這個錯誤很簡單:

  1. Uninstall your apk.
  2. Clean your android project.
  3. Build your android project.
  4. install/run your apk

玩得開心

4

在我的情況,我可以建立和運行發佈版本,但在嘗試做調試版本時INSTALL_PARSE_FAILED_NO_CERTIFICATES錯誤。

解決的方法是刪除我的debug.keystore文件並讓ADT重新創建它。它顯然已經過期。

一個更好的長期解決方案是明確創建一個debug.keystore,這個debug.keystore只在一年後纔會過期,而不是讓ADT創建它。下面是一個命令做到這一點:

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -validity 14000 

出現提示時,輸入以下值:

  • 姓氏和名字:Android的調試
  • 組織單位:的Android
  • 名稱組織:未知
  • 城市或局部性:未知
  • 州或省:未知
  • 國家代碼:美國
2

如果您嘗試包括.jar庫,包含AndroidManifest.xml文件可能發生這種情況。

  • 如果它是純Java的,請確保你沒有包含它。罐子出口
  • 如果它不是純Java(這意味着它是一個Android項目),那麼你必須把它作爲一個圖書館項目
0

我有我的Eclipse控制檯此錯誤。事實證明,我有兩個內容相同但名稱不同的罐子,它們相互衝突。我剛剛刪除了其中一個,並設法在設備上安裝應用程序。

0

我得到這個錯誤,因爲我確實釋放了我的ant release失敗,因爲我用完了磁盤空間。

0

當我試圖在運行api v23的手機上安裝針對Android N預覽而構建的Xamarin項目時,出現此錯誤。解決方法是不要那樣做。

0

獲得此錯誤的另一種方法是在macOS上使用ant構建,並在應用程序的源代碼樹中具有Finder圖標文件(Icon\r)。看起來jarsigner無法應付文件名中的回車,雖然它會聲稱簽署有效,如果您的APK爲-verify,它總是會導致不會安裝在設備上的APK。具有諷刺意味的是,Google Drive Finder插件是Finder圖標文件的重要來源。

的解決方案是與在fileset這樣的說明符排除違規的文件(這是無用的APK反正):

<exclude name="**/Icon&#13;" /> 
77

我發現,使用了錯誤的時候,現在也出現此錯誤簽署配置。如here所述,Android 7.0引入了新簽名方案V2。 V2方案對整個APK進行簽名,而不僅僅是JAR,就像V1方案中所做的那樣。如果您僅使用V2進行簽名,並嘗試安裝在7.0之前的目標上,則會出現此錯誤,因爲JAR本身未簽名且7.0之前的版本無法檢測到V2 APK簽名的存在。

爲了與所有目標系統兼容,確保APK是通過檢查Android Studio中的雙方簽名版框了產生簽名APK對話框,這兩種方案簽訂如下所示:

enter image description here

如果預計只有7.0個目標,那麼就不需要包含V1簽名。

1

其因先前生成的構建和電流爲V1(JAR簽名)和v2(全APK簽名)之間的簽名版本衝突,

要解決剔下了產生簽名APK對話框