APK کوچک می شود

کاهش حجم APK یکی از جنبه‌های مهم توسعه یک برنامه اندروید خوب است. این امر به ویژه هنگام هدف قرار دادن بازارهای در حال توسعه و همچنین هنگام توسعه یک برنامه فوری اندروید صادق است. در چنین مواردی، ممکن است مطلوب باشد که حجم کتابخانه ExoPlayer که در APK گنجانده شده است را به حداقل برسانید. این صفحه چند مرحله ساده را که می‌تواند به دستیابی به این هدف کمک کند، شرح می‌دهد.

فقط از وابستگی‌های مورد نیاز استفاده کنید

فقط به ماژول‌های کتابخانه‌ای که واقعاً به آنها نیاز دارید، وابسته باشید. برای مثال، موارد زیر وابستگی‌هایی را به ماژول‌های کتابخانه ExoPlayer، DASH و UI اضافه می‌کنند، همانطور که ممکن است برای برنامه‌ای که فقط محتوای DASH را پخش می‌کند، مورد نیاز باشد:

کاتلین

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")

گرووی

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 ، یک factory مانند این تعریف کند:

کاتلین

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 ) توسط پخش‌کننده پردازش یا منتشر نخواهد شد).

مشخص کنید که برنامه شما به کدام استخراج‌کننده‌ها نیاز دارد

به طور پیش‌فرض، پخش‌کننده با استفاده DefaultExtractorsFactory نمونه‌های Extractor را برای پخش رسانه‌های پیش‌رونده ایجاد می‌کند. DefaultExtractorsFactory به تمام پیاده‌سازی‌های Extractor ارائه شده در کتابخانه ExoPlayer بستگی دارد و در نتیجه هیچ یک از آنها با کوچک‌سازی کد حذف نمی‌شوند. اگر می‌دانید که برنامه شما فقط نیاز به پخش تعداد کمی از فرمت‌های کانتینر دارد یا اصلاً رسانه‌های پیش‌رونده را پخش نمی‌کند، می‌توانید ExtractorsFactory خودتان را مشخص کنید. به عنوان مثال، برنامه‌ای که فقط نیاز به پخش فایل‌های mp4 دارد، می‌تواند یک factory مانند زیر ارائه دهد:

کاتلین

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

اگر برنامه شما از یک MediaSource.Factory سفارشی استفاده می‌کند و می‌خواهید DefaultMediaSourceFactory با حذف کد حذف شود، باید MediaSource.Factory خود را مستقیماً به سازنده ExoPlayer.Builder ارسال کنید.

کاتلین

val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()

جاوا

ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();

اگر برنامه شما به جای MediaSource مستقیماً از MediaItem استفاده می‌کند، باید 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));