APK küçültülüyor

APK boyutunu en aza indirmek, iyi bir Android uygulaması geliştirmenin önemli bir yönüdür. Bu, özellikle gelişmekte olan pazarlar hedeflenirken ve Android Hazır Uygulama geliştirirken geçerlidir. Bu gibi durumlarda, APK'ya dahil olan ExoPlayer kitaplığının boyutunu en aza indirmek istenebilir. Bu sayfada, bunu başarmanıza yardımcı olabilecek bazı basit adımlar özetlenmektedir.

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

Yalnızca gerçekten ihtiyacınız olan kitaplık modüllerine bağlıdır. Örneğin, aşağıdakiler yalnızca DASH içeriğini oynatan bir uygulama için gerekli olabileceği gibi ExoPlayer, DASH ve UI kitaplığı modüllerine bağımlılıklar ekler:

Kotlin

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

Modern

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

Kod ve kaynak daraltmayı etkinleştir

Uygulamanızın sürüm derlemeleri için kod ve kaynak daraltmayı etkinleştirmeniz gerekir. ExoPlayer, kullanılmayan işlevleri etkili bir şekilde kaldırmak için kodun küçültülmesini sağlayacak şekilde yapılandırılmıştır. Örneğin, DASH içeriği oynatan bir uygulama için ExoPlayer'ın APK boyutuna katkısı, kod daraltma özelliğini etkinleştirerek yaklaşık% 40 oranında azaltılabilir.

Kod ve kaynak daraltmayı nasıl etkinleştireceğinizi öğrenmek için Uygulamanızı küçültme, gizleme ve optimize etme bölümünü okuyun.

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

Oynatıcının oluşturucuları varsayılan olarak 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 bir oluşturucu alt kümesine ihtiyacı olduğunu biliyorsanız bunun yerine kendi RenderersFactory öğenizi belirtebilirsiniz. Örneğin, yalnızca ses çalan bir uygulama, ExoPlayer örneklerini örneklerken 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, diğer Renderer uygulamalarının kod daraltma işlemiyle kaldırılmasına olanak tanır. Bu örnek videoda, metin ve meta veri oluşturucuları kaldırılı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 ihtiyaç duyduğunu belirtin

Oynatıcı, DefaultExtractorsFactory kullanarak progresif medya oynatmak için varsayılan olarak Extractor örnek 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çimini oynatması gerektiğini veya progresif medya oynatmadığını biliyorsanız bunun yerine kendi ExtractorsFactory öğenizi belirtebilirsiniz. Örneğin, sadece mp4 dosyalarını çalması gereken bir uygulama şunun 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, kod küçültme ile diğer Extractor uygulamalarının kaldırılmasına olanak tanır ve bu da boyutta önemli bir küçülmeye neden olabilir.

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

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şturucuya 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 ExoPlayer.Builder oluşturucuya MediaSource.Factory.UNSUPPORTED öğesini iletmeniz gerekir. Böylece DefaultMediaSourceFactory ve DefaultExtractorsFactory öğelerinin kod küçültme işlemiyle soyulabilmesini sağlarsınız.

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