公告

微信

欢迎大家私信交流

Skip to content

包体积优化

图片转换

打包后的apk,可以通过asAnalyze APK进行包体积分析。

使用as自带的功能Convert to webp。在图片文件夹下,选择需要缩小的图像,可以全部转换成.webp,使用无损转换。

当然,有损转换也是可以的,就是图片在75%的压缩下,图片失真或者泛光,观感不好。

实践中,37.3MBpng图像文件无损转换成webp后,缩减了3.6MB,变成了33.7MBpngwebp也不是每张图片都会缩小。

移除大依赖带来的额外库

agora作为音视频依赖,带了除基础视频外的一些功能,可以选择移除。

android

在build.gradle中对不需要的插件进行移除

groovy
   packaging {
        // 配置SDK弱链接,减小包体积
        jniLibs {
            // 启动传统打包方式,精细控制库包含
            useLegacyPackaging = true
            // 保留核心库
            keepDebugSymbols += listOf(
                "**/libagora_rtc_engine.so"
            )
            // 处理可能的库冲突
            pickFirsts += listOf()
            // 排除不必要的库
            excludes += listOf(
                // 声网
                // AI降噪插件
                "**/libagora_ai_noise_suppression_extension.so",
                "**/libagora_ai_noise_suppression_ll_extension.so",
                // 回声消除插件
                "**/libagora_ai_echo_cancellation_extension.so",
                // 音频美化插件
                "**/libagora_audio_beauty_extension.so",
                // 视觉增强插件
                "**/libagora_clear_vision_extension.so",
                // 内容检查插件
                "**/libagora_content_inspect_extension.so",
                // 空间音频插件
                "**/libagora_spatial_audio_extension.so",
                // 虚拟背景插件
                "**/libagora_video_segmentation_extension.so",
                // 版权音乐插件
                "**/libagora_drm_loader_extension.so",
                "**/libagora_udrm3_extension.so",
                // 人脸识别插件
                "**/libagora_face_detection_extension.so",
                // 面部捕捉插件
                "**/libagora_face_capture_extension.so",
                // 超分辨率插件
                "**/libagora_super_resolution_extension.so",
                // 屏幕共享插件
                "**/libagora_screen_capture_extension.so",
                // 视频质量分析插件
                "**/libagora_video_quality_analyzer_extension.so",
                // 视频编码插件
                "**/libagora_video_encoder_extension.so",
                "**/video_enc.so",
                // 视频解码插件
                "**/libagora_video_decoder_extension.so",
                "**/video_dec.so",
                // av1插件
                "**/libagora_video_av1_encoder_extension.so",
                "**/libagora_video_av1_decoder_extension.so",
                // 录制插件
                "**/libagora_replay_kit_extension.so",
            )
        }
    }

一顿折腾下来,可以省掉60MB左右

ios

  1. Podfile中,将Agora中的部分强依赖转为弱依赖,使得在打包时可以将弱依赖移除

    pod
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        # code...
    
        # Agora: Remove unnecessary frameworks.
        targets_to_weaklink=['develop', 'distribution', 'agora_rtc_engine']
        next unless targets_to_weaklink.include?(target.name)
        frameworks_to_weaklink = [
          'AgoraAiEchoCancellationExtension',
          'AgoraAiEchoCancellationLLExtension',
          'AgoraAiNoiseSuppressionExtension',
          'AgoraAiNoiseSuppressionLLExtension',
          'AgoraAudioBeautyExtension',
          'AgoraClearVisionExtension',
          'AgoraContentInspectExtension',
          'AgoraDrmLoaderExtension',
          'AgoraFaceCaptureExtension',
          'AgoraFaceDetectionExtension',
          'AgoraLipSyncExtension',
          'AgoraReplayKitExtension',
          'AgoraSpatialAudioExtension',
          'AgoraSuperResolutionExtension',
          'AgoraVideoAv1DecoderExtension',
          'AgoraVideoAv1EncoderExtension',
          'AgoraVideoDecoderExtension',
          'AgoraVideoEncoderExtension',
          'AgoraVideoQualityAnalyzerExtension',
          'AgoraVideoSegmentationExtension',
        ]
        target.build_configurations.each do |config|
          base_config_reference = config.base_configuration_reference
          unless base_config_reference. nil?
            xcconfig_path = base_config_reference.real_path
            xcconfig = File.read(xcconfig_path)
            frameworks_to_weaklink.each do |framework|
              xcconfig = xcconfig.gsub(/-framework "#{framework}"/, "-weak_framework \"#{framework}\"")
            end
            File.open(xcconfig_path, "w") { |file| file << xcconfig }
          end
        end
      end
    end
  2. build phases中补充删除脚本Remove EX Agora

    sh
    # 定义需要移除的框架数组
    frameworks_to_weaklink="AgoraAiEchoCancellationExtension AgoraAiNoiseSuppressionExtension AgoraAudioBeautyExtension     AgoraClearVisionExtension AgoraContentInspectExtension AgoraDrmLoaderExtension AgoraFaceCaptureExtension    AgoraFaceDetectionExtension AgoraLipSyncExtension AgoraReplayKitExtension AgoraSpatialAudioExtension   AgoraSuperResolutionExtension AgoraVideoAv1DecoderExtension AgoraVideoAv1EncoderExtension AgoraVideoDecoderExtension  AgoraVideoEncoderExtension AgoraVideoQualityAnalyzerExtension AgoraVideoSegmentationExtension"
    
    # 创建日志文件
    LOG_FILE="${BUILT_PRODUCTS_DIR}/agora_framework_removal.log"
    echo "开始移除Agora框架 - $(date)" > "$LOG_FILE"
    echo "构建目录: ${BUILT_PRODUCTS_DIR}" >> "$LOG_FILE"
    echo "框架目录: ${FRAMEWORKS_FOLDER_PATH}" >> "$LOG_FILE"
    
    # 遍历数组并移除每个框架
    for framework in $frameworks_to_weaklink; do
        framework_path="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/${framework}.framework"
        echo "正在检查框架: $framework" >> "$LOG_FILE"
    
        if [ -d "$framework_path" ]; then
            echo "发现框架,正在移除: $framework_path" >> "$LOG_FILE"
            rm -Rf "$framework_path"
    
            # 检查移除是否成功
            if [ ! -d "$framework_path" ]; then
                echo "✅ 成功移除: $framework" >> "$LOG_FILE"
            else
                echo "❌ 移除失败: $framework" >> "$LOG_FILE"
            fi
        else
            echo "⚠️ 框架不存在: $framework_path" >> "$LOG_FILE"
        fi
    done
    
    echo "Agora框架移除完成 - $(date)" >> "$LOG_FILE"
    echo "日志文件位置: $LOG_FILE"
  3. 将移除脚本放在[CP] Embed Pods Frameworks后,这一步比较重要,我在这个地方卡了很久,脚本位置挪来挪去,被官方文档坑了

一通操作下来可以省掉10MB以上空间

参考资料

缩小图片大小

包体积减少

上次更新于: