Skip to content

APKSizeControl

Franken Zeng edited this page Sep 6, 2017 · 10 revisions

APK瘦身说明

让提交应用商店的apk足够小,可以减少用户下载、安装apk的时间,提升用户体验。

基于金山云直播SDK的直播、短视频APP,大致瘦身思路有两方面:

  • 体系结构
  • so动态加载

一. 体系结构的选择

为了节省apk size,如果没有特殊缘由,请只集成armeabi-v7a版本。开发者需要将只集成armeabi-v7a版本的风险考虑进去。在不去适配用户较少的x86架构终端和低于armv7版本的老旧机型的情况下可以考虑只集成armeabi-v7a版本的so库。

注意事项

  1. 只集成armeabi-v7a版本,会导致ARMv5 ARMv6 设备不能运行。如果APP需要适配这两类设备,需要额外集成armebi版本。建议在APP功能入口(比如直播功能开启页、短视频功能开启页),判断当前的CPU体系结构,如果是ARMv5或者ARMv6,明确表示不支持。
  2. armeabi-v7a版本的so库在部分x86架构的机器上可以运行,部分机型不行。为了稳定性考虑,建议检测发现x86机型,关闭直播功能、短视频功能入口。
  3. 如果引入了其他第三方类库,需要删除这些类库引入的armv5/x85/arm64位库。

二. so动态加载

动态加载的含义是:so文件不打包进apk,在安装应用打开app的时候通过后台下载so库到本地apk的安装路径,然后使用System.load()函数进行加载。

注意事项

  1. 这里的apk安装路径也即app的内部存储目录,该路径下的文件在文件系统中默认隐藏。
  2. 将so文件下载到该路径之外的任何路径进行加载都将导致失败。如果so文件存储于SD卡等外部存储路径,不能直接用来作为可执行文件的运行目录,使用前应该把可执行文件复制到APP内部存储再运行。App内部存储目录可通过getFilesDir()来获得。

2.1 具体步骤

  1. 判断CPU平台类型:一种方法是调用系统接口CPUFrameworkHelper类判断当前CPU是ARM架构或是其它架构;第二种方法是读取系统文件"/proc/cpuinfo",它是三个参数类型的数组,第一个参数标识是不是ARM架构,第二个参数标识是V6还是V7架构,第三个参数标识是不是neon指令集。具体方法开发者可根据实际需要而定。
  2. 根据当前的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);
  1. 使用System.load()方法加载APP内部存储目录下的so库
  System.load(destFile.getAbsolutePath());

说明:关于加载时机,需要在导入SDK jar包前进行加载,最好在首页就进行下载加载处理

Clone this wiki locally