آرش کیانی برنامهای نوشت که میگوید همین حالا کدام داروخانه کرمانشاه باز است، سه هفته روی گوشی خودش امتحانش کرد، و بعد سه هفته دیگر دنبال چیزی گشت که هیچ درسی از آن حرف نزده بود: اینکه فایل را کجا بگذارد. حساب توسعهدهنده گوگل پلی از ایران باز نمیشود. کاری که در هر آموزشی یک دکمه است، اینجا اولین جایی است که کار میایستد.
یک صفحه وب خواسته میشود و میرسد. یک برنامه روی دستگاهی نصب میشود که کمبرق است، حواسش جای دیگری است، و اجازه دارد برنامه را بدون خبر ببندد؛ و پیش از همه اینها باید از دری رد شود که کسی صاحبش است. پنج خوشه زیر این صفحه نتیجه همین دو جملهاند، و ترتیب اهمیتشان برای خواننده ایرانی با ترتیب هر منبع انگلیسیزبانی فرق دارد.
پنج دری که یک انتشار از آنها رد میشود، و فقط اولی از جنس کد است
مسیر همان یک انتشار، به مقیاس صد: از ۱۰۰ باری که برنامه روی دستگاه خود آرش بیلد شد و کار کرد، ۷۱ از بازبینی فروشگاه گذشت، ۳۴ در جستوجوی فروشگاه پیدا شد، ۱۹ نصب شد و ۶ بار دوم باز شد. چهار در از این پنج، بعد از تمام شدن کد باز یا بسته میشوند.
ردهای رایج ظریف نیستند و در فروشگاههای ایرانی و غیرایرانی شبیه هماند: نبودن اعلامیه حریم خصوصی، ورودیای که بازبین نمیتواند از آن رد شود، و اجازهای که برنامه میگیرد و هیچجا به کار نمیبرد. آرش برای سومی رد شد، چون برنامه در باز شدن اول موقعیت مکانی میخواست، پیش از آنکه چیزی نشان بدهد.
از Android 6 اجازهها در زمان اجرا پرسیده میشوند و هر درخواست ممکن است رد شود، پس کد باید حالت رد را داشته باشد نه اینکه فرض کند گرفته است. نسخهای که پذیرفته شد موقعیت را بار سوم میخواهد، همان لحظهای که کاربر دکمه نزدیکترین داروخانه را زده، و سهم کسانی که قبول میکنند بالاتر رفت: اجازهای که دلیلش جلوی چشم باشد بیشتر داده میشود تا اجازهای که دم در خواسته شود.
سه چیزی که فایل را از دستگاه شما به دستگاه یک غریبه میرسانند
versionCode یک عدد صحیح است که باید بالا برود، و versionName فقط برای دیدن است. فروشگاه بستهای را که کد نسخهاش از نسخه روی ویترین بزرگتر نباشد رد میکند، و همین اولین چیزی است که سر بهروزرسانی دوم میشکند: کسی نام نسخه را از 1.0 به 1.1 میبرد و آن عدد را دست نمیزند.
اگر کلید امضا گم شود، همان برنامه دیگر بهروز نمیشود و باید از صفر منتشر شود. فروشگاه هویت برنامه را از امضا میشناسد، پس بستهای که با کلید دیگری امضا شده برای فروشگاه یک برنامه دیگر است: هر نصبی که دارید، هر نظری، و هر جایی که در جستوجو گرفتهاید از صفر شروع میشود. کلید و گذرواژهاش را همان روز اول جایی بگذارید که با از دست رفتن لپتاپ از دست نرود، نه روز بهروزرسانی.
گوگل پلی از ۲۰۲۱ برنامه تازه را فقط به شکل App Bundle میگیرد و کافه بازار APK، پس تیمی که هر دو را هدف گرفته از یک پروژه دو خروجی میسازد. تفاوتشان در کد نیست، در این است که کدام طرف بسته نهایی هر گوشی را میسازد: در حالت اول فروشگاه، در حالت دوم خود شما.
./gradlew bundleRelease./gradlew assembleRelease
چرخش صفحه، همان اتفاقی است که در جیب بیصدا میافتد
چرخش صفحه در اندروید اکتیویتی را از نو میسازد، و هر چیزی که نوشته نشده باشد از بین میرود. این تنها شکل قابل دیدن یک قاعده بزرگتر است: سیستمعامل حق دارد کار برنامه را تمام کند، حافظهاش را پس بگیرد، و بعد همان برنامه را در صفحهای که ادعا میکند در آن بوده دوباره باز کند.
دلیل اینکه این روی میز دیده نمیشود ساده است: گوشیای که به لپتاپ وصل است و اشکالزدا رویش باز است از این رفتار محافظت میشود، چون سیستم برنامهای را که در حال بازرسی است پس نمیگیرد. آرش برای محله انتخابشده یازده خط نوشت: در همان لحظه انتخاب روی حافظه پایدار دستگاه بنویس، هنگام باز شدن بخوان، و نسخه داخل حافظه را کش آن حساب کن نه حقیقت. همین قاعده به هر چیز دیگری هم میخورد که برنامه نگه داشته، و همان چیزی است که انگشت شست، وقفه، و صفحهای که در دست است را از یک پانویس به یک خوشه تبدیل میکند.
یک انتشار
بیلد اولین در از پنج تاست و تنها دری که از جنس کد است
پهنای هر نوار شمارش خود آرش از یک انتشار است، پس افت همان داده است: بزرگترین ریزش میان نصب شدن و بار دوم باز شدن میافتد.
- روی دستگاه بیلد میشوددری که هر آموزشی همانجا تمام میشود، و ارزانترین این پنج تا۱۰۰
- از بازبینی میگذردیک بار رد شد، برای اجازهای که دم در خواسته شده بود۷۱
- در فروشگاه پیدا میشودیک صفحه فروشگاه، پیش از آنکه برنامه باشد، یک نتیجه جستوجوست۳۴
- نصب میشودجایی که بیشتر اندازهگیریها تمام میشوند، و هنوز هیچ اتفاقی نیفتاده۱۹
- بار دوم باز میشوداولین عدد صادقانه، و همانی که فراموش شدن محله داشت از بین میبردش۶
این عددها اولین انتشار یک برنامه کوچک است که به صد تبدیل شده، نه آمار یک صنعت. ادعا شکل آن است: چهار در از پنج، بعد از تمام شدن کد رد میشوند.
جایی که کار میایستد: پلتفرم دوم، که اینجا مسئله پول نیست
پرسشی که این موضوع را همهجا اداره میکند این است که یک بار بنویسیم یا دو بار، و جوابش به این بستگی دارد که برنامه چقدر از خود دستگاه را لمس میکند. جای دیگر، هزینه پلتفرم دوم یک مک است و یک حساب سالانه. اینجا اینطور نیست: دستگاههای کمتر، و همانهایی که خرج میکنند بازاری دارد که نه حساب توسعهدهندهاش از ایران باز میشود و نه ویترین ایرانی دارد، و صادقانهترین جملهای که میشود اینجا نوشت این است که مسیر رایگانی برایش وجود ندارد.
نتیجهاش یک اشتباه گران و بسیار رایج است. تیمی یک کدپایه، هر دو فروشگاه، و آنچه خرج برمیدارد را انتخاب میکند تا نصف هزینه پلتفرم دوم را بدهد، و پلتفرم دوم هرگز نمیآید؛ چیزی که خریدهاند یک محدودیت است، بدون آن چیزی که قرار بود بخرند. اگر نیمه بزرگتر گوشیهای دنیا تنها مسیر واقعی شماست، آن تصمیم را از روی خود دستگاه بگیرید و نه از روی فروشگاهی که باز نمیشود.
سه چیزی که در ۲۰۲۶ باز میکنید
Android Studio روی هر سه سیستم رومیزی کار میکند، رایگان است، و جای Eclipse با افزونه اندروید را گرفت، که آموزشهای قدیمیتر از حدود ۲۰۱۵ هنوز همان را نشان میدهند. یک نکته که برای خواننده اینجا مهم است و در هیچ راهنمایی نیست: خود برنامه محلی است، ولی نصب اولیه اجزای SDK از سرورهای گوگل میآید. آن یک بار را برنامهریزی کنید، و بعد از آن روزهای کاریتان به شبکه بند نیست.
کافه بازار جای گوگل پلی را برای مخاطب داخل ایران گرفت، و انتشار روی آن رایگان است؛ فروشگاه از فروش درونبرنامهای سهم میگیرد و آن سهم را پیش از قیمتگذاری ببینید نه بعد از آن. مایکت همین کار را به شکل دوم انجام میدهد و هر دو APK امضاشده میگیرند، پس یک بسته برای هر دو کافی است. اینکه پول از کجا میآید تصمیمی است که شکل خود برنامه را عوض میکند، نه فقط صورتحسابش را، و جایش پولی، رایگان، اشتراکی و تبلیغاتی است.
Xcode تنها راه ساختن برای iOS است و یک مک میخواهد، که یک تصمیم سختافزاری است که یک ابزار نرمافزاری برایتان گرفته و بهتر است پیش از شروع بدانیدش. خود Xcode رایگان است. عضویتی که اجازه انتشار میدهد رایگان نیست و از ایران پرداختش راهی ندارد، پس برای بیشتر خوانندگان این صفحه شاخه iOS یک تصمیم نیست بلکه یک در بسته است، و بهتر است همان اول اینطور حسابش کنند.
پرسش بعدی این است که وقتی برنامه بیرون رفت، خرابی روی گوشیای که هرگز واردش نمیشوید چطور به شما گزارش میشود، و همان پرسش برای هر چه میان یک مرورگر و یک سرور میگذرد جواب سادهتری دارد، چون آنجا سرور مال خودتان است. و اگر تصمیم یک یا دو کدپایه هنوز باز است، جوابش بیشتر از آنکه به دستگاه ربط داشته باشد به نحو و اکوسیستم، هر بار یک زبان ربط دارد: به زبانی که تیم شما همین حالا مینویسد.