مهدی ایران نژاد
مهدی ایران نژاد
خواندن ۹ دقیقه·۳ سال پیش

انتشار فایل aab در کافه بازار

اگر کسی هستید که صرفا برای مطالعه نحوه انتشار فایل aab به این مقاله مراجعه کردید، پیشنهاد میکنم به بخش سوم این مقاله که کمی پایین‌تر نوشته شده، مراجعه کنید؛ بخش های ابتدایی بیشتر برای آشنایی با فرمت aab و چرایی استفاده ما از آن و همچنین دلیل نوشتن این مقاله هست.

بخش اول: معرفی فرمت AAB، کاربرد و مزایای آن

اگه توسعه دهنده اپ یا بازی‌ساز پلتفرم اندروید باشید و بخواهید اپ یا بازی خودتون رو در محیط کافه بازار منتشر کنید، حتما با واژه من‌درآوردی و عجیب غریب رهانش از سوی بازار آشنا هستید؛ داخل هر رهانش ما میتونیم چندین فایل APK برای معماری های مختلف از پردازنده ها و سخت‌افزار ها منتشر کنیم؛ من تا جایی که اطلاع دارم گوشی های اندرویدی از لحاظ سخت‌افزاری همواره بر اساس 3 معماری زیر تولید و ساخته میشوند:

  1. ARM: ARMv7 or armeabi or v7a
  2. ARM64: AArch64 or arm64 or v8a
  3. x86: x86 or x86abi (در حال منسوخ شدن)

برای این که ما بتوانیم از بابت پشتیبانی برنامه خود پس از انتشار و صحت عملکرد آن روی تمامی دستگاه ها مطمئن باشیم، باید در هنگام خروجی گرفتن از کد های خود، تنظیمات مربوط به معماری های پردازنده رو بررسی کرده و حدالامکان هر 3 معماری بالا رو برای خروجی گرفتن فعال کنیم؛ تا اینجا مشکلی نیست و همه چیز بر وقف مراد است؛ ولی پس از خروجی گرفتن سر و کله یه مشکل خیلی جزئی و بسیار آزار دهنده پیدا میشه که کاملا عادی و منطقی هستش و اونم افزایش قابل توجه حجم فایل خروجی ما از برنامه و پروژه است.

من یک توسعه دهنده بازی های اندرویدی هستم که با انجین یونیتی کار میکنم، پس تجربه خودم در برخورد با این مشکل رو اینگونه توضیح میدم که به ازای انتخاب هر کدوم از معماری های بالا چیزی در حدود 10 الی 15 مگابایت به حجم خروجی بازی من اضافه میشه، یعنی اگه حجم بازی من 30 مگابایت باشه و هر 3 معماری رو انتخاب کنم در خوش‌بینانه ترین حالت، حجم نهایی بازی من حداقل حدود 60 مگابایته و این خیلی بده، حداقل برای کاربری میخواد بازی رو دانلود کنه جلوه خوبی نداره.

راه حل بسیار ساده برای رفع این مشکل اینه که از پروژه خودمون بر اساس هر معماری، خروجی APK مجزایی بگیریم و منتشر کنیم، خبر خوب اینه که کافه بازار این روش رو پشتیبانی میکنه و شما میتونید با ایجاد یک رهانش فایل های apk مربوط به هر معماری رو به صورت مجزا آپلود و منتشر کنید.

روش بالا شاید جوابگو باشه ولی اصلا پیشنهاد نمیشه، دلیلش اینه که شما باید همواره Version Code مربوط به فایلی که داخل بازار آپلود میکنید از Version Code آخرین نسخه آپلود شده بیشتر باشه، یعنی اگر آخرین ورژن بازی یا برنامه منتشر شده شما عدد 3 باشه، طبق معمول باید فایلی که آپلود میکنید دارای ورژن 4 باشه ولی در این روش باید به ازای هر معماری که خروجی میگیرید یک ورژن مجزا در نظر بگیرید تا بتوانید فایلتون رو در پنل بازار آپلود کنید و اگر هر سه معماری رو انتخاب کنید باید به ترتیب ورژن 4، 5 و 6 رو برای هر نسخه از فایل apk در نظر بگیرید؛ این مشکل نه تنها از مشکل قبلی بدتره بلکه به بدترین نحو ممکن فاجعه‌اس؛ توضیح این که چرا این یک مشکل بدتره اصلا داخل این مقوله نمیگنجه ولی با کمی فکر به عمق فاجعه پی میبرید....

دقیقا نمیدونم هدف بازار از گذاشتن این قانون چیه و با خودش چه فکری کرده چنین فرایندی رو برای خودش تعریف کرده؟ حداقل باید به کاربر اجازه بده در یک رهانش بر اساس apk ها و معماری هرکدوم از آنها ورژن کد یکسانی رو آپلود کنه...

همه این حرفا رو زدیم که اینجا بگیم چی میشد اگه میتونستیم فایلی رو منتشر کنیم که تمام این معماری هارو درون خودش داشته باشه ولی کاربر ها بتونند در هنگام دانلود برنامه فقط معماری مخصوص خودشونو با حجم کمتر و بدون این مشکلاتی که مطرح کردیم، دریافت کنند؟

اینجاست که فرمت AAB میاد وسط میدان، این فرمت که مخفف Android App Bundles هست یک راهکار مناسب برای رفع مشکلات انتشار اپلیکیشن هاست که توسط گوگل در سال 2018 معرفی شد؛ در این راهکار شما نیازی به ساختن فایل apk ندارید و تمامی کد های بومی اپلیکیشن خود، قسمت های اصلی پروژه و قسمت های مربوط به هر معماری رو به صورت محافظت شده در قالب یک فایل تحت فرمت aab قرار میدید و گوگل‌پلی هنگام انتشار اون میاد به صورت خودکار فایل apk مناسب برای هر کاربر و دستگاه رو میسازه و در اختیارش میده...

فایل aab مزایای زیادی داره و مشکل افزایش حجم و تداخب معماری های مختلف فقط و فقط یکی از مشکلاتی هست در این فرمت حل شده‌اند و کلی مشکلات امنیتی دیگر هستند در این فرمت نیز برطرف شده‌اند که توضیح و تشریح آنها خارج از بحث این مقاله است.
پیشنهاد میکنم برای آشنایی بیشتر با این فرمت این مقاله را مطالعه کنید: https://dgto.ir/286l

ولی هدف ما انتشار در گوگل پلی نیست بلکه ما قصد داریم فایل aab خودمون رو داخل کافه بازار منتشر کنیم؛ در ادامه نحوه انجام این فرایند رو براتون شرح میدم....

بخش دوم: کافه بازار و فرمت AAB

مثل همیشه ما با یه سری فرایند های پیچیده بازار مواجه هستیم، یه سری کار که قطعا عبارت "لقمه را دور سر گرداندن" در مقابل این پیچیدگی هایی که بازار ایجاد کرده، سر تعظیم فرود می‌آورد؛ من قصد ندارم در این مقاله به UX و تجربه کاربری سیستم بازار در آپلود و انتشار برنامه ها بپردازم چون واقعا کاری بی‌فایده و حوصله سر بری هست.

کاری که من کردم مطالعه داکیومنت مضخرف بازار در مورد انتشار باندلی یا aab، سرچ های مختلف در گروه های تلگرامی و سایت های اینترنتی بود که در نتیجه با ساختن یک فایل bath به نتجیه مطلوب رسیدم و بدون کوچک‌ترین درگیری با یکسری کامند گمراه کننده تونستم فایل باینری امضای برنامه رو بسازم.

قبل از این که به سراغ اصل ماجرا برم اول توضیح میدم که این فایل چیه و چه کاربردی داره.

کل این ماجرا بر میگرده به همون فایل aab که توسط گوگل ایجاد شده، گوگل این فرمت رو به قول معروف برای گوگل‌پلی اختراع کرد تا از یه سری مشکلات انتشار جلوگیری کنه و الحق به خوبی تونست از پسش بر بیاد و چند روز پیش هم خوندم که فرمت apk کلا منسوخ شده و گوگل پلی دیگه از این فرمت پشتیبانی نمیکنه ولی توسعه‌دهنده ها میتونن برای خودشون از این فرمت استفاده کنند.

پس نتیجه میگیریم که فایل aab به طور پیش‌فرض برای گوگل‎‌پلی ساخته شده و جایی کاربرد نداره؛ چیزی که این وسط اتفاق میافته اینه که گوگل فایل aab مارو تحویل میگیره و ازش apk میسازه و در اختیار کاربر ها قرارش میده، برای این کار گوگل نیاز داره apk هایی که میسازه رو امضا کنه به همین خاطر قبل از هر کاری از ما فایل مربوط به کلید امضای برنامه رو تحویل میگیره و بر اساس اون یک کلید امضای خصوصی میسازه، حالا گوگل تمام apk هایی که میسازه رو به نمایندگی از ما امضا و منتشر میکنه.

تا اینجا ما با ساز و کار گوگل‌پلی آشنا شدیم، حالا بازار هم میخواد همچنین کاری رو با فایل های aab ما بکنه ولی یه نکته ای اینجا هست، از اون جایی که ما خیلی به سیستم های ایرانی و امنیتشون اعتماد داریم، در اختیار گذاشتن فایل کلید امضای پروژه در چنین سیستمی فقط یک حماقت محضه و کافه بازار هم به خوبی بر این مسئله واقفه؛ پس این جا یک سیستم و ابزاری رو پیاده کرده تا ما با استفاده از اون یک کلید رمز شده از کلید اصلی خودمون بسازیم و اون رو در اختیارشون بزاریم تا با استفاده از اون کلید رمز شده فایل های apk که میسازه رو برامون امضا کنه.

سیستم های بانکی، مخابراتی و اپراتور های تلفن همراه کشور رو هک کردن این که دیگه براشون مثه آب خوردنه :|

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

پیش‌نیاز این کار نصب بودن JDK و JRE نسخه 8 یا بالاتر روی سیستم و اضافه کردن مسیر آن در متغیر path و JAVA_HOME ویندوز است؛ جهت اطلاعات بیشتر میتونید عبارت "config java_home" رو در گوگل سرچ کرده یا این مقاله را مطالعه کنید.

کافه بازار برای ساخت فایل باینری امضا ابزار اپن سورسی به اسم Bundle Signer رو توسعه داده که سورس کد و مستنداتش رو میتونید از گیت‌هاب این پروژه دریافت کنید؛ کلا یه سری مستندات چرت پرتی نوشته که باید چندین بار مطاالعه بشه یا خیلی در این زمینه حرفه ای باشید تا بلکه متوجه معنا و مفهومش بشید

در قدم اول آخرین نسخه این ابزار رو از لینک بالا دانلود کرده و در محلی مناسب ذخیره کنید.

اکنون باید کد های زیر رو در notepad بنویسیم:

@echo off cls set /p aabFilePath=&quotEnter the *.aab File Name or Fully Address Path: &quot echo. set /p saveLocation=&quotEnter Loaction for Storing the Generated *.bin File ([dot] . for Current Location):&quot echo. set /p ksPath=&quotEnter the *.keystore File Path: &quot echo. set /p ksAlias=&quotEnter the Key Store Alias: &quot echo. set /p ksPass=&quotEnter the Key Store Password: &quot echo. set /p aliasPass=&quotEnter the Alias Password: &quot echo. java -jar bundlesigner-0.1.7.jar genbin -v --bundle %aabFilePath% --bin %saveLocation% --v2-signing-enabled true --v3-signing-enabled true --ks %ksPath% --ks-key-alias %ksAlias% --ks-pass pass:%aliasPass% --key-pass pass:%ksPass% --pass-encoding utf-8 echo. pause

کد های بالا رو با یک اسم دلخواه و با پسوند bat یا cmd در کنار فایل bundle-signer ذخیره کنید.

نسخه bundle-signer که من استفاده کردم نسخه 0.1.7 بود و همانطور که در کد های بالا مشاهده میکنید عبارت "bundlesigner-0.1.7.jar" در واقع به اسم و نام همان فایل اشاره میکند، پس در صورتی که شما ورژن و نام متفاوتی با این نسخه را استفاده میکنید حتما نام مربوط به این نسخه را درون کد بالا اصلاح کنید.

پیشنهاد من استفاده از همان نسخه 0.1.7 برای انجام این فرایند است چون از بابت عملکرد آن اطمینان دارم...

از این پس هر زمان که نیاز به ساخت فایل باینری امضا داشتید، روی فایلی که در مرحله قبل ساختید راست کلیک کنید و روی گزینه run as administrator کلیک کنید و به ترتیب مقادیر مورد نیاز خود را بر اساس توضیحات زیر، وارد پنجره باز شده کنید...

در صورتی که در داخل اطلاعات خود از کارکتر space یا فاصله استفاده شده باشد باید آن را درون دابل کوتیشن یا "" قرار دهید...

اطلاعات درخواستی از طرف برنامه به ترتیب زیر است:

  1. آدرس فایل aab
  2. محل ذخیره سازی فایل باینری امضا؛ درصورتی که از . یا نقطه استفاده کنید، فایل ساخته شده در کنار فایل bundle-signer ذخیره میشود.
  3. آدرس فایل امضا با پسوند keystore
  4. نام مستعار یا Alias استفاده شده در امضای پروژه
  5. پسورد مشترک نام مستعار و کلید امضا

به عنوان مثال چیزی که در آخر داخل برنامه نمایش داده میشود شبیه به مقادیر زیر است:

Enter the *.aab File Name or Fully Address Path: "C:\Projects\My App Build.aab"

Enter Loaction for Storing the Generated *.bin File ([dot] . for Current Location): .

Enter the *.keystore File Path: "C:\Projects\My Key File.keystore"

Enter the Key Store Alias: KEY_ALIAS_NAME

Enter the Key Store Password: KEY_PASSWORD

نمونه فرایند انجام شده در برنامه
نمونه فرایند انجام شده در برنامه

پس از تائید اطلاعات وارد شده، مدت زمانی را بر اساس نوع پروژه و میزان حجم برنامه سپری میشود و در نهایت پیغامی چاپ میشود که نمایانگر موفقیت و اتمام فرایند فوق است.

اکنون کار ما تمام شده و شما میتوانید پس از آپلود فایل aab در پنل رهانش کافه بازار، فایل باینری امضا را نیز در اختیار کافه بازار قرار دهید.


نکته مهم در خصوص کد ها و فرایند بالا

کد های بالا برای کلید های امضای از نوع Java Key Store یا keystore.* نوشته شده‌اند؛ در صورتی که از کلید های نوع PKCS#8 استفاده میکنید، در بخش نظرات اعلام کنید تا کد مربوط به این نوع از کلید ها را هم به مقاله اضافه کنم. «چون تجربه کار با این نوع کلید امضا رو نداشتم، نوشتن کد و امتحان کردن آن نیاز به کمی تحقیق و بررسی داره»


منتظر نظرات و بازخورد های شما عزیزان هستم

موفق و پیروز باشید

کافه بازاراندرویدبازار
برنامه نویس و توسعه دهنده بازی های اندرویدی در Unity، طراح UI
شاید از این پست‌ها خوشتان بیاید