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

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

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

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

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"

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

आपको अपने ऐप्लिकेशन के रिलीज़ के लिए तैयार बिल्ड के लिए, कोड और संसाधन को छोटा करने की सुविधा चालू करनी चाहिए. 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), प्लेयर).

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

डिफ़ॉल्ट रूप से, प्लेयर DefaultExtractorsFactory का इस्तेमाल करके प्रोग्रेसिव मीडिया चलाने के लिए, Extractor इंस्टेंस बनाता है. 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();

कस्टम 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 का इस्तेमाल कर रहा है, तो आपको यह करना चाहिए MediaSource.Factory.UNSUPPORTED को ExoPlayer.Builder कंस्ट्रक्टर को पास करें, ताकि यह पक्का किया जा सके कि 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));