前言
在Android 7.0上引入了v2簽名機制,v2簽名是對整個apk基于二進制生成簽名,因此只要apk有任何改動都會導(dǎo)致校驗失敗。而我們原來v1版的渠道包生成方案是在apk中META-INF目錄中插入一個空文件標識渠道,這必然會破壞apk的二進制結(jié)果從而導(dǎo)致簽名失效。
至于v3簽名,是Android 9.0開始才引入的方案,是對v2完善和補充,具體的原理和簽名結(jié)構(gòu)均參照v2模式
在此我們使用了美團的Walle來實現(xiàn)兼容v2簽名的渠道包生成腳本,腳本現(xiàn)已支持v2&v3
使用方法
腳本邏輯:腳本會自動檢測apk,如果已簽名則直接寫入渠道信息;若不存在v2則根據(jù)配置項部分重新簽名。因此對于源文件無特殊要求,放入debug包、v1包、v2包都可以使用
1.放入apk文件
2.修改py文件中配置項部分(可選)
3.執(zhí)行腳本
注意:
新腳本打包channel獲取方式變更,腳本請搭配lib-common 1.1.1.0食用
腳本詳解
腳本主要分三步流程
1.zipalign字節(jié)對齊
2.apk簽名
3.生成渠道包
注意:不管你的源文件是否簽名過,或者說你打包時只勾選了v1,第二步都會幫你apk文件重新簽署上v1及v2簽名。
這三步都是對官方命令行的封裝,有疑問請直接參閱文檔
1.?https://developer.android.com/studio/publish/app-signing?hl=zh-cn#sign-manually
2.?https://developer.android.com/studio/command-line/apksigner.html?hl=zh-cn
3.?https://github.com/Meituan-Dianping/walle/blob/master/walle-cli/README.md
測試用例
測試build-tools=27.0.3
只勾選V1
勾選v1及v2
360加固
Android 4.4Android 7.1Android 9.0
測試步驟
在設(shè)備上安裝線上APK,使用新腳本打包,驗證老腳本遷移后可否順利升級
驗證新腳本apk獲取的渠道名是否正確
坑點
若使用命令行簽名,build-tools>=28,會引入v3簽名。但是如果使用Android studio打包,即使項目build-tools版本為28,也不會引入v3簽名。而且Android studio上也只提供了v1v2的選擇項。因此推測google只在命令行簽名工具中開放了v3
渠道包腳本會破壞v3簽名,解決方法有兩個,要么修改腳本來兼容v3的簽名格式,要么使用build-tool 27打包不要引入v3。本腳本目前選擇的是后者.
walle腳本已更新,同時支持v2&v3