APK সাইজ কমানো

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

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

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

Kotlin

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

Kotlin

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 ExoPlayer লাইব্রেরিতে দেওয়া সব Extractor ইমপ্লিমেন্টেশনের উপর নির্ভর করে এবং এর ফলে কোড সঙ্কুচিত করার মাধ্যমে কোনওটিই সরিয়ে দেওয়া হবে না। আপনি যদি জানেন যে আপনার অ্যাপকে শুধুমাত্র কয়েকটি কন্টেনার ফর্ম্যাট চালাতে হবে অথবা প্রোগ্রেসিভ মিডিয়া একেবারেই চালাতে হবে না, তাহলে আপনি নিজের ExtractorsFactory নির্দিষ্ট করতে পারেন। যেমন, শুধুমাত্র mp4 ফাইল চালাতে হবে এমন কোনও অ্যাপ এই ধরনের ফ্যাক্টরি প্রদান করতে পারে:

Kotlin

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 পাস করতে হবে।

Kotlin

val player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY))
    .build()

জাভা

ExoPlayer player =
    new ExoPlayer.Builder(
            context, new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY))
        .build();

Custom MediaSource ইনস্ট্যানসিয়েশন

আপনার অ্যাপ কাস্টম MediaSource.Factory ব্যবহার করলে এবং আপনি কোড স্ট্রিপিংয়ের মাধ্যমে DefaultMediaSourceFactory সরাতে চাইলে, আপনাকে MediaSource.Factory সরাসরি ExoPlayer.Builder কনস্ট্রাক্টরে পাস করতে হবে।

Kotlin

val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()

জাভা

ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();

আপনার অ্যাপ MediaItem-এর পরিবর্তে MediaSource সরাসরি ব্যবহার করলে, আপনাকে ExoPlayer.Builder কনস্ট্রাক্টরে MediaSource.Factory.UNSUPPORTED পাস করতে হবে, যাতে কোড ছোট করার মাধ্যমে DefaultMediaSourceFactory ও DefaultExtractorsFactory-কে সরিয়ে দেওয়া যায়।

Kotlin

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));