APK کوچک می شود
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
به حداقل رساندن اندازه APK یک جنبه مهم در توسعه یک برنامه اندروید خوب است. این امر به ویژه هنگام هدف قرار دادن بازارهای در حال توسعه و همچنین هنگام توسعه یک برنامه فوری Android صادق است. برای چنین مواردی، ممکن است مطلوب باشد که اندازه کتابخانه 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 درصد کاهش داد.
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();
اگر برنامه شما مستقیماً به جای 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));
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# APK shrinking\n\nMinimizing APK size is an important aspect of developing a good Android\napp. This is particularly true when targeting developing markets, and\nalso when developing an Android Instant App. For such cases, it may be desirable\nto minimize the size of the ExoPlayer library that's included in the APK. This\npage outlines some simple steps that can help to achieve this.\n\nUse only required dependencies\n------------------------------\n\nDepend only on the library modules that you actually need. For example, the\nfollowing will add dependencies on the ExoPlayer, DASH, and UI library modules,\nas might be required for an app that only plays DASH content: \n\n### Kotlin\n\n```kotlin\nimplementation(\"androidx.media3:media3-exoplayer:1.8.0\")\nimplementation(\"androidx.media3:media3-exoplayer-dash:1.8.0\")\nimplementation(\"androidx.media3:media3-ui:1.8.0\")\n```\n\n### Groovy\n\n```groovy\nimplementation \"androidx.media3:media3-exoplayer:1.8.0\"\nimplementation \"androidx.media3:media3-exoplayer-dash:1.8.0\"\nimplementation \"androidx.media3:media3-ui:1.8.0\"\n```\n\nEnable code and resource shrinking\n----------------------------------\n\nYou should enable code and resource shrinking for your app's release\nbuilds. ExoPlayer is structured in a way that allows code shrinking to\neffectively remove unused functionality. For example, for an app that\nplays DASH content, ExoPlayer's contribution to APK size can be reduced by\napproximately 40% by enabling code shrinking.\n\nRead [Shrink, obfuscate, and optimize your app](/studio/build/shrink-code) to learn how to enable\ncode and resource shrinking.\n\nSpecify which renderers your app needs\n--------------------------------------\n\nBy default, the player's renderers will be created using\n`DefaultRenderersFactory`. `DefaultRenderersFactory` depends on all of the\n`Renderer` implementations provided in the ExoPlayer library, and as a result\nnone of them will be removed by code shrinking. If you know that your app only\nneeds a subset of renderers, you can specify your own `RenderersFactory`\ninstead. For example, an app that only plays audio can define a factory like\nthis when instantiating `ExoPlayer` instances: \n\n### Kotlin\n\n```kotlin\nval audioOnlyRenderersFactory =\n RenderersFactory {\n handler: Handler,\n videoListener: VideoRendererEventListener,\n audioListener: AudioRendererEventListener,\n textOutput: TextOutput,\n metadataOutput: MetadataOutput,\n -\u003e\n arrayOf\u003cRenderer\u003e(\n MediaCodecAudioRenderer(context, MediaCodecSelector.DEFAULT, handler, audioListener)\n )\n}\nval player = ExoPlayer.Builder(context, audioOnlyRenderersFactory).build()\n```\n\n### Java\n\n```java\nRenderersFactory audioOnlyRenderersFactory =\n (handler, videoListener, audioListener, textOutput, metadataOutput) -\u003e\n new Renderer[] {\n new MediaCodecAudioRenderer(\n context, MediaCodecSelector.DEFAULT, handler, audioListener)\n };\nExoPlayer player = new ExoPlayer.Builder(context, audioOnlyRenderersFactory).build();\n```\n\n\u003cbr /\u003e\n\nThis will allow other `Renderer` implementations to be removed by code\nshrinking. In this particular example video, text and metadata renderers are\nremoved (which means any subtitles or in-stream metadata (e.g.\n[ICY](https://cast.readme.io/docs/icy)) won't be processed or emitted by the\nplayer).\n\nSpecify which extractors your app needs\n---------------------------------------\n\nBy default, the player creates `Extractor` instances to play progressive media using\n`DefaultExtractorsFactory`. `DefaultExtractorsFactory` depends on all of the\n`Extractor` implementations provided in the ExoPlayer library, and as a result\nnone of them will be removed by code shrinking. If you know that your app only\nneeds to play a small number of container formats, or doesn't play progressive\nmedia at all, you can specify your own `ExtractorsFactory` instead. For example,\nan app that only needs to play mp4 files can provide a factory like: \n\n### Kotlin\n\n```kotlin\nval mp4ExtractorFactory = ExtractorsFactory {\n arrayOf\u003cExtractor\u003e(Mp4Extractor(DefaultSubtitleParserFactory()))\n}\nval player =\n ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()\n```\n\n### Java\n\n```java\nExtractorsFactory mp4ExtractorFactory =\n () -\u003e new Extractor[] {new Mp4Extractor(new DefaultSubtitleParserFactory())};\nExoPlayer player =\n new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, mp4ExtractorFactory))\n .build();\n```\n\n\u003cbr /\u003e\n\nThis will allow other `Extractor` implementations to be removed by code\nshrinking, which can result in a significant reduction in size.\n\nIf your app is not playing progressive content at all, you should pass\n`ExtractorsFactory.EMPTY` to the `DefaultMediaSourceFactory` constructor, then\npass that `mediaSourceFactory` to the `ExoPlayer.Builder` constructor. \n\n### Kotlin\n\n```kotlin\nval player =\n ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)).build()\n```\n\n### Java\n\n```java\nExoPlayer player =\n new ExoPlayer.Builder(\n context, new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY))\n .build();\n```\n\n\u003cbr /\u003e\n\nCustom MediaSource instantiation\n--------------------------------\n\nIf your app is using a custom `MediaSource.Factory` and you want\n`DefaultMediaSourceFactory` to be removed by code stripping, you should pass\nyour `MediaSource.Factory` directly to the `ExoPlayer.Builder` constructor. \n\n### Kotlin\n\n```kotlin\nval player = ExoPlayer.Builder(context, customMediaSourceFactory).build()\n```\n\n### Java\n\n```java\nExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();\n```\n\n\u003cbr /\u003e\n\nIf your app is using `MediaSource` directly instead of `MediaItem` you should\npass `MediaSource.Factory.UNSUPPORTED` to the `ExoPlayer.Builder` constructor,\nto ensure `DefaultMediaSourceFactory` and `DefaultExtractorsFactory` can be\nstripped by code shrinking. \n\n### Kotlin\n\n```kotlin\nval player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build()\nval mediaSource =\n ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory)\n .createMediaSource(MediaItem.fromUri(uri))\n```\n\n### Java\n\n```java\nExoPlayer player = new ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build();\nProgressiveMediaSource mediaSource =\n new ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory)\n .createMediaSource(MediaItem.fromUri(uri));\n```\n\n\u003cbr /\u003e"]]