APK küçültülüyor

APK boyutunu en aza indirmek, iyi bir Android uygulaması geliştirmenin önemli bir yönüdür. Bu durum, özellikle gelişmekte olan pazarları hedeflerken ve Android Anında Uygulaması geliştirirken geçerlidir. Bu gibi durumlarda, APK'ya dahil edilen ExoPlayer kitaplığının boyutunu en aza indirmek istenebilir. Bu sayfada, bu amaca ulaşmanıza yardımcı olabilecek bazı basit adımlar açıklanmaktadır.

Yalnızca gerekli bağımlılıkları kullanın

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

Kotlin

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

Groovy

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

Kod ve kaynak küçültmeyi etkinleştirme

Uygulamanızın yayın derlemeleri için kod ve kaynak küçültmeyi etkinleştirmeniz gerekir. ExoPlayer, kod küçültmenin 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 küçültme 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 belirtin

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 hiçbiri kod küçültme ile kaldırılmaz. Uygulamanızın yalnızca bir alt küme oluşturucuya 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 küçültme işlemiyle kaldırılabilir. Bu örnek videoda, metin ve meta veri oluşturucular kaldırılır.Bu nedenle, altyazılar veya yayın içi meta veriler (ör. ICY) oynatıcı tarafından işlenmez ya da yayınlanmaz.

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

Varsayılan olarak, oynatıcı Extractor kullanarak aşamalı medya oynatmak için DefaultExtractorsFactory örnekleri oluşturur. DefaultExtractorsFactory, ExoPlayer kitaplığında sağlanan tüm Extractor uygulamalarına bağlıdır ve sonuç olarak hiçbiri kod küçültme ile kaldırılmaz. Uygulamanızın yalnızca az sayıda kapsayıcı biçim oynatması gerektiğini veya hiç aşamalı medya oynatmadığını biliyorsanız bunun yerine kendi ExtractorsFactory değerinizi belirtebilirsiniz. Örneğin, yalnızca mp4 dosyalarını oynatması gereken bir uygulama şu 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 küçültme ile kaldırılabilir. Bu da boyutta önemli bir azalmaya yol açabilir.

Uygulamanızda hiç progresif içerik oynatılmıyorsa ExtractorsFactory.EMPTY öğesini DefaultMediaSourceFactory oluşturucusuna, ardından bu mediaSourceFactory öğesini ExoPlayer.Builder oluşturucusuna 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 oluşturma

Uygulamanız özel bir MediaSource.Factory kullanıyorsa ve DefaultMediaSourceFactory öğesinin kod temizleme 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 küçültme işlemiyle kaldırılabilmesi için MediaSource.Factory.UNSUPPORTED öğesini ExoPlayer.Builder oluşturucusuna 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));