معماری اپلیکیشن های اندروید

در این نوشته به معماری اپلیکیشن های اندروید و بررسی فایل AndroidManifest.xml می پردازم.

۱- AndroidManifest.xml
تنظیمات و کامپوننت ها و Permissionهای استفاده شده در یک برنامه، در فایل AndroidManifest.xml تعریف می شوند. برای مثال تمامی Activityها و Serviceهای یک برنامه باید در این فایل تعریف شوند.
این فایل دربرگیرنده سطوح دسترسی و یا Permissionها نیز هست. برای مثال اگر برنامه نیاز به دسترسی به اینترنت داشته باشد باید مانند زیر در این فایل ثبت شود:

خاصیت package در واقع کلاس پایه ایست که اشیاء جاوا به آن اشاره کنند. اگر اشیاء جاوا مرتبط به پکیج دیگری باشند، آن پکیج باید کاملا تعریف شود.
Google Play مقید به این هست که هر برنامه دارای پکیج یکتای خود باشد. به همین دلیل بود که در معرفی پکیج من از ir.mohammadi استفاده کردم. این کار مانع از یکی شدن نام برنامه ها می شود.
android:versionName و android:versionCode تعیین کننده نسخه برنامه هستند. versionName نسخه ای است که کاربران می بینند و می تواند هر عددی باشد. اما versionCode یک عدد است. اندروید مارکت، فقط به versionCode کار دارد و اگر شما می خواهید برای برنامه خود نسخه جدیدتری را ارائه دهید، versionCode نسخه جدید حتما باید از نسخه فعلی بیشتر باشد.
تگ activity یک Activity را تعریف می کند. در کد بالا تگ activity به کلاس Convert در پکیج ir.mohammadi.android.temperature اشاره دارد. تگ intent-filter نیز برای این کلاس تعریف شده است تا وقتی که این Activity اجرا شد، برنامه اجرا شود (به واسطه android:name=”android.intent.action.MAIN”). تگ category android:name=”android.intent.category.LAUNCHER” نیز تعریف می شود تا برنامه به منوهای دستگاه اندرویدی اضافه شود.
مقدار string/app_name@ به فایل های منبع یا resource اشاره می کند که شامل مقداری ست که نام برنامه را تعیین می کند. مزیت استفاده از فایل های resource این هست که می توان resourceهای متفاوتی با نوع های متفاوت ایجاد کرد و از آن در تمامی برنامه استفاده کرد. مزیت دیگر آن توانایی ترجمه برنامه به زبان های دیگر است.
uses-sdk که بخشی از فایل AndroidManifest.xml است، در واقع تعیین کننده پایین ترین نسخه اندروید SDK مورد نظر برای اجرای برنامه است. با استفاده از uses-sdk، برنامه بر روی نسخه های اندروید پایین تر از نسخه تعیین شده اجرا نمی شود.

۲- Activityها و چرخه حیات
سیستم اندروید چرخه حیات برنامه ها را کنترل می کند. ممکن است اندروید در هر زمانی، برنامه را از بین ببرد (destroy) و یا به حالت تعلیق (stop) ببرد. این تبدیل حالت ممکن است به خاطر برقراری یک تماس باشد. اندروید چرخه حیات هر Activity را بر اساس متدهای از پیش تعریف شده کنترل می کند. مهمترین این متدها عبارتند از:
()onSaveInstanceState : پس از اینکه Activity معلق شد، صدا زده می شود. این تابع برای دخیره اطلاعات به کار برده می شود بنابراین برنامه به واسطه این ذخیره اطلاعات، می تواند در حالت قبل دوباره شروع به کار کند.
()onPause : وقتی که Activity پایان می یابد، صدا زده می شود و برای دخیره اطلاعات یا آزاد کردن منابع به کار برده می شود.
()onResume : وقتی صدا زده می شود که برنامه، مجددا شروع به کار کند و می تواند برای مقداردهی اولیه فیلدها به کار رود.

۳- تغییر تنظیمات
همیشه ممکن است یک Activity راه اندازی مجدد شود. بنابراین نیاز به تغییرات تنظیمات می باشد. این تغییر تنظیمات ممکن است به هر دلیلی اتفاق بیفتد. برای مثال اگر کاربر جهت (Orientation) گوشی خود را عوض کند این تغییر تنظیمات نیاز خواهد بود. چون اندروید فرض را بر این دارد که Activity نیاز به منابع دیگری در این جهت دارد و در نتیجه Activity راه اندازی مجدد می شود.
در ایمولاتور با Ctrl+F11 می توانید جهت گوشی را عوض کنید.
یکی از امکاناتی که اندروید در اختیار ما قرار می دهد این است که می توان از راه اندازی مجدد برنامه و به دنبال آن تغییر تنظیمات جلوگیری کرد. این کار با تعریف خاصیت configChanges در تگ Activity مورد نظر در فایل AndroidManifest.xml انجام می گیرد. در کد زیر Activity مورد نظر با تغییر جهت یا مکان کیبورد تغییر نخواهد کرد:

۴- Context
کلاس android.content.Context امکان اتصال به سیستم اندروید و منابع پروژه را فراهم می آورد. این کلاس رابط اطلاعات در مورد محیط نرم افزار نیز هست.
Context امکان اتصال به سرویس ها مانند سرویس موقعیت یابی را نیز فراهم می آورد.
Activityها و Serviceها کلاس Context را گسترش می دهند.

decompile اپلیکیشن های اندروید

یکی از راه های یادگیری برنامه نویسی، دیدن نمونه کدها است. یادگیری برنامه نویسی اندروید هم از این قانون مستثنی نیست. هرچند که در اینترنت کدهای زیادی برای استفاده و یادگیری وجود دارد اما اکثر این کدها کامل نیستند و تمامی جنبه ها را بررسی نمی کنند. البته دو سایت CodePlex و CodeProject شامل این موضوع نمی شوند.
برای دیدن سورس کد هر برنامه ای شما نیاز به انجام عملیات معکوسی هستید. اگر در هنگام ساخت برنامه، کدهای برنامه که برای شما قابل فهم هست به زبان ماشین کامپایل می شوند، برای دیدن کدها شما نیاز دارید که کدهای قابل فهم برای ماشین را به کدهای قابل فهم برای خودتان تبدیل کنید. یعنی مهندسی معکوس.
برای decompile اپلیکیشن های اندروید ، در ابتدا نیاز به فایل APK برنامه دارید. این فایل را به هر طریقی می توانید به کامپیوتر خود وارد کنید، چه با وصل مستقیم کارت حافظه چه با استفاده از کابل یا شبکه. اما من به شما توصیه می کنم حتما از برنامه رایگان و سورس باز DroidExplorer استفاده کنید. این برنامه علاوه بر کاربردی بودن، با مرور سورس آن جنبه آموزشی بالایی دارد.

روش decompile اپلیکیشن های اندروید

پس از کپی فایل APK، آن را با Winrar یا ۷Zip یا هر برنامه مدیریت فایل های فشرده باز کنید. همانطور که مشاهده می کنید، پوشه هایی با نام پوشه های پروژه ها در Eclipse وجود دارند.
اما مهمترین فایل موجود فایل classes.dex است. تمامی کلاس ها و کدهای جاوای نوشته شده در یک فایل به نام classes.dex تجمیع و تبدیل می شوند. این تبدیل به خاطر این هست که کدبایت جاوا با کدبایت Dalvik که ماشین مجازی اندروید هست، تفاوت دارد. dex کوتاه شده Dalvik Executable است.
مرحله دوم تبدیل dex به کدهای جاوا هست. برای این کار ابتدا برنامه dex2jar را از اینجا دانلود کنید. محتویات این فایل را Extract کنید. سپس Command Prompt را باز کنید و دستورات زیر را وارد کنید:

اگر در لینوکس هستید، به جای dex2jar.bat از dex2jar.sh در کد بالا استفاده کنید.
در مکانی که فایل classes.dex بود، یک فایل classes_dex2jar.jar ایجاد شده است. پس از این مرحله سورس کدها به کدهای جاوا با پسوند jar. تبدیل شده اند. برای مشاهده کدها برنامه رایگان JD-GUI را از اینجا دانلود کنید.
برنامه را باز کنید و فایل تبدیل شده مورد نظر را انتخاب کنید. کلاس های برنامه اولیه را می توانید مشاهده کنید.