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 im APK enthaltenen ExoPlayer-Bibliothek zu minimieren. Auf dieser Seite werden einige einfache Schritte beschrieben, mit denen Sie dies erreichen können.
Nur erforderliche Abhängigkeiten verwenden
Verwenden Sie nur die Bibliotheksmodule, die Sie tatsächlich benötigen. Mit dem folgenden Code werden beispielsweise Abhängigkeiten von den ExoPlayer-, DASH- und UI-Bibliotheksmodulen hinzugefügt, wie sie für eine App erforderlich sein könnten, die nur DASH-Inhalte abspielt:
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"
Verkürzung 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 Komprimieren von Code aktiviert wird.
Im Hilfeartikel App verkleinern, verschleieren und optimieren erfahren Sie, wie Sie die Code- und Ressourcenkomprimierung aktivieren.
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 in der ExoPlayer-Bibliothek ab. Daher wird keine davon durch Code-Shrinking 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 bei der Instanziierung 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();
So können andere Renderer
-Implementierungen durch Code-Schrumpfen 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-Shrinking entfernt. Wenn Sie wissen, dass in Ihrer App nur eine kleine Anzahl von Containerformaten wiedergegeben werden muss oder progressive Medien gar nicht wiedergegeben werden, können Sie stattdessen eine eigene ExtractorsFactory
angeben. Eine App, die nur MP4-Dateien abspielen muss, kann beispielsweise eine solche Factory 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();
So können andere Extractor
-Implementierungen durch Code-Minimierung entfernt werden, was zu einer erheblichen Verringerung der Größe führen kann.
Wenn in deiner App keine progressiven Inhalte wiedergegeben werden, solltest du ExtractorsFactory.EMPTY
an den Konstruktor von DefaultMediaSourceFactory
und dann mediaSourceFactory
an den Konstruktor von ExoPlayer.Builder
übergeben.
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 App MediaSource
direkt anstelle von MediaItem
verwendet, sollten Sie MediaSource.Factory.UNSUPPORTED
an den Konstruktor von ExoPlayer.Builder
übergeben, damit DefaultMediaSourceFactory
und DefaultExtractorsFactory
durch Code-Shrinking 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));