Уменьшение размера APK-файла – важный аспект разработки качественного приложения для Android. Это особенно актуально при создании приложений для развивающихся рынков и мгновенных приложений для Android. В таких случаях может быть полезно уменьшить размер библиотеки ExoPlayer, включенной в APK. На этой странице описаны простые действия, которые помогут вам в этом.
Используйте только необходимые зависимости
Используйте только те модули библиотеки, которые вам действительно нужны. Например, следующий код добавит зависимости от модулей ExoPlayer, DASH и UI, которые могут потребоваться приложению, воспроизводящему только контент DASH:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")
Яркий
implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"
Как включить удаление неиспользуемого кода и ресурсов
В релизных сборках приложения необходимо включить удаление неиспользуемого кода и ресурсов. ExoPlayer имеет такую структуру, которая позволяет эффективно выполнять сжатие кода для удаления неиспользуемых функций. Например, для приложения, которое воспроизводит контент DASH, вклад ExoPlayer в размер APK можно уменьшить примерно на 40 %, включив сжатие кода.
Подробнее о том, как уменьшить размер приложения, обфусцировать код и оптимизировать его…
Укажите, какие рендереры нужны вашему приложению
По умолчанию рендереры проигрывателя создаются с помощью DefaultRenderersFactory. DefaultRenderersFactory зависит от всех реализаций Renderer, предоставленных в библиотеке ExoPlayer, поэтому ни одна из них не будет удалена при сжатии кода. Если вы знаете, что вашему приложению требуется только часть рендереров, вы можете указать собственный RenderersFactory. Например, приложение, которое только воспроизводит аудио, может определить фабрику следующим образом при создании экземпляров ExoPlayer:
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()
Java
RenderersFactory audioOnlyRenderersFactory = (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] { new MediaCodecAudioRenderer( context, MediaCodecSelector.DEFAULT, handler, audioListener) }; ExoPlayer player = new ExoPlayer.Builder(context, audioOnlyRenderersFactory).build();
Это позволит удалить другие реализации Renderer с помощью сокращения кода. В этом примере видео удалены рендереры текста и метаданных (а значит, субтитры и метаданные In-Stream, например ICY, не будут обрабатываться и воспроизводиться проигрывателем).
Укажите, какие экстракторы нужны вашему приложению
По умолчанию проигрыватель создает Extractor экземпляров для воспроизведения прогрессивного медиаконтента с помощью DefaultExtractorsFactory. DefaultExtractorsFactory зависит от всех реализаций Extractor, предоставленных в библиотеке ExoPlayer, поэтому ни одна из них не будет удалена при сжатии кода. Если вы знаете, что ваше приложение поддерживает лишь небольшое количество форматов контейнеров или не воспроизводит потоковое видео, вы можете указать собственный файл ExtractorsFactory. Например, приложению, которому нужно только воспроизводить файлы MP4, можно предоставить фабрику, как показано ниже.
Kotlin
val mp4ExtractorFactory = ExtractorsFactory { arrayOf<Extractor>(Mp4Extractor(DefaultSubtitleParserFactory())) } val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()
Java
ExtractorsFactory mp4ExtractorFactory = () -> new Extractor[] {new Mp4Extractor(new DefaultSubtitleParserFactory())}; ExoPlayer player = new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, mp4ExtractorFactory)) .build();
Это позволит удалить другие реализации Extractor с помощью уменьшения кода, что может значительно сократить размер приложения.
Если в приложении не воспроизводится контент с прогрессивной загрузкой, передайте значение ExtractorsFactory.EMPTY в конструктор DefaultMediaSourceFactory, а затем передайте объект mediaSourceFactory в конструктор ExoPlayer.Builder.
Kotlin
val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)) .build()
Java
ExoPlayer player = new ExoPlayer.Builder( context, new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)) .build();
Создание собственного экземпляра MediaSource
Если в вашем приложении используется собственный атрибут MediaSource.Factory и вы хотите, чтобы атрибут DefaultMediaSourceFactory был удален при удалении кода, передайте MediaSource.Factory непосредственно конструктору ExoPlayer.Builder.
Kotlin
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
Если в вашем приложении используется 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))
Java
ExoPlayer player = new ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri));