包体积优化
图片转换
打包后的apk,可以通过as
的Analyze APK
进行包体积分析。
使用as
自带的功能Convert to webp
。在图片文件夹下,选择需要缩小的图像,可以全部转换成.webp
,使用无损转换。
当然,有损转换也是可以的,就是图片在75%的压缩下,图片失真或者泛光,观感不好。
实践中,37.3MB
的png
图像文件无损转换成webp
后,缩减了3.6MB
,变成了33.7MB
。png
转webp
也不是每张图片都会缩小。
移除大依赖带来的额外库
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
在
Podfile
中,将Agora
中的部分强依赖转为弱依赖,使得在打包时可以将弱依赖移除podpost_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
在
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"
将移除脚本放在
[CP] Embed Pods Frameworks
后,这一步比较重要,我在这个地方卡了很久,脚本位置挪来挪去,被官方文档坑了
一通操作下来可以省掉10MB
以上空间