每個(gè)app都必須要簽名才能安裝到手機(jī)上芬为,不然就會(huì)安裝失敗派近。
假設(shè)你開發(fā)了一個(gè)手機(jī)游戲app攀唯,然后你要生成一個(gè)apk榕栏,發(fā)布出去供玩家下載安裝玩耍噪窘,你創(chuàng)建了一個(gè)簽名文件,文件名是god.jks询张,并且使用這個(gè)簽名文件對(duì)游戲進(jìn)行了簽名谱轨。用戶成功安裝戒幔。
好,過了一個(gè)星期碟嘴,你修改了app的代碼,增加了一個(gè)體力值系統(tǒng)囊卜,這個(gè)時(shí)候你要發(fā)布新版本出去就得再簽一次名娜扇,有兩種操作:
1. 如果你換了簽名文件,不是上次那個(gè)god.jks栅组,用戶升級(jí)安裝失敗雀瓢,
2. 如果你使用上次的god.jks簽名,用戶升級(jí)安裝成功玉掸。
好刃麸,來看看Android系統(tǒng)在安裝的時(shí)候做了什么:
第一步:讀取新版本的簽名信息
第二步:讀取老版本的簽名信息
第三步:對(duì)比新版和老版的簽名信息是否一致,如果一致司浪,繼續(xù)安裝泊业,安裝成功把沼,如果不一致,停止安裝吁伺,安裝失敗饮睬。
重點(diǎn)來了,為什么要對(duì)比簽名信息篮奄?因?yàn)槟惆l(fā)布的apk文件可能會(huì)被別人修改捆愁。讓我們來模擬一個(gè)場景。
用戶玩著你的游戲窟却,到了第99關(guān)昼丑,想玩第100關(guān),但是過關(guān)條件太難了夸赫,要收集99塊碎片菩帝,用戶才50塊。這個(gè)時(shí)候用戶動(dòng)了歪心思憔足,他想修改你的APK胁附,讓過關(guān)條件變成50塊碎片。
于是他打開了他的破解軟件滓彰,反編譯了你的apk控妻,修改了過關(guān)條件,然后他打包->簽名->安裝->簽名信息不一致->安裝失敗揭绑。那么也基本等于破解失敗弓候。
像這樣的場景還有很多,比如有的人會(huì)往你的apk里植入惡意代碼他匪,然后發(fā)布菇存。用戶不小心下載到了含有惡意代碼的apk,然后在升級(jí)過程中邦蜜,Android系統(tǒng)就會(huì)阻止安裝依鸥,因?yàn)楹灻畔⒏愕牟灰恢拢f明這個(gè)軟件是盜版悼沈。
那么贱迟,這就是簽名的意義所在,可以防止別人修改你的apk絮供,然后發(fā)布給用戶讓用戶升級(jí)衣吠。
當(dāng)然Android系統(tǒng)的對(duì)比都是新版本跟老版本對(duì)比,如果用戶先安裝了你游戲的破解版壤靶,再安裝你的正版時(shí)缚俏,也會(huì)安裝失敗。
到最后,apk其實(shí)就是一個(gè).zip壓縮文件忧换,任何人都可以對(duì)他進(jìn)行修改恬惯。
看吧,這是我反編譯夸克瀏覽器的代碼包雀,如果我修改了他宿崭,哪怕是一個(gè)字母,我都升級(jí)安裝不了
我修改了一個(gè)字母才写,打包簽名
因?yàn)槲矣玫暮灻俏业钠隙遥寻惭b的app包含的簽名信息不一致,故安裝失敗