يُعد تقليل حجم حِزمة APK أحد الجوانب المهمة في تطوير تطبيق Android جيد، وينطبق ذلك بشكل خاص عند استهداف الأسواق النامية، وكذلك عند تطوير تطبيق فوري على Android. وفي مثل هذه الحالات، قد يكون من المستحسن تقليل حجم مكتبة ExoPlayer المُضمّنة في حِزمة APK. توضّح هذه الصفحة بعض الخطوات البسيطة التي يمكن أن تساعد في تحقيق ذلك.
استخدام العناصر التابعة المطلوبة فقط
استخدِم فقط وحدات المكتبة التي تحتاج إليها فعلاً. على سبيل المثال، سيؤدي ما يلي إلى إضافة تبعيات على وحدات 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، يمكن تقليل مساهمة ExoPlayer في حجم حزمة APK بنسبة% 40 تقريبًا من خلال تفعيل ميزة تصغير حجم الرمز.
يمكنك الاطّلاع على مقالة تصغير حجم تطبيقك وإخفاء مفاتيح فك التشفير وتحسينه للتعرّف على كيفية تفعيل تصغير حجم الرموز والموارد.
تحديد أدوات العرض التي يحتاجها تطبيقك
سيتم تلقائيًا إنشاء أدوات العرض الخاصة بالمشغّل باستخدام
DefaultRenderersFactory. تعتمد DefaultRenderersFactory على جميع عمليات تنفيذ Renderer المتوفّرة في مكتبة ExoPlayer، ونتيجةً لذلك، لن تتم إزالة أيّ منها من خلال تصغير الرمز البرمجي. إذا كنت تعلم أنّ تطبيقك يحتاج فقط إلى مجموعة فرعية من أدوات العرض، يمكنك تحديد 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 على جميع عمليات تنفيذ Extractor المتوفّرة في مكتبة ExoPlayer، ونتيجةً لذلك، لن تتم إزالة أيّ منها من خلال تصغير الرمز البرمجي. إذا كنت تعلم أنّ تطبيقك يحتاج فقط إلى تشغيل عدد صغير من تنسيقات الحاويات، أو أنّه لا يشغّل الوسائط المتدفقة على الإطلاق، يمكنك تحديد 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();
إذا كان تطبيقك يستخدم MediaSource مباشرةً بدلاً من MediaItem، عليك تمرير 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));