Android SDK的so远程化最佳实践

更新时间:
复制为 MD 格式

若应用自身具备 so 远程化能力,且对 SDK 包体积有严格限制,可将 SDK 中的 so 文件拆分至应用的远程 so 仓库,利用应用现有的远程化机制进行动态下发与加载。

适用范围

  • APP应用必须具备 so 远程化能力。

  • 本方案暂不支持 NFC 功能。

操作步骤

  1. so 文件提取与上传
    手动解压 AAR 文件或通过自有框架自动提取 AAR 中的 so 文件,将其上传至应用的远程仓库。

  2. so 文件下载与加载
    在调用 ZIMFacade.install(this) 之前,必须完成 so 文件的下载与加载。参考逻辑如下。

        /**
         * 加载apk外部的so文件
         * @param soFullPath 加载外部路径so完整路径 例如/data/user/0/ctrip.android.view.test/files/libtoyger.so
         */
        public void loadsoFile(String soFullPath) {
            try {
                if (!TextUtils.isEmpty(soFullPath)) {
                    File file = new File(soFullPath);
                    if (file.exists()) {
                        //文件合法性校验
                        String fileMd5 = Utils.getFileMd5(file);
                        if (fileMd5.equals("xxxxx")) {//xxxxsomd5值
                            System.load(soFullPath);
                            //加载成功之后逻辑
                        }
                    }
                }
            } catch (Throwable th) {
                //抛出异常则为加载不成功
            }
        }
  3. 打包配置过滤
    在构建配置中排除需远程化的 so 文件,避免其打入 APK。示例如下。

    android {
        packagingOptions {
            exclude 'lib/arm64-v8a/libtoyger.so'
            exclude 'lib/armeabi-v7a/libtoyger.so'
            exclude 'lib/armeabi/libtoyger.so'
        }
    }

so 远程化后包体积说明

功能模块组合

双架构

arm64

armv7

代码模块

刷脸模块+质量模块+双安全模块

16.04MB

10.52MB

9.71MB

  • aliyun-face

  • aliyun-base

  • aliyun-facade

  • aliyun-facequality

  • APSecuritySDK

  • Android-AliyunFaceGuard

远程化aliyun-face中的 so (libtoyger.so, libzkfv_tj.so)

-1.07MB

-0.58MB

-0.48MB

远程化aliyun-facade中的 so (libaliyunaf.so)

-0.19MB

-0.11MB

-0.08MB

远程化aliyun-facequality中的 so (libxnn.so, libxnnloader.so)

-3.68MB

-1.96MB

-1.73MB

远程化 APSecuritySDK中的 so (libAPSE_8.0.1.so, libAPSE_J.so)

-4.05MB

-2.16MB

-1.89MB

远程化Android-AliyunFaceGuard中的 so (libfacedevice.so)

-2.15MB

-1.14MB

-1.01MB

全部远程化后包大小

4.90MB

4.57MB

4.52MB

  • aliyun-face (去除libtoyger.solibzkfv_tj.so)

  • aliyun-base

  • aliyun-facade (去除libaliyunaf.so)

  • aliyun-facequality(去除libxnn.solibxnnloader.so)

  • APSecuritySDK (去除libAPSE_8.0.1.solibAPSE_J.so)

  • Android-AliyunFaceGuard (去除libfacedevice.so)