APK küçültülüyor

APK boyutunu küçültmek, iyi bir Android uygulaması geliştirmenin önemli bir parçasıdır. Bu durum özellikle gelişmekte olan pazarları hedeflerken ve Android Anında Uygulama geliştirirken geçerlidir. Bu gibi durumlarda, APK'ya dahil edilen ExoPlayer kitaplığının boyutunu küçültmek isteyebilirsiniz. Bu sayfada, bu hedefe ulaşmanıza yardımcı olabilecek bazı basit adımlar özetlenmiştir.

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, aşağıdaki kod, yalnızca DASH içeriği oynatan bir uygulama için gerekli olabileceğinden ExoPlayer, DASH ve kullanıcı arayüzü kitaplık modüllerine bağımlılık ekler:

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"

Kod ve kaynak küçültmeyi etkinleştirme

Uygulamanızın sürüm derlemeleri için kod ve kaynak küçültmeyi etkinleştirmeniz gerekir. ExoPlayer, kullanılmayan işlevleri etkili bir şekilde kaldırmak için kod küçültme işleminin yapılmasını sağlayacak şekilde yapılandırılmıştır. Örneğin, DASH içeriği oynatan bir uygulamada kod küçültme özelliği etkinleştirilerek ExoPlayer'ın APK boyutuna olan 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 ihtiyaç duyduğu oluşturma araçlarını belirtme

Oynatıcının oluşturma araçları varsayılan olarak DefaultRenderersFactory kullanılarak oluşturulur. DefaultRenderersFactory, ExoPlayer kitaplığında sağlanan tüm Renderer uygulamalarından yararlanır. Bu nedenle, kod küçültme işlemiyle bunların hiçbiri kaldırılmaz. Uygulamanızın yalnızca bir alt küme oluşturma aracına ihtiyacı olduğunu biliyorsanız bunun yerine kendi RenderersFactory 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, kod küçültme işlemiyle diğer Renderer uygulamalarının kaldırılması sağlanır. Bu örnek videoda metin ve meta veri oluşturma araçları 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 ihtiyaç duyduğu ayıklayıcıları belirtme

Oynatıcı, varsayılan olarak DefaultExtractorsFactory kullanarak progresif medyayı oynatmak için Extractor örnek oluşturur. DefaultExtractorsFactory, ExoPlayer kitaplığında sağlanan tüm Extractor uygulamalarına bağlıdır ve sonuç olarak kod küçültme yöntemiyle bunların hiçbiri kaldırılmaz. Uygulamanızın yalnızca az sayıda kapsayıcı biçimi oynatması gerektiğini veya hiç progresif medya oynatmadığını biliyorsanız bunun yerine kendi ExtractorsFactory dosyanızı 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 da kod küçültme işlemiyle diğer Extractor uygulamalarının kaldırılmasına olanak tanır ve bu da boyutta önemli bir küçülmeye neden olabilir.

Uygulamanız hiç aşamalı içerik oynatmı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 örneği oluşturma

Uygulamanız özel bir MediaSource.Factory kullanıyorsa ve DefaultMediaSourceFactory'nin kod ayıklamayla kaldırılmasını istiyorsanız MediaSource.Factory'nizi doğrudan ExoPlayer.Builder kurucusuna 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'nin kod küçültme işlemiyle kaldırılabilmesi için MediaSource.Factory.UNSUPPORTED değerini 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));