La réduction de la taille de l'APK est un aspect important du développement d'une bonne application Android. Cela est particulièrement vrai lorsque vous ciblez des marchés en développement, mais aussi lorsque vous développez une application Android Instant. Dans ce cas, il peut être souhaitable de réduire la taille de la bibliothèque ExoPlayer incluse dans l'APK. Cette page décrit quelques étapes simples qui peuvent vous aider à y parvenir.
N'utiliser que les dépendances requises
Ne dépendez que des modules de bibliothèque dont vous avez réellement besoin. Par exemple, le code suivant ajoute des dépendances sur les modules de bibliothèque ExoPlayer, DASH et UI, comme cela peut être nécessaire pour une application qui ne lit que du contenu DASH:
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"
Activer la réduction du code et des ressources
Vous devez activer la réduction des ressources et la minification du code pour les builds de votre application. ExoPlayer est structuré de manière à permettre la réduction du code pour supprimer efficacement les fonctionnalités inutilisées. Par exemple, pour une application qui lit du contenu DASH, la contribution d'ExoPlayer à la taille de l'APK peut être réduite d'environ 40% en activant la minification de code.
Consultez Réduire, obscurcir et optimiser votre application pour découvrir comment activer la réduction du code et des ressources.
Spécifier les moteurs de rendu dont votre application a besoin
Par défaut, les moteurs de rendu du lecteur sont créés à l'aide de DefaultRenderersFactory
. DefaultRenderersFactory
dépend de toutes les implémentations Renderer
fournies dans la bibliothèque ExoPlayer. Par conséquent, aucune d'elles ne sera supprimée par la réduction du code. Si vous savez que votre application n'a besoin que d'un sous-ensemble de moteurs de rendu, vous pouvez spécifier votre propre RenderersFactory
à la place. Par exemple, une application qui ne lit que de l'audio peut définir une usine comme celle-ci lors de l'instanciation d'instances 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();
Cela permettra de supprimer les autres implémentations Renderer
par réduction du code. Dans cet exemple de vidéo, les moteurs de rendu du texte et des métadonnées sont supprimés (ce qui signifie que les sous-titres ou les métadonnées intégrées au flux (par exemple, ICY) ne seront pas traités ni émis par le lecteur).
Spécifier les extracteurs dont votre application a besoin
Par défaut, le lecteur crée des instances Extractor
pour lire des contenus multimédias progressifs à l'aide de DefaultExtractorsFactory
. DefaultExtractorsFactory
dépend de toutes les implémentations Extractor
fournies dans la bibliothèque ExoPlayer. Par conséquent, aucune d'elles ne sera supprimée par la réduction du code. Si vous savez que votre application ne doit lire qu'un petit nombre de formats de conteneur ou qu'elle ne lit pas du tout les médias progressifs, vous pouvez spécifier votre propre ExtractorsFactory
. Par exemple, une application qui ne doit lire que des fichiers MP4 peut fournir une fabrique comme celle-ci:
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();
Cela permet d'éliminer d'autres implémentations Extractor
par réduction du code, ce qui peut entraîner une réduction significative de la taille.
Si votre application ne lit pas du tout de contenu progressif, vous devez transmettre ExtractorsFactory.EMPTY
au constructeur DefaultMediaSourceFactory
, puis transmettre ce mediaSourceFactory
au constructeur 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();
Instanciation de MediaSource personnalisée
Si votre application utilise un MediaSource.Factory
personnalisé et que vous souhaitez que DefaultMediaSourceFactory
soit supprimé par le dénudage de code, vous devez transmettre votre MediaSource.Factory
directement au constructeur ExoPlayer.Builder
.
Kotlin
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
Si votre application utilise directement MediaSource
au lieu de MediaItem
, vous devez transmettre MediaSource.Factory.UNSUPPORTED
au constructeur ExoPlayer.Builder
pour vous assurer que DefaultMediaSourceFactory
et DefaultExtractorsFactory
peuvent être supprimés par la réduction du code.
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));