گروه تبدیل به سوپر گروپ شد !
لینک جدید :
https://telegram.me/joinchat/B1f7ETv_ZoJDk2dr0ES0rQ
در صورت عدم رعایت قوانین بدون اخطار وارد بلک لیست میشین ! پس لطفا قوانینو رعایت کنین ممنون .مطالب اضافه هم پاک شدند.
لینک جدید :
https://telegram.me/joinchat/B1f7ETv_ZoJDk2dr0ES0rQ
در صورت عدم رعایت قوانین بدون اخطار وارد بلک لیست میشین ! پس لطفا قوانینو رعایت کنین ممنون .مطالب اضافه هم پاک شدند.
سلام شرمنده دوستان که دیر شد واقعا چند ساعته دارم برای مقاله کار می کنم و الان تقریبا به سطح مطلوب رسید . فقط لطفا هنگام گذاشته شدن مقاله لیو ندین و گروه رو mute کنین چون ما داریم رایگان برای شما زحمت می کشیم شما هم ما رو حمایت کنین با معرفی کردن به دوستان و لیو ندادن !
یکی از مشکلات بزرگ برنامه نویسان به خصوص برنامه نویسان اندروید دادن force close توسط برنامه شان است. ! این ارور در زمان Runtime اتفاق میافتد یعنی در هنگام اجرای برنامه و برای همین handle کردنش سخت تره مخصوصا برای افراد تازه کار همچنین ممکنه فقط در بعضی گوشی ها مخصوصا گوشی های با رم پایین برنامتون force close بشه ! و حتی خودتون خبر نداشته باشین . اما همه ی این موارد رو میشه مدیریت کرد که در ادامه توضیح می دیم .
دلیل اول که بررسی می کنیم (LargeHeap ) : در قسمت #اعماق_اندروید در مورد Stack و پشته صحبت کردیم و نحوه ی اختصاص دادن استک های جدا به هر اکتویتی رو گفتیم . همین پشته یکی از دلایل force close شدن برنامه ما در گوشی های با رم پایین است . که خودم ماه ها این مشکل رو داشتم و بالاخره پیدا کردم دلیلشو ! اگر در یک اکتویتیون عکسهای زیادی رو بذارین یا حجم هر عکس زیاد باشه در گوشی های با رم پایین معمولا و یا در نسخه های اندروید مختلف ! چون به هر دو مورد بستگی داره برنامتون وقتی وارد اون اکتویتی میشین force close میشه و شما هیچ ایده ای برای حل این مشکل ندارین. دلیلش اینه که این عکس ها یا عکس باعث پر شدن استک اختصاص یافته به اون اکتویتی میشه و خود سیستم عامل برنامتونو می بنده تا به خودش فشار نیاد ! (دستش درد نکنه :) ) حالا شما دو راه دارین :1- همه یعکس هاتونو ریسایز کنین و حجمش رو بیارین پایین من برنامه ی AnyPic Image Resizer رو به شما پیشنهاد می کنم. چون خودم راضیم . و این راه اصولیش هست .2-شما مجبورین به دلایل مختلف همین سایز رو داشته باشین یا با پایین آوردن حجم ها بازم ارور پا برجاست ! حالا کارهای زیر رو انجام بدین ! :
1-وارد AndroidManifest.xml بشین و در تگ <application> بیاین android:largeHeap="true" رو اضافه کنین . توجه داشته باشین برای دستگاه های با Api Level +11 فقط این ویژگی کار می کنه .
1-وارد AndroidManifest.xml بشین و در تگ <application> بیاین android:largeHeap="true" رو اضافه کنین . توجه داشته باشین برای دستگاه های با Api Level +11 فقط این ویژگی کار می کنه .
دلایلی که این کار اصولی نیست اینه :
1-هیچ تضمینی که مقدار Heap یعنی استک شما چه مقدار افزایش بیابه نیست ! .
2-شما یا این کار سیستم عامل رو مجبور می کنین که برنامه های دیگه رو که در رم هستن رو ببنده پروسشون رو تا رم مورد نیاز برای برنامه ی شما آزاد بشه !
3-ممکنه بعدا دسترسی ای برای این موضوع جداگونه اضافه بشه و یا کابر موقع نصب بهش اخطارداده بشه .
اگر چاره ای نبود این کارو بکنین ولی در انتها ما روشی رو برای بهبود رم توسط دیباگ کردن برنامه رو بهتون می گیم.
1-هیچ تضمینی که مقدار Heap یعنی استک شما چه مقدار افزایش بیابه نیست ! .
2-شما یا این کار سیستم عامل رو مجبور می کنین که برنامه های دیگه رو که در رم هستن رو ببنده پروسشون رو تا رم مورد نیاز برای برنامه ی شما آزاد بشه !
3-ممکنه بعدا دسترسی ای برای این موضوع جداگونه اضافه بشه و یا کابر موقع نصب بهش اخطارداده بشه .
اگر چاره ای نبود این کارو بکنین ولی در انتها ما روشی رو برای بهبود رم توسط دیباگ کردن برنامه رو بهتون می گیم.
2 -دومین مشکلی که می تونه باعث force close شدن برنامتون بشه Intent ایه که مشکل داره !
می دونین که یکی از وظایف Intent ها تبادل اطلاعات بین اکتویتی هاست حالا اگر در اکتیویتی اول اطلاعاتی ر به دومی بخواین بفرستین و درست نفرستین برنامتون force close میشه نمونه عملی و روش حل :
کد اشتباه
اکتویتی اول :
String resultString = Double.toString(result);
Bundle packet = new Bundle();
packet.putString("giveResults", resultString);
Intent a = new Intent(MainActivity.this, Display.class);
startActivity(a);
اکتویتی دوم :
Bundle getPacket = getIntent().getExtras();
result = getPacket.getString("giveResults");
tvResult.setText(result);
در اینجا در اکتویتی اول یک Bundle تعریف شده و یه Instance ازش ساخته شده و سپس در اون یه رشته وارد شده. Bundle مثل یه بقچه می مونه که شما اطلاعاتو به روش key/value توش می ریزی (روش key/value یک روش ذخیره سازی اطلاعاته که با فراخوانی key که همون شناسه اطلاعاته مورد نظره value یعنی مقدار اون داده برگشت داده میشه است در SharedPreferences هم ازش استفاده می شه ). و در اکتویتی دوم میای از اون بقچه برش میداری ! حالا اشتباه کجاست ؟ getIntent().getExtras(); یعنی تمام اینت ها رو بگیر و سپس داخل Extra هاشو نگاه کن ! اما ما اطلاعاتو تو Bundle ریختیم اما موقع استارت Intent بهش پاس نکردیم. تا بتونیم از ش استفاده کنیم و شکل صحیح به صورت زیر خواهد بود.
Intent a = new Intent(MainActivity.this, Display.class);
a.putExtras("giveResults",packet );
startActivity(a);
که به وسیله ی putExtra میتونیم تو اکتیویتی دوم getExtra کنیم :)
می دونین که یکی از وظایف Intent ها تبادل اطلاعات بین اکتویتی هاست حالا اگر در اکتیویتی اول اطلاعاتی ر به دومی بخواین بفرستین و درست نفرستین برنامتون force close میشه نمونه عملی و روش حل :
کد اشتباه
اکتویتی اول :
String resultString = Double.toString(result);
Bundle packet = new Bundle();
packet.putString("giveResults", resultString);
Intent a = new Intent(MainActivity.this, Display.class);
startActivity(a);
اکتویتی دوم :
Bundle getPacket = getIntent().getExtras();
result = getPacket.getString("giveResults");
tvResult.setText(result);
در اینجا در اکتویتی اول یک Bundle تعریف شده و یه Instance ازش ساخته شده و سپس در اون یه رشته وارد شده. Bundle مثل یه بقچه می مونه که شما اطلاعاتو به روش key/value توش می ریزی (روش key/value یک روش ذخیره سازی اطلاعاته که با فراخوانی key که همون شناسه اطلاعاته مورد نظره value یعنی مقدار اون داده برگشت داده میشه است در SharedPreferences هم ازش استفاده می شه ). و در اکتویتی دوم میای از اون بقچه برش میداری ! حالا اشتباه کجاست ؟ getIntent().getExtras(); یعنی تمام اینت ها رو بگیر و سپس داخل Extra هاشو نگاه کن ! اما ما اطلاعاتو تو Bundle ریختیم اما موقع استارت Intent بهش پاس نکردیم. تا بتونیم از ش استفاده کنیم و شکل صحیح به صورت زیر خواهد بود.
Intent a = new Intent(MainActivity.this, Display.class);
a.putExtras("giveResults",packet );
startActivity(a);
که به وسیله ی putExtra میتونیم تو اکتیویتی دوم getExtra کنیم :)
مورد سوم که از همه مهم تره رو گذاشتیم آخر که کامل روش مانور بدیم 😊 NullPointerException :
این مورد یکی از شایع ترین دلایل force close شدن برنامست و هم در برنامه نویسی اندروید و هم در نوشتن برنامه های ویندوزی با جاوا زیاد رخ میده ! اول اندرویدش و بعد جاواش که مکمل هم هستند رو توضیح می دیم.
در سایت developer.android.com که مرجع اصلی هست در بخش Develop - > Reference - >NullPointerException اول جمله ی زیر رو می بینین :
public class
NullPointerException
extends RuntimeException
یعنی یک کلاس از نوع public که از RuntimeExceptions ارث بری شده . خب RuntimeExceptions هم که یک سوپر کلاس برای این حساب میشه و این کلاس ما Subclass اش هست به معنی انتظارات در زمان اجرا هست ! یعنی انتظاراتی که ما داریم و معمولا بر خلافش اتفاق میوفته !
بررسی اجمالی کلاس : وقتی که برنامه سعی می کنه به یک فیلد یا متد یک آبجکت یا یک المنت از یک آرایه دسترسی پیدا کنه وقتی که هیچ نمونه یا آرایه ای برای دسترسی وجود نداره ! و باعث میشه اون آبجکت یا آرایه به null اشاره کنه . و اون خطا رخ بده و همچین چیزی رو د ر LogCat مشاهده می کنین....Caused by: java.lang.NullPointerException
این مورد یکی از شایع ترین دلایل force close شدن برنامست و هم در برنامه نویسی اندروید و هم در نوشتن برنامه های ویندوزی با جاوا زیاد رخ میده ! اول اندرویدش و بعد جاواش که مکمل هم هستند رو توضیح می دیم.
در سایت developer.android.com که مرجع اصلی هست در بخش Develop - > Reference - >NullPointerException اول جمله ی زیر رو می بینین :
public class
NullPointerException
extends RuntimeException
یعنی یک کلاس از نوع public که از RuntimeExceptions ارث بری شده . خب RuntimeExceptions هم که یک سوپر کلاس برای این حساب میشه و این کلاس ما Subclass اش هست به معنی انتظارات در زمان اجرا هست ! یعنی انتظاراتی که ما داریم و معمولا بر خلافش اتفاق میوفته !
بررسی اجمالی کلاس : وقتی که برنامه سعی می کنه به یک فیلد یا متد یک آبجکت یا یک المنت از یک آرایه دسترسی پیدا کنه وقتی که هیچ نمونه یا آرایه ای برای دسترسی وجود نداره ! و باعث میشه اون آبجکت یا آرایه به null اشاره کنه . و اون خطا رخ بده و همچین چیزی رو د ر LogCat مشاهده می کنین....Caused by: java.lang.NullPointerException
Android Developers
Android Mobile App Developer Tools - Android Developers
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.
خب چجوری این مشکلو بر طرف کنیم ؟ اگر در برنامتون از آرایه استفاده کردین و می دونین به خاطر اینکه مثلا شما 20 تا عضو آرایتون داره و دارین روی آرایه حرکت می کنین با استفاده از couner (شمارنده ) و به ایندکس 21 که میرسین force close میده میتونین یه if بذارین به این صورت که
if (counter ==ArrayName.length -1)
بود یه پیغام به کاربر نشون بدین یا هر کار دیگه اینجا -1 گذاشتم چون index از 0 شروع میشه و وقتی 20 تا آیتم داشته باشیم index آخرین آیتم 21 است ! .
به همین راحتی در این مورد ارور برطرف میشه اما این یکی از حالات بود .
چند حالت بعدی :
شما هر ویجتی که در xml تون تعریف میکنین برای استفاده از اون در کدهای جاوا باید بهش یه مرجع یا Refrence بدین . و اینو در نظر داشته باشین که قبل از
setContentView()
شما هیچ مرجعی از xml تون نمی تونین بدین و اگر بدین باعث NullPointerException میشه . و همچنین قبل از مرجع دادن به اون ویو نمی تونین چیزی رو بهش ست کنین . نمونه عملی :
فرض کنین ما یک لیست ویو تعریف می کنیم و setAdapter ش می کنیم .
ListView listview;
listview.setAdapter(new ArrayAdapter<String😠this,android.R.layout.androiddevelop,mStrings));
حالا لیست ویو شما null هست و شما سعی می کنین تا setAdapeter ش کنین پس NPE که مخفف همون NullPointerException هست اتفاق میوفته !
if (counter ==ArrayName.length -1)
بود یه پیغام به کاربر نشون بدین یا هر کار دیگه اینجا -1 گذاشتم چون index از 0 شروع میشه و وقتی 20 تا آیتم داشته باشیم index آخرین آیتم 21 است ! .
به همین راحتی در این مورد ارور برطرف میشه اما این یکی از حالات بود .
چند حالت بعدی :
شما هر ویجتی که در xml تون تعریف میکنین برای استفاده از اون در کدهای جاوا باید بهش یه مرجع یا Refrence بدین . و اینو در نظر داشته باشین که قبل از
setContentView()
شما هیچ مرجعی از xml تون نمی تونین بدین و اگر بدین باعث NullPointerException میشه . و همچنین قبل از مرجع دادن به اون ویو نمی تونین چیزی رو بهش ست کنین . نمونه عملی :
فرض کنین ما یک لیست ویو تعریف می کنیم و setAdapter ش می کنیم .
ListView listview;
listview.setAdapter(new ArrayAdapter<String😠this,android.R.layout.androiddevelop,mStrings));
حالا لیست ویو شما null هست و شما سعی می کنین تا setAdapeter ش کنین پس NPE که مخفف همون NullPointerException هست اتفاق میوفته !
کد صحیح :
ListView listview=(ListView)findViewById(R.id.list);
یا
ListView listview = new ListView(this);
هست که یعنی یا باید به لیست ویو مرجع بدین یا یه آبجکت ازش بسازین و بعد set کنین چیزی رو بهش .
خب هرگز نمیشه تمام حالات رو بررسی کرد !! و این موارد مواردی بود که شاید بیشتر برای تازه کارها یا دوستان اتفاق بیوفته بهترین روش حل این مشکل ابتدا یافتن این که مشکل از کدوم قسمت کدتون هست با استفاده از try/catch و سپس حل اون مشکل است.
اون قسمت کدی که شک دارین ارورتون از اونجا باشه رو در
try{
//کد شما
}
قرار بدین و بعدش
catch(NullPointerException e){
e.printStackTrace();
}
رو بذارین تا موقع دیباگ کردن برنامه در LogCat متوجه بشین ارور از کجاست. یه نمونه از خطاهایی که به خاطر NPE رخ داده رو داخلش توضیحات رو نوشتم تا اگر خطاشو دیدن ببین کجا باید دنبال عامل به وجود آورنده خطا باشین.
Caused by: java.lang.NullPointerException
02-03 16:19:48.322: E/AndroidRuntime(959): at
mohammad.ghaffari.androiddevelop(پکیج نیم).MainMenu(نام کلاس).populateListViewFromDB(نام تابع)(MainMenu.java():184(خط 184 ام کد کلاس )).
خسته نباشین ❤️.
در مورد دیباگ کردن در اندروید استودیو به زودی یه مقاله کامل گذاشته خواهد شد.
دوستان این مقاله حدود 4 5 ساعت نوشتنش زمان برد و حاصل تجربیات شخصی طی 4 ، 5 سال و بررسی حداقل 10، 11 مقاله و مشکلات رایج در اینترنت بود. و برای اولین بار در کانال @androiddevelop قرار داده شد و لطفا در صورت کپی برداری حتما فروارد کنین و منبع رو ذکر کنین .
منابع استفاده شده در این مقاله :
1-تجربیات شخصی !
2-http://developer.android.com/reference/java/lang/NullPointerException.html
3-http://developer.android.com/guide/topics/manifest/application-element.html
4-http://samir-mangroliya.blogspot.ae/p/why-nullpointerexception-occures-in.html
5-بررسی انواع سوالهای مطرح شده در سایت stackoverflow.com و جوابهای آنها مانند:
http://stackoverflow.com/questions/14198204/android-app-force-closing
http://stackoverflow.com/questions/19977856/android-caused-by-java-lang-nullpointerexception
و...
با معرفی کانال ما به دوستان و در گروه های خودتون ما رو حمایت کنین تا آموزش ها ادمه پیدا کنه. ❤️❤️
@androiddevelop
@mohamadghaffari
لینک گروه ما جهت پرسش و پاسخ (تلگرامتون رو به آخرین نسخه باید آپدیت کنین):
https://telegram.me/joinchat/B1f7ETv_ZoJDk2dr0ES0rQ
ListView listview=(ListView)findViewById(R.id.list);
یا
ListView listview = new ListView(this);
هست که یعنی یا باید به لیست ویو مرجع بدین یا یه آبجکت ازش بسازین و بعد set کنین چیزی رو بهش .
خب هرگز نمیشه تمام حالات رو بررسی کرد !! و این موارد مواردی بود که شاید بیشتر برای تازه کارها یا دوستان اتفاق بیوفته بهترین روش حل این مشکل ابتدا یافتن این که مشکل از کدوم قسمت کدتون هست با استفاده از try/catch و سپس حل اون مشکل است.
اون قسمت کدی که شک دارین ارورتون از اونجا باشه رو در
try{
//کد شما
}
قرار بدین و بعدش
catch(NullPointerException e){
e.printStackTrace();
}
رو بذارین تا موقع دیباگ کردن برنامه در LogCat متوجه بشین ارور از کجاست. یه نمونه از خطاهایی که به خاطر NPE رخ داده رو داخلش توضیحات رو نوشتم تا اگر خطاشو دیدن ببین کجا باید دنبال عامل به وجود آورنده خطا باشین.
Caused by: java.lang.NullPointerException
02-03 16:19:48.322: E/AndroidRuntime(959): at
mohammad.ghaffari.androiddevelop(پکیج نیم).MainMenu(نام کلاس).populateListViewFromDB(نام تابع)(MainMenu.java():184(خط 184 ام کد کلاس )).
خسته نباشین ❤️.
در مورد دیباگ کردن در اندروید استودیو به زودی یه مقاله کامل گذاشته خواهد شد.
دوستان این مقاله حدود 4 5 ساعت نوشتنش زمان برد و حاصل تجربیات شخصی طی 4 ، 5 سال و بررسی حداقل 10، 11 مقاله و مشکلات رایج در اینترنت بود. و برای اولین بار در کانال @androiddevelop قرار داده شد و لطفا در صورت کپی برداری حتما فروارد کنین و منبع رو ذکر کنین .
منابع استفاده شده در این مقاله :
1-تجربیات شخصی !
2-http://developer.android.com/reference/java/lang/NullPointerException.html
3-http://developer.android.com/guide/topics/manifest/application-element.html
4-http://samir-mangroliya.blogspot.ae/p/why-nullpointerexception-occures-in.html
5-بررسی انواع سوالهای مطرح شده در سایت stackoverflow.com و جوابهای آنها مانند:
http://stackoverflow.com/questions/14198204/android-app-force-closing
http://stackoverflow.com/questions/19977856/android-caused-by-java-lang-nullpointerexception
و...
با معرفی کانال ما به دوستان و در گروه های خودتون ما رو حمایت کنین تا آموزش ها ادمه پیدا کنه. ❤️❤️
@androiddevelop
@mohamadghaffari
لینک گروه ما جهت پرسش و پاسخ (تلگرامتون رو به آخرین نسخه باید آپدیت کنین):
https://telegram.me/joinchat/B1f7ETv_ZoJDk2dr0ES0rQ
Android Developers
<application> | App architecture | Android Developers
The declaration of the application. This element contains subelements that declare each of the application's components and has attributes that can affect all the components. Many of these attributes (such as icon, label, permission, process, taskAffinity…
دوستان در حال آماده سازی قسمت های بعدی آموزش بالا هستیم لطفا صبور باشین سورپرایزم داریم براتون 😊
@androiddevelop
@androiddevelop
#لایبرری #photo_view #custom_library #image_viw
سلام ... همونطور که می دونین image view در حالت دیفالت قابلیت زوم کردن رو نداره و خیلی از اوقات شما عکس هایی در برنامتون دارین که نیاز به زوم داره مانند نقشه ... در این حالت بعضی از افراد از web view برای اینکار استفاده می کنند که اصلا جالب نیست !! اما یه کتابخونه وجود داره که با implement کردن image view زوم رو بهش اضافه کرده و یه View Pager داره که مانند یک گالری می تونین تصاویر رو توش بریزین و با سوییپ کردن بین تصاویر حرکت کنین ! پس این لایبرری رو از دست ندین .
@androiddevelop
سلام ... همونطور که می دونین image view در حالت دیفالت قابلیت زوم کردن رو نداره و خیلی از اوقات شما عکس هایی در برنامتون دارین که نیاز به زوم داره مانند نقشه ... در این حالت بعضی از افراد از web view برای اینکار استفاده می کنند که اصلا جالب نیست !! اما یه کتابخونه وجود داره که با implement کردن image view زوم رو بهش اضافه کرده و یه View Pager داره که مانند یک گالری می تونین تصاویر رو توش بریزین و با سوییپ کردن بین تصاویر حرکت کنین ! پس این لایبرری رو از دست ندین .
@androiddevelop
#دانلود #android_sdk
http://theandroidbeta.blogspot.com/p/direct-download-android-sdk.html
دوستانی که با گرفتن جدیدترین sdk ها مشکل دارن این سایت جدیدترین لینک های مستقیم گوگل رو میذاره پس می تونین با فیلتر شکن و IDM (Internet Download Manager)
دانلود کنین سرعت دانلود با خود sdk manager خیلی پایینه اما با IDM سرعت بسیار بالایی داره.
پس از دانلود فایلهای مورد نیاز اونها رو در پوشه temp در Sdk بریزین و سپس وارد Sdk Manager شده و پس از انتخاب package ها بر روی install packages کلیک کنین . 👇👇👇
@androiddevelop
http://theandroidbeta.blogspot.com/p/direct-download-android-sdk.html
دوستانی که با گرفتن جدیدترین sdk ها مشکل دارن این سایت جدیدترین لینک های مستقیم گوگل رو میذاره پس می تونین با فیلتر شکن و IDM (Internet Download Manager)
دانلود کنین سرعت دانلود با خود sdk manager خیلی پایینه اما با IDM سرعت بسیار بالایی داره.
پس از دانلود فایلهای مورد نیاز اونها رو در پوشه temp در Sdk بریزین و سپس وارد Sdk Manager شده و پس از انتخاب package ها بر روی install packages کلیک کنین . 👇👇👇
@androiddevelop
سلام دوستان در مورد تاخیر بین آموزش ها عرض کنم که واقعا هر آموزش آماده سازیش زمان زیادی رو میبره و مطالب اختصاصیه پس نمیشه هر روز آموزش گذاشت ولی تمام تلاشمون رو می کنیم که آموزش ها مستمر باشه ...
#اعماق_اندروید #معماری_اندروید #سید_حسن_هاشمی
در جلسات قبلی سری مقالات اعماق اندروید به بررسی Task ها در اندروید پرداختیم و اون بخش هنوز ادامه داره امروز معماری اندروید رو می خواهیم براتون شرح بدیم که هر برنامه نویس اندرویدی باید با معماری این سیستم عامل آشنا باشه تا بتونه براش برنامه های کاربردی بنویسه ... سری آموزش های معماری اندروید توسط آقای سید حسن هاشمی نوشته شده و با اجازه خودشون در اینجا قرار داده میشه .
شروع آموزش:
فکر نمی کنم نیازی باشه که بخوایم اهمیت درک معماری سیستم عاملی که داریم ازش استفاده و یا احیاناً داریم براش برنامه می نویسیم رو اثبات کنیم.
درک عمیق از کمپوننت های مختلف شکل دهنده ساختار سیستم عامل به ما کمک می کنه تا حداکثر استفاده رو از امکانات فراهم شده توسط اون رو داشته باشیم. که از قضا اندروید هست برای این پست.
برای مثال در سیستم عامل ویندوز درک درست و حسابی از process management برای تضمین امنیت نرم افزار مهمه.
و یا مدل مدیریت thread ها که توی Multi threading حیاتیه.
برای سیستم عامل اندروید هم از این مثال ها میشه زد.
اولش می خواستم توی یه پست اینکارو انجام بدم، اما دیدم دیاگرام توضیحات زیادی داره و توی یه پست خیلی طولانی میشه. در نتیجه به صورت چند پست می نویسمشون.
برای اولین میریم سراغ خاستگاه لینوکسی اندروید.
پس برای شروع دیاگرام رو میذارم:
در جلسات قبلی سری مقالات اعماق اندروید به بررسی Task ها در اندروید پرداختیم و اون بخش هنوز ادامه داره امروز معماری اندروید رو می خواهیم براتون شرح بدیم که هر برنامه نویس اندرویدی باید با معماری این سیستم عامل آشنا باشه تا بتونه براش برنامه های کاربردی بنویسه ... سری آموزش های معماری اندروید توسط آقای سید حسن هاشمی نوشته شده و با اجازه خودشون در اینجا قرار داده میشه .
شروع آموزش:
فکر نمی کنم نیازی باشه که بخوایم اهمیت درک معماری سیستم عاملی که داریم ازش استفاده و یا احیاناً داریم براش برنامه می نویسیم رو اثبات کنیم.
درک عمیق از کمپوننت های مختلف شکل دهنده ساختار سیستم عامل به ما کمک می کنه تا حداکثر استفاده رو از امکانات فراهم شده توسط اون رو داشته باشیم. که از قضا اندروید هست برای این پست.
برای مثال در سیستم عامل ویندوز درک درست و حسابی از process management برای تضمین امنیت نرم افزار مهمه.
و یا مدل مدیریت thread ها که توی Multi threading حیاتیه.
برای سیستم عامل اندروید هم از این مثال ها میشه زد.
اولش می خواستم توی یه پست اینکارو انجام بدم، اما دیدم دیاگرام توضیحات زیادی داره و توی یه پست خیلی طولانی میشه. در نتیجه به صورت چند پست می نویسمشون.
برای اولین میریم سراغ خاستگاه لینوکسی اندروید.
پس برای شروع دیاگرام رو میذارم:
توی این دیاگرام قسمت قرمز رنگ به زبان C و Assembly نوشته شده، قسمت سبز رنگ ++C و قسمت آبی هم کاملاً جاوا هست.
@androiddevelop
همونجور که می دونید اندروید مبتنی بر kernel 2.6 لینوکس هستش.
برای این که از بحث اصلی دور نشیم و هم یه یاد آوری بشه یه توضیح مختصری از کرنل:
kernel بخشی از سیستم عامل هست که دسترسی بخش های مختلف سیستم عامل رو به منابع سخت افزار فراهم و مدیریت می کنه. در ساده ترین حالت thread ی کد برنامه شما رو اجرا می کنه از قلب kernel رد میشه:) و به cpu میرسه.
به علاوه که kernel دسترسی شما رو به سخت افزار به صورت انتزاعی برآورده می کنه و از اونطرف خودش با استفاده از درایوارهایی که زمان اجرا لود می کنه به صورت واقعی به سخت افزار دسترسی پیدا می کنه. به صورت اختصاری به این کار می گن HAL .
توضیحات در مورد HAL در حیطه این پست نیست.
خب برگردیم به بحث اصلیمون، کرنل لینوکس مدیریت process، مدیریت حافظه و... رو فراهم می کنه. اما ...
اما اندروید از Linux kernel بیشتر به عنوان لایه ای که انتزاع کننده سخت افزار هست استفاده می کنه. (نه به این معنی که بقیه جاهاش رو بی خیال شده ) چون اگر واقع بین باشیم واقعاً خوب پیاده سازی شده و کاراییش در این بخث ثابت کرده.
در Kernel 2.6 بهینه سازی خیلی خیلی زیادی انجام شد تا بتونن برای دیوایس های با cpu و مموری پایین ازش استفاده کنند.
حالا این حرف هایی که زدیم به این معنیه که فی المثل اگه شما روزی خواستین یه Device بسازید که از سیستم عامل اندروید استفاده می کنه، اولین کاری که باید بکنید اینه که برای سخت افزارهایی مثل دوربین، یو اس بی ... درایورهایی بنویسید. که از قواعد کرنل لینوکس پیروی می کنن.
که در واقع توی ++C چیزی فراتر از یه سری header نیستن، توابع اجباری رو پیاده سازی می کنید و بعد اونا رو به عنوان module در اختیار کرنل لینوکس قرار بدید. بقیه اش با خودش؛ یه جورایی منو یاده windows service میندازه :)
@androiddevelop
همونجور که می دونید اندروید مبتنی بر kernel 2.6 لینوکس هستش.
برای این که از بحث اصلی دور نشیم و هم یه یاد آوری بشه یه توضیح مختصری از کرنل:
kernel بخشی از سیستم عامل هست که دسترسی بخش های مختلف سیستم عامل رو به منابع سخت افزار فراهم و مدیریت می کنه. در ساده ترین حالت thread ی کد برنامه شما رو اجرا می کنه از قلب kernel رد میشه:) و به cpu میرسه.
به علاوه که kernel دسترسی شما رو به سخت افزار به صورت انتزاعی برآورده می کنه و از اونطرف خودش با استفاده از درایوارهایی که زمان اجرا لود می کنه به صورت واقعی به سخت افزار دسترسی پیدا می کنه. به صورت اختصاری به این کار می گن HAL .
توضیحات در مورد HAL در حیطه این پست نیست.
خب برگردیم به بحث اصلیمون، کرنل لینوکس مدیریت process، مدیریت حافظه و... رو فراهم می کنه. اما ...
اما اندروید از Linux kernel بیشتر به عنوان لایه ای که انتزاع کننده سخت افزار هست استفاده می کنه. (نه به این معنی که بقیه جاهاش رو بی خیال شده ) چون اگر واقع بین باشیم واقعاً خوب پیاده سازی شده و کاراییش در این بخث ثابت کرده.
در Kernel 2.6 بهینه سازی خیلی خیلی زیادی انجام شد تا بتونن برای دیوایس های با cpu و مموری پایین ازش استفاده کنند.
حالا این حرف هایی که زدیم به این معنیه که فی المثل اگه شما روزی خواستین یه Device بسازید که از سیستم عامل اندروید استفاده می کنه، اولین کاری که باید بکنید اینه که برای سخت افزارهایی مثل دوربین، یو اس بی ... درایورهایی بنویسید. که از قواعد کرنل لینوکس پیروی می کنن.
که در واقع توی ++C چیزی فراتر از یه سری header نیستن، توابع اجباری رو پیاده سازی می کنید و بعد اونا رو به عنوان module در اختیار کرنل لینوکس قرار بدید. بقیه اش با خودش؛ یه جورایی منو یاده windows service میندازه :)
یه نکته مثبتی دیگه ای که کرنل لینوکس داره، و برمیگرده به ماهیت اوپن سورس بودن اینه که خیلی زیاد قابل سفارشی کردنه. یعنی تا جایی که من متوجه شدم و سورس های این دوتا رو (کرنلی که گوگل استفاده می کنمه وکرنل اورجینال لینوکس) خیلی جاهاش توی کرنل اندروید حذف شدن و منطقی هم هست چون کرنل لینوکس برای سیستم بزرگتری تدارک دیده شده در حالیکه کرنل اندروید امکانات محدودتری نیاز داره.
توی دیاگرام در بخش کرنل قسمت های دیگه ای هم هستن که فکر نمی کنم نیازی به توضیح داشته باشن:)
اما فکر می کنم Binder (IPC) Driver رو یه نگاهی باید بهش بکنیم.
یه خاصیت جالب دیگه کرنل لینوکس هم اینه که برای ارتباط بین دو تا process مکانیزمش تحمیل نمی کنه، یعنی لفظ کلمه driver همه چیز رو حل می کنه. یعنی داره میگه اگه مکانیزم پیش فرض لینوکس برای ارتباط خارج از process رو نمی پسندید کافیه یه درایور بنویسید.
در واقع سازندگان اندروید موقعی که می خواستن مکانیزم Binding رو برای Interprocess Communication پیاده سازی کنن تنها لازم بود یه درایور بنویسن. که همین کارو هم کردن به خاطر همین اسم مکانیزم فعلی اندروید برای اینکار Binder IPC Driver هست.
Binder واقعاً مکانیزم ساده ای هست که کارو برای برنامه نویسان اندروید راحت می کنه و یه جورایی داره سعی می کنه دردسرهایی که مکانیزم های ویندوز برای ارتباط خارج از process رو داشت رفع کنه. (البته چون ویندوز سیستم عامل گسترده تری اون دردسرها اجتناب ناپذیر هستن).
یه دیاگرام از مراحل عملکرد BInder رو که تو گوگل پیدا کردم براتون می ذارم:
توی دیاگرام در بخش کرنل قسمت های دیگه ای هم هستن که فکر نمی کنم نیازی به توضیح داشته باشن:)
اما فکر می کنم Binder (IPC) Driver رو یه نگاهی باید بهش بکنیم.
یه خاصیت جالب دیگه کرنل لینوکس هم اینه که برای ارتباط بین دو تا process مکانیزمش تحمیل نمی کنه، یعنی لفظ کلمه driver همه چیز رو حل می کنه. یعنی داره میگه اگه مکانیزم پیش فرض لینوکس برای ارتباط خارج از process رو نمی پسندید کافیه یه درایور بنویسید.
در واقع سازندگان اندروید موقعی که می خواستن مکانیزم Binding رو برای Interprocess Communication پیاده سازی کنن تنها لازم بود یه درایور بنویسن. که همین کارو هم کردن به خاطر همین اسم مکانیزم فعلی اندروید برای اینکار Binder IPC Driver هست.
Binder واقعاً مکانیزم ساده ای هست که کارو برای برنامه نویسان اندروید راحت می کنه و یه جورایی داره سعی می کنه دردسرهایی که مکانیزم های ویندوز برای ارتباط خارج از process رو داشت رفع کنه. (البته چون ویندوز سیستم عامل گسترده تری اون دردسرها اجتناب ناپذیر هستن).
یه دیاگرام از مراحل عملکرد BInder رو که تو گوگل پیدا کردم براتون می ذارم: