APK সঙ্কুচিত হচ্ছে

একটি ভালো অ্যান্ড্রয়েড অ্যাপ তৈরির ক্ষেত্রে APK-এর আকার কমানো একটি গুরুত্বপূর্ণ দিক। উন্নয়নশীল বাজারগুলিকে লক্ষ্য করে এবং একটি অ্যান্ড্রয়েড ইনস্ট্যান্ট অ্যাপ তৈরি করার সময় এটি বিশেষভাবে সত্য। এই ধরনের ক্ষেত্রে, APK-তে অন্তর্ভুক্ত ExoPlayer লাইব্রেরির আকার কমানো বাঞ্ছনীয় হতে পারে। এই পৃষ্ঠায় কিছু সহজ পদক্ষেপের রূপরেখা দেওয়া হয়েছে যা এটি অর্জনে সাহায্য করতে পারে।

শুধুমাত্র প্রয়োজনীয় নির্ভরতা ব্যবহার করুন

আপনার আসলে যে লাইব্রেরি মডিউলগুলি প্রয়োজন তার উপর নির্ভর করুন। উদাহরণস্বরূপ, নিম্নলিখিতগুলি ExoPlayer, DASH এবং UI লাইব্রেরি মডিউলগুলির উপর নির্ভরতা যোগ করবে, যেমনটি শুধুমাত্র DASH কন্টেন্ট চালায় এমন একটি অ্যাপের জন্য প্রয়োজন হতে পারে:

কোটলিন

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

খাঁজকাটা

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

কোড এবং রিসোর্স সঙ্কুচিতকরণ সক্ষম করুন

আপনার অ্যাপের রিলিজ বিল্ডের জন্য কোড এবং রিসোর্স সঙ্কুচিতকরণ সক্ষম করা উচিত। এক্সোপ্লেয়ার এমনভাবে তৈরি করা হয়েছে যা কোড সঙ্কুচিতকরণকে কার্যকরভাবে অব্যবহৃত কার্যকারিতা অপসারণ করতে দেয়। উদাহরণস্বরূপ, DASH কন্টেন্ট চালায় এমন একটি অ্যাপের জন্য, কোড সঙ্কুচিতকরণ সক্ষম করে APK আকারে এক্সোপ্লেয়ারের অবদান প্রায় 40% কমানো যেতে পারে।

Read Shrink, obfuscate, and optimize your app to learn how to enable code and resource shrinking.

আপনার অ্যাপের কোন রেন্ডারারগুলির প্রয়োজন তা নির্দিষ্ট করুন

ডিফল্টরূপে, প্লেয়ারের রেন্ডারারগুলি DefaultRenderersFactory ব্যবহার করে তৈরি করা হবে। DefaultRenderersFactory ExoPlayer লাইব্রেরিতে প্রদত্ত সমস্ত Renderer বাস্তবায়নের উপর নির্ভর করে এবং ফলস্বরূপ কোড সঙ্কুচিত করে তাদের কোনওটিই সরানো হবে না। যদি আপনি জানেন যে আপনার অ্যাপের শুধুমাত্র রেন্ডারারের একটি উপসেট প্রয়োজন, তাহলে আপনি আপনার নিজস্ব 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();

This will allow other Renderer implementations to be removed by code shrinking. In this particular example video, text and metadata renderers are removed (which means any subtitles or in-stream metadata (eg ICY ) won't be processed or emitted by the player).

আপনার অ্যাপের কোন এক্সট্র্যাক্টর প্রয়োজন তা নির্দিষ্ট করুন।

ডিফল্টরূপে, প্লেয়ারটি DefaultExtractorsFactory ব্যবহার করে প্রগতিশীল মিডিয়া চালানোর জন্য Extractor ইনস্ট্যান্স তৈরি করে। DefaultExtractorsFactory ExoPlayer লাইব্রেরিতে প্রদত্ত সমস্ত Extractor বাস্তবায়নের উপর নির্ভর করে এবং ফলস্বরূপ কোড সঙ্কুচিত করে তাদের কোনওটিই সরানো হবে না। যদি আপনি জানেন যে আপনার অ্যাপটিকে কেবল অল্প সংখ্যক কন্টেইনার ফর্ম্যাট চালাতে হবে, অথবা একেবারেই প্রগতিশীল মিডিয়া চালাতে হবে না, তাহলে আপনি আপনার নিজস্ব 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();

This will allow other Extractor implementations to be removed by code shrinking, which can result in a significant reduction in size.

যদি আপনার অ্যাপটি প্রগতিশীল কন্টেন্ট একেবারেই চালাতে না পারে, তাহলে আপনার 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));