1. 程式人生 > >apk簽名衝突 與舊版不同解決辦法 apk簽名比對

apk簽名衝突 與舊版不同解決辦法 apk簽名比對

最近剛接手一個應用,更新了一些內容後想在測試機器上進行除錯,結果AndroidStudio提示

Installation failed since the device already has an application with the same package but a different signature.
In order to proceed, you have to uninstall the existing application.

WARNING: Uninstalling will remove the application data!

Do you want to uninstall the existing application?

意思很明顯,就是說現在要安裝apk的機器上已經有了一個相同包名的apk了,但是這個apk的簽名和要安裝的apk的簽名不一致,要想安裝必須解除安裝之前的那個。

要解除安裝之前的apk很容易,但是這樣新的apk釋出出去後用戶就沒法更新了,總不能要求使用者先解除安裝在安裝更新吧。

於是問題來了,要找到之前應用使用的簽名檔案,用同樣的簽名對apk再簽名一次,但是手頭有很多簽名檔案,挨個試效率太低了,於是想到直接把應用中已經安裝好的apk的簽名拿到,再跟本地的簽名庫去比對,來找到原始簽名。

第一步拿到已經安裝了的舊應用的apk 可以先用以下方法確定下該應用安裝後在裝置中的存放位置

連線adb後執行

Adb shell

Ls檢視移動裝置當前資料夾下檔案

因為本應用是系統檔案,apk安裝後存放在/system/app目錄下

Cd /system/app

如果是使用者安裝的應用,apk安裝後存放在 /data/app目錄下

進入到該目錄 執行ls檢視目錄下的系統app,可以看到有很多.apk結尾的應用,找到要替換的那個應用,確定該應用的位置。

然後新開一個終端,(千萬不要在裝置的shell中執行)執行

Adb pull /system/app/XXX.apk /home/me/Desktop

將裝置中/system/app/XXX.apk位置的apk複製到本機的/home/me/Desktop,

就能拿到之前安裝的應用的apk了。

第二步,進行簽名比對

將拿到的已經安裝上的apk解壓,在解壓出的資料夾的META-INF資料夾下找到CERT.RSA,這裡麵包含了apk的簽名信息,

在當前檔案下下開啟終端,執行

keytool -printcert –file ./CERT.RSA

可以看到原來安裝的apk的簽名信息與證書指紋了,要比對的就是這個指紋

然後進入到 本地的簽名庫,執行keytool  -v –list –keystore XXX.key將XXX替換成你的簽名庫的名字,執行,將會打印出庫中所有的條目,當然也包括所有簽名的指紋資訊,將這個指紋與上一步得到的已經安裝的apk的指紋比對,就知道之前使用哪個對應用進行簽名的了。