APK wird kleiner

Die Minimierung der APK-Größe ist ein wichtiger Aspekt bei der Entwicklung einer guten Android-App. Das gilt insbesondere für Entwicklungsmärkte und für die Entwicklung einer Android Instant App. In solchen Fällen kann es sinnvoll sein, die Größe der ExoPlayer-Bibliothek zu minimieren, die im APK enthalten ist. Auf dieser Seite finden Sie einige einfache Schritte, die Ihnen dabei helfen können.

Nur erforderliche Abhängigkeiten verwenden

Verwenden Sie nur die Bibliotheksmodule, die Sie tatsächlich benötigen. Im folgenden Beispiel werden Abhängigkeiten von den Modulen der ExoPlayer-, DASH- und der UI-Bibliothek hinzugefügt, wie sie möglicherweise für eine App erforderlich sind, in der nur DASH-Inhalte wiedergegeben werden:

Kotlin

implementation("androidx.media3:media3-exoplayer:1.4.1")
implementation("androidx.media3:media3-exoplayer-dash:1.4.1")
implementation("androidx.media3:media3-ui:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer:1.4.1"
implementation "androidx.media3:media3-exoplayer-dash:1.4.1"
implementation "androidx.media3:media3-ui:1.4.1"

Verkleinern von Code und Ressourcen aktivieren

Sie sollten die Code- und Ressourcenkomprimierung für die Release-Builds Ihrer App aktivieren. ExoPlayer ist so strukturiert, dass durch Code-Shrinking nicht verwendete Funktionen effektiv entfernt werden können. Bei einer App, die DASH-Inhalte wiedergibt, kann der Beitrag von ExoPlayer zur APK-Größe beispielsweise um etwa 40% reduziert werden, wenn das Schrumpfen von Code aktiviert wird.

Weitere Informationen zum Komprimieren, Verschleieren und Optimieren Ihrer App

Angeben, welche Renderer für Ihre App erforderlich sind

Standardmäßig werden die Renderer des Players mit DefaultRenderersFactory erstellt. DefaultRenderersFactory hängt von allen Renderer-Implementierungen ab, die in der ExoPlayer-Bibliothek bereitgestellt werden. Daher wird keine davon durch das Verkleinern von Code entfernt. Wenn Sie wissen, dass für Ihre App nur eine Teilmenge der Renderer erforderlich ist, können Sie stattdessen Ihre eigene RenderersFactory angeben. Eine App, die nur Audio abspielt, kann beispielsweise eine solche Fabrik beim Instanziieren von ExoPlayer-Instanzen definieren:

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();

Dadurch können andere Renderer-Implementierungen durch das Verkleinern von Code entfernt werden. In diesem Beispielvideo wurden Text- und Metadaten-Renderer entfernt. Das bedeutet, dass Untertitel oder In-Stream-Metadaten (z. B. ICY) vom Player nicht verarbeitet oder gesendet werden.

Angeben, welche Extraktoren für Ihre App erforderlich sind

Standardmäßig erstellt der Player Extractor-Instanzen, um progressive Medien mit DefaultExtractorsFactory abzuspielen. DefaultExtractorsFactory hängt von allen Extractor-Implementierungen in der ExoPlayer-Bibliothek ab. Daher wird keine davon durch Code-Minimierung entfernt. Wenn Sie wissen, dass Ihre App nur wenige Containerformate oder überhaupt keine Progressive-Medien wiedergeben muss, können Sie stattdessen Ihre eigene ExtractorsFactory angeben. Eine App, die nur MP4-Dateien abspielen muss, kann beispielsweise eine Fabrik wie die folgende bereitstellen:

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();

Dadurch können andere Extractor-Implementierungen durch Codeverkleinerung entfernt werden, was zu einer erheblichen Größenreduzierung führen kann.

Wenn in Ihrer App überhaupt keine progressiven Inhalte wiedergegeben werden, sollten Sie ExtractorsFactory.EMPTY an den Konstruktor DefaultMediaSourceFactory und dann an den Konstruktor ExoPlayer.Builder übergeben.mediaSourceFactory

Kotlin

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

Java

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

Benutzerdefinierte MediaSource-Instanziierung

Wenn Ihre App eine benutzerdefinierte MediaSource.Factory verwendet und Sie möchten, dass DefaultMediaSourceFactory durch Code-Stripping entfernt wird, sollten Sie Ihre MediaSource.Factory direkt an den ExoPlayer.Builder-Konstruktor übergeben.

Kotlin

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

Java

ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();

Wenn Ihre Anwendung MediaSource direkt statt MediaItem verwendet, sollten Sie MediaSource.Factory.UNSUPPORTED an den Konstruktor ExoPlayer.Builder übergeben, damit DefaultMediaSourceFactory und DefaultExtractorsFactory durch das Verkleinern von Code entfernt werden können.

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));