APK বিশ্লেষক দিয়ে আপনার বিল্ড বিশ্লেষণ করুন

অ্যান্ড্রয়েড স্টুডিওতে একটি এপিকে অ্যানালাইজার রয়েছে, যা বিল্ড প্রক্রিয়া সম্পন্ন হওয়ার পর আপনার এপিকে বা অ্যান্ড্রয়েড অ্যাপ বান্ডেলের গঠন সম্পর্কে তাৎক্ষণিক ধারণা দেয়। এপিকে অ্যানালাইজার ব্যবহার করে আপনি আপনার অ্যাপের মধ্যে থাকা DEX ফাইল এবং রিসোর্স সম্পর্কিত সমস্যা ডিবাগ করার সময় কমাতে পারেন এবং এটি আপনার এপিকে ফাইলের আকার কমাতেও সাহায্য করে। এপিকে অ্যানালাইজারটি কমান্ড লাইন থেকেও apkanalyzer মাধ্যমে ব্যবহার করা যায়।


APK অ্যানালাইজার দিয়ে আপনি যা করতে পারেন:

  • অ্যাপের মধ্যে থাকা DEX এবং অ্যান্ড্রয়েড রিসোর্স ফাইলের মতো ফাইলগুলির পরম এবং আপেক্ষিক আকার দেখুন।
  • DEX ফাইলের গঠন সম্পর্কে জানুন।
  • অ্যাপের ফাইলগুলির, যেমন AndroidManifest.xml ফাইলের, চূড়ান্ত সংস্করণ দ্রুত দেখুন।
  • দুটি APK বা অ্যাপ বান্ডেলের পাশাপাশি তুলনা করুন।

প্রজেক্ট খোলা থাকা অবস্থায় এপিকে অ্যানালাইজার অ্যাক্সেস করার তিনটি উপায় রয়েছে:

  • অ্যান্ড্রয়েড স্টুডিওর এডিটর উইন্ডোতে একটি APK বা অ্যাপ বান্ডেল ড্র্যাগ করে আনুন।
  • প্রজেক্ট উইন্ডোতে প্রজেক্ট ভিউতে যান, তারপর ডিফল্ট build/output/apks/ ডিরেক্টরিতে থাকা APK ফাইলটিতে ডাবল-ক্লিক করুন।
  • মেনু বার থেকে Build > Analyze APK নির্বাচন করুন, তারপর আপনার APK বা অ্যাপ বান্ডেলটি বেছে নিন।

ফাইল এবং আকারের তথ্য দেখুন

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

এপিকে অ্যানালাইজার প্রতিটি এনটিটির জন্য জিপ করা ফাইলের আকার (বা 'র ফাইল সাইজ') এবং ডাউনলোড ফাইলের আকারের মান দেখায়, যেমনটি চিত্র ১-এ দেখানো হয়েছে। র ফাইল সাইজ মোট এপিকে আকারে এনটিটিটির অবদানকে বোঝায়। ডাউনলোড সাইজ গুগল প্লে দ্বারা সরবরাহ করা এনটিটিটির আনুমানিক সংকুচিত আকারকে বোঝায়। মোট ডাউনলোড আকারের শতাংশ নির্দেশ করে যে, এপিকে-র মোট ডাউনলোড আকারের কত শতাংশ এনটিটিটি দ্বারা গঠিত।

চিত্র ১. এপিকে অ্যানালাইজারে ফাইলের আকার।

AndroidManifest.xml দেখুন

যদি আপনার প্রজেক্টে একাধিক AndroidManifest.xml ফাইল থাকে, যেমন প্রোডাক্ট ফ্লেভারের জন্য, অথবা এমন লাইব্রেরি অন্তর্ভুক্ত থাকে যেগুলোরও একটি ম্যানিফেস্ট ফাইল রয়েছে, তাহলে সেগুলোকে আপনার অ্যাপে একটি একক ফাইলে একত্রিত করা হয়। এই ম্যানিফেস্ট ফাইলটি সাধারণত APK বা অ্যাপ বান্ডেলের মধ্যে একটি বাইনারি ফাইল হয়, কিন্তু APK অ্যানালাইজারে এটি নির্বাচন করা হলে, এই সত্তাটির XML রূপটি পুনর্গঠিত হয়ে প্রদর্শিত হয়।

এই ভিউয়ারটি আপনাকে বিল্ডের সময় আপনার অ্যাপে করা যেকোনো পরিবর্তন বুঝতে সাহায্য করে। উদাহরণস্বরূপ, আপনি দেখতে পারেন যে আপনার অ্যাপ্লিকেশনটি যে লাইব্রেরির উপর নির্ভর করে, তার AndroidManifest.xml ফাইলটি কীভাবে চূড়ান্ত AndroidManifest.xml ফাইলের সাথে একীভূত হয়েছে।

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

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

DEX ফাইলগুলি দেখুন

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

চিত্র ৩-এ একটি মাঝারি আকারের অ্যাপ দেখানো হয়েছে যা ৬৪কেবি DEX সীমার নিচে রয়েছে। DEX ফাইলের ভেতরের প্রতিটি প্যাকেজ, ক্লাস এবং মেথডের সংখ্যা ' Defined Methods' এবং 'Referenced Methods' কলামে তালিকাভুক্ত করা হয়েছে।

রেফারেন্সড মেথডস কলামটি সেই সমস্ত মেথড গণনা করে যা DEX ফাইলটি রেফারেন্স করে। এর মধ্যে সাধারণত আপনার কোডে সংজ্ঞায়িত মেথড, ডিপেন্ডেন্সি লাইব্রেরি এবং কোডে ব্যবহৃত স্ট্যান্ডার্ড জাভা ও অ্যান্ড্রয়েড প্যাকেজের মেথডগুলো অন্তর্ভুক্ত থাকে। প্রতিটি DEX ফাইলের ৬৪কে (64K) মেথড সীমার মধ্যে এই মেথডগুলোই গণনা করা হয়।

'Defined Methods' কলামটি শুধুমাত্র সেই মেথডগুলোকেই গণনা করে যেগুলো আপনার কোনো একটি DEX ফাইলে সংজ্ঞায়িত করা আছে, তাই এই সংখ্যাটি 'Referenced Methods'- এর একটি উপসেট।

চিত্র ৩. একটি মাঝারি আকারের অ্যাপ।

DEX ফাইল ট্রি ভিউ ফিল্টার করুন

ক্লাস তালিকার ঠিক উপরে, এপিকে অ্যানালাইজারটি নির্বাচিত DEX ফাইলের বিষয়বস্তু দেখার জন্য ফিল্টার প্রদান করে, যেমনটি চিত্র ৪-এ দেখানো হয়েছে।

চিত্র ৪. BuildConfig এর ফিল্ড এবং মেথডগুলো প্রদর্শনের জন্য সেট করা DEX ফিল্টারসমূহ।

একটি ক্লাসের ভেতরের সমস্ত মেথড এবং ফিল্ড প্রদর্শন করতে ফিল্টার ব্যবহার করার জন্য, নিম্নলিখিতগুলি করুন:

  1. ফাইল তালিকা থেকে classes.dex ফাইলটি নির্বাচন করুন।
  2. ক্লাস তালিকা থেকে একটি ক্লাস খুঁজে বের করে নির্বাচন করুন।
  3. আপনার নির্বাচিত ক্লাসটি প্রসারিত করুন।
  4. টগল করুন ক্ষেত্রগুলি দেখান ক্লাস ফিল্ডগুলি দেখানো বা লুকানোর জন্য।
  5. পদ্ধতিগুলি দেখান টগল করুন ক্লাস মেথডগুলো দেখানো বা লুকানোর জন্য।
  6. সমস্ত উল্লেখিত মেথড বা ফিল্ড দেখানোর জন্য টগল করুন রেফারেন্সকৃত প্যাকেজ, ক্লাস, মেথড এবং ফিল্ড দেখানো বা লুকানোর জন্য।

    ট্রি ভিউতে, ইটালিক করা নোডগুলো হলো এমন রেফারেন্স, যেগুলোর সংজ্ঞা নির্বাচিত DEX ফাইলে নেই। একটি DEX ফাইল অন্য কোনো ফাইলে সংজ্ঞায়িত মেথড এবং ফিল্ডকে রেফারেন্স করতে পারে। উদাহরণস্বরূপ, System.out.println হলো অ্যান্ড্রয়েড ফ্রেমওয়ার্কের println মেথডের একটি রেফারেন্স।

ProGuard ম্যাপিং লোড করুন

ফিল্টারিং আইকনগুলোর পাশে প্রোগার্ড ম্যাপিং আইকনগুলো রয়েছে। প্রোগার্ড আইকনগুলো ধূসর রঙের থাকে যতক্ষণ না আপনি এক সেট প্রোগার্ড ম্যাপিং ফাইল লোড করেন, যা DEX ভিউয়ারে বিভিন্ন কার্যকারিতা যোগ করে, যেমন—নামের দুর্বোধ্যতা দূর করা ( mapping.txt ), মুছে ফেলা নোডগুলো দেখানো ( usage.txt ), এবং যে নোডগুলো সরানো যাবে না তা নির্দেশ করা ( seeds.txt )।

আপনি যে ProGuard ম্যাপিং ফাইলটি ইম্পোর্ট করবেন, সেটি অবশ্যই সেই একই বিল্ড থেকে তৈরি হতে হবে যেটি কোড শ্রিংকিং সক্ষম থাকা অবস্থায় DEX ফাইলগুলো তৈরি করেছিল।

চিত্র ৫. প্রোগার্ড ম্যাপিং লোড করুন...

ProGuard ম্যাপিং ফাইলগুলো লোড করতে, নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:

  1. 'Load Proguard mappings...'- এ ক্লিক করুন।
  2. প্রজেক্ট ফোল্ডারে যান যেখানে ম্যাপিং ফাইলগুলো রয়েছে এবং সমস্ত ফাইল, ফাইলগুলোর যেকোনো সংমিশ্রণ, অথবা ফাইলগুলো যে ফোল্ডারে রয়েছে, সেটি লোড করুন।

    ম্যাপিং ফাইলগুলো সাধারণত project / app /build/outputs/mappings/release/ -এ থাকে। এই প্রজেক্ট কাঠামোটি শনাক্ত করতে পারলে ফাইল পিকার ডিফল্টভাবে রিলিজ ফোল্ডারটি বেছে নেয়।

    প্রথমে, ফাইল পিকারটি mapping.txt , seeds.txt , এবং usage.txt সাথে হুবহু মিলে যায় এমন ফাইলের নাম খুঁজে দেখে। এরপর, ফাইল পিকারটি এমন ফাইলের নাম খুঁজে দেখে যেগুলোতে কোথাও mapping , usage , বা seeds আছে এবং যা .txt দিয়ে শেষ হয়। উদাহরণস্বরূপ, release-seeds-1.10.15.txt মিলে যায়।

নিম্নলিখিত তালিকাটি ম্যাপিং ফাইলগুলির বর্ণনা দেয়:

  • seeds.txt : যে নোডগুলো ProGuard কনফিগারেশনের কারণে সঙ্কুচিত করার সময় অপসারিত হতে পারে না, সেগুলোকে গাঢ় অক্ষরে দেখানো হয়েছে।
  • mapping.txt : নাম ডিওবিফাসকেট করতে সক্ষম করে ফলে আপনি R8 দ্বারা অস্পষ্ট করে দেওয়া নোডগুলোর আসল নাম পুনরুদ্ধার করতে পারবেন। উদাহরণস্বরূপ, আপনি a , b , c এর মতো অস্পষ্ট নোডের নামগুলো MyClass , MainActivity , এবং myMethod() এ পুনরুদ্ধার করতে পারেন।
  • usage.txt : অপসারিত নোডগুলি দেখানোর সুবিধা চালু করে ফলে আপনি সেইসব ক্লাস, মেথড এবং ফিল্ড দেখাতে পারবেন যা R8 আকার ছোট করার সময় সরিয়ে দিয়েছিল। পুনরুদ্ধার করা নোডগুলো স্ট্রাইকথ্রু করে দেখানো হয়।

    আপনার কোডকে দুর্বোধ্য ও সংক্ষিপ্ত করতে R8 ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “আপনার অ্যাপকে সংকুচিত, দুর্বোধ্য এবং অপ্টিমাইজ করুন” দেখুন।

বাইটকোড দেখান, ব্যবহার খুঁজুন, এবং Keep রুল তৈরি করুন।

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

বাইটকোড দেখান : নির্বাচিত ক্লাস, মেথড বা ফিল্ডকে ডিকম্পাইল করে এবং একটি ডায়ালগে তার স্মালি বাইটকোড উপস্থাপনা প্রদর্শন করে, যা নিম্নরূপ:

চিত্র ৬. init মেথডের DEX বাইটকোড।

ব্যবহার খুঁজুন : এটি দেখায় যে DEX কোডের অন্য কোন অংশে নির্বাচিত ক্লাস বা মেথডের রেফারেন্স রয়েছে, যেমনটি চিত্র ৭-এ দেখানো হয়েছে। যদি আপনার seeds.txt লোড করা থাকে, তাহলে বোল্ড অক্ষরে প্রদর্শিত নোডগুলি নির্দেশ করে যে ProGuard কনফিগারেশন সঙ্কুচিত করার সময় সেগুলিকে অপসারণ হতে বাধা দেয়:

চিত্র ৭. MyClass এর উল্লেখসমূহ।

Proguard Keep রুল তৈরি করুন : এটি ProGuard-এর সেইসব রুল দেখায় যা আপনি আপনার প্রোজেক্টের ProGuard কনফিগারেশন ফাইলে কপি ও পেস্ট করতে পারেন, যেমনটি চিত্র ৮-এ দেখানো হয়েছে। এটি কোড সঙ্কুচিত করার পর্যায়ে একটি নির্দিষ্ট প্যাকেজ, ক্লাস, মেথড বা ফিল্ডকে মুছে যাওয়া থেকে রক্ষা করে। আরও তথ্যের জন্য, কোন কোড রাখতে হবে তা কাস্টমাইজ করুন দেখুন।

চিত্র ৮। ProGuard-এর নিয়মাবলী যা আপনি ডায়ালগ থেকে আপনার ProGuard কনফিগারেশন ফাইলে কপি করতে পারেন।

কোড এবং রিসোর্স সত্তাগুলি দেখুন

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

APK অ্যানালাইজার দিয়ে আপনার ফাইলগুলোর চূড়ান্ত সংস্করণ দেখতে, চিত্র ৯-এ দেখানো অনুযায়ী টেক্সট বা ইমেজ এনটিটির প্রিভিউ দেখার জন্য সেটিতে ক্লিক করুন।

চিত্র ৯. চূড়ান্ত চিত্র সম্পদের একটি পূর্বরূপ।

এপিকে অ্যানালাইজার বিভিন্ন টেক্সট এবং বাইনারি ফাইলও প্রদর্শন করতে পারে। উদাহরণস্বরূপ, resources.arsc এনটিটি ভিউয়ার আপনাকে কনফিগারেশন-নির্দিষ্ট মানগুলো দেখতে দেয়, যেমন একটি স্ট্রিং রিসোর্সের ভাষা অনুবাদ। চিত্র ১০-এ, আপনি প্রতিটি স্ট্রিং রিসোর্সের অনুবাদগুলো দেখতে পারেন।

চিত্র ১০। অনূদিত স্ট্রিং রিসোর্সসমূহের পূর্বরূপ।

ফাইলগুলি তুলনা করুন

এপিকে অ্যানালাইজার দুটি ভিন্ন এপিকে বা অ্যাপ বান্ডেল ফাইলের উপাদানগুলোর আকার তুলনা করতে পারে। পূর্ববর্তী রিলিজের তুলনায় আপনার অ্যাপের আকার কেন বেড়েছে, তা বোঝার জন্য এটি সহায়ক।

আপডেট করা অ্যাপটি প্রকাশ করার আগে, নিম্নলিখিত কাজগুলো করুন:

  1. আপনি যে অ্যাপটির সংস্করণটি প্রকাশ করতে চলেছেন, সেটি APK অ্যানালাইজারে লোড করুন।
  2. APK অ্যানালাইজারের উপরের ডান কোণায়, ‘Compare with previous APK...’-এ ক্লিক করুন।
  3. সিলেকশন ডায়ালগে, আপনার ব্যবহারকারীদের জন্য সর্বশেষ প্রকাশিত আর্টিফ্যাক্টটি খুঁজুন এবং OK-তে ক্লিক করুন।

    আপডেটটি ব্যবহারকারীদের উপর কী প্রভাব ফেলতে পারে তা মূল্যায়ন করতে আপনাকে সাহায্য করার জন্য চিত্র ১১-এর অনুরূপ একটি ডায়ালগ বক্স প্রদর্শিত হয়।

চিত্র ১১-তে একটি নির্দিষ্ট অ্যাপের ডিবাগ এবং রিলিজ বিল্ডের মধ্যে পার্থক্য দেখানো হয়েছে। এই বিল্ড টাইপগুলোর মধ্যে ভিন্ন ভিন্ন বিল্ড অপশন ব্যবহৃত হয়, যা অন্তর্নিহিত সত্তাগুলোকে ভিন্নভাবে পরিবর্তন করে।

চিত্র ১১। ডিবাগ এবং রিলিজ এপিকে-এর মধ্যে পার্থক্য।