安卓手机APP开发__媒体开发部分__APK裁剪

安卓手机APP开发__媒体开发部分__APK裁剪

目录

概述

仅使用必要的依赖

启用代码和资源的裁剪

指定你的APP需要哪一个渲染器

指定你的APP需要哪个抽取器

定制媒体源的实例化


概述

最小化APK的大小是开发一个好的安卓APP的一个重要的方面.当面向的是正在开发

的市场时更是如此,当开发一个安卓的小程序时,也是很重要的.对于这些用例,

对于包括在APK中的ExoPlayer库的大小的最小化,就是让人很期待的事了.

这里列出了实现这个任务的几个步骤.

仅使用必要的依赖

仅依赖你实际需要的库的模块.例如,对于一个APP仅播放DASH内容,仅加上如下的

依赖,即ExoPlayer, DASH和用户界面库的模块.

Kotlin

Kotlin 复制代码
implementation("androidx.media3:media3-exoplayer:1.3.1")
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
implementation("androidx.media3:media3-ui:1.3.1")

启用代码和资源的裁剪

你应该对你的APP的发布版本,启用代码和资源的裁剪.ExoPlayer是结构化的,支持以一种方式

来允许代码裁剪,来有效地移除没有用的功能.例如,对于一个播放DASH内容的APP,ExoPlayer

通过启用代码裁剪,可以减少40%的自身大小.

阅读裁剪,并且优化你的APP,来学习如何启用代码和资源的裁剪.

指定你的APP需要哪一个渲染器

默认情况下,播放器的渲染器能使用DefaultRenderersFactory来创建.

DefaultRenderersFactory依赖所有的渲染器的实现,结果是在代码裁剪时

没有代码被裁剪掉.如果你知道你的APP仅需要一个渲染器的子集,你能指定你

自己的RenderersFactory来替换原来的.例如,一个APP仅播放音频,能够定义

一个工厂是如下的形式:

Kotlin

Kotlin 复制代码
val audioOnlyRenderersFactory =
  RenderersFactory {
    handler: Handler,
    videoListener: VideoRendererEventListener,
    audioListener: AudioRendererEventListener,
    textOutput: TextOutput,
    metadataOutput: MetadataOutput,
    ->
    arrayOf<Renderer>(
      MediaCodecAudioRenderer(context, MediaCodecSelector.DEFAULT, handler, audioListener)
    )
}
val player = ExoPlayer.Builder(context, audioOnlyRenderersFactory).build()

这将允许在代码裁剪时把其它的渲染器的代码给裁剪掉.在这个特殊的示例视频中,文件和

元数据的渲染器都被移除了.

指定你的APP需要哪个抽取器

默认情况下,播放器创建了抽取器实例来播放先进的媒体,使用的是DefaultExtractorsFactory.

DefaultExtractorsFactory依赖所有的抽取器,结果是没有抽取器被裁剪掉.如果你知道,你的

APP播放很少的容器的格式,或者根本不需要播放先进的媒体,你能指定你的ExtractorsFactory

来替换掉原来的.例如,一个APP仅需要播放MP4文件,能提供如下的工厂:

Kotlin

Kotlin 复制代码
val mp4ExtractorFactory = ExtractorsFactory {
  arrayOf<Extractor>(Mp4Extractor(DefaultSubtitleParserFactory()))
}
val player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()

这将允许通过代码裁剪,把其它的抽取器的实现优化掉,这能让APK的大小有显著地减少。

如果你的APP不播放先进的内容,你应该把ExtractorsFactory.EMPTY传给

DefaultMediaSourceFactory的组装子,然后,把mediaSourceFactory传给

ExoPlayer.Builder的组装子。

Kotlin

Kotlin 复制代码
val player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)).build()

定制媒体源的实例化

如果你的APP使用一个定制的MediaSource.Factory,并且你要DefaultMediaSourceFactory

通过代码优化而被优化,你应该把你的MediaSource.Factory直接传给

ExoPlayer.Builder的组装子。

Kotlin

Kotlin 复制代码
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()

如果你的APP是使用MediaSource直接代替了MediaItem,你应该把

MediaSource.Factory.UNSUPPORTED传给ExoPlayer.Builder的组装子,来确保

DefaultMediaSourceFactory 和 DefaultExtractorsFactory都被优化了。

Kotlin

Kotlin 复制代码
val player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build()
val mediaSource =
  ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory)
    .createMediaSource(MediaItem.fromUri(uri))
相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui