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

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

目录

概述

仅使用必要的依赖

启用代码和资源的裁剪

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

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

定制媒体源的实例化


概述

最小化APK的大小是开发一个好的安卓APP的一个重要的方面.当面向的是正在开发
的市场时更是如此,当开发一个安卓的小程序时,也是很重要的.对于这些用例,
对于包括在APK中的ExoPlayer库的大小的最小化,就是让人很期待的事了.
这里列出了实现这个任务的几个步骤.

仅使用必要的依赖

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

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

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

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

val player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)).build()

定制媒体源的实例化

如果你的APP使用一个定制的MediaSource.Factory,并且你要DefaultMediaSourceFactory
通过代码优化而被优化,你应该把你的MediaSource.Factory直接传给
ExoPlayer.Builder的组装子。


Kotlin

val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()

如果你的APP是使用MediaSource直接代替了MediaItem,你应该把
MediaSource.Factory.UNSUPPORTED传给ExoPlayer.Builder的组装子,来确保
DefaultMediaSourceFactory 和 DefaultExtractorsFactory都被优化了。


Kotlin

val player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build()
val mediaSource =
  ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory)
    .createMediaSource(MediaItem.fromUri(uri))

相关推荐

  1. 手机APP开发__媒体开发部分__APK裁剪

    2024-04-30 02:40:01       17 阅读
  2. 手机APP开发__媒体开发部分__媒体

    2024-04-30 02:40:01       16 阅读
  3. 手机APP开发__媒体开发部分__媒体

    2024-04-30 02:40:01       14 阅读
  4. 手机APP开发__媒体开发部分__直播流

    2024-04-30 02:40:01       16 阅读
  5. 手机APP开发__媒体开发部分__网络栈

    2024-04-30 02:40:01       18 阅读
  6. 手机APP开发__媒体开发部分__媒体投屏

    2024-04-30 02:40:01       14 阅读
  7. 手机APP开发__媒体开发部分__检索元数据

    2024-04-30 02:40:01       13 阅读
  8. 手机APP开发__媒体开发部分__音轨的选择

    2024-04-30 02:40:01       15 阅读
  9. 手机APP开发__媒体开发部分__播放器的接口

    2024-04-30 02:40:01       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 02:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 02:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 02:40:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 02:40:01       20 阅读

热门阅读

  1. 【C++例8-2】 将单目运算符“++”重载为成员函数

    2024-04-30 02:40:01       10 阅读
  2. Oracle中取出clob类型

    2024-04-30 02:40:01       10 阅读
  3. Modbus协议到EtherCAT协议的转换

    2024-04-30 02:40:01       10 阅读
  4. 穆迪信用评级

    2024-04-30 02:40:01       10 阅读
  5. 【Pyhton爬虫实战】爬取京东商城的商品信息

    2024-04-30 02:40:01       11 阅读
  6. Rest开发

    2024-04-30 02:40:01       9 阅读
  7. R语言 数据整理篇之结构重塑

    2024-04-30 02:40:01       9 阅读