کوچک کردن APK

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

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

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

کاتلین

implementation("androidx.media3:media3-exoplayer:1.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")

شیک

implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"

فعال کردن کاهش کد و منابع

باید کاهش منابع و کد را برای ساخت‌های نسخه پخش برنامه‌تان فعال کنید. ExoPlayer به‌گونه‌ای ساختار یافته است که کوچک کردن کد را ممکن می‌سازد تا عملکردهای استفاده‌نشده را به‌طور مؤثر حذف کند. برای مثال، برای برنامه‌ای که محتوای DASH را پخش می‌کند، با فعال کردن کوچک کردن کد می‌توان سهم ExoPlayer در اندازه APK را تقریباً ۴۰٪ کاهش داد.

برای آشنایی با نحوه فعال کردن کاهش کد و منابع، کاهش، مبهم‌سازی، و بهینه‌سازی برنامه را بخوانید.

مشخص کنید برنامه‌تان به کدام پردازنده گرافیکی نیاز دارد

به‌طور پیش‌فرض، پردازنده پخش‌کننده بااستفاده از 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 سفارشی

اگر برنامه‌تان از 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));