APK छोटा किया जा रहा है

अच्छा Android ऐप्लिकेशन बनाने के लिए, APK का साइज़ कम रखना ज़रूरी है. यह खास तौर पर, उन देशों में ऐप्लिकेशन लॉन्च करने के लिए ज़रूरी है जहां विकासशील बाज़ार हैं. साथ ही, Android Instant App बनाने के लिए भी यह ज़रूरी है. ऐसे मामलों में, APK में शामिल ExoPlayer लाइब्रेरी का साइज़ कम रखना फ़ायदेमंद हो सकता है. इस पेज पर, कुछ आसान तरीके बताए गए हैं. इनकी मदद से, ऐसा किया जा सकता है.

सिर्फ़ ज़रूरी डिपेंडेंसी का इस्तेमाल करना

सिर्फ़ उन लाइब्रेरी मॉड्यूल पर भरोसा करें जिनकी आपको वाकई ज़रूरत है. उदाहरण के लिए, नीचे दिए गए कोड से ExoPlayer, DASH, और यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी मॉड्यूल पर डिपेंडेंसी जुड़ जाएंगी. इनकी ज़रूरत ऐसे ऐप्लिकेशन के लिए पड़ सकती है जो सिर्फ़ DASH कॉन्टेंट चलाता है:

Kotlin

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

Groovy

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

कोड और संसाधन का साइज़ कम करने की सुविधा चालू करना

आपको अपने ऐप्लिकेशन की रिलीज़ के लिए तैयार बिल्ड के लिए, कोड और संसाधन को छोटा करने की सुविधा चालू करनी चाहिए. ExoPlayer को इस तरह से बनाया गया है कि कोड छोटा करने की सुविधा, इस्तेमाल न होने वाली सुविधाओं को आसानी से हटा सके. उदाहरण के लिए, DASH कॉन्टेंट चलाने वाले किसी ऐप्लिकेशन के लिए, कोड श्रिंक करने की सुविधा चालू करके, APK के साइज़ में ExoPlayer के योगदान को करीब 40% तक कम किया जा सकता है.

कोड और संसाधन को छोटा करने की सुविधा चालू करने का तरीका जानने के लिए, अपने ऐप्लिकेशन को छोटा करें, कोड को उलझाएं, और उसे ऑप्टिमाइज़ करें लेख पढ़ें.

बताएं कि आपके ऐप्लिकेशन को किन रेंडरर की ज़रूरत है

डिफ़ॉल्ट रूप से, प्लेयर के रेंडरर DefaultRenderersFactory का इस्तेमाल करके बनाए जाएंगे. DefaultRenderersFactory, ExoPlayer लाइब्रेरी में दिए गए सभी Renderer इंप्लीमेंटेशन पर निर्भर करता है. इसलिए, कोड श्रिंक करने की प्रोसेस के दौरान इनमें से किसी को भी नहीं हटाया जाएगा. अगर आपको पता है कि आपके ऐप्लिकेशन को सिर्फ़ रेंडरर के सबसेट की ज़रूरत है, तो इसके बजाय, अपने RenderersFactory को तय करें. उदाहरण के लिए, सिर्फ़ ऑडियो चलाने वाला कोई ऐप्लिकेशन, 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();

इससे कोड को छोटा करके, Renderer के अन्य वर्शन को हटाया जा सकेगा. इस उदाहरण वीडियो में, टेक्स्ट और मेटाडेटा रेंडरर हटा दिए गए हैं. इसका मतलब है कि प्लेयर, किसी भी सबटाइटल या स्ट्रीम में दिखने वाले मेटाडेटा (जैसे, ICY) को प्रोसेस या रिलीज़ नहीं करेगा.

बताएं कि आपके ऐप्लिकेशन को किन एक्सट्रैक्टर की ज़रूरत है

डिफ़ॉल्ट रूप से, प्लेयर Extractor इंस्टेंस बनाता है, ताकि DefaultExtractorsFactory का इस्तेमाल करके प्रोग्रेसिव मीडिया चलाया जा सके. DefaultExtractorsFactory, ExoPlayer लाइब्रेरी में दिए गए सभी Extractor इंप्लीमेंटेशन पर निर्भर करता है. इसलिए, कोड श्रिंक करने की प्रोसेस के दौरान इनमें से किसी को भी नहीं हटाया जाएगा. अगर आपको पता है कि आपके ऐप्लिकेशन को सिर्फ़ कुछ कंटेनर फ़ॉर्मैट चलाने की ज़रूरत है या वह प्रोग्रेसिव मीडिया नहीं चलाता है, तो इसके बजाय, अपना ExtractorsFactory तय किया जा सकता है. उदाहरण के लिए, सिर्फ़ mp4 फ़ाइलें चलाने वाले ऐप्लिकेशन के लिए, फ़ैक्ट्री इस तरह से उपलब्ध कराई जा सकती है:

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

इससे कोड को छोटा करके, Extractor के अन्य वर्शन को हटाया जा सकेगा. इससे फ़ाइल का साइज़ काफ़ी कम हो सकता है.

अगर आपका ऐप्लिकेशन प्रोग्रेसिव कॉन्टेंट नहीं चला रहा है, तो आपको ExtractorsFactory.EMPTY को DefaultMediaSourceFactory कंस्ट्रक्टर में पास करना चाहिए. इसके बाद, उस mediaSourceFactory को 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();

Custom MediaSource इंस्टैंटिएशन

अगर आपका ऐप्लिकेशन कस्टम MediaSource.Factory का इस्तेमाल कर रहा है और आपको कोड स्ट्रिपिंग की मदद से DefaultMediaSourceFactory को हटाना है, तो आपको अपने MediaSource.Factory को सीधे ExoPlayer.Builder कंस्ट्रक्टर को पास करना चाहिए.

Kotlin

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

Java

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

अगर आपका ऐप्लिकेशन MediaItem के बजाय सीधे MediaSource का इस्तेमाल कर रहा है, तो आपको ExoPlayer.Builder कंस्ट्रक्टर को MediaSource.Factory.UNSUPPORTED पास करना चाहिए. इससे यह पक्का किया जा सकेगा कि कोड छोटा करने की प्रोसेस में, DefaultMediaSourceFactory और DefaultExtractorsFactory को हटाया जा सके.

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