每个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包含的签名信息不一致,故安装失败