每個app都必須要簽名才能安裝到手機上,不然就會安裝失敗。
假設你開發了一個手機游戲app,然后你要生成一個apk,發布出去供玩家下載安裝玩耍,你創建了一個簽名文件,文件名是god.jks,并且使用這個簽名文件對游戲進行了簽名。用戶成功安裝。
好,過了一個星期,你修改了app的代碼,增加了一個體力值系統,這個時候你要發布新版本出去就得再簽一次名,有兩種操作:
1. 如果你換了簽名文件,不是上次那個god.jks,用戶升級安裝失敗,
2. 如果你使用上次的god.jks簽名,用戶升級安裝成功。
好,來看看Android系統在安裝的時候做了什么:
第一步:讀取新版本的簽名信息
第二步:讀取老版本的簽名信息
第三步:對比新版和老版的簽名信息是否一致,如果一致,繼續安裝,安裝成功,如果不一致,停止安裝,安裝失敗。
重點來了,為什么要對比簽名信息?因為你發布的apk文件可能會被別人修改。讓我們來模擬一個場景。
用戶玩著你的游戲,到了第99關,想玩第100關,但是過關條件太難了,要收集99塊碎片,用戶才50塊。這個時候用戶動了歪心思,他想修改你的APK,讓過關條件變成50塊碎片。
于是他打開了他的破解軟件,反編譯了你的apk,修改了過關條件,然后他打包->簽名->安裝->簽名信息不一致->安裝失敗。那么也基本等于破解失敗。
像這樣的場景還有很多,比如有的人會往你的apk里植入惡意代碼,然后發布。用戶不小心下載到了含有惡意代碼的apk,然后在升級過程中,Android系統就會阻止安裝,因為簽名信息跟你的不一致,說明這個軟件是盜版。
那么,這就是簽名的意義所在,可以防止別人修改你的apk,然后發布給用戶讓用戶升級。
當然Android系統的對比都是新版本跟老版本對比,如果用戶先安裝了你游戲的破解版,再安裝你的正版時,也會安裝失敗。
到最后,apk其實就是一個.zip壓縮文件,任何人都可以對他進行修改。
看吧,這是我反編譯夸克瀏覽器的代碼,如果我修改了他,哪怕是一個字母,我都升級安裝不了
我修改了一個字母,打包簽名
因為我用的簽名是我的,跟已安裝的app包含的簽名信息不一致,故安裝失敗