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

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

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

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

কোটলিন

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

গ্রোভি

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

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

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

কোড এবং রিসোর্স সঙ্কুচিত কীভাবে সক্ষম করবেন তা শিখতে আপনার অ্যাপ সঙ্কুচিত করুন, অস্পষ্ট করুন এবং অপ্টিমাইজ করুন

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

ডিফল্টরূপে, প্লেয়ারের রেন্ডারারগুলি 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 ব্যবহার করে তাহলে আপনাকে 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));