अच्छा Android ऐप्लिकेशन बनाने के लिए, APK का साइज़ कम करना ज़रूरी है. यह बात खास तौर पर, विकासशील देशों/इलाकों को टारगेट करते समय और Android इंस्टैंट ऐप्लिकेशन बनाते समय ज़रूरी है. ऐसे मामलों में, 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
का इस्तेमाल कर रहा है, तो आपको 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));