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"

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

আপনার অ্যাপের রিলিজ বিল্ডগুলোর জন্য কোড ও রিসোর্স সঙ্কুচিতকরণ (code and resource shrinking) চালু করা উচিত। ExoPlayer-এর গঠন এমনভাবে তৈরি করা হয়েছে, যা কোড সঙ্কুচিতকরণের মাধ্যমে অব্যবহৃত কার্যকারিতা কার্যকরভাবে অপসারণ করতে সাহায্য করে। উদাহরণস্বরূপ, যে অ্যাপ DASH কন্টেন্ট প্লে করে, সেটির ক্ষেত্রে কোড সঙ্কুচিতকরণ চালু করার মাধ্যমে APK ফাইলের আকারে ExoPlayer-এর অবদান প্রায় ৪০% কমানো যেতে পারে।

কোড এবং রিসোর্স সঙ্কুচিত করার পদ্ধতি জানতে "আপনার অ্যাপ সঙ্কুচিত করুন, অস্পষ্ট করুন এবং অপ্টিমাইজ করুন" পড়ুন।

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

ডিফল্টরূপে, প্লেয়ারের রেন্ডারারগুলো 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();

এর ফলে কোড সঙ্কুচিত করার মাধ্যমে অন্যান্য Renderer ইমপ্লিমেন্টেশনগুলো অপসারণ করা যাবে। এই নির্দিষ্ট উদাহরণ ভিডিওটিতে, টেক্সট এবং মেটাডেটা রেন্ডারারগুলো অপসারণ করা হয়েছে (যার অর্থ হলো, কোনো সাবটাইটেল বা ইন-স্ট্রিম মেটাডেটা (যেমন ICY ) প্লেয়ার দ্বারা প্রসেস বা নির্গত হবে না)।

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

ডিফল্টরূপে, প্লেয়ারটি 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();

এর ফলে কোড সঙ্কুচিত করার মাধ্যমে অন্যান্য Extractor ইমপ্লিমেন্টেশনগুলো অপসারণ করা যাবে, যার ফলে ফাইলের আকার উল্লেখযোগ্যভাবে হ্রাস পেতে পারে।

যদি আপনার অ্যাপটি মোটেও প্রগ্রেসিভ কন্টেন্ট প্লে না করে, তাহলে আপনাকে DefaultMediaSourceFactory কনস্ট্রাক্টরে ExtractorsFactory.EMPTY পাস করতে হবে এবং তারপর সেই 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 ব্যবহার করে, তাহলে ExoPlayer.Builder কনস্ট্রাক্টরে MediaSource.Factory.UNSUPPORTED পাস করা উচিত, যাতে কোড সঙ্কুচিত করার মাধ্যমে 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));