Минимизация размера APK-файла — важный аспект разработки качественного Android-приложения. Это особенно актуально при работе с развивающимися рынками, а также при разработке Android-приложений мгновенного доступа. В таких случаях может быть целесообразно минимизировать размер библиотеки ExoPlayer, включенной в APK-файл. На этой странице описаны несколько простых шагов, которые помогут этого добиться.
Используйте только необходимые зависимости.
Зависимость следует устанавливать только от тех модулей библиотеки, которые вам действительно необходимы. Например, следующий код добавит зависимости от модулей библиотеки ExoPlayer, DASH и UI, которые могут потребоваться для приложения, воспроизводящего только контент DASH:
Котлин
implementation("androidx.media3:media3-exoplayer:1.9.2") implementation("androidx.media3:media3-exoplayer-dash:1.9.2") implementation("androidx.media3:media3-ui:1.9.2")
Классный
implementation "androidx.media3:media3-exoplayer:1.9.2" implementation "androidx.media3:media3-exoplayer-dash:1.9.2" implementation "androidx.media3:media3-ui:1.9.2"
Включите возможность сжатия кода и ресурсов.
Для релизных сборок вашего приложения следует включить уменьшение размера кода и ресурсов. ExoPlayer имеет такую структуру, которая позволяет эффективно удалять неиспользуемую функциональность за счет уменьшения размера кода. Например, для приложения, воспроизводящего контент DASH, вклад ExoPlayer в размер APK-файла можно уменьшить примерно на 40% за счет включения уменьшения размера кода.
Прочитайте статью «Сжатие, обфускация и оптимизация вашего приложения» , чтобы узнать, как включить функцию сжатия кода и ресурсов.
Укажите, какие средства визуализации необходимы вашему приложению.
По умолчанию рендереры плеера создаются с помощью DefaultRenderersFactory . DefaultRenderersFactory зависит от всех реализаций Renderer , предоставляемых библиотекой ExoPlayer, и поэтому ни одна из них не будет удалена при сокращении кода. Если вы знаете, что вашему приложению требуется только подмножество рендереров, вы можете указать свою собственную RenderersFactory . Например, приложение, которое только воспроизводит аудио, может определить фабрику следующим образом при создании экземпляров ExoPlayer :
Котлин
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 за счет сокращения кода. В этом конкретном примере удаляются рендереры видео, текста и метаданных (что означает, что субтитры или метаданные в потоке (например, ICY ) не будут обрабатываться или передаваться плеером).
Укажите, какие экстракторы необходимы вашему приложению.
По умолчанию плеер создает экземпляры Extractor для воспроизведения прогрессивного мультимедиа с помощью DefaultExtractorsFactory . DefaultExtractorsFactory зависит от всех реализаций Extractor , предоставляемых библиотекой ExoPlayer, и поэтому ни одна из них не будет удалена при сокращении кода. Если вы знаете, что вашему приложению нужно воспроизводить лишь небольшое количество форматов контейнеров или оно вообще не воспроизводит прогрессивное мультимедиа, вы можете указать свою собственную ExtractorsFactory . Например, приложение, которому нужно воспроизводить только файлы mp4, может предоставить фабрику следующего вида:
Котлин
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 .
Котлин
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 .
Котлин
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 при сокращении кода.
Котлин
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));