অ্যান্ড্রয়েড স্টুডিও একটি ডিবাগার সরবরাহ করে যা আপনাকে নিম্নলিখিত এবং আরও অনেক কিছু করতে দেয়:
- আপনার অ্যাপ ডিবাগ করার জন্য একটি ডিভাইস নির্বাচন করুন।
- আপনার Java, Kotlin, এবং C/C++ কোডে ব্রেকপয়েন্ট সেট করুন।
- ভেরিয়েবল পরীক্ষা করুন এবং রানটাইমে এক্সপ্রেশন মূল্যায়ন করুন।
এই পৃষ্ঠায় মৌলিক ডিবাগার অপারেশনের জন্য নির্দেশাবলী অন্তর্ভুক্ত রয়েছে। আরও ডকুমেন্টেশনের জন্য, IntelliJ IDEA ডিবাগিং ডক্সও দেখুন।
ডিবাগিং সক্ষম করুন
আপনি ডিবাগিং শুরু করার আগে, নিম্নলিখিতগুলি করুন:
- আপনার ডিভাইসে ডিবাগিং সক্ষম করুন।
- আপনি যদি এমুলেটর ব্যবহার করেন, ডিবাগিং ডিফল্টরূপে সক্রিয় থাকে। কিন্তু একটি সংযুক্ত ডিভাইসের জন্য, আপনাকে ডিভাইস বিকাশকারী বিকল্পগুলিতে ডিবাগিং সক্ষম করতে হবে।
- একটি ডিবাগযোগ্য বিল্ড বৈকল্পিক চালান।
বিল্ড কনফিগারেশনে
debuggable true
(isDebuggable = true
কোটলিন স্ক্রিপ্টে) অন্তর্ভুক্ত একটি বিল্ড ভেরিয়েন্ট ব্যবহার করুন।সাধারণত, আপনি প্রতিটি অ্যান্ড্রয়েড স্টুডিও প্রকল্পে অন্তর্ভুক্ত ডিফল্ট "ডিবাগ" ভেরিয়েন্ট নির্বাচন করতে পারেন, যদিও এটি
build.gradle
ফাইলে দৃশ্যমান নয়। যাইহোক, আপনি যদি নতুন বিল্ড প্রকারগুলি সংজ্ঞায়িত করেন যা ডিবাগযোগ্য হওয়া উচিত, তবে আপনাকে অবশ্যই বিল্ড টাইপের সাথেdebuggable true
যুক্ত করতে হবে:- আপনার অ্যাপের কোডে ব্রেকপয়েন্ট সেট করুন।
- টুলবারে, টার্গেট ডিভাইস মেনু থেকে আপনার অ্যাপ ডিবাগ করার জন্য একটি ডিভাইস নির্বাচন করুন।
আপনার যদি কনফিগার করা কোনো ডিভাইস না থাকে, তাহলে আপনাকে হয় USB এর মাধ্যমে একটি ডিভাইস সংযুক্ত করতে হবে , Wi-Fi এর মাধ্যমে একটি ডিভাইস সংযুক্ত করতে হবে , অথবা Android এমুলেটর ব্যবহার করার জন্য একটি AVD তৈরি করতে হবে ৷
- টুলবারে, ডিবাগ এ ক্লিক করুন .
যদি আপনার অ্যাপটি ইতিমধ্যেই ডিভাইসে চলছে, তাহলে আপনি রান থেকে ডিবাগে স্যুইচ করতে চান কিনা তা জিজ্ঞাসা করে একটি ডায়ালগ প্রদর্শিত হয়। ডিবাগিং শুরু করার জন্য ডিভাইসটিকে পুনরায় চালু করতে হবে। অ্যাপের একই উদাহরণ চালু রাখতে, ডিবাগ বাতিল করুন-এ ক্লিক করুন এবং পরিবর্তে একটি চলমান অ্যাপে ডিবাগার সংযুক্ত করুন । অন্যথায়, Android স্টুডিও একটি APK তৈরি করে, এটি একটি ডিবাগ কী দিয়ে স্বাক্ষর করে, এটি আপনার নির্বাচিত ডিভাইসে ইনস্টল করে এবং এটি চালায়।
আপনি যদি আপনার প্রোজেক্টে C এবং C++ কোড যোগ করেন , তাহলে Android Studio আপনার নেটিভ কোড ডিবাগ করতে ডিবাগ উইন্ডোতে LLDB ডিবাগারও চালায়।
- যদি ডিবাগ উইন্ডোটি খোলা না থাকে, তাহলে View > Tool Windows > Debug নির্বাচন করুন অথবা ডিবাগ ক্লিক করুন টুল উইন্ডো বারে।
- অ্যান্ড্রয়েড প্রক্রিয়ার সাথে ডিবাগার সংযুক্ত করুন ক্লিক করুন .
- প্রক্রিয়া নির্বাচন করুন ডায়ালগে, আপনি যে প্রক্রিয়াটিতে ডিবাগার সংযুক্ত করতে চান তা নির্বাচন করুন।
- আপনি যদি একটি এমুলেটর বা একটি রুট করা ডিভাইস ব্যবহার করেন, আপনি সমস্ত প্রক্রিয়াগুলি দেখতে সমস্ত প্রক্রিয়াগুলি দেখান চেক করতে পারেন৷ একটি রুটেড ডিভাইসে, এটি ডিভাইসে চলমান সমস্ত প্রক্রিয়া দেখাবে। যাইহোক, একটি আন-রুটড ডিভাইসে, এটি শুধুমাত্র ডিবাগযোগ্য প্রক্রিয়াগুলি দেখাবে।
- মেনু থেকে Android ডিবাগার সেটিংস ব্যবহার করুন থেকে, আপনি একটি বিদ্যমান রান/ডিবাগ কনফিগারেশন নির্বাচন করতে পারেন। C এবং C++ কোডের জন্য, এটি আপনাকে একটি বিদ্যমান কনফিগারেশনে LLDB স্টার্টআপ কমান্ড, LLDB পোস্ট-অ্যাটাচ কমান্ড এবং প্রতীক ডিরেক্টরি পুনরায় ব্যবহার করতে দেয়।
- আপনার যদি বিদ্যমান রান/ডিবাগ কনফিগারেশন না থাকে, নতুন তৈরি করুন নির্বাচন করুন। এই নির্বাচনটি ডিবাগ টাইপ মেনু সক্ষম করে, যেখানে আপনি একটি ভিন্ন ডিবাগ টাইপ নির্বাচন করতে পারেন। ডিফল্টরূপে, অ্যান্ড্রয়েড স্টুডিও আপনার প্রোজেক্টে জাভা বা C/C++ কোড অন্তর্ভুক্ত কিনা তার উপর ভিত্তি করে আপনার জন্য সেরা ডিবাগার বিকল্প নির্বাচন করতে স্বয়ংক্রিয়ভাবে ডিবাগ টাইপ সনাক্ত করুন ব্যবহার করে।
- ওকে ক্লিক করুন।
ডিবাগ উইন্ডো প্রদর্শিত হবে।
- এক্সিকিউশন এবং নেভিগেশন টুলবার ব্রেকপয়েন্টের সাথে কাজ দেখুন
- থ্রেড নির্বাচক
- মূল্যায়ন এবং অভিব্যক্তি এন্ট্রি ঘড়ি. ভেরিয়েবল পরিদর্শন দেখুন।
- স্ট্যাক ডিসপ্লে
- ভেরিয়েবল প্যান। ভেরিয়েবল পরিদর্শন দেখুন।
- স্বয়ংক্রিয়ভাবে সনাক্ত করুন
- আপনি যে কোডটি ডিবাগ করছেন তার জন্য Android স্টুডিও স্বয়ংক্রিয়ভাবে সেরা বিকল্প বেছে নিতে চাইলে এই ডিবাগ টাইপটি নির্বাচন করুন। উদাহরণস্বরূপ, আপনার প্রোজেক্টে কোনো C বা C++ কোড থাকলে, Android Studio স্বয়ংক্রিয়ভাবে ডুয়াল ডিবাগ টাইপ ব্যবহার করে। অন্যথায়, অ্যান্ড্রয়েড স্টুডিও জাভা-অনলি ডিবাগ টাইপ ব্যবহার করে।
- জাভা শুধুমাত্র
- আপনি যদি জাভা বা কোটলিনে লেখা শুধুমাত্র কোড ডিবাগ করতে চান তবে এই ডিবাগ টাইপ নির্বাচন করুন। Java-Only ডিবাগার আপনার নেটিভ কোডে সেট করা যেকোনো ব্রেকপয়েন্ট বা ঘড়ি উপেক্ষা করে।
- শুধুমাত্র স্থানীয় (শুধুমাত্র C/C++ কোড সহ উপলব্ধ)
- আপনি যদি আপনার কোড ডিবাগ করতে শুধুমাত্র LLDB ব্যবহার করতে চান তবে এই ডিবাগ টাইপ নির্বাচন করুন। এই ডিবাগ টাইপ ব্যবহার করার সময়, জাভা ডিবাগার সেশন ভিউ পাওয়া যায় না। ডিফল্টরূপে, LLDB শুধুমাত্র আপনার নেটিভ কোড পরিদর্শন করে এবং আপনার জাভা কোডের ব্রেকপয়েন্ট উপেক্ষা করে। আপনি যদি আপনার জাভা কোডটিও ডিবাগ করতে চান তবে স্বয়ংক্রিয়ভাবে সনাক্ত করুন বা দ্বৈত ডিবাগ টাইপটিতে স্যুইচ করুন।
নেটিভ ডিবাগিং শুধুমাত্র নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করে এমন ডিভাইসগুলিতে কাজ করে:
ডিভাইস
run-as
সমর্থন করে।ডিভাইসটি
run-as
সমর্থন করে কিনা তা পরীক্ষা করতে, আপনার ডিভাইসের সাথে সংযুক্ত ADB শেলটিতে নিম্নলিখিত কমান্ডটি চালান:run-as your-package-name pwd
your-package-name
আপনার অ্যাপের প্যাকেজের নামের সাথে প্রতিস্থাপন করুন। যদি ডিভাইসrun-as
সমর্থন করে, কমান্ডটি কোনো ত্রুটি ছাড়াই ফিরে আসা উচিত।ডিভাইসটিতে
ptrace
সক্ষম করা আছে।ptrace
সক্ষম হয়েছে কিনা তা পরীক্ষা করতে, আপনার ডিভাইসের সাথে সংযুক্ত ADB শেলটিতে নিম্নলিখিত কমান্ডটি চালান:sysctl kernel.yama.ptrace_scope
ptrace
সক্রিয় করা থাকলে, কমান্ডটি মান0
বা একটিunknown key
ত্রুটি মুদ্রণ করবে।ptrace
সক্রিয় না হলে, এটি0
ছাড়া অন্য একটি মান প্রিন্ট করবে।
- ডুয়াল (জাভা + নেটিভ) - শুধুমাত্র C/C++ কোড সহ উপলব্ধ
- আপনি যদি জাভা এবং নেটিভ কোড উভয় ডিবাগ করার মধ্যে স্যুইচ করতে চান তবে এই ডিবাগ টাইপ নির্বাচন করুন। অ্যান্ড্রয়েড স্টুডিও জাভা ডিবাগার এবং এলএলডিবি উভয়কেই আপনার অ্যাপ প্রক্রিয়ায় সংযুক্ত করে যাতে আপনি আপনার অ্যাপ রিস্টার্ট না করে বা আপনার ডিবাগ কনফিগারেশন পরিবর্তন না করেই আপনার জাভা এবং নেটিভ কোড উভয়ের ব্রেকপয়েন্ট পরীক্ষা করতে পারেন।
চিত্র 2-এ, ডিবাগ উইন্ডো শিরোনামের ডানদিকে দুটি ট্যাব লক্ষ্য করুন। যেহেতু অ্যাপটিতে Java এবং C++ কোড উভয়ই রয়েছে, একটি ট্যাব নেটিভ কোড ডিবাগ করার জন্য এবং অন্যটি জাভা কোড ডিবাগ করার জন্য, যেমন -java দ্বারা নির্দেশিত।
- লাইন ব্রেকপয়েন্ট
- সবচেয়ে সাধারণ ধরন হল একটি লাইন ব্রেকপয়েন্ট যা নির্দিষ্ট কোডের লাইনে আপনার অ্যাপের এক্সিকিউশনকে বিরতি দেয়। বিরতি দেওয়ার সময়, আপনি ভেরিয়েবল পরীক্ষা করতে পারেন, এক্সপ্রেশন মূল্যায়ন করতে পারেন এবং তারপর রানটাইম ত্রুটির কারণ নির্ধারণ করতে লাইন দ্বারা এক্সিকিউশন লাইন চালিয়ে যেতে পারেন।
- পদ্ধতি ব্রেকপয়েন্ট
- একটি মেথড ব্রেকপয়েন্ট আপনার অ্যাপের এক্সিকিউশনকে বিরতি দেয় যখন এটি একটি নির্দিষ্ট পদ্ধতিতে প্রবেশ করে বা প্রস্থান করে। বিরতি দেওয়ার সময়, আপনি ভেরিয়েবল পরীক্ষা করতে পারেন, এক্সপ্রেশন মূল্যায়ন করতে পারেন এবং তারপর রানটাইম ত্রুটির কারণ নির্ধারণ করতে লাইন দ্বারা এক্সিকিউশন লাইন চালিয়ে যেতে পারেন। আপনি যখন একটি সংমিশ্রণযোগ্য ফাংশনে একটি ব্রেকপয়েন্ট সেট করেন, তখন ডিবাগার কম্পোজেবলের প্যারামিটার এবং তাদের অবস্থার তালিকা করে যে পরিবর্তনগুলি পুনর্গঠনের কারণ হতে পারে তা সনাক্ত করতে সহায়তা করে।
- ফিল্ড ব্রেকপয়েন্ট
- একটি ফিল্ড ব্রেকপয়েন্ট আপনার অ্যাপের এক্সিকিউশনকে বিরতি দেয় যখন এটি একটি নির্দিষ্ট ফিল্ড থেকে পড়ে বা লেখে।
- ব্যতিক্রম ব্রেকপয়েন্ট
- একটি ব্যতিক্রম ব্রেকপয়েন্ট যখন একটি ব্যতিক্রম নিক্ষেপ করা হয় তখন আপনার অ্যাপের কার্য সম্পাদনে বিরতি দেয়।
- কোডের লাইনটি সনাক্ত করুন যেখানে আপনি এক্সিকিউশন পজ করতে চান।
- কোডের সেই লাইন বরাবর বাম গটারে ক্লিক করুন বা লাইনে ক্যারেট রাখুন এবং Control+F8 (macOS, Command+F8 এ) টিপুন।
- যদি আপনার অ্যাপটি ইতিমধ্যেই চলছে, তাহলে Android প্রক্রিয়াতে ডিবাগার সংযুক্ত করুন ক্লিক করুন . অন্যথায়, ডিবাগিং শুরু করতে, ডিবাগ ক্লিক করুন .
একটি ভেরিয়েবলের জন্য অবজেক্ট ট্রি পরীক্ষা করতে, এটিকে ভেরিয়েবল ভিউতে প্রসারিত করুন। যদি ভেরিয়েবল ভিউ দৃশ্যমান না হয়, লেআউট সেটিংস ক্লিক করুন এবং নিশ্চিত করুন যে ভেরিয়েবল চেক করা হয়েছে।
কোনো পদ্ধতি না লিখে কোডের পরবর্তী লাইনে যেতে, ধাপে ধাপে ক্লিক করুন .
একটি মেথড কলের ভিতরে প্রথম লাইনে যেতে, স্টেপ ইনটু ক্লিক করুন .
বর্তমান পদ্ধতির বাইরে পরবর্তী লাইনে যেতে, স্টেপ আউট ক্লিক করুন .
অ্যাপটি স্বাভাবিকভাবে চালানো চালিয়ে যেতে, Resume Program এ ক্লিক করুন .
- যখন LLDB ডিবাগার আপনার C/C++ কোডে একটি ব্রেকপয়েন্টের সম্মুখীন হয় তখন Android Studio <your-module> ট্যাবে স্যুইচ করে। ফ্রেম, ভেরিয়েবল এবং ঘড়ির প্যানগুলিও উপলব্ধ এবং আপনি জাভা কোড ডিবাগ করলে ঠিক সেভাবেই কাজ করে।
যদিও থ্রেড প্যানটি এলএলডিবি সেশন ভিউতে পাওয়া যায় না, আপনি ফ্রেম ফলকের তালিকা ব্যবহার করে আপনার অ্যাপের প্রক্রিয়াগুলি অ্যাক্সেস করতে পারেন। কিভাবে উইন্ডো ফ্রেম ডিবাগ করতে হয় এবং ভেরিয়েবল পরিদর্শন করতে হয় সে সম্পর্কে বিভাগগুলিতে এই প্যানগুলি সম্পর্কে আরও জানুন।
দ্রষ্টব্য: আপনার নেটিভ কোডে একটি ব্রেকপয়েন্ট পরিদর্শন করার সময়, Android সিস্টেম ভার্চুয়াল মেশিনটিকে সাসপেন্ড করে যা আপনার অ্যাপের জাভা বাইটকোড চালায়। এর মানে হল যে আপনি জাভা ডিবাগারের সাথে ইন্টারঅ্যাক্ট করতে বা আপনার নেটিভ কোডে একটি ব্রেকপয়েন্ট পরিদর্শন করার সময় আপনার Java ডিবাগার সেশন থেকে কোনো স্টেট তথ্য পুনরুদ্ধার করতে অক্ষম।
- Android স্টুডিও <your-module> -java ট্যাবে স্যুইচ করে যখন Java ডিবাগার আপনার Java বা Kotlin কোডে একটি ব্রেকপয়েন্টের সম্মুখীন হয়।
- LLDB-এর সাথে ডিবাগ করার সময়, আপনি LLDB-এ কমান্ড-লাইন বিকল্পগুলি পাস করতে LLDB সেশন ভিউতে LLDB টার্মিনাল ব্যবহার করতে পারেন। আপনার যদি নির্দিষ্ট কিছু কমান্ড থাকে যেগুলো আপনি LLDB দ্বারা প্রতিবার আপনার অ্যাপ ডিবাগ করা শুরু করার সময় কার্যকর করতে চান, ডিবাগার আপনার অ্যাপ প্রক্রিয়ার সাথে সংযুক্ত হওয়ার ঠিক আগে বা ঠিক পরে, আপনি সেই কমান্ডগুলি আপনার ডিবাগ কনফিগারেশনে যোগ করতে পারেন।
- দেখতে বা প্রদর্শনের জন্য অভিব্যক্তি লিখুন
- ঘড়িতে যোগ করুন ক্লিক করুন বা অভিব্যক্তিটি একবার মূল্যায়ন করতে এন্টার টিপুন।
- আপনার টার্গেট ফিজিক্যাল ডিভাইস বা এমুলেটর একটি x86 বা x86_64 CPU ব্যবহার করে। যদি আপনার ডিভাইসটি একটি ARM CPU ব্যবহার করে, তাহলে আপনাকে অবশ্যই মেমরিতে আপনার ভেরিয়েবলের ঠিকানার সীমানা 4 বাইটে, 32-বিট প্রসেসরের জন্য বা 64-বিট প্রসেসরের জন্য 8 বাইটের সাথে সারিবদ্ধ করতে হবে। আপনার নেটিভ কোডে একটি ভেরিয়েবলকে সারিবদ্ধ করতে, ভেরিয়েবলের হ্রাসে
__attribute__((aligned( num_bytes )))
উল্লেখ করুন, যেমনটি নীচে দেখানো হয়েছে:// For a 64-bit ARM processor int my_counter __attribute__((aligned(8)));
- আপনি ইতিমধ্যে তিনটি বা তার কম ওয়াচপয়েন্ট বরাদ্দ করেছেন। অ্যান্ড্রয়েড স্টুডিও x86 বা x86_64 টার্গেট ডিভাইসে শুধুমাত্র চারটি ওয়াচপয়েন্ট সমর্থন করে। অন্যান্য ডিভাইস কম ওয়াচপয়েন্ট সমর্থন করতে পারে।
- একটি ব্রেকপয়েন্টে আপনার অ্যাপ সাসপেন্ড করা হলে, আপনার LLDB সেশন ভিউতে ভেরিয়েবল প্যানে নেভিগেট করুন।
আপনি ট্র্যাক করতে চান এমন মেমরির ব্লক দখল করে এমন একটি ভেরিয়েবলে ডান-ক্লিক করুন এবং ওয়াচপয়েন্ট যোগ করুন নির্বাচন করুন।
আপনার ওয়াচপয়েন্ট কনফিগার করার জন্য একটি ডায়ালগ প্রদর্শিত হবে, যেমন চিত্র 9 এ দেখানো হয়েছে।
নিম্নলিখিত বিকল্পগুলির সাথে আপনার ওয়াচপয়েন্ট কনফিগার করুন:
- সক্রিয়: আপনি যদি সেটিং পরিবর্তন না করা পর্যন্ত ওয়াচপয়েন্ট উপেক্ষা করতে অ্যান্ড্রয়েড স্টুডিওকে বলতে চান তাহলে এই বিকল্পটি অনির্বাচন করুন। অ্যান্ড্রয়েড স্টুডিও আপনার ওয়াচপয়েন্ট সংরক্ষণ করে যাতে আপনি পরে এটি অ্যাক্সেস করতে পারেন।
- সাসপেন্ড: ডিফল্টরূপে, অ্যান্ড্রয়েড সিস্টেম আপনার অ্যাপ প্রক্রিয়া স্থগিত করে যখন এটি আপনার ওয়াচপয়েন্টে বরাদ্দ করা মেমরির একটি ব্লক অ্যাক্সেস করে। আপনি যদি এই আচরণটি না চান তবে এই বিকল্পটি অনির্বাচন করুন৷ এটি অতিরিক্ত বিকল্পগুলি প্রকাশ করে যা আপনি আচরণ কাস্টমাইজ করতে ব্যবহার করতে পারেন যখন সিস্টেমটি আপনার ওয়াচপয়েন্টের সাথে ইন্টারঅ্যাক্ট করে: কনসোলে বার্তা লগ করুন এবং আঘাত করলে সরান ৷
- অ্যাক্সেসের ধরন: সিস্টেমটি ভেরিয়েবলের জন্য বরাদ্দকৃত মেমরির ব্লকে পড়ার বা লেখার চেষ্টা করার সময় আপনার অ্যাপটি আপনার ওয়াচপয়েন্টকে ট্রিগার করবে কিনা তা নির্বাচন করুন। আপনার ওয়াচপয়েন্ট ট্রিগার করতে একটি পঠন বা লিখতে, যেকোনো নির্বাচন করুন।
- সম্পন্ন ক্লিক করুন.
- ভেরিয়েবল তালিকায়, তালিকাটি প্রদর্শন করতে রিসোর্স লাইনের যেকোনো জায়গায় ডান-ক্লিক করুন।
- তালিকায়, হিসাবে দেখুন নির্বাচন করুন এবং আপনি যে বিন্যাসটি ব্যবহার করতে চান তা নির্বাচন করুন।
উপলব্ধ ফরম্যাটগুলি আপনার নির্বাচিত সংস্থানের ডেটা প্রকারের উপর নির্ভর করে। আপনি নিম্নলিখিত বিকল্পগুলির মধ্যে এক বা একাধিক দেখতে পারেন:
- শ্রেণী: শ্রেণীর সংজ্ঞা প্রদর্শন করুন।
- toString: স্ট্রিং বিন্যাস প্রদর্শন করুন।
- অবজেক্ট: অবজেক্ট (একটি ক্লাসের একটি উদাহরণ) সংজ্ঞা প্রদর্শন করুন।
- অ্যারে: একটি অ্যারে বিন্যাসে প্রদর্শন করুন।
- টাইমস্ট্যাম্প: তারিখ এবং সময় নিম্নরূপ প্রদর্শন করুন: yyyy-mm-dd hh:mm:ss।
- স্বয়ংক্রিয়: অ্যান্ড্রয়েড স্টুডিও ডেটা প্রকারের উপর ভিত্তি করে সেরা বিন্যাস বেছে নেয়।
- বাইনারি: শূন্য এবং এক ব্যবহার করে একটি বাইনারি মান প্রদর্শন করুন।
- MeasureSpec: পিতামাতার কাছ থেকে নির্বাচিত সন্তানের কাছে মানটি প্রেরণ করা হয়েছে।
MeasureSpec
দেখুন। - হেক্স: হেক্সাডেসিমেল মান হিসাবে প্রদর্শন করুন।
- আদিম: একটি আদিম ডেটা টাইপ ব্যবহার করে একটি সংখ্যাসূচক মান হিসাবে প্রদর্শন করুন।
- Integer:
Integer
টাইপের সাংখ্যিক মান হিসাবে প্রদর্শন করুন।
- সম্পদ মান ডান ক্লিক করুন.
- হিসাবে দেখুন নির্বাচন করুন।
- তৈরি করুন নির্বাচন করুন।
- জাভা ডেটা টাইপ রেন্ডারার ডায়ালগ প্রদর্শন করে। জাভা ডেটা টাইপ রেন্ডারারগুলিতে নির্দেশাবলী অনুসরণ করুন।
গ্রোভি
android { buildTypes { customDebugType { debuggable true ... } } }
কোটলিন
android { buildTypes { create("customDebugType") { isDebuggable = true ... } } }
এই বৈশিষ্ট্যটি C/C++ কোড সহ মডিউলগুলিতেও প্রযোজ্য।
দ্রষ্টব্য: jniDebuggable
সম্পত্তি আর ব্যবহার করা হয় না।
যদি আপনার অ্যাপটি একটি লাইব্রেরি মডিউলের উপর নির্ভর করে যা আপনি ডিবাগ করতে চান, তাহলে সেই লাইব্রেরিটি অবশ্যই debuggable true
সাথে প্যাকেজ করা উচিত যাতে এটি তার ডিবাগ চিহ্নগুলি ধরে রাখে। আপনার অ্যাপ প্রকল্পের ডিবাগযোগ্য ভেরিয়েন্টগুলি একটি লাইব্রেরি মডিউলের ডিবাগযোগ্য বৈকল্পিক গ্রহণ করে তা নিশ্চিত করতে, আপনার লাইব্রেরির নন-ডিফল্ট সংস্করণ প্রকাশ করুন।
ডিবাগিং শুরু করুন
আপনি নিম্নরূপ একটি ডিবাগিং সেশন শুরু করতে পারেন:
একটি চলমান অ্যাপে ডিবাগার সংযুক্ত করুন
আপনার অ্যাপটি ইতিমধ্যেই আপনার ডিভাইসে চলমান থাকলে, আপনি নিম্নোক্তভাবে আপনার অ্যাপ রিস্টার্ট না করেই ডিবাগিং শুরু করতে পারেন:
ডিভাইস এক্সপ্লোরার ( ভিউ> টুল উইন্ডোজ> ডিভাইস এক্সপ্লোরার ) এর প্রসেস ট্যাবে ডিবাগযোগ্য প্রক্রিয়াগুলির একটি তালিকা রয়েছে। সেখান থেকে আপনি একটি প্রক্রিয়া নির্বাচন করতে পারেন এবং একটি হত্যা করতে পারেন , জোর করে থামান , অথবা একটি প্রদত্ত প্রক্রিয়াতে ডিবাগার সংযুক্ত করুন .
ডিবাগ উইন্ডো
ডিবাগ উইন্ডো ভাগ করা হয়
দ্রষ্টব্য: অ্যান্ড্রয়েড স্টুডিও ডিবাগার এবং আবর্জনা সংগ্রাহক আলগাভাবে একত্রিত। অ্যান্ড্রয়েড ভার্চুয়াল মেশিন গ্যারান্টি দেয় যে ডিবাগার যে কোনো বস্তু সম্পর্কে সচেতন তা ডিবাগার সংযোগ বিচ্ছিন্ন না হওয়া পর্যন্ত আবর্জনা সংগ্রহ করা হবে না। ডিবাগার সংযুক্ত থাকাকালীন এর ফলে বস্তুর বিল্ডআপ হতে পারে। উদাহরণস্বরূপ, যদি ডিবাগার একটি চলমান থ্রেড দেখতে পায়, তাহলে সংশ্লিষ্ট Thread
অবজেক্টটি ডিবাগার সংযোগ বিচ্ছিন্ন না হওয়া পর্যন্ত আবর্জনা সংগ্রহ করা হয় না, এমনকি থ্রেডটি বন্ধ হয়ে গেলেও।
ডিবাগার টাইপ পরিবর্তন করুন
যেহেতু Java/Kotlin কোড এবং C/C++ কোড ডিবাগ করার জন্য বিভিন্ন ডিবাগার টুলের প্রয়োজন হয়, তাই অ্যান্ড্রয়েড স্টুডিও ডিবাগার আপনাকে কোন ডিবাগার প্রকার ব্যবহার করতে হবে তা নির্বাচন করতে দেয়। ডিফল্টরূপে, অ্যান্ড্রয়েড স্টুডিও সিদ্ধান্ত নেয় কোন ডিবাগার ব্যবহার করবে তার উপর ভিত্তি করে যে এটি আপনার প্রোজেক্টে ডিটেক্ট অটোমেটিক ডিবাগার টাইপ ব্যবহার করে কোন ভাষা সনাক্ত করে।
ডিবাগ কনফিগারেশনে ম্যানুয়ালি ডিবাগার নির্বাচন করতে, রান > কনফিগারেশন সম্পাদনা করুন ক্লিক করুন। আপনি রান > অ্যাটাচ ডিবাগার অ্যান্ড্রয়েড প্রক্রিয়াতে ক্লিক করার সময় প্রদর্শিত ডায়ালগে ডিবাগার নির্বাচন করতে পারেন।
উপলব্ধ ডিবাগ ধরনের নিম্নলিখিত অন্তর্ভুক্ত:
দ্রষ্টব্য: কম্পাইলার দ্বারা অপ্টিমাইজ করা নেটিভ কোড ডিবাগ করার সময়, আপনি নিম্নলিখিত সতর্কতা বার্তা পেতে পারেন:
This function was compiled with optimizations enabled. Some debugger features may not be available
। অপ্টিমাইজেশান ফ্ল্যাগ ব্যবহার করার সময়, কম্পাইলার আপনার সংকলিত কোডে পরিবর্তন করে যাতে এটি আরও দক্ষতার সাথে চালানো যায়। এটি ডিবাগারকে অপ্রত্যাশিত বা ভুল তথ্যের প্রতিবেদন করতে পারে কারণ ডিবাগারের পক্ষে অপ্টিমাইজ করা সংকলিত কোডটিকে মূল উত্স কোডে ম্যাপ করা কঠিন। এই কারণে, আপনার নেটিভ কোড ডিবাগ করার সময় আপনার কম্পাইলার অপ্টিমাইজেশন অক্ষম করা উচিত।
সিস্টেম লগ ব্যবহার করুন
আপনি আপনার অ্যাপ ডিবাগ করার সময় সিস্টেম লগ সিস্টেম বার্তাগুলি দেখায়৷ এই বার্তাগুলিতে ডিভাইসে চলমান অ্যাপের তথ্য অন্তর্ভুক্ত রয়েছে। আপনি যদি আপনার অ্যাপ ডিবাগ করার জন্য সিস্টেম লগ ব্যবহার করতে চান, তাহলে নিশ্চিত করুন যে আপনার অ্যাপটি বিকাশের পর্যায়ে থাকাকালীন আপনার কোড লগ বার্তা লিখে এবং ব্যতিক্রমগুলির জন্য স্ট্যাক ট্রেস প্রিন্ট করে।
আপনার কোডে লগ বার্তা লিখুন
আপনার কোডে লগ বার্তা লিখতে, Log
ক্লাস ব্যবহার করুন। লগ মেসেজ আপনাকে আপনার অ্যাপের সাথে ইন্টারঅ্যাক্ট করার সময় সিস্টেম ডিবাগ আউটপুট সংগ্রহ করে এক্সিকিউশন ফ্লো বুঝতে সাহায্য করে। লগ বার্তাগুলিও আপনাকে বলতে পারে যে আপনার অ্যাপের কোন অংশ ব্যর্থ হয়েছে৷ লগিং সম্পর্কে আরও তথ্যের জন্য, Logcat দিয়ে লগ লিখুন এবং দেখুন দেখুন ।
নিম্নলিখিত উদাহরণটি দেখায় যে আপনার কার্যকলাপ শুরু হলে পূর্ববর্তী অবস্থার তথ্য উপলব্ধ কিনা তা নির্ধারণ করতে আপনি কীভাবে লগ বার্তা যোগ করতে পারেন:
কোটলিন
import android.util.Log ... class MyActivity : Activity() { ... override fun onCreate(savedInstanceState: Bundle?) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state") /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available") /* initialize app */ } ... } ... companion object { private val TAG: String = MyActivity::class.java.simpleName ... } }
জাভা
import android.util.Log; ... public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); ... @Override public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state"); /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available"); /* initialize app */ } ... } }
বিকাশের সময়, আপনার কোড ব্যতিক্রমগুলিও ধরতে পারে এবং সিস্টেম লগে স্ট্যাক ট্রেস লিখতে পারে:
কোটলিন
fun someOtherMethod() { try { ... } catch (e : SomeException) { Log.d(TAG, "someOtherMethod()", e) } }
জাভা
void someOtherMethod() { try { ... } catch (SomeException e) { Log.d(TAG, "someOtherMethod()", e); } }
দ্রষ্টব্য: আপনি যখন আপনার অ্যাপ প্রকাশ করতে প্রস্তুত তখন আপনার কোড থেকে ডিবাগ লগ বার্তাগুলি সরান এবং স্ট্যাক ট্রেস প্রিন্ট কল করুন৷ এটি করার জন্য, একটি DEBUG
পতাকা সেট করুন এবং শর্তসাপেক্ষ বিবৃতিগুলির মধ্যে ডিবাগ লগ বার্তাগুলি রাখুন৷
সিস্টেম লগ দেখুন
আপনি লগক্যাট উইন্ডোতে ডিবাগ এবং অন্যান্য সিস্টেম বার্তাগুলি দেখতে এবং ফিল্টার করতে পারেন, যেমন চিত্র 4-এ দেখানো হয়েছে৷ উদাহরণস্বরূপ, যখন আবর্জনা সংগ্রহ করা হয় তখন আপনি বার্তাগুলি দেখতে পারেন বা Log
ক্লাসের সাথে আপনার অ্যাপে যুক্ত করা বার্তাগুলি দেখতে পারেন৷
Logcat ব্যবহার করতে, ডিবাগিং শুরু করুন এবং Logcat ট্যাব নির্বাচন করুন।
Logcat এবং এর ফিল্টারিং বিকল্পগুলির একটি বিবরণের জন্য, Logcat দিয়ে লগ লিখুন এবং দেখুন দেখুন ।
ব্রেকপয়েন্ট নিয়ে কাজ করুন
অ্যান্ড্রয়েড স্টুডিও ব্রেকপয়েন্ট সমর্থন করে যা বিভিন্ন ডিবাগিং অ্যাকশন ট্রিগার করে। বিভিন্ন ধরণের ব্রেকপয়েন্ট রয়েছে:
আপনি শর্তসাপেক্ষ ব্রেকপয়েন্ট সেট করতে পারেন যা শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই মৃত্যুদন্ড স্থগিত করবে। আপনি লগিং ব্রেকপয়েন্টগুলিও সেট করতে পারেন যা এক্সিকিউশন স্থগিত না করে Logcat এ লিখবে। এটি লগ স্টেটমেন্টের সাথে আপনার কোড লিটারিং এড়াতে সাহায্য করতে পারে।
একটি লাইন ব্রেকপয়েন্ট যোগ করতে, নিম্নরূপ এগিয়ে যান:
আপনি যখন একটি ব্রেকপয়েন্ট সেট করেন তখন লাইনের পাশে একটি লাল বিন্দু দেখা যায়, যেমনটি চিত্র 5 এ দেখানো হয়েছে।
যখন আপনার কোড এক্সিকিউশন ব্রেকপয়েন্টে পৌঁছায়, তখন অ্যান্ড্রয়েড স্টুডিও আপনার অ্যাপের এক্সিকিউশন থামিয়ে দেয়।
অ্যাপের অবস্থা শনাক্ত করতে, ডিবাগার ট্যাবে টুলগুলি ব্যবহার করুন:
যদি আপনার প্রোজেক্ট কোনো নেটিভ কোড ব্যবহার করে, ডিফল্টরূপে ডিটেক্ট স্বয়ংক্রিয়ভাবে ডিবাগ টাইপ জাভা ডিবাগার এবং এলএলডিবি উভয়কেই দুটি পৃথক প্রক্রিয়া হিসেবে আপনার অ্যাপে সংযুক্ত করে। আপনি আপনার অ্যাপ রিস্টার্ট না করে বা সেটিংস পরিবর্তন না করে জাভা পরিদর্শন এবং C/C++ ব্রেকপয়েন্টের মধ্যে স্যুইচ করতে পারেন।
দ্রষ্টব্য: আপনার C বা C++ কোডে ব্রেকপয়েন্ট শনাক্ত করার জন্য Android স্টুডিওর জন্য, আপনাকে একটি ডিবাগ টাইপ ব্যবহার করতে হবে যা LLDB সমর্থন করে, যেমন স্বয়ংক্রিয়ভাবে সনাক্ত করুন, স্থানীয় বা দ্বৈত। আপনি আপনার ডিবাগ কনফিগারেশন সম্পাদনা করে Android স্টুডিও ব্যবহার করে ডিবাগ প্রকার পরিবর্তন করতে পারেন। বিভিন্ন ডিবাগ প্রকার সম্পর্কে আরও জানতে, অন্যান্য ডিবাগ প্রকারগুলি ব্যবহার করার বিষয়ে বিভাগটি পড়ুন।
যখন অ্যান্ড্রয়েড স্টুডিও আপনার টার্গেট ডিভাইসে আপনার অ্যাপ স্থাপন করে, তখন প্রতিটি ডিবাগার প্রক্রিয়ার জন্য একটি ট্যাব বা ডিবাগ সেশন ভিউ দিয়ে ডিবাগ উইন্ডো খোলে, যেমন চিত্র 6-এ দেখানো হয়েছে।
C/C++ কোড ডিবাগ করার সময়, আপনি বিশেষ ধরনের ব্রেকপয়েন্টও সেট করতে পারেন, যাকে বলা হয় ওয়াচপয়েন্ট , যেটি আপনার অ্যাপ প্রক্রিয়া স্থগিত করতে পারে যখন আপনার অ্যাপ মেমরির একটি নির্দিষ্ট ব্লকের সাথে ইন্টারঅ্যাক্ট করে। আরও জানতে, কিভাবে ওয়াচপয়েন্ট যোগ করতে হয় সে সম্পর্কে বিভাগটি পড়ুন।
ব্রেকপয়েন্ট দেখুন এবং কনফিগার করুন
সমস্ত ব্রেকপয়েন্ট দেখতে এবং ব্রেকপয়েন্ট সেটিংস কনফিগার করতে, ব্রেকপয়েন্ট দেখুন ক্লিক করুন ডিবাগ উইন্ডোতে। ব্রেকপয়েন্ট উইন্ডো প্রদর্শিত হবে, যেমন চিত্র 7 এ দেখানো হয়েছে।
ব্রেকপয়েন্ট উইন্ডো আপনাকে ফলকের তালিকা থেকে প্রতিটি ব্রেকপয়েন্ট সক্রিয় বা নিষ্ক্রিয় করতে দেয়। যদি একটি ব্রেকপয়েন্ট অক্ষম করা থাকে, তাহলে অ্যান্ড্রয়েড স্টুডিও সেই ব্রেকপয়েন্টে আঘাত করার সময় আপনার অ্যাপকে বিরতি দেয় না।
সেটিংস কনফিগার করতে তালিকা থেকে একটি ব্রেকপয়েন্ট নির্বাচন করুন। আপনি প্রথমে অক্ষম করার জন্য একটি ব্রেকপয়েন্ট কনফিগার করতে পারেন এবং একটি ভিন্ন ব্রেকপয়েন্ট আঘাত করার পরে সিস্টেমটিকে এটি সক্ষম করতে পারেন। আপনি একটি ব্রেকপয়েন্ট আঘাত করার পরে নিষ্ক্রিয় করা উচিত কিনা তাও কনফিগার করতে পারেন। যেকোনো ব্যতিক্রমের জন্য একটি ব্রেকপয়েন্ট সেট করতে, ব্রেকপয়েন্টের তালিকায় ব্যতিক্রম ব্রেকপয়েন্ট নির্বাচন করুন।
সাময়িকভাবে সমস্ত ব্রেকপয়েন্ট অক্ষম করতে, ব্রেকপয়েন্ট নিঃশব্দে ক্লিক করুন ডিবাগ উইন্ডোতে। পুনরায় সক্ষম করতে আবার ক্লিক করুন৷
উইন্ডো ফ্রেম ডিবাগ করুন
ডিবাগার উইন্ডোতে, ফ্রেম ফলক আপনাকে স্ট্যাক ফ্রেম পরিদর্শন করতে দেয় যা বর্তমান ব্রেকপয়েন্টকে আঘাত করেছে। এটি আপনাকে স্ট্যাক ফ্রেম নেভিগেট করতে এবং পরীক্ষা করতে এবং আপনার Android অ্যাপে থ্রেডের তালিকা পরিদর্শন করতে সক্ষম করে।
একটি থ্রেড নির্বাচন করতে, থ্রেড নির্বাচক মেনু ব্যবহার করুন এবং এর স্ট্যাক ফ্রেম দেখুন। সম্পাদকে উৎস খুলতে ফ্রেমের উপাদানগুলিতে ক্লিক করুন। এছাড়াও আপনি থ্রেড উপস্থাপনা কাস্টমাইজ করতে পারেন এবং স্ট্যাক ফ্রেম রপ্তানি করতে পারেন যেমন পরীক্ষা ফ্রেম গাইডে আলোচনা করা হয়েছে।
ভেরিয়েবল পরিদর্শন করুন
ডিবাগার উইন্ডোতে, ভেরিয়েবল প্যান আপনাকে ভেরিয়েবলগুলি পরিদর্শন করতে দেয় যখন সিস্টেম আপনার অ্যাপকে ব্রেকপয়েন্টে থামায় এবং আপনি ফ্রেম ফলক থেকে একটি ফ্রেম নির্বাচন করেন। ভেরিয়েবল ফলক আপনাকে স্ট্যাটিক পদ্ধতি এবং/অথবা নির্বাচিত ফ্রেমের মধ্যে উপলব্ধ ভেরিয়েবল ব্যবহার করে অ্যাডহক এক্সপ্রেশন মূল্যায়ন করতে দেয়।
অবজেক্ট ট্রিতে একটি অভিব্যক্তি যোগ করতে (যখন অ্যাপ্লিকেশনটি ডিবাগ করা হচ্ছে):
বিকল্পভাবে, যদি অবজেক্ট ট্রিতে আপনি যে অভিব্যক্তিটি দেখতে চান তা ধারণ করে, আপনি এটিকে একটি দেখা অভিব্যক্তি হিসাবে যুক্ত করতে গাছের শীর্ষে টেনে আনতে পারেন৷
প্রেক্ষিত এক্সপ্রেশন আপডেট হবে যখন ব্রেকপয়েন্ট আঘাত করা হয় বা আপনি আপনার কোড মাধ্যমে পদক্ষেপ.
মূল্যায়নকৃত অভিব্যক্তিগুলি অবজেক্ট ট্রির শীর্ষে প্রদর্শিত হবে যতক্ষণ না আপনি ম্যানুয়ালি অন্য অভিব্যক্তি মূল্যায়ন করেন বা আপনার কোডের মাধ্যমে পদক্ষেপ না করেন।
অবজেক্ট ট্রি থেকে একটি প্রেক্ষিত অভিব্যক্তি অপসারণ করতে, অভিব্যক্তিটি ডান-ক্লিক করুন এবং তারপরে ঘড়ি সরান ক্লিক করুন।
ওয়াচপয়েন্ট যোগ করুন
C/C++ কোড ডিবাগ করার সময়, আপনি বিশেষ ধরনের ব্রেকপয়েন্ট সেট করতে পারেন, যাকে বলা হয় ওয়াচপয়েন্ট , যেটি আপনার অ্যাপ প্রক্রিয়া স্থগিত করতে পারে যখন আপনার অ্যাপ মেমরির একটি নির্দিষ্ট ব্লকের সাথে ইন্টারঅ্যাক্ট করে। উদাহরণস্বরূপ, যদি আপনি মেমরির একটি ব্লকে দুটি পয়েন্টার সেট করেন এবং এটিতে একটি ওয়াচপয়েন্ট বরাদ্দ করেন, মেমরির সেই ব্লকটি অ্যাক্সেস করতে যেকোন একটি পয়েন্টার ব্যবহার করে ওয়াচপয়েন্টটি ট্রিগার করে।
অ্যান্ড্রয়েড স্টুডিওতে, আপনি একটি নির্দিষ্ট ভেরিয়েবল নির্বাচন করে রানটাইম চলাকালীন একটি ওয়াচপয়েন্ট তৈরি করতে পারেন, কিন্তু এলএলডিবি শুধুমাত্র মেমরির ব্লকে ওয়াচপয়েন্ট নির্ধারণ করে যা সিস্টেম সেই ভেরিয়েবলের জন্য বরাদ্দ করে, ভেরিয়েবলটিকে নয়। এটি ঘড়ির ফলকটিতে একটি ভেরিয়েবল যুক্ত করার থেকে আলাদা, যা আপনাকে একটি ভেরিয়েবলের মান পর্যবেক্ষণ করতে সক্ষম করে কিন্তু সিস্টেমটি মেমরিতে এর মানটি পড়ার বা পরিবর্তন করার সময় আপনাকে আপনার অ্যাপ প্রক্রিয়া স্থগিত করতে দেয় না।
দ্রষ্টব্য: যখন আপনার অ্যাপ প্রক্রিয়াটি একটি ফাংশন থেকে প্রস্থান করে এবং সিস্টেমটি মেমরি থেকে তার স্থানীয় ভেরিয়েবলগুলিকে ডিলকেট করে, তখন আপনাকে সেই ভেরিয়েবলগুলির জন্য তৈরি করা যেকোনো ওয়াচপয়েন্টকে পুনরায় বরাদ্দ করতে হবে।
একটি ওয়াচপয়েন্ট সেট করতে, আপনাকে অবশ্যই নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করতে হবে:
দ্রষ্টব্য: 32-বিট এআরএম ABI-এর সাথে আপনার অ্যাপ ডিবাগ করার সময়, একটি ওয়াচপয়েন্ট যোগ করা বা কোডের ভিতরে ভেরিয়েবলের উপর হোভার করা তাদের মানগুলি তদন্ত করার জন্য ক্র্যাশ হতে পারে। একটি সমাধান হিসাবে, 64-বিট ARM, x86, বা x86_64 বাইনারি ব্যবহার করে ডিবাগ করুন। এই সমস্যাটি একটি আসন্ন অ্যান্ড্রয়েড স্টুডিও রিলিজে ঠিক করা হবে।
আপনি যদি প্রয়োজনীয়তাগুলি পূরণ করেন তবে আপনি নিম্নলিখিত হিসাবে একটি ওয়াচপয়েন্ট যুক্ত করতে পারেন:
আপনার সমস্ত ওয়াচপয়েন্ট দেখতে এবং ওয়াচপয়েন্ট সেটিংস কনফিগার করতে, ব্রেকপয়েন্ট দেখুন ক্লিক করুন ডিবাগ উইন্ডোতে। ব্রেকপয়েন্ট ডায়ালগ প্রদর্শিত হবে, যেমন চিত্র 10 এ দেখানো হয়েছে।
আপনি আপনার ওয়াচপয়েন্ট যোগ করার পরে, প্রোগ্রাম পুনরায় শুরু করুন ক্লিক করুন আপনার অ্যাপ প্রক্রিয়া পুনরায় শুরু করতে ডিবাগ উইন্ডোতে। ডিফল্টরূপে, যদি আপনার অ্যাপ মেমরির একটি ব্লক অ্যাক্সেস করার চেষ্টা করে যা আপনি একটি ওয়াচপয়েন্ট সেট করেছেন, তাহলে অ্যান্ড্রয়েড সিস্টেম আপনার অ্যাপ প্রক্রিয়া এবং একটি ওয়াচপয়েন্ট আইকন স্থগিত করে কোডের লাইনের পাশে প্রদর্শিত হবে যেটি আপনার অ্যাপটি সর্বশেষ কার্যকর করেছে, যেমন চিত্র 11-এ দেখানো হয়েছে।
সম্পদ মান প্রদর্শন বিন্যাস দেখুন এবং পরিবর্তন করুন
ডিবাগ মোডে, আপনি সম্পদের মান দেখতে পারেন এবং আপনার Java বা Kotlin কোডে ভেরিয়েবলের জন্য একটি ভিন্ন প্রদর্শন বিন্যাস নির্বাচন করতে পারেন। ভেরিয়েবল ট্যাব প্রদর্শিত এবং একটি ফ্রেম নির্বাচন করে, নিম্নলিখিতগুলি করুন:
একটি কাস্টম বিন্যাস তৈরি করতে, নিম্নলিখিতগুলি করুন: