تالار گفتمان nCIS.ir

نسخه‌ی کامل: توسعه برنامه های اندروید با ابزارهای خط فرمان
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
گوشی روت شده و SSH توی این کار مفید هستن، ولی واجب نیستن.

یکی از اساسی ترین برنامه های خط فرمان اندروید adb است.

با فرمان adb devices میتونید لیست وسایل اندروید مجازی یا واقعی رو که در حال حاضر در سیستم در دسترس هستن مشاهده کنید.

با adb pull و دادن مسیر و اسم فایل روی گوشی میتونید فایل رو از گوشی روی PC دانلود کنید.

با adb push میشه فایلی رو از PC به روی گوشی کپی کرد.

adb shell به شما یک شل و محیط خط فرمان گوشی رو میده. البته این کار رو با ssh هم میتونید انجام بدید، ولی مزیت adb هم اینه که نیازی به نصب و اجرای سرور SSH روی گوشی نداره و ضمنا نیازی به Tether بودن گوشی هم نداره

با adb install و adb uninstall هم میشه پکیج یا همون برنامه های apk اندروید رو نصب و آنیستال کرد (باید نام پکیج برنامه رو به فرمان uninstall بدید – مثلا com.exmple.test).
ایجاد یک پروژهء اندروید از صفر در یک فولدر از پیش ایجاد شده:

android create project --target 1 --path . --activity Test --package test.test

اون فرمان android که اولش زدیم روی ویندوز همون batch file (فایل با پسوند bat) با اسم android است که در پوشهء tools در پوشهء Android SDK قرار داره است. شما میتونید در محیط گرافیکی ویندوز اون فایل bat رو به پنجرهء command prompt بکشید و رها کنید که اینطوری آدرسش برای اجرا رو بصورت خودکار براتون در خط فرمان درج میکنه، و بعدش شما پارامترهای فرمان رو که در مثال بالا آمده جلوش اضافه میکنید.

با فرمان android list targets شما میتونید لیستی از نسخه های اندروید که روی سیستمتون نصب دارید رو مشاهده کنید.

خب درمورد پارامترها توضیح بدم. با پارامتر target داریم میگیم که برناممون تحت کدوم نسخهء اندروید/کتابخانه اندروید که البته باید روی سیستم هم اون کتابخانه رو جزو Android SDK نصب کرده باشیم، کامپایل و اجرا بشه. با فرمان android list targets شما میتونید لیستی از نسخه های اندروید که روی سیستمتون نصب دارید رو مشاهده کنید.

پارامتر activity میگه که توی فایلهای پروژهء ما یک activity اصلی به این نام ایجاد کن (در جریان یادگیری برنامه نویسی اندروید میفهمید که activity به هر یک از صفحات UI یک برنامهء اندروید گفته میشه و یک نکته اینکه activity اصلی اونیه که موقعی که برنامه برای اولین بار اجرا میشه اجرا میشه و بنابراین اینترفیس اون نمایش داده میشه).
Package هم که اسم پکیجی هست که برای برناممون انتخاب میکنیم، که بازم در جریان یادگیری برنامه نویسی اندروید خودتون باید بفهمید چیه. البته من از اسمهای خیلی ساده و بی معنی و غیراستانداردی برای اینطور چیزها استفاده کردم چون فقط قصد داریم کلیت و ساختار کلی مفاهیم دیگری رو آموزش بدیم و تست کنیم و بحث درونی خود برنامه نویسی اصلی نیست.
خب حالا شما میتونید برنامهء اندروید Hello World ایجاد شده رو دستکاری کنید و تغییر یا گسترش بدید، یا همون رو برای اولین بار و بعنوان اولین نمونه کامپایل و تست کنید.
قبل از اینکه بتونیم پروژه رو کامپایل کنیم باید یک ابزار جداگانه ای بنام Apache Ant رو هم دانلود و آماده کنیم.

شما خیلی ساده فایل زیپ محتوی سیستم ant رو دانلود کنید، توی دایرکتوری مخصوص خودش هرجا که میخواید اکسترکت کنید، همین، هیچ فایل setup/install مثل برنامه های کلاسیک ویندوزی در کار نیست. اما بعدش ما باید قبل از استفاده در خط فرمان چندتا متغییر محیطی رو set کنیم. من برای این منظور یک batch file با نام setant.bat نوشتم و انداختم توی فولدر ویندوز که هر بار مجبور نباشم این دستورات رو مجددا تایپ کنم. یعنی به این شکل کافیه در خط فرمان تایپ کنم setant تا این متغییرها ست بشن. محتوی فایل setant.bat من اینه:

@ echo off
set ANT_HOME=c:ant
set JAVA_HOME=C:Program FilesJavajdk1.7.0_71
set PATH=%PATH%;%ANT_HOME%bin

به ANT_HOME مسیر پوشه ای که فایلهای ant توش قرار داره رو میدید. از آدرس مال من مشخصه که برای من این سیستم در پوشه ای بنام ant در درایو C قرار داشته.
به متغییر JAVA_HOME آدرس پوشه ای که توش JDK رو نصب کردید میدید.

پس بعد از اینکه اون batch file رو درست کردید و در پوشهء ویندوز خودتون انداختید، در خط فرمانی که میخواید باهاش برنامهء اندروید رو کامپایل کنید، دستور setant رو تایپ کنید و Enter رو بزنید. با این کار batch file ما اجرا شده و آدرسهای لازم برای استفاده از سیستم ant رو ست میکنه.

خب حالا با دستور ant debug میتونیم برنامهء اندروید رو کامپایل کنیم (دقت کنید که دایرکتوری جاری خط فرمان شما باید پوشهء پروژهء اندروید شما باشه). با اجرای فرمان ant debug اگر مشکلی در کدها و مراحل کامپایل نباشه، شما در نهایت پیام BUILD SUCCESSFUL رو در قسمتهای پایانی پیامهای خروجی مشاهده میکنید؛ در غیر این صورت پیام BUILD FAILED رو مشاهده میکنید و معمولا در قسمت پیامهایی که با برچسب [javac] در خروجی مشخص شدن که بنابراین مشخصه که پیامهای خروجی کامپایلر جاوا هستن باید به دنبال خطاهای کدتون بگردید، مگر اینکه علت خطا در بخش و سیستم و جریان دیگری غیر از کدهای برنامهء شما و مرحلهء کامپایل جاوا باشه.

خب حالا اگر دستور ant debug رو با موفقیت اجرا کرده باشید، فایل apk پروژهء شما در پوشهء bin ایجاد شده. البته اونجا بیش از یک فایل apk است ولی اونی که اسمش مثلا درمورد پروژهء ما Test-debug.apk است فایل مورد نظر ماست. شما میتونید این فایل رو به هر طریقی روی گوشی ببرید و نصب کنید، یا اینکه اگر گوشی شما به PC وصله و در لیست خروجی adb devices شناسایی شده، یا اینکه یک گوشی مجازی رو توسط امولیتور (emulator) اندروید روی PC آماده دارید (اگر کاملا آماده شده باشه باید در لیست خروجی دستور adb devices مشخص باشه و دقت کنید که وضعیت اون رو offline نزده باشه)، با دستوراتی که در فایل build اندروید برای سیستم ant نوشته شده بصورت خودکار روی گوشی کپی و نصب کنید.
دستور برای انتقال و نصب فایل apk تولید شده مرحله قبل روی گوشی اینه:
ant installd

دقت کنید اون d انتهای کلمهء install به این معنی هست که میگیم میخوایم نسخهء debug برنامه رو نصب کنیم. اگر بخوایم نسخهء release که در واقع نسخهء نهایی و رسمی انتشار برنامه است رو نصب کنیم، از دستور ant installr استفاده میکنیم. اما درست کردن نسخهء release با قابلیت نصب و انتشار نهایی نیازمند مراحل تولید کلید شخصی (که میتونید خودتون هم براحتی و رایگان تولید کنید) و امضاء دیجیتال فایل apk است که بعدا توضیح میدم. نسخهء debug برنامه های اندروید توسط یک کلید debug بطور خودکار امضاء میشه، اما این کلید فقط برای همین توسعه و تست و موقتی است نمیشه یا نباید ازش برای نسخهء نهایی و انتشار برنامه ها استفاده کرد.
خب ما طرز ایجاد و کامپایل و نصب یک پروژهء اندروید توسط خط فرمان رو تا اینجا شرح دادیم؛ اما بعضی وقتا هست که میخوایم یک پروژهء اندروید رو که از قبل وجود داره (و شاید مثلا توسط سیستم دیگری مثل Eclipse ایجاد شده) توسط خط فرمان کامپایل کنیم.

بعنوان نمونه، من از sample هایی که با android sdk نصب کردم یکی رو برمیدارم. مثلا پروژه ای بنام NotePad رو از C:Program Filesandroid-sdksamplesandroid-16 بردارید و جای دیگری کپیش کنید. حالا خط فرمان رو باز کرده و وارد پوشه NotePad میشیم، فرمان setant رو اجرا میکنیم، بعد ant debug. این پیام خطا رو دریافت میکنیم:
Buildfile: build.xml does not exist!

حال این فرمان رو اجرا میکنیم:
android.bat update project --path . --target 1

خب حالا که این فرمان با موفقیت اجرا شد اگر در فولدر پروژه نگاه کنید میبینید که یکسری فایلهای لازم برای ant بهش اضافه شدن. بعدم که با فرمانهای ant میتونید پروژه رو کامپایل و روی گوشی آپلود و نصب کنید (من این مراحل رو هم تست کردم و به مشکلی برنخوردم).

راستی بعدا این روش رو یه پروژه دیگری هم تست کردم، ولی فرق اون پروژه این بود که خودش یک فایل build.xml داشت (ظاهرا توسط Eclipse ایجاد شده بود). در این مورد با خطا و دستورالعمل های خاصی مواجه شدم که بیش از حد پیچیده کننده بودن. بنابراین اون فایل build.xml خود پروژه رو دلیت کردم و اونوقت مراحل رو مثل مثال قبلی انجام دادم و مشکل حل شد! البته شاید این روش درمورد همهء پرژه های اینچنینی جواب نده، اما این تجربه رو هم گفتم که بدونید و اگر برخورد کردید تستش کنید شاید مشکل رو حل کنه.

یه مورد کاربرد دیگر برای android.bat update project که هست، مثلا میاید فولدر پروژه ای رو که دارید روش کار میکنید کپی میکنید روی یه سیستم دیگه، ولی وقتی فرمان ant debug رو اجرا میکنید به شما چنین خطایی میده:

BUILD FAILED
D:tmpsms-serverbuild.xml:90: Cannot find C:old c Program Filesandroid-sdktoolsantbuild.xml imported from D:tmpsms-serverbuild.xml

این بخاطر اینه که آدرس نصب android-sdk در سیستم جدید با سیستم قبلی فرق داره و در فایلهای پیکربندی پروژهء ما آدرس نصب SDK قبلی درج شده (محتویات فایل local.properties در ریشهء فولدر پروژه رو نگاه کنید).

برای حل این مشکل، ما این دستور رو اجرا میکنیم:
android.bat update project -p .
بعدش مشکل حله و میتونیم پروژه رو روی سیستم جدید هم کامپایل کنیم.
خب مباحث بعدی که میخوام آموزش بدم اینجا لیست میکنم که خودمم یادم نره:
  • logcat
  • adb via tcp
  • release
  • proguard
  • sign
  • align
  • javadoc
تقریبا تمام برنامه نویسها باید بدونن که چاپ کردن پیامهایی به کنسول/ترمینال یا همون محیط متنی خشک و خالی، توی برنامه نویسی برای دیباگ کردن چقدر مفیده، حتی موقعی که داریم برنامه های کاملا گرافیکی می نویسیم.

حالا درمورد اندروید ولی چطور میشه این کار رو کرد؟ چون اندروید اینطوری نیست که فرضا شما توی جاوا بصورت استاندارد یه چیزی رو بفرستید به stdout (با توابعی مثل print) و یه پنجرهء متنی باز بشه و پیام رو نشون بده.

بخصوص وقتی دارید مثل من با ابزارهای خط فرمان برنامه های اندروید رو توسعه میدید، بلد بودن روش انجام این کار خیلی مهمتره.

در اندروید باید اینطور عمل کرد:

- ابتدا در فایل سورس مورد نظر این رو اضافه کنید:
import android.util.Log;
- حالا هرجا که میخواید پیام دیباگ چاپ کنید به شکل این مثال عمل کنید:
Log.d("custom_tag", "your debug message");
این دستور پیام your debug message رو به سیستم لاگینگ اندروید ارسال میکنه که اونجا ثبت میشه. فرقی و مزیتی هم که نسبت به پرینت معمولی پیامها به stdout داره اینه که پیامها در سیستم لاگ اندروید ذخیره میشن و به این زودی از بین نمیرن (مگر اینکه خودتون پاک کنید) و میتونید بصورت ریل تایم یا بعدا هروقت که نیاز شد اونا رو بارها بررسی کنید.

custom_tag یک رشته ای هست که بعدا برای پیدا کردن پیامهای خاص برنامهء شما در بین انبوه پیامهای موجود برنامه های مختلف در سیستم لاگ اندروید، استفاده خواهید کرد.

خب حالا ما چطور پیامهای سیستم لاگ اندروید رو در خط فرمان مشاهده کنیم؟

وقتی دیوایس واقعی یا امولیتور اندروید مورد نظر به سیستم شما اتصال داره این دستور رو بزنید (البته من فرض کردم که فقط یک دیوایس در حال حاضر روی سیستم است):
adb.exe logcat
با اجرای این دستور مشاهده خواهید کرد که یک عالمه پیام لاگ روی صفحه رژه میرن که مربوط به تمام برنامه های اندروید هست که از قبل تولید شدن و حالا هم بعضیا همچنان در حال تولید این پیامها هستن. برای خارج شدن از این حالت، ctrl+c رو بزنید.

حالا ما فقط پیامهای برنامهء خودمون رو چطوری جدا کنیم؟
این دستور:
adb.exe logcat custom_tag:d *:s
این کار رو برامون انجام میده.
این دستور پیامهای دیباگ برنامه تاکنون رو که در سیستم لاگ ثبت شدن نشون میده، و ضمنا همینطور منتظر میمونه و اگر برنامهء ما پیام جدیدی ارسال کرد، اون رو بصورت ریل تایم نشون میده.

البته این دستور یکسری جزییات و امکانات بیشتری داره ولی من خلاصه مختصر و مفید موارد اصلی و بدردبخور رو گفتم. ولی با این حال بازم بیشتر توضیح میدم (نه کامل). برای اطلاعات کاملش به رفرنس های مربوطه مراجعه کنید.

راستی اونکه نوشتم adb.exe، خواستم مثال خلاصه و تمیز باشه، وگرنه من آیکون این فایل رو از پوشهء android-sdkplatform-tools درگ میکنم به پنجرهء خط فرمان، که اینطوری آدرس مطلقش در اونجا درج میشه و قابل اجرا است. همینطوری اگر بزنید adb یا adb.exe این برنامه اجرا نمیشه، مگر اینکه در مسیر دایرکتوری جاری خط فرمان شما باشه یا دایرکتوریش در متغییر path خط فرمان شما اضافه شده باشه (البته برای ویندوز رو میگم؛ درمورد لینوکس شاید از قبل در مسیر فایلهای اجرایی باشه).

برای اینکه امکانات و ساختار این فرمان دستتون بیاد بیشتر توضیح میدم:

اگر میخواید پیامهای لاگ اندروید رو بطور کلی پاک کنید این دستور رو بزنید:
adb.exe logcat -c
این دستور البته پیامهای تمام برنامه ها و سیستمهای اندروید رو پاک میکنه، نه فقط پیامهای برنامهء شما رو.

اگر میخواید فقط پیامهای لاگ دارای سطح Error (و بالاتر) رو مشاهده کنید این دستور رو میزنید:
adb.exe logcat *:s *:e
برای سطح debug و بالاتر:
adb.exe logcat *:s *:d
اون حروف e و d معرف همین سطوح ذکر شده هستن. سطوح دیگری هم داریم که توی رفرنس ها میتونید پیدا کنید.

توی برنامهء خودتون هم میتونید پیامهای لاگ در سطوح مختلف رو چاپ کنید (مثالی که من زدم سطح debug بود). مثلا برای چاپ پیام در سطح information از این دستور استفاده می کنید: Log.i برای سطح warning از Log.w و غیره.

اما باید توجه داشت دستور adb.exe logcat custom_tag:d *:s که برای نمایش پیامهای برنامهء خودمون تایپ کردیم، فقط پیامهای سطح debug رو نشون میده؛ به کاراکتر d بعد از تگ custom_tag دقت کنید. بنابراین شما برای نمایش هر سطح از پیامها باید کاراکتر مربوط به اون سطح یا پایین ترش رو مشخص کنید. مثلا اگر من بخوام تمام پیامها در هر سطحی نشون داده بشن، باید از کاراکتر v که معرف سطح verbose است استفاده کنم، چون سطح verbose پایین ترین سطح پیامهای لاگینگ اندروید می باشد.
یوقت هست که به هر علتی، نمیتونید گوشی رو بصورت مستقیم (توسط کابل USB) به PC خودتون وصل کنید، ولی نیاز دارید که در هنگام توسعه اندروید با گوشی خودتون کار کنید.

در چنین مواردی میشه adb رو طوری تنظیم و راه اندازی مجدد کرد که از اتصال شبکه ای TCP برای ارتباط استفاده کنه، و به این شکل میشه از طریق هر شبکه ای که با گوشی ارتباط داشته باشه با adb کار کرد. یعنی مثلا میتونم از اتصال WiFi یا بلوتوث (Tethering) استفاده کنیم.

فقط نکته ای که هست، این کار نیاز به یک گوشی root شده داره.

اول این دستورات باید تو گوشی اجرا بشه (باید توی گوشی برنامهء ترمینال امولیتور نصب کنید، یا از SSH استفاده کنید):
su
setprop service.adb.tcp.port 5555
stop adbd
start adbd
بعد  توی PC این دستور باید اجرا بشه:
adb connect 192.168.44.1:5555
بجای 192.168.44.1 باید IP گوشی خودتون رو بنویسید، چون ممکنه IP وایفای باشه، ممکنه IP بلوتوث باشه، و ممکنه IP بلوتوث گوشی من با گوشی شما متفاوت باشه.

بعدش هر دستوری که به adb بدید از طریق این ارتباط صورت میگیره. مثلا اگر بزنم adb logcat، پیامهای لاگ گوشی رو نشون میده.

برای برگشتن به حالت عادی و پیشفرض adb هم باید این دستورات رو مجددا در گوشی اجرا کنید:
setprop service.adb.tcp.port -1
stop adbd
start adbd

و بعد در PC این فرمان:
adb usb

متن کاملتر منبع رو هم میذارم شاید نیاز شد:
نقل قول:
Manual Process
From your device, if it is rooted

According to a post on xda-developers, you can enable ADB over Wi-Fi from the device with the commands:

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

And you can disable it and return ADB to listening on USB with

setprop service.adb.tcp.port -1
stop adbd
start adbd

From a computer, if you have USB access already

It is even easier to switch to using Wi-Fi, if you already have USB. From a command line on the computer that has the device connected via USB, issue the commands

adb tcpip 5555
adb connect 192.168.0.101:5555

Be sure to replace 192.168.0.101 with the IP address that is actually assigned to your device.

You can find the IP address of a tablet in two ways:

Manual IP Discovery:

Go into Android's WiFi settings, click the menu button in the action bar (the vertical ellipsis), hit Advanced and see the IP address at the bottom of the screen.

Use ADB to discover IP:

Execute the following command via adb:

adb shell ip -f inet addr show wlan0

To tell the ADB daemon return to listening over USB

adb usb

دقت کنید بقیهء برنامه ها هم پشت صحنه از adb استفاده میکنن. بنابراین وقتی ما adb رو از طریق TCP راه اندازی کردیم، میتونیم هر عملیات توسعهء اندروید رو انجام بدیم. مثلا میتونیم بزنیم ant installd و برنامهء اندروید ما از روی PC به روی گوشی نصب میشه.
خب حالا میخوایم پروژه رو در حالت release (برای انتشار نهایی) کامپایل کنیم.

فرمان ant release رو میزنیم و میبینیم که اجرا میشه و پیام موفقیت میده. ولی فایل apk که به این شکل تولید شده، فایلی است که نه Obfuscate شده و نه sign شده و نه align شده.

اول میریم سر بحث Obfuscate.
برای اونایی که نمیدونن بگم که Obfuscate کردن یعنی اینکه برنامه تولید شده نهایی رو به شکلی درمیاره که دیکد کردن اون دشوارتر بشه. یعنی کسی نمیتونه بسادگی برنامهء شما رو مهندسی معکوس کنه و کدهای منبع و الگوریتم اولیه شما رو بنوعی بازسازی کنه و کدها و برنامه شما رو سرقت یا دستکاری کنه. البته گفتم که این کارها با Obfuscate کردن فقط دشوارتر میشن، و نه غیرممکن.

در اندروید برای Obfuscate از proguard استفاده میشه. البته باید بگم که کارایی proguard فقط Obfuscate کردن نیست و چندین عملکرد و مزیت دیگر هم داره، مثلا حجم برنامه رو کمتر میکنه و اون رو بهینه تر میکنه.

البته فکر نکنید که proguard دیگه آخر Obfuscate است! نه برنامه بهتر از proguard هم هست، ولی مزیت proguard اینه که بازمتن و مجانیه. خلاصه زیاد روی امنیت proguard  حساب نکنید و اگر امنیت کدهاتون براتون خیلی مهمه میتونید دنبال برنامه های دیگر برید، ولی بهرحال استفاده از proguard یک امنیت اولیه و حداقلی رو میده و همچنین مزایای دیگری که اشاره کردم هم داره.

خب ما دستور ant release قبلی رو که زدیم، proguard روش عمل نکرده بود. برای فعال کردن proguard، فایل project.properties در ریشهء پروژه رو باز کنید و چیزی شبیه این رو درش مشاهده میکنید:
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
اون # اول خط رو حذف کنید و فایل رو سیو کنید تا عملکرد proguard فعال بشه (البته دقت کنید که proguard فقط در کامپایل release اعمال میشه و نه در حالت debug).

البته با فعال کردن proguard ممکنه یکسری دردسرهای دیگری نمایان بشن. بطور مثال بنده با هشدارهایی مواجه شدم که proguard درمورد یک کتابخانهء جاوا که در برنامم ازش استفاده کرده بودم میداد، و این هشدارها باعث میشدن که عملیات کامپایل کامل نشه. این کتابخانه اسمش androidasync-2.1.6.jar و نام پکیج اون با com.koushikdutta شروع میشد.
با تحقیقات و جستجویی که کردم راه حلش رو پیدا کردم. راه حل این بود که این کدها رو به فایل proguard-project.txt اضافه کنم:
-libraryjars libs/androidasync-2.1.6.jar
-dontwarn com.koushikdutta.**
البته خط اول احتمالا ضروری نیست، ولی خط دوم ضروری هست که به proguard دستور میده که برای پکیجی با این نام، هشدارها رو اعلام نکنه.

خب ما تا اینجا proguard رو فعال کردیم و حالا اگر فرمان ant release رو بزنید، proguard هم در جریان کامپایل عمل میکنه. فایل apk که در این مرحله تولید میشه Obfuscate شده ولی sign و zip align نشده.

در پستهای بعدی روش امضاء کردن (signing) و align کردن فایل apk بدست آمده رو خواهم گفت.
خب حالا ما apk از نوع release رو داریم، و این apk ممکنه توسط proguard پردازش شده باشه یا نشده باشه، بهرحال در قدم بعدی نیاز هست تا اون رو امضاء دیجیتال کنیم تا بتونه روی دستگاه نصب بشه.

اول باید یک زوج کلید خصوصی و عمومی برای خودمون تولید کنیم (البته اگر از قبل برای خودمون کلید توسعه دهنده ای تولید نکرده باشیم که برای امضای برنامه های خودمون ازش استفاده کنیم):
"D:Program FilesJavajdk1.7.0_71binkeytool.exe" -genkey -v -keystore my-release-key.keystore -alias hm_android -keyalg RSA -keysize 2048 -validity 10000
من آدرس کامل keytool.exe رو براتون گذاشتم تا متوجه بشید که این ابزار جزیی از Java SDK است.
این کد الان برای ما یک زوج کلید RSA 2048 bit ایجاد میکنه و اون رو در فایلی بنام my-release-key.keystore ذخیره میکنه. شما باید این فایل رو که محتوی کلیدهای شماست فقط برای خودتون و محرمانه نگه دارید. اگر این فایل رو از دست بدید، نمیتونید برنامه هایی رو که قبلا باهاش امضاء کردید آپدیت کنید (چون نمیتونید نسخه های جدید رو با کلید خصوصی سابقتون امضاء کنید)، پس حتما سعی کنید از این فایل محافظت کافی داشته باشید.
البته در جریان اجرای این فرمان، از شما سوالاتی میپرسه و مشخصاتی میخواد که باید وارد کنید، و همچنین پسوردی میگیره که از محتویات my-release-key.keystore محافظت میکنه (این پسورد بخاطر اینه که اگر این فایل دست کس دیگری افتاد نتونه ازش استفاده کنه؛ ولی اگر پسورد ضعیف باشه یا به هر شکل دیگری دست هکر بهش برسه میتونه ازش بهره برداری کنه).
hm_android هم اسمی هست که روی این کلید گذاشتیم (فکر کنم چند مجموعه کلید رو میشه در یک فایل keystore ذخیره کرد و بخاطر همین برای هر کلید یه اسمی میذاریم که بعدا با این اسم بهش رجوع کنیم).

خب حالا که کلید خودمون رو تولید کردیم، میتونیم باهاش فایل apk خودمون رو امضاء کنیم:
"D:Program FilesJavajdk1.7.0_71binjarsigner.exe" -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore sms-release-unsigned.apk hm_android
مشاهده میفرمایید که ابزار jarsigner هم جزیی از Java SDK است.
خب حالا که فایل sms-release-unsigned.apk رو امضاء کردیم، توصیه میکنم اسم اون رو به sms-release-signed.apk تغییر بدید تا بعدا دچار اشتباه نشید و با دیدنش سریعا بفهمید که امضاء شده.

الان ما میتونیم sms-release-signed.apk رو در گوشی نصب کنیم، ولی اکیدا توصیه میشه که یک عملیات دیگر رو هم روش انجام بدیم: zipalign
در پست بعدی zipalign رو توضیح خواهم داد.
خب عملیات zipalign بعد از عملیات signing صورت میگیره.
اما zipalign چیه؟ نمیخوام وارد بحث متفرقه و مفصلی بشم و برای مقصود ما اصلا مهم نیست، پس فقط اینو بگم که یه چیزی مربوط به بهینه سازی برنامه های اندروید برای اجرای بهینه تره که مثلا باعث میشه حافظهء کمتری مصرف کنن.
ابزار zipalign جزیی از Android SDK است.

این فرمان:
"C:old c Program Filesandroid-sdkbuild-tools21.1.2zipalign.exe" -v 4 sms-release-signed.apk sms-release-signed-aligned.apk
فایل sms-release-signed.apk رو بعنوان ورودی میگیره و فایل sms-release-signed-aligned.apk رو تولید میکنه که zipalign شده.

حالا کار ما تمومه و یک فایل apk آمادهء انتشار نهایی داریم. میتونید این فایل رو با فرمان زیر روی گوشی که به سیستم وصله یا امولیتور نصب کنید:
"C:old c Program Filesandroid-sdkplatform-toolsadb.exe" install sms-release-signed-aligned.apk
توضیح بدم که من این فرمانها رو بعنوان مثالهایی برای ذهنیت و روش کار کلی گذاشتم و بعنوان الگو که بعد اگر نیاز شد اونا رو تغییر بدید، وگرنه هر کدام از این فرمانها معمولا جزییات بیشتری هم دارن که ممکنه خیلی افراد عملا نیاز داشته باشن. یه آدمی که میخواد با خط فرمان کار کنه باید اونقدری حرفه ای باشه و زبان انگلیسی بلد باشه و پیامها و مستندات فرمانها و منابع دیگر رو بتونه راحت بخونه و بفهمه که در موقع نیاز بتونه این جزییات رو خودش دربیاره و تنظیم کنه.
مثلا بعضی فرمانهایی که من بعنوان نمونه دادم، برنامه رو روی اولین دستگاه اندروید که توی لیست دستگاه های وصل به سیستم بیاد نصب میکنن. من چون بخاطر سنگینی امولیتور اندروید و ضعیف بودن PC خودم از امولیتور استفاده نمیکنم، همیشه فقط گوشی خودم رو به سیستم وصل دارم که برنامه ها رو روی اون نصب و تست میکنم. حالا کسی ممکنه همزمان چند دستگاه مجازی اندروید هم روی سیستمش فعال باشه و بخواد برنامه رو روی یک مورد خاص از اونها که لزوما اولین مورد انتخاب شده بصورت خودکار نیست نصب کنه، پس باید ببینه آپشن مربوطه در برنامهء مورد نظر برای انتخاب دیوایس دلخواه چیه و چطوریه و اون آپشن رو به خط فرمان خودش اضافه کنه.

ضمنا محیط کار من ویندوز XP SP3 بوده، ولی به احتمال زیاد همهء این فرمانها و رویه ها باید روی سیستم عامل ها و نسخه های دیگر هم کار بکنن، حتی در لینوکس. البته طبیعتا با یکسری تغییرات جنبی و جزیی معمولا. مثلا اسم فایلهای اجرایی در لینوکس معمولا پسوند نداره، و معمولا این فایلها در مسیر فایلهای اجرایی نصب میشن و بنابراین احتیاجی به درج آدرس کامل اونها نیست (کافیه در خط فرمان اسمشون رو وارد کنید)، اما روی ویندوز شما باید آدرس کامل فایلها رو وارد کنید که در مثالها هم مشاهده میفرمایید و آدرس هر فرمانی بستگی داره به اینکه هر تشکیلاتی رو کجا نصب کردید (مثلا Java SDK کجا نصب شده، Android SDK کجا نصب شده). یه راه راحت برای وارد کردن آدرس ابزارهای توسعهء اندروید در خط فرمان اینه که فایل اجرایی مربوطه رو پیدا کرده و سپس به پنجرهء خط فرمان Drag & Drop کنید. برای پیدا کردن ابزار مربوطه هم میتونید به پوشهء نصب Java SDK یا Android SDK و خلاصه هر جایی که فکر میکنید محل ابزار مورد نظر زیرمجموعه ای از اون پوشه است برید و اسم اون ابزار رو توسط ویندوز سرچ کنید، و میتونید فایل پیدا شده رو مستقیما از نتایج جستجو به پنجرهء خط فرمان بکشید تا آدرسش براتون درج بشه.
همچنین درمورد فایلهایی که روشون عمل میشه. مثلا وقتی در فرمانی ما نوشتیم sms-release-unsigned.apk، این به معنی اینه که sms-release-unsigned.apk در محل دایرکتوری جاری خط فرمان ما قرار داره، یعنی جایی که آدرس اعلان Command prompt ما در حال حاضر در اون پوشه قرار داره. اگر فایل مورد نظر در دایرکتوری جاری نباشه، باید آدرس کامل اون رو درج کنید، که بازم راحت ترین راهش اینه که آیکون فایل مورد نظر رو به پنجرهء خط فرمان بکشید و رها کنید. اگر خواستید آدرسها رو دستی وارد کنید، دقت کنید که آدرسهایی که محتوی کاراکترهایی مثل فضای خالی هستن باید در کوتیشن دوبل (") محصور بشن.
و در پایان مفید دیدم که یک مطلب دیگه در مورد شروع یادگیری و توسعه برنامه های اندروید رو هم اضافه کنم!
چون خودم موقع نصب Android SDK این برام سوال و مشکل بود که دقیقا کدام اجزاء در Android SDK ضروری هستن که باید از طریق SDK Manager نصب کنم، فکر میکنم ممکنه این سوال و مشکل برای دیگران هم پیش بیاد و دیدن یک نمونه از نصب در حال کار SDK براشون مفید باشه.
موقعی که Android SDK رو نصب میکنید و اجرا میکنید اجزای لازم برای توسعه برنامه های اندروید رو نداره و تازه اون موقع لیستی از اجزای مختلف و کتابخانه های مختلف اندروید و خلاصه بند و بساطش و مخلفات مختلفش رو از گوگل استعلام میکنه و به شما نشون میده و بعد شما میتونید از بین اونها گزینه هایی رو که میخواید انتخاب کرده و بذارید تا SDK Manager اون اجزاء رو دانلود و نصب کنه. چون تعداد این پکیج ها زیاده و حجم قابل توجهی هم دارن و از اون طرف بخاطر تحریم ایران از سمت گوگل، برای دانلود اونا باید از فیلترشکن استفاده کرد که این کار دانلود رو مشکل تر و کندتر میکنه، اینکه بیایم و تنها اجزایی رو که واقعا نیاز داریم و برای هدف و این مرحله از کار ما ضروری هستن انتخاب کنیم میتونه مهم و مفید باشه و در وقت و انرژی و هزینهء ما صرفه جویی قابل توجهی بکنه. بنابراین بنده تصویری از محیط SDK Manager خودم رو میذارم که نشون میده چه اجزایی در اون نصب شده:

[عکس: attachment.php?aid=390]

البته از میان اینها، Documentation و Samples که به ترتیب، مستندات و برنامه های نمونه برای نسخه اندروید/API انتخاب شده هستن، ضروری نیستن، ولی فکر میکنم اکثر افراد لازم ببینن که اونا رو داشته باشن.
همینطور اون System image ها هم فکر نمیکنم ضروری باشن و اگر شما از گوشی خودتون برای نصب و تست برنامه ها استفاده کنید فکر میکنم دیگه دانلود این System image ها که بنظرم برای اجرای دستگاههای اندروید مجازی (بوسیلهء Emulator یا شبیه سازی) بکار میرن ضروری نباشه. البته از این بابت کاملاً مطمئن نیستم! بهرحال شما میتونید بدون اینها رو تست کنید و اگر نیاز بود بعدا اینها رو هم دانلود کنید، چون حجم این System image ها زیاده (هرکدام حدود 200 مگ و بیشتر).
درمورد Support Library و USB Driver هم شک دارم که اکیداً ضروری هستن یا نه، ولی تاجاییکه چک کردم حجمشون زیاد نیست و بنابراین بهتره از ابتدا دانلودشون کنید.

البته این مواردی که من دانلود کردم بعنوان یک حداقل پایه برای شروع و فقط برای یادگیری و تست توسعه برنامه های اندروید هستن و ممکنه بیشتر افراد نیاز به دانلود اجزای بیشتری داشته باشن. من فقط خواستم نشون بدم که اجزای اکیداً ضروری حدوداً چقدر و چیا هستن و داستان این SDK و تشکیلاتش توی چه مایه هاست! اینطور بینش بهتری دارید و کمتر گیج و دچار اشتباه و مشکل میشید. بطور مثال من آخرین نسخهء کتابخانهء اندروید رو نصب نکردم چون سیستم عامل گوشیم آخرین نسخه نیست و آپدیت سیستم عاملش رو هم غیرفعال کردم، و بنابراین خواستم نسخه ای رو دانلود کنم که دقیقا نسخهء محیط سیستم عامل گوشی خودم باشه ‎(Android 4.1.2 (API 16))‎ تا مطمئن باشم که در زمینهء تست برنامه ها در مسیر یادگیری با مشکلی مواجه نمیشم.

البته نکتهء دیگر اینکه درواقع در حال حاضر گوگل یک محیط توسعهء جدیدتر و اختصاصی برای توسعهء اندروید رو ساخته و ارائه میده بنام Android Studio که بعنوان محیط توسعهء رسمی اندروید جایگزین کرده که ظاهرا در مقام مقایسه یه چیزی شبیه ویژوال استودیو است. حتما هم که این برنامه کاملتر و بهتره (جزییاتش رو نمیدونم)، ولی من شخصا بخاطر دلایلی مثل زیاد بودن حجم دانلودش، نیاز به یک سیستم با حداقل مشخصات سخت افزاری واقعا قوی تر از PC بنده، و غیره طرف این برنامه نرفتم و خواستم از همون روش و محیط قدیمی تر که همین بند و بساط Android SDK Manager و Eclipse و این حرفاست استفاده کنم شروع کنم (البته گفتم که در استفاده از Eclipse که با مشکل مواجه شدم و به استفاده از خط فرمان روی آوردم، که در این مسیر خیلی چیزهای جدید و مفید یاد گرفتم و فکر میکنم از این لحاظ در کل به نفعم شد). از یک جهت فکر کردم اینطوری بهتر و پایه ای تر و ساده تر و آموزنده تره که از روش و محیطی که تا همین اواخر همه ازش استفاده میکردن استفاده کنم و بعد که راه افتادم و اگر نیاز و ممکن شد برم سراغ Android Studio گوگل. البته یک توجیه دیگر استفاده از محیط قبلی هم میتونه این باشه که بخش بزرگی از منابع و کتابها بر اساس این محیط هستن و توضیح و مثالهاشون با این محیطه تا جاییکه دیدم (Android SDK Manager و Eclipse با پلاگین ADT).
بنده نمیگم ملت بیان کارها رو با خط فرمان انجام بدن بهتره، ولی خط فرمان ابزاری هست که خیلی وقتا نیاز میشه و در شرایط خاص مزایای بزرگی داره، بعضی وقتا هم عملا هیچ راهی جز توسل به خط فرمان وجود نداره.
ترکیب و استفاده همزمان از خط فرمان و رابط گرافیکی هم هیچ مشکلی نداره و کارایی رو به میزان چشمگیری افزایش میده.
بعضی وقتا برای بعضیا یا بعضی کارها ابزارهای گرافیکی پیشرفته بیش از حد سنگین، کند، گسترده و پیچیده هستن یا پیشنیازهای سخت افزاری و نرم افزاری خاصی رو طلب میکنن که خیلی ها در دسترس ندارن، به هر علتی براشون مقدور نیست یا صرف نمیکنه. اینطور مواقع خط فرمان هست که انعطاف و امکان های ما رو به میزان چشمگیری افزایش میده.
ابزارهای خط فرمان سبک هستن، سریع هستن، در محیطهای بیشتری راحت تر در دسترس هستن، و حداقل نیازهای سخت افزاری و نرم افزاری محیط اجرا رو طلب میکنن.

ضمنا یک کاربرد مفید ابزارهای خط فرمان، Automation هست. یعنی وقتی که به هر علتی میخواید یکسری از عملیاتی رو که بطور معمول مستقیما توسط انسان انجام میشه، بصورت خودکار دربیارید. مثلا یه طرفی اومده بود میخواست توسط سایتی که طراحی کرده بود برنامه های اندروید بسازه؛ در اینطور مواقع معمولا انتخابی جز استفاده از خط فرمان وجود نداره.
خب قول داده بودم درمورد javadoc هم بگم.
البته javadoc مستقیما مربوط به برنامه نویسی اندروید نمیشه و بحث خود جاواست، ولی چون مفیده و برای خودم در برنامه نویسی اندروید نیاز شد و بصورت خط فرمان ازش استفاده کردم، ذکر میکنم.

داستان از اونجایی شروع شد که این کتابخانهء خاص رو میخواستم توی برنامهء اندروید خودم استفاده کنم: https://github.com/koush/AndroidAsync
ولی هرچی گشتم مستنداتش رو پیدا نکردم. فقط چندتا مثال محدود و کلی زده، که برای کار کردن بیشتر باهاش کافی نبود.
آقا ما هرچی گشتیم دیدیم نه انگار واقعا این کتابخانه هیچ مستندات API و اینا ندارم.
حتی توی stackoverflow پرسیدم مستنداتش کجاست، ولی پرسشم رو بعنوان آفتاپیک بستن!
رفتم توی فروم forum.ncis.ir پرسیدم، یه نفر گفت که «چرا داره بین سورسش مشخصه دیگه کامنت هایی /** شروع میشن در مورد متد ها و فیلد ها توضیح میده. کافیه با javadoc مستنداتش رو بسازید.» و «javadoc همراه jdk نصب میشه و از خط فرمان اجرا میشه. و help کاملی هم داره. کافیه سورس برنامه رو بهش بدین بعد مستندات رو به صورت html تولید میکنه.»

خلاصه رفتم دربارۀ javadoc تحقیق کردم و بالاخره تونستم فرمانی که داکیومنت های کل کتابخانه رو تولید میکنه پیدا کنم:
javadoc.exe -d c:docs -sourcepath c:AndroidAsync-masterAndroidAsyncsrc -subpackages com
توضیح اینکه c:docs فولدری هست که فایلهای HTML تولید شده بعنوان مستندات توسط javadoc، در اون ذخیره میشن.
بقیش هم که باید بقدر کافی واضح باشه میتونید خودتون کد منبع کتابخانهء مورد نظر رو دانلود کرده و این داستان رو بررسی و آزمایش کنید.

خلاصه براحتی با همین یک خط فرمان، کلی داکیومنت برای API این کتابخانه برام تولید شد. تر و تمیز و قشنگ.

گفتم این مطلب رو اینجا بذارم شاید بعدا بدرد دیگران هم خورد، و همینطور خودم اگر خواستم دنبال خط فرمانش بگردم دوباره راحت بهش رجوع کنم.
شخصا تاحالا با اینطور ابزارها کار نکرده بودم نمیدونستم اینقدر راحت و خوب هستن.
البته مستنداتی که اینطور تولید میشن یه مستندات حداقلی هستن و خیلی توضیحات یا مثال و اینها ندارن، اما اگر حرفه ای باشید همین حداقل هم احتمالا میتونه کارتون رو راه بندازه (مثل منکه کارم راه افتاد).