به حداقل رساندن اندازه APK یک جنبه مهم در توسعه یک برنامه اندروید خوب است. این امر به ویژه هنگام هدف قرار دادن بازارهای در حال توسعه و همچنین هنگام توسعه یک برنامه فوری Android صادق است. برای چنین مواردی، ممکن است مطلوب باشد که اندازه کتابخانه ExoPlayer موجود در APK را به حداقل برسانید. این صفحه چند مرحله ساده را بیان می کند که می تواند به دستیابی به این هدف کمک کند.
فقط از وابستگی های مورد نیاز استفاده کنید
فقط به ماژول های کتابخانه ای که واقعاً به آنها نیاز دارید بستگی داشته باشید. برای مثال، موارد زیر وابستگیهایی را به ماژولهای کتابخانه ExoPlayer، DASH و UI اضافه میکنند، همانطور که ممکن است برای برنامهای که فقط محتوای DASH را پخش میکند لازم باشد:
کاتلین
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")
شیار
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 را پخش میکند، سهم ExoPlayer در اندازه APK را میتوان با فعال کردن کوچک کردن کد تقریباً 40 درصد کاهش داد.
Shrink، مبهم کردن، و بهینه سازی برنامه خود را بخوانید تا نحوه فعال کردن کد و کوچک شدن منابع را بیاموزید.
مشخص کنید که برنامه شما به چه رندرهایی نیاز دارد
به طور پیش فرض، رندرهای پخش کننده با استفاده از DefaultRenderersFactory
ایجاد می شوند. DefaultRenderersFactory
به تمام پیاده سازی های Renderer
ارائه شده در کتابخانه ExoPlayer بستگی دارد و در نتیجه هیچ یک از آنها با کوچک کردن کد حذف نمی شوند. اگر میدانید که برنامه شما فقط به زیرمجموعهای از رندرها نیاز دارد، میتوانید RenderersFactory
خود را به جای آن مشخص کنید. برای مثال، برنامهای که فقط صدا را پخش میکند، میتواند هنگام نمونهسازی نمونههای ExoPlayer
، کارخانهای مانند این را تعریف کند:
کاتلین
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()
جاوا
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 نیاز دارد، میتواند کارخانهای مانند:
کاتلین
val mp4ExtractorFactory = ExtractorsFactory { arrayOf<Extractor>(Mp4Extractor(DefaultSubtitleParserFactory())) } val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()
جاوا
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
منتقل کنید.
کاتلین
val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)).build()
جاوا
ExoPlayer player = new ExoPlayer.Builder( context, new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)) .build();
نمونه مدیا سورس سفارشی
اگر برنامه شما از MediaSource.Factory
سفارشی استفاده می کند و می خواهید DefaultMediaSourceFactory
با حذف کد حذف شود، باید MediaSource.Factory
خود را مستقیماً به سازنده ExoPlayer.Builder
منتقل کنید.
کاتلین
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
جاوا
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
اگر برنامه شما مستقیماً به جای MediaItem
از MediaSource
استفاده می کند، باید MediaSource.Factory.UNSUPPORTED
را به سازنده ExoPlayer.Builder
ارسال کنید تا مطمئن شوید که DefaultMediaSourceFactory
و DefaultExtractorsFactory
می توانند با کوچک کردن کد حذف شوند.
کاتلین
val player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build() val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri))
جاوا
ExoPlayer player = new ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri));