تجربیات من با گوشی اندروید و ویندوز XP و توسعه برنامه های اندروید با استفاده از ابزارهای خط فرمان

وقتی من برای اولین بار یک گوشی اندرویدی (سامسونگ Galaxy young مدل GT-S6310) گرفتم اولین مشکلم این بود که در ویندوز ایکس پی شناخته نمیشد، بعد مسئله فقط دسترسی به فایلها نبود بلکه میخواستم از اینترنت گوشی هم توی PC استفاده کنم. خب فکر کنم احتمالا بعضی افراد دیگر هم همین مشکل رو دارن یا خواهند داشت و این مطلب و تجربیات بنده بتونه براشون مفید باشه (البته این مقاله برای یادآوری و جمع بندی و خلاصه و استفاده های احتمالی آینده جهت خودم هم هست).

اولا که شما اون Samsung USB Driver رو بگیرید و نصب کنید. ولی من نصب کردم هنوزم مشکل داشتم. خب درواقع ویندوز ایکس پی (شاید سرویس پک 2 فقط) ظاهرا نیاز به یک پچ (از طرف میکروسافت) هم داره که باید نصب کنید تا بتونه از Tethering گوشی هم جهت به اشتراک گذاری اینترنت استفاده کنه. البته این Tethering چون باعث اتصال شبکه ای گوشی و PC میشه به دردهای دیگری مثل دسترسی به شل SSH توی گوشی از طریق PC و نیز انتقال فایل بین گوشی و PC هم میخوره. اون پچ که من دانلود کردم اینه اگر اشتباه نکنم: 366484‎_ENU_i386_zip.exe که از سایت میکروسافت دانلود کردم: http://support.microsoft.com/kb/959765
بعد از نصب این اجزاء حتی اگر ویندوز شما بازم نتونه مستقیما گوشی رو شناسایی کنه و فولدرها و فایلهای اون رو در محیط ویندوز مورد دسترسی مستقیم قرار بده (مثل سیستم شخصی بنده که این مشکل رو داره)، میتونید از قابلیت Tethering گوشی استفاده کنید و اینترنت گوشی رو با PC به اشتراک بذارید، با SSH به گوشی وصل بشید و توی لینوکسش که البته یک نسخهء تاحدی تغییر یافته و محدود و کوچک شده از لینوکسه سیر و سیاحت کنید و فرمان اجرا و تست کنید و بعضی استفاده هایی که واقعا راه دست هستن، میتونید با SCP فایلها رو بین گوشی و PC رد و بدل کنید (البته این کار رو از طریق ترفندها و روشهای دیگری مثل راه انداختن وب سرور روی PC و آپلود و دانلود فایلها از طریق نرم افزار مرورگر وب در گوشی هم میشه انجام داد ولی scp راحتتر و سریعتره بنظرم)، و همچنین خوشبختانه میتونید به توسعه و تست برنامه های اندروید روی PC خودتون بپردازید و اونا رو از اون طریق به گوشی هم منتقل و نصب کنید (با فرامین مربوطه یا Eclipse IDE اگر تونستید با موفقیت نصب و استفادش کنید). خب صحبت از SSH و SCP شد همینجا بگم تا یادم نرفته که توی ویندوز شما با نصب برنامه کلاینت معروف و عالی PuTTY میتونید همهء این امکانات رو بدست بیارید و به سرور SSH توی گوشی وصل بشید و ازش شل بگیرید.
برای گوشی سرورهای SSH مختلفی هست که من چندتاش رو که تست کردم و جواب دادن اینا بودن (البته توجه کنید که برای توسعه و تست برنامه های اندروید شما نیاز به SSH ندارید ولی من دارم همهء مباحث و چیزهای بدردبخور در این زمینه رو که شخصا تست کردم یکجا بیان میکنم همون موقع که بیادم میاد!): SSH Server و SSHelper. البته یکی دیگه هم بود که بد نبود که چون آنیستال کردم اسمش یادم نیست ولی فکر کنم نیاز به root داشت برای اجرا. اون دوتا که نوشتم اولی برای کار کردن با شل خوبه ولی ظاهرا از Port forwarding و یکسری امکانات جانبی دیگه مثل scp پشتیبانی نمیکنه. با دومی هم Port forward کار میکنه و هم scp ولی من این نسخه از برنامش که نصب کردم فکر کنم مقداری ناپایداره (شاید هم بخاطر استفاده از Port forward و/یا scp باشه) و یوقتا وسط کار مشکل پیدا میکنه و از کار میفته و باید سرور SSH اش رو ریستارت کنید (البته ریستارت کردنش راحته و خرجش زدن یک دکمه است). بهرحال کار رو راه میندازه! اصولا در دنیای بازمتن باید خبره و خوره بود و مشکلات رو حل کرد و از هر طریق ممکن و از هر سوراخی شده راه رو باز کرد و کار رو راه انداخت! آدم باید خوف باشه :D
خب یه کار خوب دیگه که میشه یا باید با گوشی اندروید کرد اینه که گوشی رو root کنیم. من با برنامهء SuperSU این کار رو انجام دادم (تاجاییکه یادمه). بعدش یه کار دیگه که کردم نصب BusyBox بود. BusyBox چیه؟ خب اندروید بصورت پیشفرض خیلی از فرمانهای استاندارد و پرکاربرد لینوکس رو نداره و بنابراین در محیط ترمینال به این برنامه ها دسترسی ندارید چون قرار نبوده کاربران برن توی خط فرمان لینوکس اندروید و ضمنا بیخودی با این برنامه ها که معدودی افراد ممکنه استفاده کنن حجم اندروید رو زیاد نکردن! بنابراین اگر میخواید از گوشی استفاده های خاص خط فرمان یا جهت آموزش و یادگیری و تست و اینای لینوکس کنید میتونید BusyBox رو نصب کنید که کلی از برنامه های استاندارد خط فرمان لینوکس رو به اندروید اضافه میکنه. یه برنامه هایی مثل cp و grep و غیره (من اول واقعا تعجب کردم که اندروید حتی cp هم نداره و در چند مورد اوایل مجبور شدم بجاش از cat و ریدایرکت کردن خروجیش به فایل مقصد استفاده کنم). جهت اطلاعات عمومی بیشتر بگم که BusyBox درواقع یک برنامه هست که کلی از فرمانها/برنامه های استاندارد خط فرمان لینوکس رو در خودش مجتمع کرده (یک فایل اجرایی نقش این همه فرمان/برنامه رو اجرا میکنه).
راستی یه برنامه دیگه که همون اوایل توی گوشی نصب کردم Terminal Emulator بود که یک محیط خط فرمان/شل توی گوشی است که با شل های توی لینوکس های استاندارد فرق زیادی نداره. شما میتونید توش فرمانهای لینوکس رو اجرا کنید. یه کاربردی که من از این برنامه استفاده میکنم پنهان کردن بعضی پوشه هاست که با اضافه کردن نقطه به ابتدای نام هر پوشه یا فایلی میشه اون رو پنهان کرد که بطور معمول از طریق محیط اندروید نمایش داده نشه و قابل دسترس نباشه.
بطور مثال این فرمان:
mv priv .priv
پوشهء priv رو پنهان میکنه (دقت کنید که برای اجرای این دستور باید خط فرمان شما در دایرکتوری ای باشه که این پوشه توش قرار داره، وگرنه باید هر دو آدرس رو کامل وارد کنید)
و این فرمان:
mv .priv priv
دوباره اون رو آشکار میکنه.
البته شاید این روش بدوی ای باشه و روشهای بهتر و حتی برنامه های اندروید گرافیکی خوبی برای این قبیل کارها وجود داشته باشن، ولی برای من همین روش ساده کفایت میکرد. ضمنا ادعا نمیکنم که امنیت این روش بالاست! پیدا و ظاهر کردن فایلها و پوشه های پنهان برای کسی که بدونه دنبال چی میگرده دشوار نیست، ولی جلوی افراد بی اطلاع و کشفیات تصادفی رو میگیره!

همینجا یک کاربرد جالب SSH رو براتون بگم که بفهمید اینکه میگم آدم خوره و خوف باشه و راه خودش رو به هر صورتی و از هر سوراخی که شده باز میکنه یعنی چی. من موقعی که توی گوشی Hotspot Shield رو فعال میکردم توی PC اینترنت گوشی اصلا جواب نمیداد، ولی توی گوشی کار میکرد، که هرکاری کردم علتش رو نفهمیدم و درست نشد، ولی تونستم این مشکل رو تاحد زیادی از طریق SSH و Port forwarding حل کنم. به این شکل که شما توی بخش Tunnels در PuTTY میاید و یک Port forward از نوع Dynamic تعریف میکنید، مثلا: توی کادر Source port بنویسید 12345 و توی کادر Destination آدرس IP گوشی رو بنویسید (واسه من همیشه 192.168.42.129 است) و بعدش زیرش گزینهء Dynamic رو استفاده کنید، بعد دکمهء Add رو بزنید و اونوقت توی اون کادر بالایی یه چیزی اینطوری دیده میشه D12345 که اشاره به همون Port forward است که شما تعریف کردید. خب بعدش هم که باید از طریق همون PuTTY با اون تنظیمات که کردید (که در PuTTY میتونید این تنظیمات رو برای استفادهء راحت در دفعات بعد save کنید) یه کانکشن SSH بین گوشی و PC ایجاد کنید که به شما یک شل و خط فرمان هم میده. بعد میاید و در مرورگر خودتون، مثلا فایرفاکس، یه پراکسی از نوع SOCKS تعریف میکنید که هاستش رو localhost )یا 127.0.0.1( قرار میدید و پورتش رو 12345 (یا هر عدد دیگری که استفاده کردید). حالا مرورگر شما میتونه از اینترنت گوشی در حالیکه hotspotshield هم فعاله استفاده کنه و از فیلترینگ به این شکل عبور کنید! البته من بعضی وقتا تونستم بعضی فیلترشکن هایی رو مستقیما توی PC هم اجرا و استفاده کنم، اما خیلی وقتا جواب نمیده و مشکل زیاد داره و ضعیف و کند کار میکنه. Hotspotshield توی خود گوشی خیلی خوب کار میکنه.

خب حالا میریم سر وقت توسعه برنامه های اندروید در خط فرمان!
اوه یه نکته ای رو یادم نره! اینو بگم که قبل از شروع کار، در گوشی خودتون در بخش تنظیمات در بخش گزینه های توسعه دهنده (Developer options)، گزینهء USB debugging رو فعال کنید (فکر کنم این برای ارتباط از طریق adb با گوشی مورد نیازه – درمورد adb در ادامه مطالب توضیح داده میشه). ضمنا میتونید گزینهء Stay awake رو هم فعال کنید تا تازمانیکه گوشی به کابل USB وصله صفحه خاموش و قفل نشه که هر موقع کار دارید مجبور نباشید گوشی Unlock کنید (البته دقت کنید اگر این گزینه فعال باشه کلا موقعی که گوشی داره از طریق USB یا شارژر شارژ میشه هیچوقت خاموش/قفل نمیشه؛ البته نور صفحه بعد از یک مدتی خیلی کم میشه و بنابراین از نظر مصرف برق و طول عمر صفحهء نمایش فکر نمیکنم مشکلی داشته باشه).
من روی سیستم خودم موفق به استفاده از Eclipse نشدم و یکسری خطاهای بی سر و تهی میداد با وجودیکه اجزای لازم Android SDK و JRE و JDK و پلاگین ADT مربوط به Eclipse رو نصب کردم. خب من منتظر برطرف شدن مشکل Eclipse نشدم و بازم از مسیر دیگری راه خودم رو باز کردم و اون مسیر خط فرمان بود! من فکر کنم این روش خط فرمان برای توسعه اندروید بتونه به درد دیگران هم بخوره و خوشایند هم باشه چون واقعا سریع و سبک هم هست و روی سیستمهای قدیمی و ضعیف مثل مال من گزینهء مناسبیه. ضمنا یه چیزای جالب و مفیدی در این بین یاد میگیرید که فکر کنم ارزشش رو داشته باشه! مثلا من خودم اگر اینقدر به محیط خط فرمان در هردوی لینوکس و ویندوز مسلط نبودم در همین مسائلی که گفتم و در خیلی موارد و اوقات دیگر نمیتونستم به این راحتی و سرعت مشکلات و نیازها رو جواب بدم و شاید بعضی مشکلات برام مبدل به بن بست های جدی میشدن؛ مثلا یه جا که سیستم ضعیف بود و پول هم نداشتم سیستم جدید و قوی بخرم، یا یجا که امکانات دیگری مثل اینترنت با کیفیت و ارزان در دسترسم نبود که بتونم تمام اجزای مورد نیاز رو بصورت آنلاین دانلود و نصب و تست کنم جهت رفع بعضی مشکلات که احتمالا با نصب اجزا بصورت آفلاین بوجود آمدن.

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

توی پوشه های Android SDK یه برنامه پیدا میشه بنام adb.exe (اسمش مخفف Android Debug Bridge است). کامپایلر و تشکیلات توسعه اندروید هم قاعدتا در پشت صحنه از این برنامه برای ارتباط با گوشی استفاده میکنن. من چندتا کاربرد روشنش رو میگم:
با فرمان adb devices میتونید لیست وسایل اندروید مجازی یا واقعی رو که در حال حاضر در سیستم در دسترس هستن مشاهده کنید.
با adb pull و دادن مسیر و اسم فایل روی گوشی میتونید فایل رو از گوشی روی PC دانلود کنید. البته این کار رو با scp هم میشه انجام داد.
با adb push میشه فایلی رو از PC به روی گوشی کپی کرد.
adb shell به شما یک شل و محیط خط فرمان گوشی رو میده. البته این کار رو با ssh هم میتونید انجام بدید، ولی مزیت adb هم اینه که نیازی به نصب و اجرای سرور SSH روی گوشی نداره و ضمنا نیازی به Tether بودن گوشی هم نداره (اینا رو خودمم همین الان به ذهنم رسید – تاحالا همش از SSH استفاده میکردم!).
ضمنا با adb ظاهرا میشه port forward هم انجام داد، اما البته ظاهرا از نوع Dynamic که خیلی هم مفیده ساپورت نمیکنه (این رو میتونید با ssh انجام بدید).
با adb install و adb uninstall هم میشه پکیج یا همون برنامه های apk اندروید رو نصب و آنیستال کرد (باید نام پکیج برنامه رو به فرمان uninstall بدید – مثلا com.exmple.test).

خب حالا ما میخوایم یه برنامهء اندروید ساده مثل hello world رو با خط فرمان ایجاد کنیم چکار باید بکنیم. اگر بخوایم یه برنامه از صفر رو شروع کنیم میتونیم به این شکل شروع کنیم (البته ناگفته نماند که این چند دستور مربوط به ایجاد پروژه و کامپایل و اینها رو از توی کتاب The Busy Coder’s Guide to Android Development نوشتهء Mark L. Murphy درآوردم):
ابتدا با این دستور یک پروژهء خالی در دایرکتوری جاری ایجاد میکنیم:
android create project --target 1 --path . --activity Test --package test.test
اون فرمان android که اولش زدیم روی ویندوز همون batch file (فایل با پسوند bat) با اسم android است که در پوشهء tools در پوشهء Android SDK قرار داره است. شما میتونید در محیط گرافیکی ویندوز اون فایل bat رو به پنجرهء command prompt بکشید و رها کنید که اینطوری آدرسش برای اجرا رو بصورت خودکار براتون در خط فرمان درج میکنه، و بعدش شما پارامترهای فرمان رو که در مثال بالا آمده جلوش اضافه میکنید. از این روش Drag & Drop فولدرها و فایل ها به پنجرهء خط فرمان میتونید برای cd کردن به دایرکتوری ها یا درج آدرس فایلهای دیگر هم استفاده کنید و تقریبا هیچوقت نیازی نیست که آدرس پوشه ها یا فایلها رو با دست تایپ کنید که طبیعتا کار زمانبر و پرزحمت و مستعد خطایی است.
خب بعد از اجرای این فرمان پوشه ای که توش این فرمان رو اجرا کردید با یکسری پوشه و فایل اولیه و استاندارد پایه برای توسعهء یک برنامهء اندروید پر میشه. بعد شما باید برنامه نویسی اندروید رو از توی کتابهایی مثل اونی که بالا معرفی کردم یاد بگیرید؛ البته دروغ نگم من قبل از این کتاب، مطالب این منبع رو مطالعه کرده بودم: ‎http://www.tutorialspoint.com/android/‎ که شاید بهتر باشه شما هم همین کار رو بکنید (حجمش زیاد نیست و راحته و میشه در مدت کوتاهی خوندش). این بحث بیش از این دیگه میشه آموزش برنامه نویسی اندروید که این مقاله در این مورد نیست.

خب درمورد پارامترها توضیح بدم. با پارامتر target داریم میگیم که برناممون تحت کدوم نسخهء اندروید/کتابخانه اندروید که البته باید روی سیستم هم اون کتابخانه رو جزو Android SDK نصب کرده باشیم، کامپایل و اجرا بشه. با فرمان android list targets شما میتونید لیستی از نسخه های اندروید که روی سیستمتون نصب دارید رو مشاهده کنید. البته گفتم که بجای کلمهء تنهای android شما فایل android.bat رو به داخل پنجرهء فرمان Drag & Drop میکنید تا آدرس کاملش در اونجا درج بشه (مگر اینکه دایرکتوری جاری خط فرمان شما در دایرکتوری ای باشه که android.bat توشه)، چون این فایل در مسیر برنامه های اجرایی ویندوز نیست و اگر همینطور فقط بزنید android یا android.bat خطای عدم وجود فرمان رو از خط فرمان ویندوز دریافت میکنید.
خروجی android list targets روی سیستم من اینه:
Available Android targets:
----------
id: 1 or "android-16"
Name: Android 4.1.2
Type: Platform
API level: 16
Revision: 5
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, W
XGA720, WXGA800, WXGA800-7in
Tag/ABIs : default/armeabi-v7a, default/x86

مشاهده میکنید که من روی سیستم خودم فقط یک نسخه از کتابخانه اندروید رو نصب کردم (نسخهء 16)، بخاطر اینکه نسخهء اندروید گوشی من 4.1.2 است که نسخهء API اون 16 است. ما برای مقدار پارامتر target هم میتونیم از شماره ردیف (در اینجا 1) و هم از اسم کامل نسخهء مورد نظر (در اینجا android-16) استفاده کنیم که من بخاطر کوتاهی و راحتیش از شماره ردیفش استفاده کردم.
پارامتر path پوشه ای رو که میخوایم پوشه ها و فایلهای پروژهء اندروید ما درش ایجاد بشه مشخص میکنه، که من از . (نقطه) که به معنای دایرکتوری جاری است استفاده کردم (باید قبلا پوشهء پروژه رو ایجاد کرده باشید و دایرکتوری جاری خط فرمان رو با فرمان CD به اونجا برده باشید) چون قبلا پوشهء مخصوص پروژه رو خودم بصورت دستی ایجاد کرده بودم.
پارامتر activity میگه که توی فایلهای پروژهء ما یک activity اصلی به این نام ایجاد کن (در جریان یادگیری برنامه نویسی اندروید میفهمید که activity به هر یک از صفحات UI یک برنامهء اندروید گفته میشه و یک نکته اینکه activity اصلی اونیه که موقعی که برنامه برای اولین بار اجرا میشه اجرا میشه و بنابراین اینترفیس اون نمایش داده میشه).
Package هم که اسم پکیجی هست که برای برناممون انتخاب میکنیم، که بازم در جریان یادگیری برنامه نویسی اندروید خودتون باید بفهمید چیه. البته من از اسمهای خیلی ساده و بی معنی و غیراستانداردی برای اینطور چیزها استفاده کردم چون فقط قصد داریم کلیت و ساختار کلی مفاهیم دیگری رو آموزش بدیم و تست کنیم و بحث درونی خود برنامه نویسی اصلی نیست.
خب حالا شما میتونید برنامهء اندروید Hello World ایجاد شده رو دستکاری کنید و تغییر یا گسترش بدید، یا همون رو برای اولین بار و بعنوان اولین نمونه کامپایل و تست کنید.
برای کامپایل این فرمان رو اجرا میکنید:
اوه اوه یه چیزی یادم رفت! قبل از اینکه بتونیم پروژه رو کامپایل کنیم باید یک ابزار جداگانه ای بنام Apache Ant رو هم دانلود و آماده کنیم! Apache Ant یک برنامه و فریمورک و تشکیلاتی هست مثل سیستم make در لینوکس که برای مدیریت و انجام هوشمند خودکار فرایند کامپایل و ساخت پروژه ها ازش استفاده میشه. اگر در این مورد تجربه و اطلاعاتی ندارید ضروری نیست، ولی اگر بدونید خوبه و بینش و احاطهء ارزشمندی بهتون میده. فرق Apache Ant با سیستم make کلاسیک در سیستمهای لینوکس اینه که با زبان جاوا کار میکنه و makefile های اون هم در فرمت xml هستن، و یکسری مزایایی داره مثل استقلال بیشتر از پلتفرم که این برنامه بخاطر اون نوشته شده. طبیعی هست که اینطور باشه، چون سیستم جدیدتری هست که یک هدفش همین و برطرف کردن کمبودهای سیستم make کلاسیک و قدیمی متداول بوده. البته بعنوان اطلاعات عمومی بگم که حتی بعد و بجای ant هم یکی دو نسل یا مورد جدید از سیستمهای make دیگر بوجود آمده اند.
خب شما خیلی ساده فایل زیپ محتوی سیستم ant رو دانلود کنید، توی دایرکتوری مخصوص خودش هرجا که میخواید اکسترکت کنید، همین، هیچ فایل setup/install مثل برنامه های کلاسیک ویندوزی در کار نیست. اما بعدش ما باید قبل از استفاده در خط فرمان چندتا متغییر محیطی رو set کنیم. من برای این منظور یک batch file با نام setant.bat نوشتم و انداختم توی فولدر ویندوز که هر بار مجبور نباشم این دستورات رو مجددا تایپ کنم. یعنی به این شکل کافیه در خط فرمان تایپ کنم setant تا این متغییرها ست بشن. محتوی فایل setant.bat من اینه:
@ echo off
set ANT_HOME=c:\ant
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_71
set PATH=%PATH%;%ANT_HOME%\bin

بغیر از خط اول بقیهء خطوط رو توضیح میدم چون شما ممکنه بسته به مسیرهای نصب روی سیستم خودتون نیاز به تغییر اونا داشته باشید:
به ANT_HOME مسیر پوشه ای که فایلهای ant توش قرار داره رو میدید. از آدرس مال من مشخصه که برای من این سیستم در پوشه ای بنام ant در درایو C قرار داشته.
به متغییر JAVA_HOME آدرس پوشه ای که توش JDK رو نصب کردید میدید.
اون آخری PATH هم که نیازی به تغییر نداره چون بصورت خودکار توسط متغییرهایی که از قبل ست شدن تعیین میشه.

خب حالا برگردیم سر بحث کامپایل! شاید این مباحث بنظر پیچیده و طولانی بیان، ولی یک بار که یاد بگیرید و انجام بدید بعدش دیگه چیز سخت و گیج کننده ای نیست و عوضش کلی چیزهای مفید هم از ساختار اندروید و جاوا و طرز کامپایل و غیره یاد گرفتید که اعتمادبنفس و انعطاف و قدرت کلی شما رو بالا میبره و نه فقط در این مورد خاص بلکه در موارد دیگری تا پایان عمرتون هم میتونه بصورت مستقیم یا غیرمستقیم به دردتون بخوره.

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

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

راستی یه توضیح و اطلاعات عمومی مفید باز بدم. فایلی که ant برای دستورات کامپایل برنامهء شما میخونه فایل build.xml در ریشهء پوشهء پروژهء شماست. البته خود این فایل اگر با یک ادیتور بازش کنید میبینید که چیز زیادی توش نیست، و بنده با بررسی که کردم متوجه شدم درواقع عمدهء دستورات کامپایل و ساخت برنامه در یک فایل build.xml که در پوشهء Android SDK در آدرس tools/ant قرار داره، درج شدن که این فایل توسط دستور در قسمت انتهایی فایل build پروژهء اجرا میشه. پیشنهاد میکنم نگاهی به محتویات این فایلهای build بندازید بد نیست و میشه تاحد قابل توجهی (بخصوص اگر قبلا با سیستم make لینوکس آشنا بوده باشید) اون رو با همون خوندن و نگاه و بررسی اول فهمید.

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

خب حالا اگر دستور 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 بطور خودکار امضاء میشه، اما این کلید فقط برای همین توسعه و تست و موقتی است نمیشه یا نباید ازش برای نسخهء نهایی و انتشار برنامه ها استفاده کرد.

شاید بپرسید چرا برنامه های اندروید باید امضای دیجیتال داشته باشن. این کار بخاطر اینه که هویت و مالکیت برنامه های اندروید یکتا و قابل اثبات باشه، ضمن کاربردهای امنیتی و مثلا برای آپدیت و غیره که احتمالا از نظر فنی داره که در این لحظه اطلاعات موثق و حضور ذهن و تمرکز درمورد جزییات این مسئله رو که به بحث جاری مربوط نمیشه ندارم.

خب حالا که با دستور ant installd یا کپی و نصب دستی، برنامهء شما روی گوشی نصب شد، میتونید برنامه رو در لیست برنامه های گوشی پیدا کرده و اجرا کنید. به همین سادگی!
برای پاک کردن برنامه از روی گوشی هم میتونید از دستور ant uninstall استفاده کنید.
البته باید بگم امکان نصب و پاک کردن برنامه ها روی گوشی واقعی یا مجازی (شبیه ساز) توسط برنامهء adb.exe هم وجود داره (درواقع فکر میکنم و قبلا هم اشاره کردم که ant با هدایت دستورات فایلهای build هم طبیعتا برای انجام این دسته عملیات از adb استفاده میکنه) که شاید در مواردی نیاز یا راه دست باشه.

خب ما طرز ایجاد و کامپایل و نصب یک پروژهء اندروید توسط خط فرمان رو تا اینجا شرح دادیم؛ اما بعضی وقتا هست که میخوایم یک پروژهء اندروید رو که از قبل وجود داره (و شاید مثلا توسط سیستم دیگری مثل Eclipse ایجاد شده) توسط خط فرمان کامپایل کنیم. در این موارد باید چه کرد؟ آیا همه چیز از قبل آمادس و کافیه فقط خط فرمان رو در دایرکتوری پروژه مورد نظر باز کنیم و دستورات قبلی رو اجرا کنیم؟ حقیقتش من خودم نیاز به این مسئله پیدا کردم و با تست اول متوجه شدم که اینطور پیشفرض آماده و راحت هم نیست، ولی خوشبختانه خیلی راحت و سریع تونستم طرز راه انداختنش رو بفهمم و ردیفش کنم! البته شاید نمونه برنامه ای که من روش تست کردم چون ساختار استاندارد/ساده ای داشته این کار به سادگی و بدون مشکل انجام شد، ولی فکر میکنم در موارد دیگر هم با کمی بررسی و تلاش و احتمالا کمی ویرایش فایلهای پیکربندی یا build و اینها طبیعتا میشه به نتیجه رسید.
بعنوان نمونه، من از sample هایی که با android sdk نصب کردم یکی رو برمیدارم. مثلا پروژه ای بنام NotePad رو از C:\Program Files\android-sdk\samples\android-16 بردارید و جای دیگری کپیش کنید. حالا خط فرمان رو باز کرده و وارد پوشه NotePad میشیم، فرمان setant رو اجرا میکنیم، بعد ant debug. این پیام خطا رو دریافت میکنیم:
Buildfile: build.xml does not exist!
خب من همین الان یخورده بررسی کردم و متوجه شدم که راه احتمالی برای آماده کردن پروژه برای ant چیه. اول فرمان ant –help رو اجرا کردم ببینم آپشن و دستوری برای این کار در ant وجود داره یا نه. توجه کنید که یکی از راههای مهم حل مشکلات همین پاس کردن پارامتر help به ابزارها و برنامه هاست و خوندن خروجی ای که تولید میکنن. در برنامه های ویندوزی help معمولا با قرار دادن ‎/?‎ یا ‎/h و شاید ‎/help در جلو فرمان اجرا میشه، اما در دنیای لینوکس استاندارد عمومی که بیشتر برنامه ها ازش پشتیبانی میکنن ‎–help یا ‎–h است (یکی یا هردوش به احتمال زیاد جواب میده). بنابراین شما میتونید هر یک از این آپشن ها رو به یک برنامه پاس کنید تا یکی از اونا جواب بده. البته گاهی هم اگر برنامه با پارامترهای اشتباه/نامفهوم اجرا بشه یا پارامترهای کافی که برای عملیات خودش نیاز داره بهش داده نشه، خودش یکسری پیام راهنما رو چاپ میکنه که البته بعضی وقتا بجای helpکامل و مفصل درواقع یک usage message است (usage message پیام کوتاه و اطلاعات مختصری است که معمولا فرمت و نکات کلی استفاده از اون فرمان/برنامه رو نشون میده). بنابراین شما بهرصورت معمولا باید اون آپشن ها رو هم تست کنید تا ببینید آیا برنامه help کامل تری داره یا نه. به همین سادگی گاهی مشکلات ظاهرا بزرگ بدون اینکه نیازی به استفاده از هر منبع دیگری باشه حل میشن! فراموش نکنیم در خود برنامه ها و مستندات همراه اونا میتونه اطلاعات و راهنماهای کافی برای خیلی کارها وجود داشته باشه؛ فقط کمی سواد و زیرکی و مهارت میخواد که بتونید بصورت بهینه ای از این منابع استفاده کنید.
اما با بررسی خروجی help فرمان ant بنظر نیامد که ربطی به نیاز ما داشته باشه:
D:\Documents and Settings\hm\Desktop\NotePad>ant --help
Unknown argument: --help
ant [options] [target [target2 [target3] ...]]
Options:
-help, -h print this message
-projecthelp, -p print project help information
-version print the version information and exit
-diagnostics print information that might be helpful to
diagnose or report problems.
-quiet, -q be extra quiet
-silent, -S print nothing but task outputs and build failures
-verbose, -v be extra verbose
-debug, -d print debugging information
-emacs, -e produce logging information without adornments
-lib <path> specifies a path to search for jars and classes
-logfile <file> use given file for log
-l <file> ''
-logger <classname> the class which is to perform logging
-listener <classname> add an instance of class as a project listener
-noinput do not allow interactive input
-buildfile <file> use given buildfile
-file <file> ''
-f <file> ''
-D<property>=<value> use value for given property
-keep-going, -k execute all targets that do not depend
on failed target(s)
-propertyfile <name> load all properties from file with -D
properties taking precedence
-inputhandler <class> the class which will handle input requests
-find <file> (s)earch for buildfile towards the root of
-s <file> the filesystem and use it
-nice number A niceness value for the main thread:
1 (lowest) to 10 (highest); 5 is the default
-nouserlib Run ant without using the jar files from
${user.home}/.ant/lib
-noclasspath Run ant without using CLASSPATH
-autoproxy Java1.5+: use the OS proxy settings
-main <class> override Ant's normal entry point

نکتهء جالبی که دیده میشه اینه که اولش گفته Unknown argument: –help و این نشون میده ant پارامتر یا آپشن ‎–help رو نمیشناسه!! ولی در عین حال بخاطر عدم شناسایی این آپشن اومده و اطلاعات help خودش رو پرینت کرده.
گزینهء بعدی که بنظر من رسید این بود که شاید در فرمان android که قبلا نشون دادیم میشه باهاش اسکلت اولیه یک پروژه اندروید قابل کامپایل با ant رو رو ایجاد کرد امکانی برای این کار باشه. بنابراین من فرمان android –help رو اجرا کردم که این خروجیشه:
D:\Documents and Settings\hm\Desktop\NotePad>"C:\Program Files\android-sdk\tools\android.bat" --help

Usage:
android [global options] action [action options]
Global options:
-h --help : Help on a specific command.
-v --verbose : Verbose mode, shows errors, warnings and all messages.
--clear-cache: Clear the SDK Manager repository manifest cache.
-s --silent : Silent mode, shows errors only.

Valid actions are composed of a verb and an optional direct object:

- sdk : Displays the SDK Manager window.
- avd : Displays the AVD Manager window.
- list : Lists existing targets or virtual devices.
- list avd : Lists existing Android Virtual Devices.
- list target : Lists existing targets.
- list device : Lists existing devices.
- list sdk : Lists remote SDK repository.
- create avd : Creates a new Android Virtual Device.
- move avd : Moves or renames an Android Virtual Device.
- delete avd : Deletes an Android Virtual Device.
- update avd : Updates an Android Virtual Device to match the folders
of a new SDK.
- create project : Creates a new Android project.
- update project : Updates an Android project (must already have an
AndroidManifest.xml).
- create test-project : Creates a new Android project for a test package.
- update test-project : Updates the Android project for a test package (must
already have an AndroidManifest.xml).
- create lib-project : Creates a new Android library project.
- update lib-project : Updates an Android library project (must already have
an AndroidManifest.xml).
- create uitest-project: Creates a new UI test project.
- update adb : Updates adb to support the USB devices declared in the
SDK add-ons.
- update sdk : Updates the SDK by suggesting new platforms to install
if available.

خب برای منکه خیلی زود اون قسمتی که نوشته:
- update project : Updates an Android project (must already have an
AndroidManifest.xml).

جلب توجه کرد! فکر کنم خودشه!
پس اومدم و فرمان android.bat update project رو در دایرکتوری پروژه اجرا کردم:
اما به من خطا داد که خط اول خروجیش اینه:
Error: The parameter --path must be defined for action 'update project'
داره میگه که باید پارامتر ‎–path رو هم برای این عملیات مشخص کنید.
پس من این فرمان رو اجرا کردم که بهش بگم دایرکتوری جاری (.)، دایرکتوری پروژهء مورد نظر میباشد:
android.bat update project --path .
اما این بار این خطا رو به من داد:
Error: The project either has no target set or the target is invalid.
Please provide a --target to the 'android.bat update' command.

البته چند خط دیگه هم بود که یه چیزایی راجع به sub-projects این پروژهء خاص میگفتن که چون فعلا برای ما مهم نیست (خودمم هنوز بررسیش نکردم) ذکر نمیکنم.
خب این پیام خطا به ما چی میگه! میگه target پروژه مشخص نیست یا target نامعتبری داره و شما باید با پارامتر ‎–target یک target هم برای پروژه مشخص کنید. اگر در بحثهای قبلی یادتون باشه target درواقع نسخهء کتابخانه/API مورد نظر اندروید بود که میخوایم پروژه رو با اون بسازیم و تست کنیم. ما در اون مثالها از ‎–target 1 برای مشخص کردن اولین (و همچنین تنها) نسخه ای که روی سیستم در دسترس داشتیم استفاده کردیم، پس در اینجا هم همین کار رو میکنیم:
android.bat update project --path . --target 1
خب حالا دیگه android به ما خطا نمیده و ما این اطلاعات رو در خروجی دریافت میکنیم:
Updated and renamed default.properties to project.properties
Updated local.properties
No project name specified, using Activity name 'NotesList'.
If you wish to change it, edit the first line of build.xml.
Added file D:\Documents and Settings\hm\Desktop\NotePad\build.xml
Added file D:\Documents and Settings\hm\Desktop\NotePad\proguard-project.txt
It seems that there are sub-projects. If you want to update them
please use the --subprojects parameter.

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

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

خب مطلب بعدی که میخوام بگم استفاده از scp است. ضمنا این مطلب ارتباط مستقیمی با توسعهء برنامه های اندروید نداره!
Scp یک برنامه ای است که برای انتقال امن (ارتباطاتش رمزنگاری شده) فایل ها بین دو سیستم از طریق شبکه و اینترنت بکار میره. Scp از ssh استفاده میکنه، بنابراین باید یک سرور ssh که از scp پشتیبانی میکنه روی ماشین دیگر نصب و فعال باشه. اگر گوشی شما مثل ما من در سیستمتون کاملا شناسایی و نصب نشه و نتونید از طریق ویندوز به شکل معمول به فولدرها و فایلهای گوشیتون دسترسی داشته باشید، میتونید از طریق scp فایلها رو بین گوشی و PC رد و بدل کنید. البته اینو بگم که گوشی من روی سیستم محل کارم با اینکه اونم ویندوز XP است (تازه اینی که خونه دارم سرویس پک 3 است و مال محل کارم سرویس پک 2) کاملا نصب شده و کار میکنه، که احتمالا بخاطر اینه که روی اون سیستم Samsung Kies رو نصب کردم و برنامهء مذکور از طریق اینترنت دانلودهای لازمی رو انجام داد و اجزای مورد نیازی رو که دقیقا نمیدونم چی بوده نصب کرده. ولی در خونه اینترنت مناسبی نداشتم بهرحال و اینترنت گوشی هم که کیفیت کمتری داره و سرعتش کمتر و هزینش هم بیشتره! اینطور مواقع هست که محدودیت و نیاز باعث خلاقیت و استفاده از قدرتها و سوادی که آدم بدست آورده میشه که آدم خودش هم حال میکنه و متوجه میشه که تا چه حد پیشرفت کرده و دانش و توانایی کاربردی داره!

سرور ssh که روی گوشی نصب کردیم ssh helper است که از scp هم پشتیبانی میکنه. اما در سمت PC باید scp رو از کجا بیاریم؟ خب باید بگم که اگر توی پوشهء محل نصب PuTTY رو نگاه کنید فایلی بنام pscp.exe مشاهده میکنید که اگر کمی هوشمندی به خرج بدیم مشکوک میشیم که یک نمونه از برنامهء scp میباشد!
در قدم بعدی میایم و مثل مثالهای قبلی به این برنامه پارامتر help پاس میکنیم ببینیم چی میشه!
C:\Program Files\PuTTY>pscp --help
PuTTY Secure Copy client
Release 0.63
Usage: pscp [options] [user@]host:source target
pscp [options] source [source...] [user@]host:target
pscp [options] -ls [user@]host:filespec
Options:
-V print version information and exit
-pgpfp print PGP key fingerprints and exit
-p preserve file attributes
-q quiet, don't show statistics
-r copy directories recursively
-v show verbose messages
-load sessname Load settings from saved session
-P port connect to specified port
-l user connect with specified username
-pw passw login with specified password
-1 -2 force use of particular SSH protocol version
-4 -6 force use of IPv4 or IPv6
-C enable compression
-i key private key file for authentication
-noagent disable use of Pageant
-agent enable use of Pageant
-batch disable all interactive prompts
-unsafe allow server-side wildcards (DANGEROUS)
-sftp force use of SFTP protocol
-scp force use of SCP protocol

البته در واقع بدون هیچ پارامتری هم این برنامه همین صفحه رو چاپ میکنه!
ما از این خروجی دیگه مطمئن میشیم که بله این برنامه همون scp مورد نظر ماست. طرز استفاده رو هم که بهمون نشون داده، پس نباید دیگه مشکلی در کار باشه.
حالا نمونه هایی از طرز استفاده رو میذارم:
انتقال یک فایل به گوشی:
دقت کنید که برای انتقال فایل باید روی گوشی سرور ssh helper در حال اجرا باشه و همچنین Tether کرده باشید تا یک ارتباط شبکه بین گوشی و PC ایجاد شده باشه، مگر اینکه بتونید از طریق شبکه شدگی مثلا توسط Wifi که هر دوی PC و گوشی ازش استفاده میکنن این کار رو انجام بدید (من خودم هنوز این جزییات رو تست نکردم).
pscp -P 2222 -pw admin C:\vids\t80.flv 192.168.42.129:/storage/extSdCard/
در این مثال مشاهده میکنید که ما فایل C:\vids\t80.flv رو از روی PC به SD card روی گوشی منتقل کردیم.
با پارامتر آپشن P (حرف P بزرگ) پورتی رو که سرور ssh روی گوشی روش در حال اجراست مشخص کردیم؛ ssh helper بصورت پیشفرض روی پورت 2222 اجرا میشه، ولی میشه در تنظیماتش تغییرش داد. البته در روی سرورهای لینوکس ssh معمولا روی پورت استاندارد 22 اجرا میشه ولی چون گرفتن پورت های شماره پایین نیاز به مجوزهای root داره، که ممکنه گوشی root نشده باشه، ssh helper بصورت پیشفرض روی یک پورت معمولی (Unprivileged) و شماره بالا اجرا میشه.
با پارامتر pw هم پسورد سرور ssh رو مشخص کردیم که درمورد ssh helper پسورد پیشفرض admin است. البته اگر سرور ssh بطور معمول و اغلب اوقات روی گوشی شما در حال اجراست و به اینترنت متصل هستید شاید بهتر باشه بخاطر مسائل امنیتی، این پسورد رو به یک پسورد ناشناخته و قوی تر تغییر بدید، چون در غیر این صورت هکری از سمت اینترنت ممکنه بتونه به گوشی شما نفوذ کنه!
ضمنا میتونید پسورد رو در خط فرمان مشخص نکنید، که اونوقت بعد از اجرای فرمان و موقع وصل شدن به سرور ssh ازتون میپرسه و وارد میکنید. از نظر امنیتی هم وارد کردن پسورد در خط فرمان توصیه نمیشه (بخصوص در هر کتاب و منوال لینوکس اینو نوشته)، چون به این شکل پسورد از طریق History خط فرمان و احتمالا از بعضی راههای دیگر ممکنه در دسترس دیگران قرار بگیره (امنیتش میاد پایین چون روی سیستم دیده و ذخیره میشه)، ولی ما چون داریم کار تست و آموزش و یادگیری میکنیم و بصورت منفرد کار میکنیم و خطر جدی ای در این باب تهدیدمون نمیکنه، مشکلی نداره.
192.168.42.129 هم که آدرس IP گوشی ما هست که با PC شبکه شده (موقعی که گوشی رو Tether کردید آدرس IP گوشی همون آدرسی است که بعنوان Default Gateway در کانکشنش توی ویندوز مشخص شده)، و بعد از IP و بعد از یک کالن (:) آدرس مسیر روی گوشی رو که میخوایم فایل مورد نظر در اونجا کپی بشه میدیم. شما در انتهای این آدرس میتونید یک اسم فایل جدید هم اضافه کنید که فایل مورد نظر با اون اسم روی گوشی ذخیره بشه.

اینم یه مثال برعکس، یعنی انتقال فایل از گوشی به PC:
pscp -P 2222 -pw admin 192.168.42.129:/storage/extSdCard/t/o.wmv c:\
فکر نمیکنم نیازی به توضیح داشته باشه! فقط ترتیب و جای آدرس گوشی و PC عوض شده.

البته اینو بگم که با adb هم میشه انتقال فایل انجام داد که به این شکل یکسری مزایایی داره: نیاز به Tether کردن گوشی نداره، نیاز به نصب و اجرای سرور ssh روی گوشی نداره، ظاهرا سرعتش هم بیشتره.
مثلا همون فرمان قبل رو میشه با adb هم به این شکل نوشت:
"C:\Program Files\android-sdk\platform-tools\adb.exe" -d pull -p /storage/extSdCard/t/o.wmv c:\
من ‎–d رو گذاشتم تا برای adb مشخص کنم که اگر هر دوی گوشی و یک دستگاه مجازی اندروید روی سیستم شناسایی شد، منظور من گوشیه (حرف d اشاره به Device داره و اگر بجاش e بذارید اشاره به Emulator).
دستور pull هم که یعنی میخوایم فایلی رو از گوشی بیرون بکشیم (برای انتقال در جهت عکس، یعنی از PC به گوشی، از push استفاده کنید).
آپشن p هم داره میگه که موقع انتقال، پیشرفت فرایند انتقال رو با نشون دادن درصد انتقال و اینها بهمون نشون بده که بتونیم از وضعیت عملیات درحال اجرا آگاه بشیم. این آپشن ضروری نیست ولی خوفه!
نکته: من با انتقال در جهت عکس، یعنی انتقال فایل از PC به گوشی بوسیلهء adb مشکل داشتم و موفق نشدم؛ خطای Permission denied میده، ولی با تحقیق و تست متوجه شدم که این خطا رو موقع انتقال به کارت جانبی میده و وقتی مقصد کارت اصلی خود گوشی باشه این مشکل وجود نداره.

البته در نظر داشته باشید که scp یک فرمان کلی تر برای انتقال فایل بین هر دو رایانه ای است و ضمنا از پروتکل ssh استفاده میکنه و بنابراین امنه و میشه با خیال راحت در اینترنت ازش استفاده کرد (کسی در مسیر نمیتونه اطلاعات و فایلهای ما رو سرقت یا دستکاری کنه). بهرحال من خواستم تمام چیزایی رو که این چند وقته با اندروید و گوشیم یاد گرفتم و تست کردم براتون بگم و قدرت خط فرمان و دنیای لینوکس رو هم درک کنید که به شرط سواد و مهارت میشه باهاش تقریبا هرکاری کرد و خیلی از مشکلات و محدودیت ها رو هم حل کرد. بنظر من استفاده بهینه از سیستم با استفاده همزمان و ترکیب هردوی امکانات محیط گرافیکی و خط فرمان بدست میاد.

راستی در سطور بالاتر گفته بودم که طرز امضاء دیجیتال کردن فایل apk برای انتشار نهایی رو خواهم گفت، ولی به این نتیجه رسیدم که بهتره این کار رو نکنم، چون بحث و هدف در این مقاله فقط شروع و انجام توسعه در حین یادگیری برنامه نویسی اندروید است و در این حد نیازی به دونستن و انجام جزییات روش انتشار نهایی نیست. هرکس تا اون مرحله پیش بره میتونه بقیش رو هم خودش پیدا کنه چون مطلب چندان پیچیده ای هم نیست و اگر در اینترنت سرچ کنید راحت به جوابش میرسید که دو خط فرمان بیشتر نیست (البته روشهای دیگری هم وجود داره). فقط به این نکته اشاره کنم که دو برنامه ای که در این فرایند استفاده میشن، یکی برنامهء keytool برای تولید یک زوج کلید خصوصی و عمومی برای خودتون است که میتونید این برنامه رو در در پوشهء bin در پوشهء محل نصب JDK پیدا کنید، و دیگری برنامهء jarsigner است که اون رو هم همونجا پیدا میکنید؛ پس گیج نشید و دنبال محلی برای دانلود اونا نگردید!

و در پایان مفید دیدم که یک مطلب دیگه در مورد شروع یادگیری و توسعه برنامه های اندروید رو هم اضافه کنم!
چون خودم موقع نصب Android SDK این برام سوال و مشکل بود که دقیقا کدام اجزاء در Android SDK ضروری هستن که باید از طریق SDK Manager نصب کنم، فکر میکنم ممکنه این سوال و مشکل برای دیگران هم پیش بیاد و دیدن یک نمونه از نصب در حال کار SDK براشون مفید باشه.
موقعی که Android SDK رو نصب میکنید و اجرا میکنید اجزای لازم برای توسعه برنامه های اندروید رو نداره و تازه اون موقع لیستی از اجزای مختلف و کتابخانه های مختلف اندروید و خلاصه بند و بساطش و مخلفات مختلفش رو از گوگل استعلام میکنه و به شما نشون میده و بعد شما میتونید از بین اونها گزینه هایی رو که میخواید انتخاب کرده و بذارید تا SDK Manager اون اجزاء رو دانلود و نصب کنه. چون تعداد این پکیج ها زیاده و حجم قابل توجهی هم دارن و از اون طرف بخاطر تحریم ایران از سمت گوگل، برای دانلود اونا باید از فیلترشکن استفاده کرد که این کار دانلود رو مشکل تر و کندتر میکنه، اینکه بیایم و تنها اجزایی رو که واقعا نیاز داریم و برای هدف و این مرحله از کار ما ضروری هستن انتخاب کنیم میتونه مهم و مفید باشه و در وقت و انرژی و هزینهء ما صرفه جویی قابل توجهی بکنه. بنابراین بنده تصویری از محیط SDK Manager خودم رو میذارم که نشون میده چه اجزایی در اون نصب شده:

البته از میان اینها، 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).

1 دیدگاه در “تجربیات من با گوشی اندروید و ویندوز XP و توسعه برنامه های اندروید با استفاده از ابزارهای خط فرمان

  1. بازپینگ: علم خوره

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>