APK küçültülüyor

APK boyutunu en aza indirmek, iyi bir Android uygulaması geliştirmenin önemli bir parçasıdır. Bu, özellikle gelişmekte olan pazarları hedeflediğinizde ve Android Hazır Uygulamalar geliştirirken geçerlidir. Bu gibi durumlarda, APK'da bulunan ExoPlayer kitaplığının boyutunu en aza indirmek istenebilir. Bu sayfada, bu hedefe ulaşmanıza yardımcı olabilecek bazı basit adımlar açıklanmaktadır.

Yalnızca gerekli bağımlılıkları kullanma

Yalnızca gerçekten ihtiyacınız olan kitaplık modüllerine bağlı olun. Örneğin, aşağıdaki kod, yalnızca DASH içeriği oynatan bir uygulama için gerekli olabilecek ExoPlayer, DASH ve kullanıcı arayüzü kitaplığı modüllerine bağımlılıklar ekler:

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

Modern

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"

Kod ve kaynak küçültmeyi etkinleştirme

Uygulamanızın yayınlanan derlemeleri için kod ve kaynak küçültmeyi etkinleştirmeniz gerekir. ExoPlayer, kod daraltma işleminin kullanılmayan işlevleri etkili bir şekilde kaldırmasına olanak tanıyacak şekilde yapılandırılmıştır. Örneğin, DASH içeriği oynatan bir uygulamada kod daraltma etkinleştirilerek ExoPlayer'ın APK boyutuna katkısı yaklaşık% 40 oranında azaltılabilir.

Kod ve kaynak küçültmeyi nasıl etkinleştireceğinizi öğrenmek için Uygulamanızı küçültme, karartma ve optimize etme başlıklı makaleyi okuyun.

Uygulamanızın hangi oluşturuculara ihtiyacı olduğunu belirtme

Varsayılan olarak, oynatıcının oluşturucuları DefaultRenderersFactory kullanılarak oluşturulur. DefaultRenderersFactory, ExoPlayer kitaplığında sağlanan tüm Renderer uygulamalarına bağlıdır ve sonuç olarak bunların hiçbiri kod daraltma işlemiyle kaldırılmaz. Uygulamanızın yalnızca oluşturucuların bir alt kümesine ihtiyacı olduğunu biliyorsanız bunun yerine kendi RenderersFactory öğenizi belirtebilirsiniz. Örneğin, yalnızca ses çalan bir uygulama, ExoPlayer örneklerini oluştururken aşağıdaki gibi bir fabrika tanımlayabilir:

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

Bu sayede diğer Renderer uygulamaları kod daraltma ile kaldırılabilir. Bu örnek videoda, metin ve meta veri oluşturucular kaldırılmıştır (yani altyazılar veya yayın içi meta veriler (ör. ICY) oynatıcı tarafından işlenmez veya yayınlanmaz).

Uygulamanızın hangi ayıklayıcılara ihtiyacı olduğunu belirtme

Oynatıcı, varsayılan olarak DefaultExtractorsFactory kullanarak aşamalı medya oynatmak için Extractor örnekleri oluşturur. DefaultExtractorsFactory, ExoPlayer kitaplığında sağlanan tüm Extractor uygulamalarına bağlıdır ve sonuç olarak bunların hiçbiri kod daraltma işlemiyle kaldırılmaz. Uygulamanızın yalnızca az sayıda kapsayıcı biçimi oynatması gerektiğini veya aşamalı medya oynatmadığını biliyorsanız kendi ExtractorsFactory öğenizi belirtebilirsiniz. Örneğin, yalnızca MP4 dosyalarını oynatması gereken bir uygulama, aşağıdaki gibi bir fabrika sağlayabilir:

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

Bu sayede diğer Extractor uygulamaları kod daraltma ile kaldırılabilir ve boyut önemli ölçüde küçültülebilir.

Uygulamanız aşamalı içerik oynatmıyorsa DefaultMediaSourceFactory oluşturucusuna ExtractorsFactory.EMPTY, ardından ExoPlayer.Builder oluşturucusuna bu mediaSourceFactory değerini iletmeniz gerekir.

Kotlin

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

Java

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

Özel MediaSource örneklendirmesi

Uygulamanız özel bir MediaSource.Factory kullanıyorsa ve DefaultMediaSourceFactory öğesinin kod kaldırma işlemiyle kaldırılmasını istiyorsanız MediaSource.Factory öğenizi doğrudan ExoPlayer.Builder oluşturucusuna iletmeniz gerekir.

Kotlin

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

Java

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

Uygulamanız MediaItem yerine doğrudan MediaSource kullanıyorsa DefaultMediaSourceFactory ve DefaultExtractorsFactory öğelerinin kod daraltma ile çıkarılabilmesi için ExoPlayer.Builder oluşturucusuna MediaSource.Factory.UNSUPPORTED iletmeniz gerekir.

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