-
Notifications
You must be signed in to change notification settings - Fork 209
APKSizeControl
Franken Zeng edited this page Sep 6, 2017
·
10 revisions
让提交应用商店的apk足够小,可以减少用户下载、安装apk的时间,提升用户体验。
基于金山云直播SDK的直播、短视频APP,大致瘦身思路有两方面:
- 体系结构
- so动态加载
为了节省apk size,如果没有特殊缘由,请只集成armeabi-v7a版本。开发者需要将只集成armeabi-v7a版本的风险考虑进去。在不去适配用户较少的x86架构终端和低于armv7版本的老旧机型的情况下可以考虑只集成armeabi-v7a版本的so库。
注意事项
- 只集成armeabi-v7a版本,会导致ARMv5 ARMv6 设备不能运行。如果APP需要适配这两类设备,需要额外集成armebi版本。建议在APP功能入口(比如直播功能开启页、短视频功能开启页),判断当前的CPU体系结构,如果是ARMv5或者ARMv6,明确表示不支持。
- armeabi-v7a版本的so库在部分x86架构的机器上可以运行,部分机型不行。为了稳定性考虑,建议检测发现x86机型,关闭直播功能、短视频功能入口。
- 如果引入了其他第三方类库,需要删除这些类库引入的armv5/x85/arm64位库。
动态加载的含义是:so文件不打包进apk,在安装应用打开app的时候通过后台下载so库到本地apk的安装路径,然后使用System.load()函数进行加载。
注意事项
- 这里的apk安装路径也即app的内部存储目录,该路径下的文件在文件系统中默认隐藏。
- 将so文件下载到该路径之外的任何路径进行加载都将导致失败。如果so文件存储于SD卡等外部存储路径,不能直接用来作为可执行文件的运行目录,使用前应该把可执行文件复制到APP内部存储再运行。App内部存储目录可通过getFilesDir()来获得。
- 判断CPU平台类型:一种方法是调用系统接口CPUFrameworkHelper类判断当前CPU是ARM架构或是其它架构;第二种方法是读取系统文件"/proc/cpuinfo",它是三个参数类型的数组,第一个参数标识是不是ARM架构,第二个参数标识是V6还是V7架构,第三个参数标识是不是neon指令集。具体方法开发者可根据实际需要而定。
- 根据当前的CPU类型从网络下载相应平台的so文件到APP内部存储(开发者需要将各平台的so库预先存储到自己的服务器上提供下载)。
File dir = getFilesDir();
File destFile = new File(dir.getAbsolutePath() + File.separator + "libksylive.so");
也可以将下载的so存储在libs目录下
File dir = getDir("libs", Activity.MODE_PRIVATE);
- 使用System.load()方法加载APP内部存储目录下的so库
System.load(destFile.getAbsolutePath());
说明:关于加载时机,需要在导入SDK jar包前进行加载,最好在首页就进行下载加载处理