继 Google I/O 宣布新系统 Android L 带来 64 位支持后,Android NDK 日前正式推出 Revision 10 更新,添加 ARM、x86 和 MISP 架构芯片的 64 位 ABI 支持。
因而,全部ABI个数至少达到了8个.如果每个平台的链接库大小达到10M,加起来就达到了80兆,如果直接安装进手机,则会浪费手机的宝贵的存储空间.当然,在云时代,又有了一种方案,安装后在从云端下载,问题又来了,云端下载下来需要流量或宽带,同时还要对云端进行维护,问题也不小.还有一种方案是,各平台独立打包,独立打包可以减少安装包的体积,但是又会引发一个问题,发布的时候显得混乱,管理上麻烦不断.
有没有更好的办法?答案是有的,众所周知,apk就是一个zip文件,zip文件可以包含一切文件.就利用这点来解决.
在apk中,lib存成的各平台的动态链接库,每个平台需且仅需一种.因此,lib中存成各平台的链接库.我们仅需要多制作几份签名就可以了,这样去签名,有多少种类型的链接库就制作多少份签名,签名时忽略其他平台的链接库,然后生成META-INF文件(.MF,.SF,.RAS).用链接库所属的目录名命名其目录,如armeabi.再将该目录放在assets目录下的META-INFS目录里.这样和以往的APK相比,就多了这个目录.
assets目录
|--META-INFS
| |-- armeabi
| |--armeabi-v7a
| |--x86
.......
-----------------------------------------------
armeabi目录
| |--MANIFEST.MF
| |--CERT.SF
| |--CERT.RSA
--------------------------
最后再使用签名工具,对该安装包签名.
这样,发布到渠道后,渠道可以将这个多平台的安装包拆解,当用户下载APK的某个平台时,后台可以直接将该平台的提取出来,抛弃不必要的,然后打包给用户下载.当然这需要渠道,应用分发平台的支持才行.
如果用户把全平台的都下载下来,也可以直接安装全平台的安装包,如果安装器能识别出可以部分安装的话,可以将该平台的提取出来,打包后安装即可.
当然,里面还有一个zip对齐问题,其实这个问题很容易解决的.