APK সম্প্রসারণ ফাইল

Google Play-এর জন্য ব্যবহারকারীদের ডাউনলোড করা সংকুচিত APK 100MB-এর বেশি না হওয়া প্রয়োজন। বেশিরভাগ অ্যাপ্লিকেশানের জন্য, এটি সমস্ত অ্যাপের কোড এবং সম্পদের জন্য প্রচুর স্থান। যাইহোক, কিছু অ্যাপের হাই-ফিডেলিটি গ্রাফিক্স, মিডিয়া ফাইল বা অন্যান্য বড় সম্পদের জন্য আরও জায়গা প্রয়োজন। পূর্বে, আপনার অ্যাপের সংকুচিত ডাউনলোডের আকার 100MB ছাড়িয়ে গেলে, ব্যবহারকারী অ্যাপটি খুললে আপনাকে অতিরিক্ত সংস্থানগুলি হোস্ট করতে এবং ডাউনলোড করতে হত। অতিরিক্ত ফাইলগুলি হোস্ট করা এবং পরিবেশন করা ব্যয়বহুল হতে পারে এবং ব্যবহারকারীর অভিজ্ঞতা প্রায়শই আদর্শের চেয়ে কম হয়। এই প্রক্রিয়াটিকে আপনার জন্য সহজ করতে এবং ব্যবহারকারীদের জন্য আরও আনন্দদায়ক করতে, Google Play আপনাকে দুটি বৃহৎ সম্প্রসারণ ফাইল সংযুক্ত করার অনুমতি দেয় যা আপনার APK এর পরিপূরক।

Google Play আপনার অ্যাপের সম্প্রসারণ ফাইলগুলিকে হোস্ট করে এবং সেগুলিকে আপনার কোনো খরচ ছাড়াই ডিভাইসে পরিবেশন করে৷ সম্প্রসারণ ফাইলগুলি ডিভাইসের শেয়ার্ড স্টোরেজ লোকেশনে (SD কার্ড বা USB-মাউন্টযোগ্য পার্টিশন; এটি "বাহ্যিক" স্টোরেজ নামেও পরিচিত) সংরক্ষণ করা হয় যেখানে আপনার অ্যাপ সেগুলি অ্যাক্সেস করতে পারে৷ বেশিরভাগ ডিভাইসে, Google Play APK ডাউনলোড করার সাথে সাথে এক্সপেনশন ফাইল(গুলি) ডাউনলোড করে, তাই ব্যবহারকারী যখন প্রথমবার এটি খোলে তখন আপনার অ্যাপে তার প্রয়োজনীয় সবকিছু থাকে। কিছু ক্ষেত্রে, যাইহোক, আপনার অ্যাপটি শুরু হলে Google Play থেকে ফাইলগুলি ডাউনলোড করতে হবে।

আপনি যদি এক্সপেনশন ফাইলগুলি ব্যবহার করা এড়াতে চান এবং আপনার অ্যাপের কম্প্রেসড ডাউনলোড সাইজ 100 MB-এর থেকে বড় হয়, তাহলে আপনার পরিবর্তে Android App Bundles ব্যবহার করে আপনার অ্যাপ আপলোড করা উচিত যা 200 MB পর্যন্ত কম্প্রেসড ডাউনলোড সাইজের অনুমতি দেয়৷ উপরন্তু, যেহেতু অ্যাপ বান্ডেল ব্যবহার করে APK তৈরি করা এবং Google Play-তে সাইন করা স্থগিত করা হয়, ব্যবহারকারীরা আপনার অ্যাপ চালানোর জন্য প্রয়োজনীয় কোড এবং রিসোর্স সহ অপ্টিমাইজ করা APK ডাউনলোড করে। আপনাকে একাধিক APK বা সম্প্রসারণ ফাইল তৈরি করতে, সাইন করতে এবং পরিচালনা করতে হবে না এবং ব্যবহারকারীরা ছোট, আরও অপ্টিমাইজ করা ডাউনলোডগুলি পান৷

ওভারভিউ

প্রতিবার আপনি Google Play Console ব্যবহার করে একটি APK আপলোড করার সময়, আপনার কাছে APK-এ এক বা দুটি সম্প্রসারণ ফাইল যোগ করার বিকল্প থাকে। প্রতিটি ফাইল 2GB পর্যন্ত হতে পারে এবং এটি আপনার চয়ন করা যেকোনো ফর্ম্যাট হতে পারে, তবে আমরা আপনাকে ডাউনলোডের সময় ব্যান্ডউইথ সংরক্ষণ করতে একটি সংকুচিত ফাইল ব্যবহার করার পরামর্শ দিই। ধারণাগতভাবে, প্রতিটি সম্প্রসারণ ফাইল একটি ভিন্ন ভূমিকা পালন করে:

  • আপনার অ্যাপের জন্য প্রয়োজনীয় অতিরিক্ত সংস্থানগুলির জন্য প্রধান সম্প্রসারণ ফাইল হল প্রাথমিক সম্প্রসারণ ফাইল।
  • প্যাচ সম্প্রসারণ ফাইলটি ঐচ্ছিক এবং প্রধান সম্প্রসারণ ফাইলের ছোট আপডেটের জন্য উদ্দিষ্ট।

যদিও আপনি আপনার ইচ্ছামত দুটি এক্সপেনশন ফাইল ব্যবহার করতে পারেন, আমরা সুপারিশ করি যে মূল সম্প্রসারণ ফাইলটি প্রাথমিক সম্পদ সরবরাহ করে এবং কখনো আপডেট করা হলে খুব কমই করা উচিত; প্যাচ সম্প্রসারণ ফাইলটি ছোট হওয়া উচিত এবং একটি "প্যাচ ক্যারিয়ার" হিসাবে পরিবেশন করা উচিত, প্রতিটি বড় রিলিজের সাথে বা প্রয়োজনীয় হিসাবে আপডেট করা।

যাইহোক, এমনকি যদি আপনার অ্যাপ আপডেটের জন্য শুধুমাত্র একটি নতুন প্যাচ সম্প্রসারণ ফাইলের প্রয়োজন হয়, তবুও আপনাকে ম্যানিফেস্টে একটি আপডেট versionCode সহ একটি নতুন APK আপলোড করতে হবে৷ (Play Console আপনাকে একটি বিদ্যমান APK এ একটি এক্সপেনশন ফাইল আপলোড করার অনুমতি দেয় না।)

দ্রষ্টব্য: প্যাচ সম্প্রসারণ ফাইলটি শব্দার্থগতভাবে প্রধান সম্প্রসারণ ফাইলের মতোই—আপনি আপনার ইচ্ছামত প্রতিটি ফাইল ব্যবহার করতে পারেন।

ফাইলের নামের বিন্যাস

আপনার আপলোড করা প্রতিটি সম্প্রসারণ ফাইল আপনার চয়ন করা যেকোনো বিন্যাস হতে পারে (ZIP, PDF, MP4, ইত্যাদি)। আপনি সেই সেটের জন্য রিসোর্স ফাইল এবং পরবর্তী প্যাচগুলির একটি সেট এনক্যাপসুলেট এবং এনক্রিপ্ট করতে JOBB টুল ব্যবহার করতে পারেন। ফাইলের ধরন নির্বিশেষে, Google Play এগুলিকে অস্বচ্ছ বাইনারি ব্লব হিসাবে বিবেচনা করে এবং নিম্নলিখিত স্কিম ব্যবহার করে ফাইলগুলির নাম পরিবর্তন করে:

[main|patch].<expansion-version>.<package-name>.obb

এই স্কিমের তিনটি উপাদান রয়েছে:

main বা patch
ফাইলটি প্রধান বা প্যাচ সম্প্রসারণ ফাইল কিনা তা নির্দিষ্ট করে। প্রতিটি APK এর জন্য শুধুমাত্র একটি প্রধান ফাইল এবং একটি প্যাচ ফাইল থাকতে পারে।
<expansion-version>
এটি একটি পূর্ণসংখ্যা যা APK এর সংস্করণ কোডের সাথে মেলে যার সাথে সম্প্রসারণটি প্রথমে যুক্ত (এটি অ্যাপের android:versionCode মানের সাথে মেলে)।

"প্রথম" এর উপর জোর দেওয়া হয়েছে কারণ যদিও প্লে কনসোল আপনাকে একটি নতুন APK এর সাথে আপলোড করা একটি এক্সপেনশন ফাইল পুনরায় ব্যবহার করার অনুমতি দেয়, তবে সম্প্রসারণ ফাইলের নাম পরিবর্তন হয় না—আপনি যখন ফাইলটি প্রথম আপলোড করেন তখন এটি এটিতে প্রয়োগ করা সংস্করণটিকে ধরে রাখে৷

<package-name>
আপনার অ্যাপের জাভা-স্টাইল প্যাকেজের নাম।

উদাহরণস্বরূপ, ধরুন আপনার APK সংস্করণটি 314159 এবং আপনার প্যাকেজের নাম com.example.app৷ আপনি যদি একটি প্রধান সম্প্রসারণ ফাইল আপলোড করেন, তাহলে ফাইলটির নাম পরিবর্তন করা হবে:

main.314159.com.example.app.obb

স্টোরেজ অবস্থান

যখন Google Play আপনার সম্প্রসারণ ফাইলগুলিকে একটি ডিভাইসে ডাউনলোড করে, তখন এটি সেগুলিকে সিস্টেমের শেয়ার করা স্টোরেজ অবস্থানে সংরক্ষণ করে৷ সঠিক আচরণ নিশ্চিত করার জন্য, আপনাকে অবশ্যই সম্প্রসারণ ফাইলগুলি মুছতে, সরাতে বা পুনঃনামকরণ করতে হবে না। ইভেন্টে যে আপনার অ্যাপটিকে অবশ্যই Google Play থেকে ডাউনলোড করতে হবে, আপনাকে অবশ্যই ফাইলগুলিকে একই স্থানে সংরক্ষণ করতে হবে।

getObbDir() পদ্ধতিটি নিম্নলিখিত আকারে আপনার সম্প্রসারণ ফাইলগুলির জন্য নির্দিষ্ট অবস্থান প্রদান করে:

<shared-storage>/Android/obb/<package-name>/
  • <shared-storage> হল শেয়ার্ড স্টোরেজ স্পেসের পথ, getExternalStorageDirectory() থেকে উপলব্ধ।
  • <package-name> হল আপনার অ্যাপের জাভা-স্টাইল প্যাকেজের নাম, getPackageName() থেকে পাওয়া যায়।

প্রতিটি অ্যাপের জন্য, এই ডিরেক্টরিতে দুটির বেশি সম্প্রসারণ ফাইল নেই৷ একটি প্রধান সম্প্রসারণ ফাইল এবং অন্যটি প্যাচ সম্প্রসারণ ফাইল (যদি প্রয়োজন হয়)। আপনি যখন নতুন এক্সপেনশন ফাইলগুলির সাথে আপনার অ্যাপ আপডেট করেন তখন পূর্ববর্তী সংস্করণগুলি ওভাররাইট হয়৷ যেহেতু অ্যান্ড্রয়েড 4.4 (API লেভেল 19), অ্যাপগুলি বহিরাগত স্টোরেজ অনুমতি ছাড়াই OBB সম্প্রসারণ ফাইলগুলি পড়তে পারে। যাইহোক, অ্যান্ড্রয়েড 6.0 (এপিআই স্তর 23) এবং পরবর্তীতে কিছু বাস্তবায়নের জন্য এখনও অনুমতি প্রয়োজন, তাই আপনাকে অ্যাপ ম্যানিফেস্টে READ_EXTERNAL_STORAGE অনুমতি ঘোষণা করতে হবে এবং রানটাইমে নিম্নরূপ অনুমতি চাইতে হবে:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

অ্যান্ড্রয়েড 6 এবং পরবর্তী সংস্করণের জন্য, রানটাইমে বাহ্যিক স্টোরেজ অনুমতির অনুরোধ করতে হবে। যাইহোক, অ্যান্ড্রয়েডের কিছু বাস্তবায়নের জন্য OBB ফাইলগুলি পড়ার অনুমতির প্রয়োজন হয় না। নিচের কোড স্নিপেটটি দেখায় কিভাবে এক্সটার্নাল স্টোরেজ পারমিশন চাওয়ার আগে রিড এক্সেস চেক করতে হয়:

কোটলিন

val obb = File(obb_filename)
var open_failed = false

try {
    BufferedReader(FileReader(obb)).also { br ->
        ReadObbFile(br)
    }
} catch (e: IOException) {
    open_failed = true
}

if (open_failed) {
    // request READ_EXTERNAL_STORAGE permission before reading OBB file
    ReadObbFileWithPermission()
}

জাভা

File obb = new File(obb_filename);
 boolean open_failed = false;

 try {
     BufferedReader br = new BufferedReader(new FileReader(obb));
     open_failed = false;
     ReadObbFile(br);
 } catch (IOException e) {
     open_failed = true;
 }

 if (open_failed) {
     // request READ_EXTERNAL_STORAGE permission before reading OBB file
     ReadObbFileWithPermission();
 }

আপনি যদি আপনার সম্প্রসারণ ফাইলগুলির বিষয়বস্তুগুলি আনপ্যাক করতে চান, তাহলে পরে OBB সম্প্রসারণ ফাইলগুলি মুছবেন না এবং একই ডিরেক্টরিতে আনপ্যাক করা ডেটা সংরক্ষণ করবেন নাgetExternalFilesDir() দ্বারা নির্দিষ্ট করা ডিরেক্টরিতে আপনার আনপ্যাক করা ফাইলগুলি সংরক্ষণ করা উচিত। যাইহোক, যদি সম্ভব হয়, আপনি যদি একটি এক্সপেনশন ফাইল ফরম্যাট ব্যবহার করেন যা আপনাকে ডেটা আনপ্যাক করার পরিবর্তে ফাইল থেকে সরাসরি পড়ার অনুমতি দেয় তাহলে এটি সর্বোত্তম। উদাহরণস্বরূপ, আমরা APK সম্প্রসারণ জিপ লাইব্রেরি নামে একটি লাইব্রেরি প্রকল্প প্রদান করেছি যা আপনার ডেটা সরাসরি ZIP ফাইল থেকে পড়ে।

সতর্কতা: APK ফাইলের বিপরীতে, শেয়ার্ড স্টোরেজে সংরক্ষিত যেকোনো ফাইল ব্যবহারকারী এবং অন্যান্য অ্যাপ পড়তে পারে।

টিপ: আপনি যদি মিডিয়া ফাইলগুলিকে একটি ZIP-এ প্যাকেজিং করে থাকেন, তাহলে আপনি আপনার ZIP আনপ্যাক না করে অফসেট এবং দৈর্ঘ্য নিয়ন্ত্রণ (যেমন MediaPlayer.setDataSource() এবং SoundPool.load() ) সহ ফাইলগুলিতে মিডিয়া প্লেব্যাক কলগুলি ব্যবহার করতে পারেন৷ এটি কাজ করার জন্য, জিপ প্যাকেজ তৈরি করার সময় আপনাকে মিডিয়া ফাইলগুলিতে অতিরিক্ত কম্প্রেশন করতে হবে না। উদাহরণস্বরূপ, zip টুল ব্যবহার করার সময়, ফাইলের প্রত্যয়গুলি নির্দিষ্ট করতে আপনার -n বিকল্পটি ব্যবহার করা উচিত যা সংকুচিত করা উচিত নয়:
zip -n .mp4;.ogg main_expansion media_files

ডাউনলোড প্রক্রিয়া

বেশিরভাগ সময়, Google Play আপনার এক্সপেনশন ফাইলগুলি ডাউনলোড করে এবং সংরক্ষণ করে একই সময়ে এটি ডিভাইসে APK ডাউনলোড করে। যাইহোক, কিছু ক্ষেত্রে Google Play সম্প্রসারণ ফাইলগুলি ডাউনলোড করতে পারে না বা ব্যবহারকারী পূর্বে ডাউনলোড করা সম্প্রসারণ ফাইলগুলি মুছে ফেলতে পারে৷ এই পরিস্থিতিগুলি পরিচালনা করার জন্য, Google Play দ্বারা প্রদত্ত একটি URL ব্যবহার করে আপনার অ্যাপটি মূল কার্যকলাপ শুরু হলে ফাইলগুলি নিজেই ডাউনলোড করতে সক্ষম হতে হবে৷

একটি উচ্চ স্তর থেকে ডাউনলোড প্রক্রিয়া এই মত দেখায়:

  1. ব্যবহারকারী Google Play থেকে আপনার অ্যাপ ইনস্টল করার জন্য নির্বাচন করে।
  2. যদি Google Play সম্প্রসারণ ফাইলগুলি ডাউনলোড করতে সক্ষম হয় (যা বেশিরভাগ ডিভাইসের ক্ষেত্রে হয়), তবে এটি সেগুলিকে APK সহ ডাউনলোড করে।

    যদি Google Play সম্প্রসারণ ফাইলগুলি ডাউনলোড করতে অক্ষম হয় তবে এটি শুধুমাত্র APK ডাউনলোড করে।

  3. ব্যবহারকারী যখন আপনার অ্যাপ চালু করেন, তখন আপনার অ্যাপটিকে অবশ্যই ডিভাইসে সম্প্রসারণ ফাইলগুলি ইতিমধ্যে সংরক্ষিত আছে কিনা তা পরীক্ষা করতে হবে।
    1. যদি হ্যাঁ, আপনার অ্যাপ্লিকেশন যেতে প্রস্তুত.
    2. যদি না হয়, আপনার অ্যাপটিকে অবশ্যই Google Play থেকে HTTP-এর মাধ্যমে সম্প্রসারণ ফাইল ডাউনলোড করতে হবে। আপনার অ্যাপটিকে অবশ্যই Google Play এর অ্যাপ লাইসেন্সিং পরিষেবা ব্যবহার করে Google Play ক্লায়েন্টের কাছে একটি অনুরোধ পাঠাতে হবে, যা প্রতিটি সম্প্রসারণ ফাইলের নাম, ফাইলের আকার এবং URL দিয়ে প্রতিক্রিয়া জানায়৷ এই তথ্যের সাহায্যে, আপনি ফাইলগুলি ডাউনলোড করুন এবং সঠিক স্টোরেজ অবস্থানে সংরক্ষণ করুন৷

সতর্কতা: আপনার অ্যাপ শুরু হওয়ার সময় ফাইলগুলি ইতিমধ্যে ডিভাইসে না থাকলে Google Play থেকে এক্সপেনশন ফাইলগুলি ডাউনলোড করার জন্য প্রয়োজনীয় কোডটি অন্তর্ভুক্ত করা গুরুত্বপূর্ণ। সম্প্রসারণ ফাইলগুলি ডাউনলোড করার বিষয়ে নিম্নলিখিত বিভাগে আলোচনা করা হয়েছে, আমরা আপনার জন্য একটি লাইব্রেরি উপলব্ধ করেছি যা এই প্রক্রিয়াটিকে ব্যাপকভাবে সহজ করে এবং আপনার কাছ থেকে ন্যূনতম পরিমাণ কোড সহ একটি পরিষেবা থেকে ডাউনলোড সম্পাদন করে৷

উন্নয়ন চেকলিস্ট

আপনার অ্যাপ্লিকেশানের সাথে সম্প্রসারণ ফাইলগুলি ব্যবহার করার জন্য আপনাকে যে কাজগুলি করতে হবে তার একটি সারাংশ এখানে রয়েছে:

  1. প্রথমে আপনার অ্যাপের সংকুচিত ডাউনলোডের আকার 100MB-এর বেশি হওয়া প্রয়োজন কিনা তা নির্ধারণ করুন৷ স্থান মূল্যবান এবং আপনার মোট ডাউনলোডের আকার যতটা সম্ভব ছোট রাখা উচিত। একাধিক স্ক্রীনের ঘনত্বের জন্য আপনার গ্রাফিক সম্পদের একাধিক সংস্করণ প্রদান করতে আপনার অ্যাপ যদি 100MB-এর বেশি ব্যবহার করে, তাহলে একাধিক APK প্রকাশ করার কথা বিবেচনা করুন যাতে প্রতিটি APK শুধুমাত্র সেই স্ক্রিনের জন্য প্রয়োজনীয় সম্পদ থাকে যা এটি লক্ষ্য করে। Google Play-তে প্রকাশ করার সময় সর্বোত্তম ফলাফলের জন্য, একটি Android App Bundle আপলোড করুন, যাতে আপনার অ্যাপের সমস্ত সংকলিত কোড এবং সংস্থান অন্তর্ভুক্ত থাকে, কিন্তু APK তৈরি করা এবং Google Play-তে সাইন করাকে পিছিয়ে দেয়৷
  2. আপনার APK থেকে কোন অ্যাপ সংস্থানগুলিকে আলাদা করতে হবে তা নির্ধারণ করুন এবং মূল সম্প্রসারণ ফাইল হিসাবে ব্যবহার করার জন্য একটি ফাইলে প্যাকেজ করুন৷

    সাধারণত, প্রধান সম্প্রসারণ ফাইলের আপডেটগুলি সম্পাদন করার সময় আপনার শুধুমাত্র দ্বিতীয় প্যাচ সম্প্রসারণ ফাইলটি ব্যবহার করা উচিত। যাইহোক, যদি আপনার সম্পদ মূল সম্প্রসারণ ফাইলের জন্য 2GB সীমা অতিক্রম করে, তাহলে আপনি আপনার বাকি সম্পদের জন্য প্যাচ ফাইল ব্যবহার করতে পারেন।

  3. আপনার অ্যাপটি এমনভাবে বিকাশ করুন যাতে এটি ডিভাইসের শেয়ার করা স্টোরেজ অবস্থানে আপনার সম্প্রসারণ ফাইল থেকে সংস্থানগুলি ব্যবহার করে৷

    মনে রাখবেন যে আপনি অবশ্যই সম্প্রসারণ ফাইলগুলি মুছবেন না, সরাতে পারবেন না বা পুনঃনামকরণ করবেন না৷

    যদি আপনার অ্যাপটি একটি নির্দিষ্ট বিন্যাসের দাবি না করে, তাহলে আমরা আপনাকে আপনার সম্প্রসারণ ফাইলগুলির জন্য ZIP ফাইল তৈরি করার পরামর্শ দিই, তারপর APK সম্প্রসারণ জিপ লাইব্রেরি ব্যবহার করে সেগুলি পড়ুন৷

  4. আপনার অ্যাপের প্রধান কার্যকলাপে যুক্তি যোগ করুন যা স্টার্ট-আপের সময় ডিভাইসে সম্প্রসারণ ফাইল আছে কিনা তা পরীক্ষা করে। ফাইলগুলি ডিভাইসে না থাকলে, এক্সপেনশন ফাইলগুলির জন্য URL অনুরোধ করতে Google Play-এর অ্যাপ লাইসেন্সিং পরিষেবা ব্যবহার করুন, তারপরে সেগুলি ডাউনলোড করুন এবং সংরক্ষণ করুন৷

    ডাউনলোডের সময় আপনাকে যে পরিমাণ কোড লিখতে হবে এবং একটি ভাল ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করতে হবে, আমরা আপনাকে ডাউনলোডার লাইব্রেরি ব্যবহার করার পরামর্শ দিই।

    আপনি যদি লাইব্রেরি ব্যবহার করার পরিবর্তে আপনার নিজস্ব ডাউনলোড পরিষেবা তৈরি করেন, তাহলে সচেতন থাকুন যে আপনাকে অবশ্যই সম্প্রসারণ ফাইলগুলির নাম পরিবর্তন করতে হবে না এবং সেগুলিকে সঠিক স্টোরেজ অবস্থানে সংরক্ষণ করতে হবে৷

একবার আপনি আপনার অ্যাপ ডেভেলপমেন্ট শেষ করলে, আপনার সম্প্রসারণ ফাইল পরীক্ষা করার নির্দেশিকা অনুসরণ করুন।

নিয়ম এবং সীমাবদ্ধতা

আপনি প্লে কনসোল ব্যবহার করে আপনার অ্যাপ আপলোড করার সময় APK সম্প্রসারণ ফাইল যোগ করা একটি বৈশিষ্ট্য উপলব্ধ। প্রথমবার আপনার অ্যাপ আপলোড করার সময় বা এক্সপেনশন ফাইল ব্যবহার করে এমন একটি অ্যাপ আপডেট করার সময়, আপনাকে অবশ্যই নিম্নলিখিত নিয়ম এবং সীমাবদ্ধতা সম্পর্কে সচেতন হতে হবে:

  1. প্রতিটি এক্সপেনশন ফাইল 2GB এর বেশি হতে পারে না।
  2. Google Play থেকে আপনার সম্প্রসারণ ফাইলগুলি ডাউনলোড করার জন্য, ব্যবহারকারীকে অবশ্যই Google Play থেকে আপনার অ্যাপটি অর্জন করতে হবে । অ্যাপটি অন্য উপায়ে ইনস্টল করা থাকলে Google Play আপনার সম্প্রসারণ ফাইলের URL প্রদান করবে না।
  3. আপনার অ্যাপ্লিকেশানের মধ্যে থেকে ডাউনলোড করার সময়, Google Play প্রতিটি ফাইলের জন্য যে URL প্রদান করে তা প্রতিটি ডাউনলোডের জন্য অনন্য এবং প্রত্যেকটি আপনার অ্যাপে দেওয়ার কিছুক্ষণ পরেই মেয়াদ শেষ হয়ে যায়।
  4. আপনি যদি একটি নতুন APK দিয়ে আপনার অ্যাপ আপডেট করেন বা একই অ্যাপের জন্য একাধিক APK আপলোড করেন, তাহলে আপনি পূর্ববর্তী APK-এর জন্য আপলোড করা সম্প্রসারণ ফাইল নির্বাচন করতে পারেন। সম্প্রসারণ ফাইলের নাম পরিবর্তন হয় না —এটি APK দ্বারা প্রাপ্ত সংস্করণটিকে ধরে রাখে যার সাথে ফাইলটি মূলত যুক্ত ছিল৷
  5. আপনি যদি বিভিন্ন ডিভাইসের জন্য বিভিন্ন সম্প্রসারণ ফাইল প্রদান করার জন্য একাধিক APK-এর সাথে সম্মিলিতভাবে সম্প্রসারণ ফাইল ব্যবহার করেন, তাহলেও একটি অনন্য versionCode মান প্রদান করতে এবং প্রতিটি APK-এর জন্য আলাদা ফিল্টার ঘোষণা করতে আপনাকে অবশ্যই প্রতিটি ডিভাইসের জন্য আলাদা APK আপলোড করতে হবে।
  6. আপনি একা এক্সপেনশন ফাইলগুলি পরিবর্তন করে আপনার অ্যাপে একটি আপডেট ইস্যু করতে পারবেন না- আপনার অ্যাপ আপডেট করতে আপনাকে অবশ্যই একটি নতুন APK আপলোড করতে হবে । যদি আপনার পরিবর্তনগুলি শুধুমাত্র আপনার সম্প্রসারণ ফাইলগুলির সম্পদগুলির জন্য উদ্বেগ প্রকাশ করে, আপনি কেবল versionCode (এবং সম্ভবত versionName ) পরিবর্তন করে আপনার APK আপডেট করতে পারেন।

  7. আপনার obb/ ডিরেক্টরিতে অন্যান্য ডেটা সংরক্ষণ করবেন না । যদি আপনাকে কিছু ডেটা আনপ্যাক করতে হয়, getExternalFilesDir() দ্বারা নির্দিষ্ট অবস্থানে এটি সংরক্ষণ করুন।
  8. .obb সম্প্রসারণ ফাইলটি মুছুন বা পুনঃনাম করবেন না (যদি না আপনি একটি আপডেট করছেন)। এটি করার ফলে Google Play (বা আপনার অ্যাপ নিজেই) বারবার এক্সপেনশন ফাইল ডাউনলোড করবে।
  9. একটি সম্প্রসারণ ফাইল ম্যানুয়ালি আপডেট করার সময়, আপনাকে অবশ্যই পূর্ববর্তী সম্প্রসারণ ফাইলটি মুছে ফেলতে হবে।

সম্প্রসারণ ফাইল ডাউনলোড করা হচ্ছে

বেশিরভাগ ক্ষেত্রে, Google Play আপনার এক্সপেনশন ফাইলগুলিকে ডিভাইসে ডাউনলোড করে এবং সংরক্ষণ করে একই সময়ে এটি APK ইনস্টল বা আপডেট করে। এইভাবে, যখন আপনার অ্যাপ প্রথমবার চালু হয় তখন সম্প্রসারণ ফাইলগুলি উপলব্ধ হয়৷ যাইহোক, কিছু কিছু ক্ষেত্রে আপনার অ্যাপকে অবশ্যই Google Play-এর অ্যাপ লাইসেন্সিং পরিষেবার প্রতিক্রিয়ায় আপনাকে দেওয়া URL থেকে অনুরোধ করে এক্সপেনশন ফাইলগুলি ডাউনলোড করতে হবে।

আপনার সম্প্রসারণ ফাইলগুলি ডাউনলোড করার জন্য আপনার যে মৌলিক যুক্তি প্রয়োজন তা হল:

  1. আপনার অ্যাপ শুরু হলে, শেয়ার করা স্টোরেজ অবস্থানে ( Android/obb/<package-name>/ ডিরেক্টরিতে) সম্প্রসারণ ফাইলগুলি খুঁজুন।
    1. যদি সম্প্রসারণ ফাইলগুলি সেখানে থাকে, আপনি সম্পূর্ণরূপে প্রস্তুত এবং আপনার অ্যাপ চালিয়ে যেতে পারে৷
    2. যদি সম্প্রসারণ ফাইল সেখানে না থাকে:
      1. আপনার অ্যাপের সম্প্রসারণ ফাইলের নাম, আকার এবং URL পেতে Google Play-এর অ্যাপ লাইসেন্সিং ব্যবহার করে একটি অনুরোধ করুন।
      2. সম্প্রসারণ ফাইলগুলি ডাউনলোড করতে এবং সম্প্রসারণ ফাইলগুলি সংরক্ষণ করতে Google Play দ্বারা প্রদত্ত URLগুলি ব্যবহার করুন৷ আপনাকে শেয়ার করা স্টোরেজ লোকেশনে ফাইলগুলি সেভ করতে হবে ( Android/obb/<package-name>/ ) এবং Google Play এর প্রতিক্রিয়া দ্বারা প্রদত্ত সঠিক ফাইলের নামটি ব্যবহার করতে হবে৷

        দ্রষ্টব্য: Google Play আপনার সম্প্রসারণ ফাইলগুলির জন্য যে URLটি প্রদান করে তা প্রতিটি ডাউনলোডের জন্য অনন্য এবং প্রত্যেকটি আপনার অ্যাপে দেওয়ার পরেই মেয়াদ শেষ হয়ে যায়৷

যদি আপনার অ্যাপটি বিনামূল্যে হয় (একটি অর্থপ্রদানের অ্যাপ নয়), তাহলে আপনি সম্ভবত অ্যাপ লাইসেন্সিং পরিষেবা ব্যবহার করেননি। এটি প্রাথমিকভাবে আপনার অ্যাপের জন্য লাইসেন্সিং নীতিগুলি প্রয়োগ করার জন্য এবং ব্যবহারকারীর আপনার অ্যাপ ব্যবহার করার অধিকার রয়েছে তা নিশ্চিত করার জন্য ডিজাইন করা হয়েছে (তিনি Google Play-তে এটির জন্য সঠিকভাবে অর্থ প্রদান করেছেন)। এক্সপেনশন ফাইলের কার্যকারিতা সহজতর করার জন্য, আপনার অ্যাপে একটি প্রতিক্রিয়া প্রদান করার জন্য লাইসেন্সিং পরিষেবা উন্নত করা হয়েছে যাতে Google Play-তে হোস্ট করা আপনার অ্যাপের সম্প্রসারণ ফাইলগুলির URL অন্তর্ভুক্ত থাকে। সুতরাং, আপনার অ্যাপ ব্যবহারকারীদের জন্য বিনামূল্যে হলেও, আপনাকে APK সম্প্রসারণ ফাইলগুলি ব্যবহার করার জন্য লাইসেন্স যাচাইকরণ লাইব্রেরি (LVL) অন্তর্ভুক্ত করতে হবে। অবশ্যই, যদি আপনার অ্যাপটি বিনামূল্যে হয়, তাহলে আপনাকে লাইসেন্স যাচাইকরণ প্রয়োগ করতে হবে না—আপনার সম্প্রসারণ ফাইলগুলির URL প্রদান করে এমন অনুরোধটি সম্পাদন করার জন্য আপনাকে কেবল লাইব্রেরির প্রয়োজন।

দ্রষ্টব্য: আপনার অ্যাপটি বিনামূল্যে হোক বা না হোক, ব্যবহারকারী Google Play থেকে আপনার অ্যাপটি অর্জন করলেই Google Play এক্সপেনশন ফাইলের ইউআরএল ফেরত দেয়।

LVL ছাড়াও, আপনার কোডের একটি সেট প্রয়োজন যা একটি HTTP সংযোগের মাধ্যমে সম্প্রসারণ ফাইলগুলি ডাউনলোড করে এবং ডিভাইসের ভাগ করা সঞ্চয়স্থানে সঠিক অবস্থানে সংরক্ষণ করে। আপনি যখন আপনার অ্যাপে এই পদ্ধতিটি তৈরি করেন, তখন বেশ কয়েকটি বিষয় আপনার বিবেচনায় নেওয়া উচিত:

  • ডিভাইসটিতে সম্প্রসারণ ফাইলগুলির জন্য পর্যাপ্ত স্থান নাও থাকতে পারে, তাই ডাউনলোড শুরু করার আগে আপনার পরীক্ষা করা উচিত এবং পর্যাপ্ত স্থান না থাকলে ব্যবহারকারীকে সতর্ক করা উচিত।
  • ব্যবহারকারীর ইন্টারঅ্যাকশন ব্লক করা এড়াতে এবং ডাউনলোড সম্পূর্ণ হওয়ার সময় ব্যবহারকারীকে আপনার অ্যাপ ছেড়ে যাওয়ার অনুমতি দেওয়ার জন্য একটি পটভূমি পরিষেবাতে ফাইল ডাউনলোড হওয়া উচিত।
  • অনুরোধ এবং ডাউনলোড করার সময় বিভিন্ন ধরনের ত্রুটি ঘটতে পারে যেগুলি আপনাকে অবশ্যই সুন্দরভাবে পরিচালনা করতে হবে।
  • ডাউনলোডের সময় নেটওয়ার্ক সংযোগ পরিবর্তন হতে পারে, তাই আপনার এই ধরনের পরিবর্তনগুলি পরিচালনা করা উচিত এবং যদি বাধা দেওয়া হয়, সম্ভব হলে ডাউনলোডটি পুনরায় শুরু করুন৷
  • পটভূমিতে ডাউনলোড হওয়ার সময়, আপনাকে একটি বিজ্ঞপ্তি প্রদান করা উচিত যা ডাউনলোডের অগ্রগতি নির্দেশ করে, এটি হয়ে গেলে ব্যবহারকারীকে অবহিত করে এবং নির্বাচিত হলে ব্যবহারকারীকে আপনার অ্যাপে ফিরিয়ে নিয়ে যায়।

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

আপনি যদি Google Play URL ব্যবহার করে সম্প্রসারণ ফাইলগুলি ডাউনলোড করার জন্য আপনার নিজস্ব সমাধান বিকাশ করতে চান, তাহলে আপনাকে অবশ্যই লাইসেন্সের অনুরোধ সম্পাদন করতে অ্যাপ লাইসেন্সিং ডকুমেন্টেশন অনুসরণ করতে হবে, তারপর প্রতিক্রিয়া অতিরিক্ত থেকে সম্প্রসারণ ফাইলের নাম, আকার এবং URLগুলি পুনরুদ্ধার করতে হবে৷ আপনার লাইসেন্সিং নীতি হিসাবে APKExpansionPolicy ক্লাস (লাইসেন্স যাচাইকরণ লাইব্রেরিতে অন্তর্ভুক্ত) ব্যবহার করা উচিত, যা লাইসেন্সিং পরিষেবা থেকে সম্প্রসারণ ফাইলের নাম, আকার এবং URL ক্যাপচার করে।

ডাউনলোডার লাইব্রেরি সম্পর্কে

আপনার অ্যাপের সাথে APK সম্প্রসারণ ফাইলগুলি ব্যবহার করতে এবং আপনার পক্ষ থেকে ন্যূনতম প্রচেষ্টায় সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে, আমরা আপনাকে Google Play APK সম্প্রসারণ লাইব্রেরি প্যাকেজে অন্তর্ভুক্ত ডাউনলোডার লাইব্রেরি ব্যবহার করার পরামর্শ দিই। এই লাইব্রেরিটি একটি ব্যাকগ্রাউন্ড পরিষেবাতে আপনার সম্প্রসারণ ফাইলগুলি ডাউনলোড করে, ডাউনলোড স্থিতি সহ একটি ব্যবহারকারীর বিজ্ঞপ্তি দেখায়, নেটওয়ার্ক সংযোগের ক্ষতি পরিচালনা করে, সম্ভব হলে ডাউনলোড পুনরায় শুরু করে এবং আরও অনেক কিছু।

ডাউনলোডার লাইব্রেরি ব্যবহার করে সম্প্রসারণ ফাইল ডাউনলোড বাস্তবায়ন করতে, আপনাকে যা করতে হবে তা হল:

  • একটি বিশেষ Service সাবক্লাস এবং BroadcastReceiver সাবক্লাস প্রসারিত করুন যেগুলির প্রত্যেকটির জন্য আপনার কাছ থেকে মাত্র কয়েকটি লাইনের কোড প্রয়োজন৷
  • আপনার প্রধান ক্রিয়াকলাপে কিছু যুক্তি যোগ করুন যা এক্সপেনশন ফাইলগুলি ইতিমধ্যে ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করে এবং যদি না হয় তবে ডাউনলোড প্রক্রিয়া শুরু করে এবং একটি অগ্রগতি UI প্রদর্শন করে।
  • আপনার প্রধান কার্যকলাপে কয়েকটি পদ্ধতি সহ একটি কলব্যাক ইন্টারফেস প্রয়োগ করুন যা ডাউনলোডের অগ্রগতি সম্পর্কে আপডেট পায়।

ডাউনলোডার লাইব্রেরি ব্যবহার করে কীভাবে আপনার অ্যাপ সেট আপ করবেন তা নিম্নলিখিত বিভাগগুলি ব্যাখ্যা করে৷

ডাউনলোডার লাইব্রেরি ব্যবহার করার জন্য প্রস্তুত হচ্ছে

ডাউনলোডার লাইব্রেরি ব্যবহার করতে, আপনাকে SDK ম্যানেজার থেকে দুটি প্যাকেজ ডাউনলোড করতে হবে এবং আপনার অ্যাপে উপযুক্ত লাইব্রেরি যোগ করতে হবে।

প্রথমে, অ্যান্ড্রয়েড SDK ম্যানেজার খুলুন ( টুলস > SDK ম্যানেজার ), এবং চেহারা এবং আচরণ > সিস্টেম সেটিংস > Android SDK এর অধীনে, নির্বাচন এবং ডাউনলোড করতে SDK টুলস ট্যাবটি নির্বাচন করুন:

  • গুগল প্লে লাইসেন্সিং লাইব্রেরি প্যাকেজ
  • Google Play APK সম্প্রসারণ লাইব্রেরি প্যাকেজ

লাইসেন্স যাচাইকরণ লাইব্রেরি এবং ডাউনলোডার লাইব্রেরির জন্য একটি নতুন লাইব্রেরি মডিউল তৈরি করুন৷ প্রতিটি লাইব্রেরির জন্য:

  1. ফাইল > নতুন > নতুন মডিউল নির্বাচন করুন।
  2. নতুন মডিউল তৈরি করুন উইন্ডোতে, অ্যান্ড্রয়েড লাইব্রেরি নির্বাচন করুন এবং তারপরে পরবর্তী নির্বাচন করুন।
  3. একটি অ্যাপ/লাইব্রেরির নাম উল্লেখ করুন যেমন "Google Play লাইসেন্স লাইব্রেরি" এবং "Google Play ডাউনলোডার লাইব্রেরি", ন্যূনতম SDK লেভেল বেছে নিন, তারপর Finish নির্বাচন করুন।
  4. ফাইল > প্রজেক্ট স্ট্রাকচার নির্বাচন করুন।
  5. বৈশিষ্ট্য ট্যাব নির্বাচন করুন এবং লাইব্রেরি সংগ্রহস্থলে , <sdk>/extras/google/ ডিরেক্টরি থেকে লাইব্রেরিতে প্রবেশ করুন ( লাইসেন্স যাচাইকরণ লাইব্রেরির জন্য play_licensing/ অথবা ডাউনলোডার লাইব্রেরির জন্য play_apk_expansion/downloader_library/ )।
  6. নতুন মডিউল তৈরি করতে ঠিক আছে নির্বাচন করুন।

দ্রষ্টব্য: ডাউনলোডার লাইব্রেরি লাইসেন্স যাচাইকরণ লাইব্রেরির উপর নির্ভর করে। ডাউনলোডার লাইব্রেরির প্রকল্প বৈশিষ্ট্যগুলিতে লাইসেন্স যাচাইকরণ লাইব্রেরি যোগ করতে ভুলবেন না।

অথবা, একটি কমান্ড লাইন থেকে, লাইব্রেরি অন্তর্ভুক্ত করতে আপনার প্রকল্প আপডেট করুন:

  1. <sdk>/tools/ ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করুন।
  2. আপনার প্রোজেক্টে LVL এবং ডাউনলোডার লাইব্রেরি উভয়ই যোগ করতে --library বিকল্পের সাথে android update project চালান। যেমন:
    android update project --path ~/Android/MyApp \
    --library ~/android_sdk/extras/google/market_licensing \
    --library ~/android_sdk/extras/google/market_apk_expansion/downloader_library
    

আপনার অ্যাপ্লিকেশানে লাইসেন্স যাচাইকরণ লাইব্রেরি এবং ডাউনলোডার লাইব্রেরি উভয়ই যোগ করা হলে, আপনি Google Play থেকে সম্প্রসারণ ফাইলগুলি ডাউনলোড করার ক্ষমতা দ্রুত সংহত করতে সক্ষম হবেন৷ সম্প্রসারণ ফাইলগুলির জন্য আপনি যে বিন্যাসটি চয়ন করেন এবং ভাগ করা সঞ্চয়স্থান থেকে আপনি কীভাবে সেগুলি পড়েন তা একটি পৃথক বাস্তবায়ন যা আপনার অ্যাপের প্রয়োজনের উপর ভিত্তি করে বিবেচনা করা উচিত।

টিপ: Apk সম্প্রসারণ প্যাকেজে একটি নমুনা অ্যাপ রয়েছে যা দেখায় কিভাবে একটি অ্যাপে ডাউনলোডার লাইব্রেরি ব্যবহার করতে হয়। নমুনাটি APK সম্প্রসারণ জিপ লাইব্রেরি নামক Apk সম্প্রসারণ প্যাকেজে উপলব্ধ একটি তৃতীয় লাইব্রেরি ব্যবহার করে। আপনি যদি আপনার সম্প্রসারণ ফাইলগুলির জন্য ZIP ফাইলগুলি ব্যবহার করার পরিকল্পনা করেন তবে আমরা আপনাকে আপনার অ্যাপে APK সম্প্রসারণ জিপ লাইব্রেরি যুক্ত করার পরামর্শ দিই৷ আরও তথ্যের জন্য, APK সম্প্রসারণ জিপ লাইব্রেরি ব্যবহার সম্পর্কে নীচের বিভাগটি দেখুন।

ব্যবহারকারীর অনুমতি ঘোষণা

সম্প্রসারণ ফাইলগুলি ডাউনলোড করার জন্য, ডাউনলোডার লাইব্রেরির বেশ কয়েকটি অনুমতির প্রয়োজন যা আপনাকে অবশ্যই আপনার অ্যাপের ম্যানিফেস্ট ফাইলে ঘোষণা করতে হবে৷ তারা হল:

<manifest ...>
    <!-- Required to access Google Play Licensing -->
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />

    <!-- Required to download files from Google Play -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- Required to keep CPU alive while downloading files
        (NOT to keep screen awake) -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required to poll the state of the network connection
        and respond to changes -->
    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- Required to check whether Wi-Fi is enabled -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <!-- Required to read and write the expansion files on shared storage -->
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

দ্রষ্টব্য: ডিফল্টরূপে, ডাউনলোডার লাইব্রেরির API স্তর 4 প্রয়োজন, কিন্তু APK সম্প্রসারণ জিপ লাইব্রেরির API স্তর 5 প্রয়োজন৷

ডাউনলোডার পরিষেবা বাস্তবায়ন করা হচ্ছে

পটভূমিতে ডাউনলোডগুলি সম্পাদন করার জন্য, ডাউনলোডার লাইব্রেরি DownloaderService নামক নিজস্ব Service সাবক্লাস সরবরাহ করে যা আপনার প্রসারিত করা উচিত। আপনার জন্য সম্প্রসারণ ফাইলগুলি ডাউনলোড করার পাশাপাশি, DownloaderService এছাড়াও:

  • একটি BroadcastReceiver রেজিস্টার করে যেটি ডিভাইসের নেটওয়ার্ক কানেক্টিভিটি ( CONNECTIVITY_ACTION সম্প্রচার) পরিবর্তনের জন্য শোনে যখন প্রয়োজনে ডাউনলোডটি বিরাম দিতে (যেমন কানেক্টিভিটি নষ্ট হওয়ার কারণে) এবং সম্ভব হলে ডাউনলোড পুনরায় শুরু করতে (সংযোগ অর্জিত হয়)।
  • একটি RTC_WAKEUP অ্যালার্ম শিডিউল করে যে ক্ষেত্রে পরিষেবাটি মারা যায় সেগুলির জন্য ডাউনলোডের পুনরায় চেষ্টা করার জন্য৷
  • একটি কাস্টম Notification তৈরি করে যা ডাউনলোডের অগ্রগতি এবং কোনো ত্রুটি বা অবস্থার পরিবর্তন প্রদর্শন করে।
  • আপনার অ্যাপকে ম্যানুয়ালি বিরতি দিতে এবং ডাউনলোড পুনরায় শুরু করার অনুমতি দেয়।
  • যাচাই করে যে ভাগ করা সঞ্চয়স্থানটি মাউন্ট করা হয়েছে এবং উপলব্ধ আছে, ফাইলগুলি ইতিমধ্যেই বিদ্যমান নেই, এবং পর্যাপ্ত স্থান রয়েছে, সবই সম্প্রসারণ ফাইলগুলি ডাউনলোড করার আগে৷ তারপর ব্যবহারকারীকে অবহিত করে যদি এর কোনটি সত্য না হয়।

আপনাকে যা করতে হবে তা হল আপনার অ্যাপে একটি ক্লাস তৈরি করুন যা DownloaderService ক্লাসকে প্রসারিত করে এবং নির্দিষ্ট অ্যাপের বিবরণ প্রদানের জন্য তিনটি পদ্ধতি ওভাররাইড করে:

getPublicKey()
এটিকে অবশ্যই একটি স্ট্রিং ফিরিয়ে দিতে হবে যা আপনার প্রকাশক অ্যাকাউন্টের জন্য বেস64-এনকোড করা RSA পাবলিক কী, Play Console-এর প্রোফাইল পৃষ্ঠা থেকে উপলব্ধ ( লাইসেন্সিংয়ের জন্য সেট আপ দেখুন)।
getSALT()
এটি অবশ্যই র্যান্ডম বাইটের একটি অ্যারে ফেরত দেবে যা লাইসেন্সিং Policy একটি Obfuscator তৈরি করতে ব্যবহার করে। লবণ নিশ্চিত করে যে আপনার অস্পষ্ট SharedPreferences ফাইল যেখানে আপনার লাইসেন্সিং ডেটা সংরক্ষণ করা হয়েছে তা অনন্য এবং অ-আবিষ্কারযোগ্য হবে।
getAlarmReceiverClassName()
এটি অবশ্যই আপনার অ্যাপে BroadcastReceiver এর ক্লাসের নামটি ফেরত দিতে হবে যেটি অ্যালার্মটি পাবে যা ইঙ্গিত করে যে ডাউনলোডটি পুনরায় চালু করা উচিত (যা হতে পারে যদি ডাউনলোডার পরিষেবাটি অপ্রত্যাশিতভাবে বন্ধ হয়ে যায়)।

উদাহরণস্বরূপ, এখানে DownloaderService একটি সম্পূর্ণ বাস্তবায়ন রয়েছে:

কোটলিন

// You must use the public key belonging to your publisher account
const val BASE64_PUBLIC_KEY = "YourLVLKey"
// You should also modify this salt
val SALT = byteArrayOf(
        1, 42, -12, -1, 54, 98, -100, -12, 43, 2,
        -8, -4, 9, 5, -106, -107, -33, 45, -1, 84
)

class SampleDownloaderService : DownloaderService() {

    override fun getPublicKey(): String = BASE64_PUBLIC_KEY

    override fun getSALT(): ByteArray = SALT

    override fun getAlarmReceiverClassName(): String = SampleAlarmReceiver::class.java.name
}

জাভা

public class SampleDownloaderService extends DownloaderService {
    // You must use the public key belonging to your publisher account
    public static final String BASE64_PUBLIC_KEY = "YourLVLKey";
    // You should also modify this salt
    public static final byte[] SALT = new byte[] { 1, 42, -12, -1, 54, 98,
            -100, -12, 43, 2, -8, -4, 9, 5, -106, -107, -33, 45, -1, 84
    };

    @Override
    public String getPublicKey() {
        return BASE64_PUBLIC_KEY;
    }

    @Override
    public byte[] getSALT() {
        return SALT;
    }

    @Override
    public String getAlarmReceiverClassName() {
        return SampleAlarmReceiver.class.getName();
    }
}

বিজ্ঞপ্তি: আপনার প্রকাশক অ্যাকাউন্টের অন্তর্গত সর্বজনীন কী হতে আপনাকে BASE64_PUBLIC_KEY মান আপডেট করতে হবে। আপনি আপনার প্রোফাইল তথ্যের অধীনে বিকাশকারী কনসোলে কীটি খুঁজে পেতে পারেন৷ আপনার ডাউনলোডগুলি পরীক্ষা করার সময়ও এটি প্রয়োজনীয়।

আপনার ম্যানিফেস্ট ফাইলে পরিষেবাটি ঘোষণা করতে মনে রাখবেন:

<app ...>
    <service android:name=".SampleDownloaderService" />
    ...
</app>

অ্যালার্ম রিসিভার বাস্তবায়ন

ফাইল ডাউনলোডের অগ্রগতি নিরীক্ষণ করার জন্য এবং প্রয়োজনে ডাউনলোড পুনরায় চালু করার জন্য, DownloaderService একটি RTC_WAKEUP অ্যালার্ম নির্ধারণ করে যা আপনার অ্যাপে একটি BroadcastReceiver কে একটি Intent প্রদান করে। ডাউনলোডার লাইব্রেরি থেকে একটি API কল করার জন্য আপনাকে অবশ্যই BroadcastReceiver সংজ্ঞায়িত করতে হবে যা ডাউনলোডের স্থিতি পরীক্ষা করে এবং প্রয়োজনে এটি পুনরায় চালু করে।

DownloaderClientMarshaller.startDownloadServiceIfRequired() কল করার জন্য আপনাকে কেবল onReceive() পদ্ধতিটি ওভাররাইড করতে হবে।

যেমন:

কোটলিন

class SampleAlarmReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        try {
            DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    context,
                    intent,
                    SampleDownloaderService::class.java
            )
        } catch (e: PackageManager.NameNotFoundException) {
            e.printStackTrace()
        }
    }
}

জাভা

public class SampleAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            DownloaderClientMarshaller.startDownloadServiceIfRequired(context,
                intent, SampleDownloaderService.class);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

লক্ষ্য করুন যে এটি সেই ক্লাস যার জন্য আপনাকে অবশ্যই আপনার পরিষেবার getAlarmReceiverClassName() পদ্ধতিতে নাম ফেরত দিতে হবে (আগের বিভাগটি দেখুন)।

আপনার ম্যানিফেস্ট ফাইলে রিসিভার ঘোষণা করতে মনে রাখবেন:

<app ...>
    <receiver android:name=".SampleAlarmReceiver" />
    ...
</app>

ডাউনলোড শুরু হচ্ছে

আপনার অ্যাপের প্রধান কার্যকলাপ (যেটি আপনার লঞ্চার আইকন দ্বারা শুরু হয়েছে) ডিভাইসে সম্প্রসারণ ফাইলগুলি ইতিমধ্যেই আছে কিনা তা যাচাই করার জন্য এবং সেগুলি না থাকলে ডাউনলোড শুরু করার জন্য দায়ী৷

ডাউনলোডার লাইব্রেরি ব্যবহার করে ডাউনলোড শুরু করার জন্য নিম্নলিখিত পদ্ধতিগুলি প্রয়োজন:

  1. ফাইলগুলি ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করুন।

    ডাউনলোডার লাইব্রেরিতে এই প্রক্রিয়ায় সাহায্য করার জন্য Helper শ্রেণীতে কিছু API অন্তর্ভুক্ত রয়েছে:

    • getExpansionAPKFileName(Context, c, boolean mainFile, int versionCode)
    • doesFileExist(Context c, String fileName, long fileSize)

    উদাহরণস্বরূপ, Apk সম্প্রসারণ প্যাকেজে প্রদত্ত নমুনা অ্যাপটি ডিভাইসে সম্প্রসারণ ফাইলগুলি ইতিমধ্যেই বিদ্যমান কিনা তা পরীক্ষা করার জন্য কার্যকলাপের onCreate() পদ্ধতিতে নিম্নলিখিত পদ্ধতিটিকে কল করে:

    কোটলিন

    fun expansionFilesDelivered(): Boolean {
        xAPKS.forEach { xf ->
            Helpers.getExpansionAPKFileName(this, xf.isBase, xf.fileVersion).also { fileName ->
                if (!Helpers.doesFileExist(this, fileName, xf.fileSize, false))
                    return false
            }
        }
        return true
    }
    

    জাভা

    boolean expansionFilesDelivered() {
        for (XAPKFile xf : xAPKS) {
            String fileName = Helpers.getExpansionAPKFileName(this, xf.isBase,
                xf.fileVersion);
            if (!Helpers.doesFileExist(this, fileName, xf.fileSize, false))
                return false;
        }
        return true;
    }
    

    এই ক্ষেত্রে, প্রতিটি XAPKFile অবজেক্ট একটি পরিচিত সম্প্রসারণ ফাইলের সংস্করণ নম্বর এবং ফাইলের আকার এবং একটি বুলিয়ান ধারণ করে যে এটি মূল সম্প্রসারণ ফাইল কিনা। (বিশদ বিবরণের জন্য নমুনা অ্যাপের SampleDownloaderActivity ক্লাস দেখুন।)

    যদি এই পদ্ধতি মিথ্যা ফেরত দেয়, তাহলে অ্যাপটি ডাউনলোড শুরু করতে হবে।

  2. স্ট্যাটিক পদ্ধতিতে কল করে ডাউনলোড শুরু করুন DownloaderClientMarshaller.startDownloadServiceIfRequired(Context c, PendingIntent notificationClient, Class<?> serviceClass)

    পদ্ধতিটি নিম্নলিখিত পরামিতিগুলি গ্রহণ করে:

    • context : আপনার অ্যাপের Context
    • notificationClient : আপনার প্রধান কার্যকলাপ শুরু করার জন্য একটি PendingIntent । এটি ডাউনলোডের অগ্রগতি দেখানোর জন্য DownloaderService তৈরি করা Notification ব্যবহৃত হয়। যখন ব্যবহারকারী বিজ্ঞপ্তি নির্বাচন করে, সিস্টেমটি এখানে আপনার সরবরাহ করা PendingIntent আহ্বান করে এবং ডাউনলোডের অগ্রগতি দেখায় এমন কার্যকলাপটি খুলতে হবে (সাধারণত একই কার্যকলাপ যা ডাউনলোড শুরু করেছিল)।
    • serviceClass : আপনার DownloaderService বাস্তবায়নের জন্য Class অবজেক্ট, প্রয়োজন হলে পরিষেবা শুরু করতে এবং ডাউনলোড শুরু করতে হবে।

    পদ্ধতিটি একটি পূর্ণসংখ্যা প্রদান করে যা নির্দেশ করে যে ডাউনলোডের প্রয়োজন আছে কিনা। সম্ভাব্য মান হল:

    • NO_DOWNLOAD_REQUIRED : ফাইলগুলি ইতিমধ্যেই বিদ্যমান থাকলে বা ডাউনলোড ইতিমধ্যেই চলমান থাকলে ফেরত দেওয়া হবে৷
    • LVL_CHECK_REQUIRED : সম্প্রসারণ ফাইল URL গুলি অর্জন করার জন্য লাইসেন্স যাচাইকরণের প্রয়োজন হলে ফেরত দেওয়া হয়৷
    • DOWNLOAD_REQUIRED : যদি সম্প্রসারণ ফাইলের URLগুলি ইতিমধ্যেই পরিচিত, কিন্তু ডাউনলোড না করা হয় তাহলে ফেরত দেওয়া হবে৷

    LVL_CHECK_REQUIRED এবং DOWNLOAD_REQUIRED এর আচরণ মূলত একই এবং আপনার সাধারণত সেগুলি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই৷ আপনার প্রধান কার্যকলাপ যা startDownloadServiceIfRequired() কে কল করে, আপনি কেবলমাত্র প্রতিক্রিয়াটি NO_DOWNLOAD_REQUIRED কিনা তা পরীক্ষা করতে পারেন। যদি প্রতিক্রিয়াটি NO_DOWNLOAD_REQUIRED ব্যতীত অন্য কিছু হয় তবে ডাউনলোডার লাইব্রেরি ডাউনলোড শুরু করে এবং ডাউনলোডের অগ্রগতি প্রদর্শন করতে আপনার কার্যকলাপ UI আপডেট করা উচিত (পরবর্তী ধাপটি দেখুন)। যদি প্রতিক্রিয়া NO_DOWNLOAD_REQUIRED হয় , তাহলে ফাইলগুলি উপলব্ধ এবং আপনার অ্যাপ শুরু হতে পারে৷

    যেমন:

    কোটলিন

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        // Check if expansion files are available before going any further
        if (!expansionFilesDelivered()) {
            val pendingIntent =
                    // Build an Intent to start this activity from the Notification
                    Intent(this, MainActivity::class.java).apply {
                        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
                    }.let { notifierIntent ->
                        PendingIntent.getActivity(
                                this,
                                0,
                                notifierIntent,
                                PendingIntent.FLAG_UPDATE_CURRENT
                        )
                    }
    
    
            // Start the download service (if required)
            val startResult: Int = DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    this,
                    pendingIntent,
                    SampleDownloaderService::class.java
            )
            // If download has started, initialize this activity to show
            // download progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // This is where you do set up to display the download
                // progress (next step)
                ...
                return
            } // If the download wasn't necessary, fall through to start the app
        }
        startApp() // Expansion files are available, start the app
    }
    

    জাভা

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // Check if expansion files are available before going any further
        if (!expansionFilesDelivered()) {
            // Build an Intent to start this activity from the Notification
            Intent notifierIntent = new Intent(this, MainActivity.getClass());
            notifierIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                                    Intent.FLAG_ACTIVITY_CLEAR_TOP);
            ...
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notifierIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            // Start the download service (if required)
            int startResult =
                DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
                            pendingIntent, SampleDownloaderService.class);
            // If download has started, initialize this activity to show
            // download progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // This is where you do set up to display the download
                // progress (next step)
                ...
                return;
            } // If the download wasn't necessary, fall through to start the app
        }
        startApp(); // Expansion files are available, start the app
    }
    
  3. যখন startDownloadServiceIfRequired() পদ্ধতিটি NO_DOWNLOAD_REQUIRED ছাড়া অন্য কিছু ফেরত দেয়, DownloaderClientMarshaller.CreateStub(IDownloaderClient client, Class<?> downloaderService) কল করে IStub এর একটি উদাহরণ তৈরি করুন। IStub ডাউনলোডার পরিষেবার সাথে আপনার কার্যকলাপের মধ্যে একটি বাঁধাই প্রদান করে যাতে আপনার কার্যকলাপ ডাউনলোডের অগ্রগতি সম্পর্কে কলব্যাক গ্রহণ করে।

    CreateStub() এ কল করে আপনার IStub ইনস্ট্যান্ট করার জন্য, আপনাকে অবশ্যই এটিকে IDownloaderClient ইন্টারফেসের বাস্তবায়ন এবং আপনার DownloaderService বাস্তবায়ন পাস করতে হবে। ডাউনলোডের অগ্রগতি প্রাপ্তির পরবর্তী বিভাগে IDownloaderClient ইন্টারফেস নিয়ে আলোচনা করা হয়েছে, যা সাধারণত আপনার Activity ক্লাসে প্রয়োগ করা উচিত যাতে ডাউনলোডের অবস্থা পরিবর্তন হলে আপনি কার্যকলাপ UI আপডেট করতে পারেন।

    startDownloadServiceIfRequired() ডাউনলোড শুরু করার পরে, আপনার কার্যকলাপের onCreate() পদ্ধতি চলাকালীন আপনার IStub চালু করতে আমরা আপনাকে CreateStub() কল করার পরামর্শ দিচ্ছি।

    উদাহরণ স্বরূপ, onCreate() এর পূর্ববর্তী কোড নমুনায়, আপনি startDownloadServiceIfRequired() ফলাফলের জন্য এইভাবে প্রতিক্রিয়া জানাতে পারেন:

    কোটলিন

            // Start the download service (if required)
            val startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    this@MainActivity,
                    pendingIntent,
                    SampleDownloaderService::class.java
            )
            // If download has started, initialize activity to show progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // Instantiate a member instance of IStub
                downloaderClientStub =
                        DownloaderClientMarshaller.CreateStub(this, SampleDownloaderService::class.java)
                // Inflate layout that shows download progress
                setContentView(R.layout.downloader_ui)
                return
            }
    

    জাভা

            // Start the download service (if required)
            int startResult =
                DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
                            pendingIntent, SampleDownloaderService.class);
            // If download has started, initialize activity to show progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // Instantiate a member instance of IStub
                downloaderClientStub = DownloaderClientMarshaller.CreateStub(this,
                        SampleDownloaderService.class);
                // Inflate layout that shows download progress
                setContentView(R.layout.downloader_ui);
                return;
            }
    

    onCreate() পদ্ধতিটি ফিরে আসার পরে, আপনার কার্যকলাপ onResume() এ একটি কল পায়, যেখানে আপনার IStubconnect() কল করা উচিত, এটি আপনার অ্যাপের Context পাস করে। বিপরীতভাবে, আপনার কার্যকলাপের onStop() কলব্যাকে আপনার disconnect() কল করা উচিত।

    কোটলিন

    override fun onResume() {
        downloaderClientStub?.connect(this)
        super.onResume()
    }
    
    override fun onStop() {
        downloaderClientStub?.disconnect(this)
        super.onStop()
    }
    

    জাভা

    @Override
    protected void onResume() {
        if (null != downloaderClientStub) {
            downloaderClientStub.connect(this);
        }
        super.onResume();
    }
    
    @Override
    protected void onStop() {
        if (null != downloaderClientStub) {
            downloaderClientStub.disconnect(this);
        }
        super.onStop();
    }
    

    IStubconnect() কল করা আপনার কার্যকলাপকে DownloaderService এর সাথে আবদ্ধ করে যাতে আপনার কার্যকলাপ IDownloaderClient ইন্টারফেসের মাধ্যমে ডাউনলোডের অবস্থার পরিবর্তন সংক্রান্ত কলব্যাক গ্রহণ করে।

ডাউনলোডের অগ্রগতি গ্রহণ করা হচ্ছে

ডাউনলোডের অগ্রগতি সম্পর্কিত আপডেট পেতে এবং DownloaderService সাথে ইন্টারঅ্যাক্ট করতে, আপনাকে অবশ্যই ডাউনলোডার লাইব্রেরির IDownloaderClient ইন্টারফেস প্রয়োগ করতে হবে। সাধারণত, ডাউনলোড শুরু করার জন্য আপনি যে কার্যকলাপটি ব্যবহার করেন তা ডাউনলোডের অগ্রগতি প্রদর্শন করতে এবং পরিষেবাতে অনুরোধ পাঠাতে এই ইন্টারফেসটি প্রয়োগ করা উচিত।

IDownloaderClient এর জন্য প্রয়োজনীয় ইন্টারফেস পদ্ধতিগুলি হল:

onServiceConnected(Messenger m)
আপনি আপনার কার্যকলাপে IStub ইনস্ট্যান্ট করার পরে, আপনি এই পদ্ধতিতে একটি কল পাবেন, যা আপনার DownloaderService এর উদাহরণের সাথে সংযুক্ত একটি Messenger অবজেক্ট পাস করে। পরিষেবাতে অনুরোধ পাঠাতে, যেমন ডাউনলোডগুলি থামানো এবং পুনরায় শুরু করার জন্য, পরিষেবার সাথে সংযুক্ত IDownloaderService ইন্টারফেস পেতে আপনাকে অবশ্যই DownloaderServiceMarshaller.CreateProxy() কল করতে হবে৷

একটি প্রস্তাবিত বাস্তবায়ন এই মত দেখায়:

কোটলিন

private var remoteService: IDownloaderService? = null
...

override fun onServiceConnected(m: Messenger) {
    remoteService = DownloaderServiceMarshaller.CreateProxy(m).apply {
        downloaderClientStub?.messenger?.also { messenger ->
            onClientUpdated(messenger)
        }
    }
}

জাভা

private IDownloaderService remoteService;
...

@Override
public void onServiceConnected(Messenger m) {
    remoteService = DownloaderServiceMarshaller.CreateProxy(m);
    remoteService.onClientUpdated(downloaderClientStub.getMessenger());
}

IDownloaderService অবজেক্ট আরম্ভ করার সাথে, আপনি ডাউনলোডার পরিষেবাতে কমান্ড পাঠাতে পারেন, যেমন ডাউনলোডকে বিরতি এবং পুনরায় শুরু করতে ( requestPauseDownload() এবং requestContinueDownload() )।

onDownloadStateChanged(int newState)
ডাউনলোড পরিষেবা এটিকে কল করে যখন ডাউনলোডের অবস্থার পরিবর্তন ঘটে, যেমন ডাউনলোড শুরু বা সম্পূর্ণ হয়।

newState মানটি IDownloaderClient ক্লাসের STATE_* ধ্রুবকগুলির মধ্যে একটি দ্বারা নির্দিষ্ট করা বেশ কয়েকটি সম্ভাব্য মানের একটি হবে৷

আপনার ব্যবহারকারীদের একটি দরকারী বার্তা প্রদান করতে, আপনি Helpers.getDownloaderStringResourceIDFromState() কল করে প্রতিটি রাজ্যের জন্য একটি সংশ্লিষ্ট স্ট্রিং অনুরোধ করতে পারেন। এটি ডাউনলোডার লাইব্রেরির সাথে বান্ডিল করা স্ট্রিংগুলির একটির জন্য রিসোর্স আইডি প্রদান করে। উদাহরণস্বরূপ, স্ট্রিং "ডাউনলোড পজ করা হয়েছে কারণ আপনি রোমিং করছেন" STATE_PAUSED_ROAMING এর সাথে মিলে যায়।

onDownloadProgress(DownloadProgressInfo progress)
ডাউনলোড পরিষেবা এটিকে একটি DownloadProgressInfo অবজেক্ট সরবরাহ করার জন্য কল করে, যা ডাউনলোডের অগ্রগতি সম্পর্কে বিভিন্ন তথ্য বর্ণনা করে, যার মধ্যে আনুমানিক বাকি সময়, বর্তমান গতি, সামগ্রিক অগ্রগতি এবং মোট রয়েছে যাতে আপনি ডাউনলোডের অগ্রগতি UI আপডেট করতে পারেন।

টিপ: এই কলব্যাকের উদাহরণগুলির জন্য যা ডাউনলোড অগ্রগতি UI আপডেট করে, Apk সম্প্রসারণ প্যাকেজের সাথে প্রদত্ত নমুনা অ্যাপে SampleDownloaderActivity দেখুন৷

IDownloaderService ইন্টারফেসের জন্য কিছু পাবলিক পদ্ধতি যা আপনার কাজে লাগতে পারে:

requestPauseDownload()
ডাউনলোড বিরতি দেয়।
requestContinueDownload()
একটি বিরতি দেওয়া ডাউনলোড পুনরায় শুরু করে৷
setDownloadFlags(int flags)
নেটওয়ার্ক প্রকারের জন্য ব্যবহারকারীর পছন্দগুলি সেট করে যার উপর ফাইলগুলি ডাউনলোড করা ঠিক আছে৷ বর্তমান বাস্তবায়ন একটি পতাকা সমর্থন করে, FLAGS_DOWNLOAD_OVER_CELLULAR , কিন্তু আপনি অন্যদের যোগ করতে পারেন৷ ডিফল্টরূপে, এই পতাকাটি সক্ষম নয় , তাই ব্যবহারকারীকে অবশ্যই সম্প্রসারণ ফাইলগুলি ডাউনলোড করতে Wi-Fi-এ থাকতে হবে৷ সেলুলার নেটওয়ার্কে ডাউনলোডগুলি সক্ষম করতে আপনি একটি ব্যবহারকারীর পছন্দ প্রদান করতে চাইতে পারেন৷ যে ক্ষেত্রে, আপনি কল করতে পারেন:

কোটলিন

remoteService = DownloaderServiceMarshaller.CreateProxy(m).apply {
    ...
    setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR)
}

জাভা

remoteService
    .setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR);

APKExpansionPolicy ব্যবহার করে

আপনি যদি Google Play ডাউনলোডার লাইব্রেরি ব্যবহার করার পরিবর্তে আপনার নিজস্ব ডাউনলোডার পরিষেবা তৈরি করার সিদ্ধান্ত নেন, তাহলে আপনার এখনও লাইসেন্স যাচাইকরণ লাইব্রেরিতে দেওয়া APKExpansionPolicy ব্যবহার করা উচিত। APKExpansionPolicy ক্লাসটি প্রায় ServerManagedPolicy (Google Play লাইসেন্স যাচাইকরণ লাইব্রেরিতে উপলব্ধ) অনুরূপ কিন্তু APK সম্প্রসারণ ফাইল প্রতিক্রিয়া অতিরিক্তগুলির জন্য অতিরিক্ত হ্যান্ডলিং অন্তর্ভুক্ত৷

দ্রষ্টব্য: আপনি যদি পূর্ববর্তী বিভাগে আলোচনা করা ডাউনলোডার লাইব্রেরি ব্যবহার করেন , তাহলে লাইব্রেরিটি APKExpansionPolicy এর সাথে সমস্ত মিথস্ক্রিয়া সম্পাদন করে যাতে আপনাকে সরাসরি এই ক্লাসটি ব্যবহার করতে হবে না।

উপলব্ধ সম্প্রসারণ ফাইলগুলি সম্পর্কে প্রয়োজনীয় তথ্য পেতে আপনাকে সাহায্য করার পদ্ধতিগুলি ক্লাসে রয়েছে:

  • getExpansionURLCount()
  • getExpansionURL(int index)
  • getExpansionFileName(int index)
  • getExpansionFileSize(int index)

আপনি যখন ডাউনলোডার লাইব্রেরি ব্যবহার করছেন না তখন কিভাবে APKExpansionPolicy ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, আপনার অ্যাপে লাইসেন্সিং যোগ করার ডকুমেন্টেশন দেখুন, যেটি ব্যাখ্যা করে যে এই ধরনের লাইসেন্স নীতি কীভাবে বাস্তবায়ন করা যায়।

সম্প্রসারণ ফাইলটি পড়া

আপনার এপিকে সম্প্রসারণ ফাইলগুলি ডিভাইসে সংরক্ষণ করা হয়ে গেলে, আপনি কীভাবে আপনার ফাইলগুলি পড়েন তা আপনি যে ফাইলটি ব্যবহার করেছেন তার ধরণের উপর নির্ভর করে। ওভারভিউতে আলোচিত হিসাবে, আপনার সম্প্রসারণ ফাইলগুলি আপনার পছন্দসই কোনও ফাইল হতে পারে তবে একটি নির্দিষ্ট ফাইলের নাম ফর্ম্যাট ব্যবহার করে নামকরণ করা হয় এবং <shared-storage>/Android/obb/<package-name>/ এ সংরক্ষণ করা হয়।

আপনি কীভাবে আপনার ফাইলগুলি পড়েন তা নির্বিশেষে, আপনার সর্বদা প্রথমে পরীক্ষা করা উচিত যে বাহ্যিক স্টোরেজটি পড়ার জন্য উপলব্ধ। এমন একটি সুযোগ রয়েছে যে ব্যবহারকারীর স্টোরেজটি ইউএসবি -র মাধ্যমে একটি কম্পিউটারে লাগানো হয়েছে বা এসডি কার্ডটি সরিয়ে ফেলেছে।

দ্রষ্টব্য: যখন আপনার অ্যাপ্লিকেশনটি শুরু হয়, আপনার সর্বদা পরীক্ষা করা উচিত যে বাহ্যিক স্টোরেজ স্পেসটি getExternalStorageState() কল করে কল করে পঠনযোগ্য কিনা। এটি বেশ কয়েকটি সম্ভাব্য স্ট্রিংগুলির মধ্যে একটি দেয় যা বাহ্যিক স্টোরেজের অবস্থার প্রতিনিধিত্ব করে। এটি আপনার অ্যাপ্লিকেশন দ্বারা পঠনযোগ্য হওয়ার জন্য, রিটার্ন মানটি অবশ্যই MEDIA_MOUNTED করা উচিত।

ফাইলের নাম পাওয়া

ওভারভিউতে বর্ণিত হিসাবে, আপনার এপিকে সম্প্রসারণ ফাইলগুলি একটি নির্দিষ্ট ফাইলের নাম ফর্ম্যাট ব্যবহার করে সংরক্ষণ করা হয়:

[main|patch].<expansion-version>.<package-name>.obb

আপনার সম্প্রসারণ ফাইলগুলির অবস্থান এবং নামগুলি পেতে, আপনার ফাইলগুলির পথ তৈরির জন্য আপনার getExternalStorageDirectory() এবং getPackageName() পদ্ধতিগুলি ব্যবহার করা উচিত।

আপনার এক্সপেনশন উভয় ফাইলের সম্পূর্ণ পথ সম্বলিত একটি অ্যারে পেতে আপনি আপনার অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারেন এমন একটি পদ্ধতি এখানে:

কোটলিন

fun getAPKExpansionFiles(ctx: Context, mainVersion: Int, patchVersion: Int): Array<String> {
    val packageName = ctx.packageName
    val ret = mutableListOf<String>()
    if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
        // Build the full path to the app's expansion files
        val root = Environment.getExternalStorageDirectory()
        val expPath = File(root.toString() + EXP_PATH + packageName)

        // Check that expansion file path exists
        if (expPath.exists()) {
            if (mainVersion > 0) {
                val strMainPath = "$expPath${File.separator}main.$mainVersion.$packageName.obb"
                val main = File(strMainPath)
                if (main.isFile) {
                    ret += strMainPath
                }
            }
            if (patchVersion > 0) {
                val strPatchPath = "$expPath${File.separator}patch.$mainVersion.$packageName.obb"
                val main = File(strPatchPath)
                if (main.isFile) {
                    ret += strPatchPath
                }
            }
        }
    }
    return ret.toTypedArray()
}

জাভা

// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";

static String[] getAPKExpansionFiles(Context ctx, int mainVersion,
      int patchVersion) {
    String packageName = ctx.getPackageName();
    Vector<String> ret = new Vector<String>();
    if (Environment.getExternalStorageState()
          .equals(Environment.MEDIA_MOUNTED)) {
        // Build the full path to the app's expansion files
        File root = Environment.getExternalStorageDirectory();
        File expPath = new File(root.toString() + EXP_PATH + packageName);

        // Check that expansion file path exists
        if (expPath.exists()) {
            if ( mainVersion > 0 ) {
                String strMainPath = expPath + File.separator + "main." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strMainPath);
                if ( main.isFile() ) {
                        ret.add(strMainPath);
                }
            }
            if ( patchVersion > 0 ) {
                String strPatchPath = expPath + File.separator + "patch." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strPatchPath);
                if ( main.isFile() ) {
                        ret.add(strPatchPath);
                }
            }
        }
    }
    String[] retArray = new String[ret.size()];
    ret.toArray(retArray);
    return retArray;
}

আপনি এই পদ্ধতিটি আপনার অ্যাপ্লিকেশন Context এবং কাঙ্ক্ষিত সম্প্রসারণ ফাইলের সংস্করণটি পাস করে কল করতে পারেন।

আপনি এক্সপেনশন ফাইল সংস্করণ নম্বর নির্ধারণ করতে পারেন এমন অনেকগুলি উপায় রয়েছে। একটি সহজ উপায় হ'ল ডাউনলোড শুরু হওয়ার সাথে সাথে একটি SharedPreferences ফাইলে সংস্করণটি সংরক্ষণ করা, APKExpansionPolicy ক্লাসের getExpansionFileName(int index) পদ্ধতির সাথে সম্প্রসারণ ফাইলের নামটি জিজ্ঞাসা করে। তারপরে আপনি যখন এক্সপেনশন ফাইলটি অ্যাক্সেস করতে চান তখন আপনি SharedPreferences ফাইলটি পড়ে সংস্করণ কোডটি পেতে পারেন।

ভাগ করা স্টোরেজ থেকে পড়া সম্পর্কে আরও তথ্যের জন্য, ডেটা স্টোরেজ ডকুমেন্টেশন দেখুন।

এপিকে এক্সপেনশন জিপ লাইব্রেরি ব্যবহার করে

গুগল মার্কেট এপিকে এক্সপেনশন প্যাকেজে এপিকে এক্সপেনশন জিপ লাইব্রেরি ( <sdk>/extras/google/google_market_apk_expansion/zip_file/ ) এ অবস্থিত একটি লাইব্রেরি অন্তর্ভুক্ত রয়েছে। এটি একটি al চ্ছিক গ্রন্থাগার যা জিপ ফাইল হিসাবে সংরক্ষণ করা হলে আপনার সম্প্রসারণ ফাইলগুলি পড়তে সহায়তা করে। এই লাইব্রেরিটি ব্যবহার করা আপনাকে ভার্চুয়াল ফাইল সিস্টেম হিসাবে আপনার জিপ সম্প্রসারণ ফাইলগুলি থেকে সহজেই সংস্থানগুলি পড়তে দেয়।

এপিকে এক্সপেনশন জিপ লাইব্রেরিতে নিম্নলিখিত ক্লাস এবং এপিআই অন্তর্ভুক্ত রয়েছে:

APKExpansionSupport
সম্প্রসারণ ফাইলের নাম এবং জিপ ফাইলগুলি অ্যাক্সেস করার জন্য কিছু পদ্ধতি সরবরাহ করে:
getAPKExpansionFiles()
উপরে প্রদর্শিত একই পদ্ধতি যা উভয় সম্প্রসারণ ফাইলগুলিতে সম্পূর্ণ ফাইলের পথটি ফেরত দেয়।
getAPKExpansionZipFile(Context ctx, int mainVersion, int patchVersion)
মূল ফাইল এবং প্যাচ ফাইল উভয়ের যোগফলের প্রতিনিধিত্ব করে একটি ZipResourceFile প্রদান করে। এটি হ'ল, আপনি যদি mainVersion এবং patchVersion উভয়ই নির্দিষ্ট করে থাকেন তবে এটি একটি ZipResourceFile ফেরত দেয় যা প্যাচ ফাইলের ডেটা মূল ফাইলের শীর্ষে একীভূত করে সমস্ত ডেটাতে পঠন অ্যাক্সেস সরবরাহ করে।
ZipResourceFile
ভাগ করা স্টোরেজে একটি জিপ ফাইল উপস্থাপন করে এবং আপনার জিপ ফাইলগুলির উপর ভিত্তি করে ভার্চুয়াল ফাইল সিস্টেম সরবরাহ করতে সমস্ত কাজ সম্পাদন করে। আপনি APKExpansionSupport.getAPKExpansionZipFile() বা ZipResourceFile এটি আপনার সম্প্রসারণ ফাইলের পথটি পাস করে ব্যবহার করে একটি উদাহরণ পেতে পারেন। এই শ্রেণিতে বিভিন্ন ধরণের দরকারী পদ্ধতি অন্তর্ভুক্ত রয়েছে তবে আপনার সাধারণত তাদের বেশিরভাগ অ্যাক্সেস করার দরকার নেই। কয়েকটি গুরুত্বপূর্ণ পদ্ধতি হ'ল:
getInputStream(String assetPath)
জিপ ফাইলের মধ্যে একটি ফাইল পড়তে একটি InputStream সরবরাহ করে। assetPath অবশ্যই জিপ ফাইলের সামগ্রীর মূলের তুলনায় কাঙ্ক্ষিত ফাইলের পথ হতে হবে।
getAssetFileDescriptor(String assetPath)
জিপ ফাইলের মধ্যে কোনও ফাইলের জন্য একটি AssetFileDescriptor সরবরাহ করে। assetPath অবশ্যই জিপ ফাইলের সামগ্রীর মূলের তুলনায় কাঙ্ক্ষিত ফাইলের পথ হতে হবে। এটি নির্দিষ্ট অ্যান্ড্রয়েড এপিআইগুলির জন্য দরকারী যার জন্য একটি AssetFileDescriptor প্রয়োজন, যেমন কিছু MediaPlayer এপিআই।
APEZProvider
বেশিরভাগ অ্যাপ্লিকেশনগুলিকে এই ক্লাসটি ব্যবহার করার দরকার নেই। এই শ্রেণিটি এমন একটি ContentProvider সংজ্ঞায়িত করে যা একটি সামগ্রী সরবরাহকারী Uri মাধ্যমে জিপ ফাইলগুলি থেকে ডেটা মার্শাল করে যাতে মিডিয়া ফাইলগুলিতে Uri অ্যাক্সেসের প্রত্যাশা করে এমন কিছু অ্যান্ড্রয়েড এপিআইয়ের জন্য ফাইল অ্যাক্সেস সরবরাহ করতে পারে। উদাহরণস্বরূপ, আপনি যদি VideoView.setVideoURI() এর সাথে কোনও ভিডিও খেলতে চান তবে এটি দরকারী।

মিডিয়া ফাইলগুলির জিপ সংক্ষেপণ এড়িয়ে যাওয়া

আপনি যদি মিডিয়া ফাইলগুলি সঞ্চয় করতে আপনার এক্সপেনশন ফাইলগুলি ব্যবহার করছেন তবে একটি জিপ ফাইল এখনও আপনাকে অ্যান্ড্রয়েড মিডিয়া প্লেব্যাক কলগুলি ব্যবহার করতে দেয় যা অফসেট এবং দৈর্ঘ্য নিয়ন্ত্রণ সরবরাহ করে (যেমন MediaPlayer.setDataSource() এবং SoundPool.load() )। এটি কাজ করার জন্য, জিপ প্যাকেজগুলি তৈরি করার সময় আপনাকে অবশ্যই মিডিয়া ফাইলগুলিতে অতিরিক্ত সংক্ষেপণ করতে হবে না। উদাহরণস্বরূপ, zip সরঞ্জামটি ব্যবহার করার সময়, আপনার ফাইলের প্রত্যয়গুলি নির্দিষ্ট করার জন্য -n বিকল্পটি ব্যবহার করা উচিত যা সংকুচিত হওয়া উচিত নয়:

zip -n .mp4;.ogg main_expansion media_files

একটি জিপ ফাইল থেকে পড়া

এপিকে এক্সপেনশন জিপ লাইব্রেরি ব্যবহার করার সময়, আপনার জিপ থেকে একটি ফাইল পড়ার জন্য সাধারণত নিম্নলিখিতগুলির প্রয়োজন হয়:

কোটলিন

// Get a ZipResourceFile representing a merger of both the main and patch files
val expansionFile =
        APKExpansionSupport.getAPKExpansionZipFile(appContext, mainVersion, patchVersion)

// Get an input stream for a known file inside the expansion file ZIPs
expansionFile.getInputStream(pathToFileInsideZip).use {
    ...
}

জাভা

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile =
    APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

উপরের কোডটি উভয় ফাইল থেকে সমস্ত ফাইলের মার্জ করা মানচিত্র থেকে পড়ে আপনার প্রধান সম্প্রসারণ ফাইল বা প্যাচ সম্প্রসারণ ফাইলের মধ্যে বিদ্যমান যে কোনও ফাইলের অ্যাক্সেস সরবরাহ করে। আপনাকে getAPKExpansionFile() পদ্ধতিটি সরবরাহ করতে হবে আপনার অ্যাপ্লিকেশনটি হ'ল আপনার অ্যাপ্লিকেশন android.content.Context এবং মূল সম্প্রসারণ ফাইল এবং প্যাচ সম্প্রসারণ ফাইল উভয়ের জন্য সংস্করণ নম্বর।

আপনি যদি কোনও নির্দিষ্ট সম্প্রসারণ ফাইল থেকে পড়তে চান তবে আপনি পছন্দসই সম্প্রসারণ ফাইলের পথ সহ ZipResourceFile কনস্ট্রাক্টর ব্যবহার করতে পারেন:

কোটলিন

// Get a ZipResourceFile representing a specific expansion file
val expansionFile = ZipResourceFile(filePathToMyZip)

// Get an input stream for a known file inside the expansion file ZIPs
expansionFile.getInputStream(pathToFileInsideZip).use {
    ...
}

জাভা

// Get a ZipResourceFile representing a specific expansion file
ZipResourceFile expansionFile = new ZipResourceFile(filePathToMyZip);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

আপনার সম্প্রসারণ ফাইলগুলির জন্য এই গ্রন্থাগারটি ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, নমুনা অ্যাপের SampleDownloaderActivity ক্লাসটি দেখুন, যাতে সিআরসি ব্যবহার করে ডাউনলোড করা ফাইলগুলি যাচাই করতে অতিরিক্ত কোড অন্তর্ভুক্ত রয়েছে। সাবধান থাকুন যে আপনি যদি এই নমুনাটিকে নিজের বাস্তবায়নের ভিত্তি হিসাবে ব্যবহার করেন তবে এটির জন্য আপনার xAPKS অ্যারেতে আপনার সম্প্রসারণ ফাইলগুলির বাইট আকারটি ঘোষণা করা দরকার।

আপনার সম্প্রসারণ ফাইলগুলি পরীক্ষা করা হচ্ছে

আপনার অ্যাপ্লিকেশন প্রকাশের আগে আপনার দুটি জিনিস পরীক্ষা করা উচিত: এক্সপেনশন ফাইলগুলি পড়া এবং ফাইলগুলি ডাউনলোড করা।

পরীক্ষা ফাইল পঠন

আপনি গুগল প্লেতে আপনার অ্যাপটি আপলোড করার আগে আপনার ভাগ করা স্টোরেজ থেকে ফাইলগুলি পড়ার আপনার অ্যাপ্লিকেশনটির দক্ষতা পরীক্ষা করা উচিত। আপনাকে যা করতে হবে তা হ'ল ডিভাইস ভাগ করা স্টোরেজের উপযুক্ত স্থানে ফাইলগুলি যুক্ত করা এবং আপনার অ্যাপ্লিকেশনটি চালু করতে হবে:

  1. আপনার ডিভাইসে, ভাগ করা স্টোরেজটিতে উপযুক্ত ডিরেক্টরি তৈরি করুন যেখানে গুগল প্লে আপনার ফাইলগুলি সংরক্ষণ করবে।

    উদাহরণস্বরূপ, যদি আপনার প্যাকেজের নামটি com.example.android হয় তবে আপনাকে শেয়ার্ড স্টোরেজ স্পেসে Android/obb/com.example.android/ ডিরেক্টরি তৈরি করতে হবে। (ভাগ করা স্টোরেজটি মাউন্ট করতে এবং ম্যানুয়ালি এই ডিরেক্টরিটি তৈরি করতে আপনার কম্পিউটারে আপনার পরীক্ষার ডিভাইসে প্লাগ ইন করুন))

  2. ম্যানুয়ালি সেই ডিরেক্টরিতে সম্প্রসারণ ফাইলগুলি যুক্ত করুন। নিশ্চিত হয়ে নিন যে গুগল প্লে যে ফাইলের নাম ফর্ম্যাটটি ব্যবহার করবে তা মেলে আপনি আপনার ফাইলগুলির নাম পরিবর্তন করেছেন।

    উদাহরণস্বরূপ, ফাইলের ধরণ নির্বিশেষে, com.example.android অ্যাপ্লিকেশনটির জন্য প্রধান সম্প্রসারণ ফাইলটি main.0300110.com.example.android.obb হওয়া উচিত। সংস্করণ কোডটি আপনি যা চান তা হতে পারে। শুধু মনে রাখবেন:

    • প্রধান সম্প্রসারণ ফাইলটি সর্বদা main দিয়ে শুরু হয় এবং প্যাচ ফাইলটি patch দিয়ে শুরু হয়।
    • প্যাকেজের নাম সর্বদা গুগল প্লেতে ফাইলটি সংযুক্ত থাকে এমনটির সাথে মেলে।
  3. এখন যেহেতু এক্সপেনশন ফাইল (গুলি) ডিভাইসে রয়েছে, আপনি আপনার এক্সপেনশন ফাইল (গুলি) পরীক্ষা করতে আপনার অ্যাপ্লিকেশনটি ইনস্টল এবং চালাতে পারেন।

সম্প্রসারণ ফাইলগুলি পরিচালনা করার বিষয়ে এখানে কিছু অনুস্মারক রয়েছে:

  • .obb এক্সপেনশন ফাইলগুলি মুছুন বা নামকরণ করবেন না (এমনকি আপনি ডেটা অন্য কোনও স্থানে আনপ্যাক করলেও)। এটি করার ফলে গুগল প্লে (বা আপনার অ্যাপ্লিকেশন নিজেই) বারবার সম্প্রসারণ ফাইলটি ডাউনলোড করতে পারে।
  • আপনার obb/ ডিরেক্টরিতে অন্য ডেটা সংরক্ষণ করবেন না । যদি আপনাকে কিছু ডেটা আনপ্যাক করতে হয় তবে এটি getExternalFilesDir() দ্বারা নির্দিষ্ট স্থানে সংরক্ষণ করুন।

ফাইল ডাউনলোড পরীক্ষা করা

যেহেতু আপনার অ্যাপ্লিকেশনটি কখনও কখনও এক্সপেনশন ফাইলগুলি প্রথম খোলার সময় ম্যানুয়ালি ডাউনলোড করতে হবে, আপনার অ্যাপ্লিকেশনটি সফলভাবে ইউআরএলগুলির জন্য সফলভাবে জিজ্ঞাসা করতে, ফাইলগুলি ডাউনলোড করতে এবং ডিভাইসে সংরক্ষণ করতে পারে তা নিশ্চিত হওয়ার জন্য আপনি এই প্রক্রিয়াটি পরীক্ষা করা গুরুত্বপূর্ণ।

ম্যানুয়াল ডাউনলোড পদ্ধতিটি আপনার অ্যাপ্লিকেশনটির বাস্তবায়ন পরীক্ষা করতে, আপনি এটি অভ্যন্তরীণ পরীক্ষার ট্র্যাকটিতে প্রকাশ করতে পারেন, সুতরাং এটি কেবল অনুমোদিত পরীক্ষার্থীদের জন্য উপলব্ধ। যদি সবকিছু প্রত্যাশার মতো কাজ করে তবে আপনার অ্যাপ্লিকেশনটি মূল ক্রিয়াকলাপ শুরু হওয়ার সাথে সাথে সম্প্রসারণ ফাইলগুলি ডাউনলোড করা শুরু করা উচিত।

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

আপনার অ্যাপ্লিকেশন আপডেট করা হচ্ছে

গুগল প্লেতে সম্প্রসারণ ফাইলগুলি ব্যবহার করার জন্য দুর্দান্ত সুবিধাগুলির মধ্যে একটি হ'ল মূল সম্পদগুলির সমস্ত পুনরায় ডাউনলোড না করে আপনার অ্যাপ্লিকেশন আপডেট করার ক্ষমতা। যেহেতু গুগল প্লে আপনাকে প্রতিটি এপিকে সহ দুটি এক্সপেনশন ফাইল সরবরাহ করতে দেয়, আপনি দ্বিতীয় ফাইলটিকে "প্যাচ" হিসাবে ব্যবহার করতে পারেন যা আপডেট এবং নতুন সম্পদ সরবরাহ করে। এটি করার ফলে মূল সম্প্রসারণ ফাইলটি পুনরায় ডাউনলোড করার প্রয়োজন এড়ানো যায় যা ব্যবহারকারীদের জন্য বড় এবং ব্যয়বহুল হতে পারে।

প্যাচ এক্সপেনশন ফাইলটি প্রযুক্তিগতভাবে মূল সম্প্রসারণ ফাইলের সমান এবং অ্যান্ড্রয়েড সিস্টেম বা গুগল প্লে না আপনার মূল এবং প্যাচ সম্প্রসারণ ফাইলগুলির মধ্যে প্রকৃত প্যাচিং সম্পাদন করে না। আপনার অ্যাপ্লিকেশন কোডটি অবশ্যই কোনও প্রয়োজনীয় প্যাচগুলি সম্পাদন করতে হবে।

আপনি যদি জিপ ফাইলগুলি আপনার এক্সপেনশন ফাইল হিসাবে ব্যবহার করেন তবে এপিকে এক্সপেনশন জিপ লাইব্রেরি যা এপিকে এক্সপেনশন প্যাকেজের সাথে অন্তর্ভুক্ত রয়েছে তা আপনার প্যাচ ফাইলটিকে মূল সম্প্রসারণ ফাইলের সাথে মার্জ করার ক্ষমতা অন্তর্ভুক্ত করে।

দ্রষ্টব্য: এমনকি যদি আপনাকে কেবল প্যাচ এক্সপেনশন ফাইলটিতে পরিবর্তন করতে হয় তবে গুগল প্লে আপডেট করার জন্য আপনাকে অবশ্যই এপিকে আপডেট করতে হবে। যদি আপনার অ্যাপটিতে কোড পরিবর্তনের প্রয়োজন না হয় তবে আপনার কেবল ম্যানিফেস্টে versionCode আপডেট করা উচিত।

যতক্ষণ না আপনি প্লে কনসোলে এপির সাথে সম্পর্কিত মূল সম্প্রসারণ ফাইলটি পরিবর্তন করবেন না, যতক্ষণ না আপনার অ্যাপ্লিকেশনটি আগে ইনস্টল করা ব্যবহারকারীরা মূল সম্প্রসারণ ফাইলটি ডাউনলোড করবেন না। বিদ্যমান ব্যবহারকারীরা কেবল আপডেট হওয়া এপিকে এবং নতুন প্যাচ এক্সপেনশন ফাইল (পূর্ববর্তী প্রধান সম্প্রসারণ ফাইলটি ধরে রেখে) পান।

সম্প্রসারণ ফাইলগুলির আপডেটগুলি সম্পর্কে মাথায় রাখতে কয়েকটি বিষয় এখানে রয়েছে:

  • একবারে আপনার অ্যাপ্লিকেশনটির জন্য কেবল দুটি সম্প্রসারণ ফাইল থাকতে পারে। একটি প্রধান সম্প্রসারণ ফাইল এবং একটি প্যাচ এক্সপেনশন ফাইল। কোনও ফাইলের আপডেটের সময়, গুগল প্লে পূর্ববর্তী সংস্করণটি মুছে দেয় (এবং ম্যানুয়াল আপডেটগুলি সম্পাদন করার সময় আপনার অ্যাপ্লিকেশনটি অবশ্যই অবশ্যই)।
  • প্যাচ সম্প্রসারণ ফাইল যুক্ত করার সময়, অ্যান্ড্রয়েড সিস্টেমটি আসলে আপনার অ্যাপ্লিকেশন বা প্রধান সম্প্রসারণ ফাইলটি প্যাচ করে না। প্যাচ ডেটা সমর্থন করতে আপনাকে অবশ্যই আপনার অ্যাপ্লিকেশনটি ডিজাইন করতে হবে। তবে, এপিকে এক্সপেনশন প্যাকেজটিতে জিপ ফাইলগুলি এক্সপেনশন ফাইল হিসাবে ব্যবহার করার জন্য একটি গ্রন্থাগার অন্তর্ভুক্ত রয়েছে, যা প্যাচ ফাইল থেকে ডেটা মূল সম্প্রসারণ ফাইলে একীভূত করে যাতে আপনি সহজেই সমস্ত সম্প্রসারণ ফাইল ডেটা পড়তে পারেন।