Android App Debugging – अक्सर जब हम कोई Android App Create करते हैं, तो हमें हमारे Android App की विभिन्न Levels पर Debugging करने की जरूरत पड़ती है यानी हमें ये जानने की जरूरत पड़ती है कि हमारा App Code कहां तक Normally Run हुआ ताकि जहां से आगे का Code Normally Run नहीं हो रहा है, वहां से आगे के Code को ही Debug किया जाए।
इस जरूरत को पूरा करने के लिए सामान्यत: हम अपने Code में जगह-जगह कोई Log Message Print करते रहते हैं, जो कि हमें हमारे Android App के Run होते समय Android Studio के LogCat Section में दिखाई देता है।
हम हमारे Android App में जब कोई Log Message देना चाहते हैं, तो उस Message को Display करने के लिए हम Java का System.out.println() Method Use कर सकते हैं लेकिन Android SDK हमें Debugging से सम्बंधित एक सम्पूर्ण Package Provide करता है जिसके android.util.Log Class के Message, Error व Warning Return करने वाले v() Method को Use कर सकते हैं। जैसे:
Log.v(“TAG”, “Value of this android app is $1000 at this time”);
Android Studio हमें LogCat नाम का जो Debugging Tool Provide करता है, उसके Filter Option को Use करके हम विभिन्न प्रकार के Error, Warning आदि Messages को Filter करके देख सकते हैं।
हालांकि Logging का प्रयोग Android App को Debug करने के लिए बहुत उपयोगी है, लेकिन क्योंकि ये Memory और CPU Resources Use करता है, इसलिए जिस Android App में इन्हें Use किया गया होता है, उस Android App को Deploy करने से पहले इन सभी Logging Statements को Remove कर देना चाहिए, ताकि Android App की Performance प्रभावित न हो।
Log Messages को सामान्यत: निम्न चित्रानुसार हम हमारे Android Studio Emulator के LogCat Section में देखते हैं:
लेकिन जब हम किसी Real Device को अपने Android Studio के साथ Connect करते हैं, तो इन Log Messages को हम हमारे Real Android Device पर भी देख सकते हैं और उस समय ये Log Messages Debug Mode में दिखाई देते हैं।
वास्तव में सभी Log Messages इस प्रकार से Store होते हैं कि उनमें से ज्यादातर Most Recent Messages को उस Real Device द्वारा Record कर लिया जाता है। परिणामस्वरूप Device Disconnect होने के बावजूद वे Log Messages उस Device में Exist रहते हैं और यदि उस Real Device को फिर से Android Studio के साथ Connect किया जाए, तो वे सभी Recorded Log Messages हमें हमारे Android Studio के LogCat Section में दिखाई देने लगते हैं।
इसलिए यदि हम हमारे Android App में Debugging के दौरान Specify किए गए सभी Log Statements को Remove नहीं करते तो उनके द्वारा Generate होने वाले सभी Log Messages हमारे Android Device में Record होते रहते हैं, जिन्हें अपने Android Studio के साथ उस Device को Connect करके फिर से देखा जा सकता है।
इस Log Class के बारे में हम आगे विस्तार से जानेंगे, लेकिन पिछले Section में हमने Activity की Lifecycle के बारे में जो विस्तृत वर्णन किया है, उससे सम्बंधित विभिन्न Callback Methods के Execution को एक Practical Example द्वारा समझना निश्चित रूप से काफी उपयोगी होगा, ताकि आप इस बात को बेहतर तरीके से समझ सकें कि किस परिस्थिति में User द्वारा किए जाने वाले किस Action के Response में कौन-कौनसे Callback Methods Execute होते हैं, ताकि आप अपने Android App के विभिन्न Actions और उनसे सम्बंधित Responses को बेहतर तरीके से Identify कर सकें।
हम यही मान कर चल रहे हैं कि Chapter की शुरूआत में हमने जो पहला Android App Create किया था, उसी की MainActivity.java File में निम्न Code लिखे गए हैं:
// File Name: ActivityMain.java package com.bccfalna.myapp; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v("Lifecycle:", " onCreate() Method Invoked"); } @Override protected void onStart() { super.onStart(); Log.v("Lifecycle:", " onStart() Method Invoked"); } @Override protected void onRestart(){ super.onRestart(); Log.v("Lifecycle:", " onRestart() Method Invoked"); } @Override protected void onResume(){ super.onResume(); Log.v("Lifecycle:", " onResume() Method Invoked"); } @Override protected void onPause(){ super.onPause(); Log.v("Lifecycle:", " onPause() Method Invoked"); } @Override protected void onStop() { super.onStop(); Log.v("Lifecycle:", " onStop() Method Invoked"); } @Override protected void onDestroy(){ super.onDestroy(); Log.v("Lifecycle:", " onDestroy() Method Invoked"); } }
इस Example में केवल उन्हीं Lifecycle Methods को Override किया गया है, जिन्हें एक Android Developer के रूप में हमें Override करना होता है। MainActivity.java File व इसके Default रूप से Automatically Create होने वाले Codes के बारे में हम पहले ही विस्तार से Discuss कर चुके हैं, जिसमें onCreate() Method भी सम्मिलित था।
इस Example में onCreate() Method के साथ ही Activity के Lifecycle से सम्बंधित अन्य Methods को भी Override किया गया है और किसी भी Activity से सम्बंधित Java File में हमें जब भी कभी इन में से किसी भी Method को Override करना होता है, Exactly इसी तरीके से Override करना होता है, जहां पहला Statement हमेंशा अपने Parent Class के Constructor को ही Call करता है।
इस Example में Log.v() Method का प्रयोग Android Studio के LogCat Section में दिखाई देने वाले Message को Print करने के लिए किया गया है, जिसमें TAG के रूप में String Message “Lifecycle” Specify किया गया है, ताकि Android Studio के LogCat Section में निम्न चित्रानुसार केवल उन Log Messages को Filter किया जा सके, जिनके साथ “Lifecycle” TAG Associated है, ताकि इस बात को बेहतर तरीके से समझा जा सके कि किस User Action के Response में कौनसा Overridden Method Execute होता है और किस तरह के Sequence में Execute होता है:
जैसाकि इस चित्र में देख सकते हैं, हमें Android Studio के LogCat Section में केवल उन Log Messages को देखना है, जिनमें TAG के रूप में “Lifecycle” Word को Specify किया गया है, इसलिए Filter Section में दिखाई देने वाले List Box से हमने “Info” Option को Select किया है क्योंकि Log Messages Display करने के लिए हमने Log.i() Method को Use किया है। इस Android App के साथ जैसे ही कोई Action Perform किया जाता है, उससे सम्बंधित कोई न कोई Overridden Method Execute हो जाता है और जो भी Method Execute होता है, उसमें Specified Log.i() Method Execute हो जाता है, जिसकी Detail LogCat Section में देख सकते हैं।
Android Studio का जो Android Monitor Section है, उसी में हमें सभी तरह के Debug Messages दिखाई देते हैं जबकि LogCat Section हमें सभी System Messages जैसे कि Garbage Collection कब Execute हुआ या अन्य Special Action कब Perform हुआ आदि Show करता है और इसी संदर्भ में Log Class हमें हमारे Android App के Execution के दौरान अपने स्वयं के Messages Return करने की भी सुविधा देता है, जो कि इसी LogCat Section में उपरोक्तानुसार Discussed तरीके से दिखाई देते हैं।
LogCat के अन्तर्गत जो Messages दिखाई देते हैं, वे Real Time Messages होते हैं, साथ ही इसमें History के रूप में Old Messages भी Hold रहते हैं जिन्हें हम हमारी जरूरके के अनुसार फिर से देख सकते हैं।
हमारे Android App के Execution के दौरान जब भी कोई Error या Exception Trigger होता है, LogCat Monitor उस Exception से सम्बंधित Stack Resource के साथ उससे सम्बंधित एक Message भी Display कर देता है। जबकि इन्हीं Log Messages को हम Android Studio 2.2 के Run Window में भी देख सकते हैं।
प्रत्येक Log Message के साथ एक Priority व TAG Associated रहता है। TAG एक छोटा सा String होता है, जो बड़े Message का छोटा रूप या Signature होता है, जिसके साथ बड़ा Message Associated रहता है और उसकी Category को Represent करता है। उदाहरण के लिए “ActivityManager” TAG के साथ दिखाई देने वाले सभी Messages, Activity Manager से सम्बंधित होते हैं।
एक Developer के रूप में जब हम कोई TAG Specify करते हैं, तो TAG के रूप में हम कोई भी ऐसी String Specify कर सकते हैं, जिससे हमारा Message किसी Specific Category को Represent करने लगे। इसीलिए उपरोक्त Example में हमने TAG के रूप में “Lifecycle” शब्द को Specify किया था ताकि Lifecycle से सम्बंधित सभी Messages Uniquely Identify हो सकें और हम आसानी से जान सकें कि कौनसा Message किस संदर्भ में क्या जानकारी दे रहा है।
Log Class हमें v(), i(), d(), w(), e() व a() नाम के कुल 6 Methods Provide करता है और अलग-अलग Category के Messages के लिए हम इन्हीं में से किसी Method क प्रयोग करते हैं। उदाहरण के लिए उपरोक्त Example में हमें केवल इस बात की जानकारी Log करनी थी कि कब कौनसा Overridden Method Execute हुआ है, इसलिए इस जरूरत को पूरा करने के लिए हमने Log.i() Method का प्रयोग किया था। जबकि यदि हमें किसी try Block में Trigger होने वाले Error या Exception को catch Block में Catch करके उससे सम्बंधित Information को Log करना होता, तो Best Log Method के रूप में Log.e() Method का Use करना पड़ता।
जबकि किसी ऐसी Situation को Represent करने के लिए Log.w() Method को Use करना पड़ता, जो कि बाद में Exception या Error की तरह Treat हो सकता है।
इसी तरह से जब हम Debugging से सम्बंधित General Messages Log करना चाहते हैं, तब Log.d() Method Use कर सकते हैं जबकि यदि हम अपने App से सम्बंधित सभी बातों को Step by Step Log करना चाहते हैं, तो उस स्थिति में Log.v() Method Use कर सकते हैं।
सभी Log Methods का Syntax निम्नानुसार होता है:
Log.methodName(tag, message);
जैसे-
Log.i(“Lifecycle”, “ onCreate() method executed.“);
LogCat में Display होने वाले सभी Log Message का निम्नानुसार एक निश्चित Format होता है:
date time PID-TID/package priority/tag: message
इसीलिए उपरोक्त Example के LogCat Output में हमें निम्नानुसार Output Message प्राप्त हुआ था:
12-19 16:19:11.472 6779-6779/com.bccfalna.myapp I/Lifecycle:: onDestroy() Method Invoked
यहां 12-19 आज की Date है, 16:19:11.472 Current Time है, 6779-6779 Current Android App का Process ID व Thread ID है, com.bccfalna.myapp, Current Android App का Package Name व आगे का हिस्सा Log Message है, जहां “I” Info Type के Message को Represent कर रहा है। यदि हमने Log.e() Method Use किया होता, तो “I” के स्थान पर “E” होता।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Android in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।
Android in Hindi | Page: 628 | Format: PDF