安卓手机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))
相关推荐
阿巴斯甜20 分钟前
必看11
android
solo_9922 分钟前
Perftto 使用命令添加标签
android
阿巴斯甜30 分钟前
必看10
android
阿巴斯甜32 分钟前
必看9
android
阿巴斯甜1 小时前
必看6
android
angerdream1 小时前
Android手把手编写儿童手机远程监控App之SQLite详解
android
阿巴斯甜1 小时前
必看5
android
雪铃儿2 小时前
Shorebird 之外,Flutter Android 热更新还有什么选择
android·前端
张筱竼3 小时前
Android开发中的MVC、MVP与MVVM详解
android
Hommy885 小时前
【开源剪映小助手】媒体信息生成接口
开源·智能路由器·github·媒体·剪映小助手