کوچک کردن 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));