APK کوچک می شود

به حداقل رساندن اندازه 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));