ایجاد چندین APK با ابعاد مختلف

اگر برنامه خود را در Google Play منتشر می‌کنید، باید یک Android App Bundle بسازید و آپلود کنید. وقتی این کار را انجام می‌دهید، Google Play به‌طور خودکار فایل‌های APK بهینه‌شده را برای پیکربندی دستگاه هر کاربر تولید و ارائه می‌کند، بنابراین آنها فقط کد و منابعی را که برای اجرای برنامه شما نیاز دارند دانلود می‌کنند. اگر در Google Play منتشر نمی کنید، انتشار چندین APK مفید است، اما باید خودتان هر APK را بسازید، امضا کنید و مدیریت کنید.

هنگامی که برنامه اندروید خود را برای استفاده از چندین APK در Google Play توسعه می‌دهید، مهم است که برخی از روش‌های خوب را از همان ابتدا اتخاذ کنید و از سردردهای غیرضروری بیشتر در فرآیند توسعه جلوگیری کنید. این درس به شما نشان می‌دهد که چگونه می‌توانید چندین APK از برنامه خود ایجاد کنید، که هر کدام کلاس متفاوتی از اندازه صفحه را پوشش می‌دهند. همچنین برخی از ابزارهای لازم برای حفظ یک پایگاه کد APK چندگانه را تا حد امکان بدون دردسر به دست خواهید آورد.

تأیید کنید که به چندین APK نیاز دارید

وقتی سعی می‌کنید برنامه‌ای ایجاد کنید که در طیف وسیعی از دستگاه‌های اندرویدی موجود کار کند، طبیعتاً می‌خواهید برنامه‌تان در هر دستگاه به بهترین شکل ظاهر شود. شما می‌خواهید از فضای صفحه‌نمایش‌های بزرگ استفاده کنید، اما همچنان روی صفحه‌های کوچک کار کنید، تا از ویژگی‌های جدید Android API یا بافت‌های بصری موجود در دستگاه‌های پیشرفته استفاده کنید، اما صفحه‌های قدیمی‌تر را رها نکنید. ممکن است در ابتدا به نظر برسد که پشتیبانی از چندین APK بهترین راه حل است، اما اغلب اینطور نیست. بخش استفاده از یک APK به جای راهنمای چندگانه APK شامل اطلاعات مفیدی درباره نحوه انجام همه این کارها با یک APK منفرد، از جمله استفاده از کتابخانه پشتیبانی ما و پیوندهایی به منابع در سراسر راهنمای برنامه‌نویس Android است.

اگر بتوانید آن را مدیریت کنید، محدود کردن برنامه خود به یک APK دارای چندین مزیت است، از جمله:

  • انتشار و تست آسان تر است
  • تنها یک پایگاه کد برای نگهداری وجود دارد
  • برنامه شما می تواند با تغییرات پیکربندی دستگاه سازگار شود
  • بازیابی برنامه در همه دستگاه ها فقط کار می کند
  • لازم نیست نگران ترجیحات بازار، رفتار «ارتقای» از یک APK به دیگری، یا اینکه کدام APK با کدام دسته از دستگاه ها می رود، باشید.

بقیه این درس فرض می‌کند که درباره موضوع تحقیق کرده‌اید، مطالب موجود در منابع مرتبط را با دقت جذب کرده‌اید و تشخیص داده‌اید که چندین APK مسیر مناسبی برای برنامه شما هستند.

خواسته های خود را نمودار کنید

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

3 4 5 6 7 8 9 10 11 12 +
کوچک
عادی
بزرگ
xlarge

در بالا یک مثال با چهار APK وجود دارد. آبی برای همه دستگاه‌های صفحه‌نمایش کوچک/عادی، سبز برای دستگاه‌های صفحه‌نمایش بزرگ، و قرمز برای دستگاه‌های با صفحه‌نمایش xlarge، همه با محدوده API 3-10 است. بنفش یک مورد خاص است، زیرا برای همه اندازه های صفحه نمایش است، اما فقط برای API 11 و بالاتر. مهمتر از آن، فقط با نگاهی به این نمودار، فوراً متوجه می شوید که کدام APK هر ترکیب API/اندازه صفحه نمایش را پوشش می دهد. برای راه‌اندازی، شما همچنین برای هر یک کد نام‌های شیک دارید، زیرا "آیا رنگ قرمز را روی ست تست کرده‌ایم؟" پرسیدن از مکعب خود بسیار ساده تر از این است که "آیا APK xlarge 3 به 10 را در برابر Xoom آزمایش کرده ایم؟" این نمودار را چاپ کنید و به هر فردی که روی پایگاه کد شما کار می کند، تحویل دهید. زندگی خیلی راحت تر شد

همه کدها و منابع رایج را در یک پروژه کتابخانه قرار دهید

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

توجه: در حالی که جزئیات پیاده‌سازی نحوه ایجاد و گنجاندن پروژه‌های کتابخانه فراتر از محدوده این درس است، می‌توانید با خواندن «ایجاد کتابخانه Android» سرعت خود را افزایش دهید.

اگر در حال تبدیل یک برنامه موجود برای استفاده از پشتیبانی APK چندگانه هستید، پایگاه کد خود را برای هر فایل رشته محلی، فهرست مقادیر، رنگ‌های تم، نمادهای منو و طرح‌بندی که قرار نیست در APK تغییر کند، جستجو کنید و همه آن‌ها را در پروژه کتابخانه کدی که قرار نیست تغییر زیادی کند باید در پروژه کتابخانه نیز قرار گیرد. احتمالاً متوجه خواهید شد که این کلاس ها را برای اضافه کردن یک یا دو روش از APK به APK گسترش می دهید.

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

پروژه های جدید APK ایجاد کنید

برای هر APK که می‌خواهید منتشر کنید، باید یک پروژه اندروید جداگانه وجود داشته باشد. برای سازماندهی آسان، پروژه کتابخانه و تمام پروژه های APK مرتبط را در یک پوشه والد قرار دهید. همچنین به یاد داشته باشید که هر APK باید نام بسته یکسانی داشته باشد، اگرچه آنها لزوماً نیازی به اشتراک گذاری نام بسته با کتابخانه ندارند. اگر قرار بود 3 APK داشته باشید که طبق طرحی که قبلا توضیح داده شد، دایرکتوری ریشه شما ممکن است به شکل زیر باشد:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-purple
foo-red

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

مانیفست ها را تنظیم کنید

وقتی کاربر برنامه‌ای را دانلود می‌کند که از چندین APK استفاده می‌کند، APK صحیح برای استفاده با استفاده از دو قانون ساده انتخاب می‌شود:

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

به عنوان مثال، بیایید مجموعه چندین APK را که قبلاً توضیح داده شد، در نظر بگیریم، و فرض کنیم که هر APK برای پشتیبانی از تمام اندازه‌های صفحه بزرگتر از اندازه صفحه «هدف» تنظیم شده است. بیایید به نمودار نمونه قبلی نگاه کنیم:

3 4 5 6 7 8 9 10 11 12 +
کوچک
عادی
بزرگ
xlarge

از آنجایی که همپوشانی پوشش اشکالی ندارد، می‌توانیم منطقه تحت پوشش هر APK را اینگونه توصیف کنیم:

  • آبی همه صفحه‌ها را پوشش می‌دهد، minSDK 3.
  • رنگ سبز صفحه نمایش های بزرگ و بالاتر، minSDK 3 را پوشش می دهد.
  • قرمز صفحه نمایش XLarge (معمولاً تبلت) را پوشش می دهد، minSDK 9.
  • بنفش تمام صفحه‌ها را پوشش می‌دهد، minSDK 11.

توجه داشته باشید که همپوشانی های زیادی در این قوانین وجود دارد. به عنوان مثال، یک دستگاه XLarge با API 11 می تواند هر یک از 4 APK مشخص شده را اجرا کند. با این حال، با استفاده از قانون "بیشترین تعداد نسخه برنده"، می توانیم ترتیب اولویت را به صورت زیر تنظیم کنیم:

بنفش ≥ قرمز ≥ سبز ≥ آبی

چرا همه همپوشانی ها مجاز است؟ بیایید وانمود کنیم که APK بنفش دارای الزاماتی است که دو مورد دیگر ندارند. صفحه فیلترها در Google Play راهنمای برنامه‌نویس Android فهرست کاملی از مقصران احتمالی دارد. برای مثال، اجازه دهید فرض کنیم که بنفش به یک دوربین جلو نیاز دارد. در واقع، تمام هدف بنفش استفاده از چیزهای سرگرم کننده با دوربین جلو است! اما، به نظر می رسد، همه دستگاه های API 11+ حتی دوربین جلو ندارند! وحشت!

خوشبختانه، اگر کاربری در حال مرور Google Play از یکی از این دستگاه‌ها باشد، Google Play به مانیفست نگاه می‌کند، می‌بیند که Purple دوربین جلو را به‌عنوان یک الزام فهرست می‌کند، و بی‌صدا آن را نادیده می‌گیرد و تشخیص می‌دهد که Purple و آن دستگاه یک دستگاه نیستند. مسابقه ساخته شده در بهشت ​​دیجیتال سپس متوجه می‌شود که Red نه تنها با دستگاه‌های xlarge سازگار است، بلکه برای آن مهم نیست که دوربین جلویی وجود دارد یا نه! این برنامه همچنان می تواند توسط کاربر از Google Play دانلود شود، زیرا علیرغم تمام اتفاقات ناگوار دوربین جلو، هنوز یک APK وجود داشت که از آن سطح API خاص پشتیبانی می کرد.

برای اینکه همه فایل‌های APK خود را در مسیرهای جداگانه نگه دارید، داشتن یک طرح کد نسخه خوب مهم است. مورد توصیه شده را می توان در قسمت کدهای نسخه راهنمای توسعه دهنده ما یافت. ارزش خواندن کل بخش را دارد، اما اصل اساسی برای این مجموعه از APK ها، ما از دو رقم برای نمایش minSDK، دو رقم برای نمایش حداقل/حداکثر اندازه صفحه و از 3 برای نمایش شماره ساخت استفاده می کنیم. به این ترتیب، هنگامی که دستگاه به نسخه جدیدی از Android (مثلاً از 10 به 11) ارتقاء می‌یابد، هر APK که اکنون واجد شرایط است و نسبت به نسخه فعلی نصب شده ترجیح داده می‌شود، توسط دستگاه به‌عنوان «به‌روزرسانی» دیده می‌شود. طرح شماره نسخه، وقتی روی مجموعه نمونه APK اعمال می‌شود، ممکن است به این صورت باشد:

آبی: 0304001, 0304002, 0304003...
سبز: 0334001, 0334002, 0334003
قرمز: 0344001, 0344002, 0344003...
بنفش: 1104001, 1104002, 1104003...

با کنار هم گذاشتن همه اینها، مانیفست های Android شما احتمالاً چیزی شبیه به زیر است:

آبی:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="0304001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

سبز:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="0334001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

قرمز:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="0344001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

بنفش:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1104001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

توجه داشته باشید که از نظر فنی، چندین APK با تگ supports-screens یا تگ compatible-screens کار خواهند کرد. پشتیبانی از صفحه نمایش ها به طور کلی ترجیح داده می شود، و به طور کلی استفاده از هر دو ایده بسیار بدی است - این کار را بیهوده پیچیده می کند و فرصت خطا را افزایش می دهد. همچنین توجه داشته باشید که به جای استفاده از مقادیر پیش‌فرض (کوچک و معمولی همیشه به طور پیش‌فرض درست هستند)، مانیفست‌ها به صراحت مقدار را برای هر اندازه صفحه تنظیم می‌کنند. این می تواند شما را از سردرد نجات دهد - به عنوان مثال، یک مانیفست با هدف SDK کمتر از 9 دارای xlarge به طور خودکار روی false تنظیم می شود، زیرا آن اندازه هنوز وجود نداشته است. پس صریح باشید!

چک لیست قبل از راه اندازی خود را مرور کنید

قبل از آپلود در Google Play، موارد زیر را دوباره بررسی کنید. به یاد داشته باشید که این موارد به طور خاص به چندین APK مرتبط هستند و به هیچ وجه یک چک لیست کامل برای همه برنامه‌هایی که در Google Play آپلود می‌شوند را نشان نمی‌دهند.

  • همه APK ها باید یک نام بسته داشته باشند.
  • همه فایل‌های APK باید با یک گواهی امضا شوند.
  • اگر فایل‌های APK در نسخه پلتفرم همپوشانی داشته باشند، نسخه با minSdkVersion بالاتر باید کد نسخه بالاتری داشته باشد.
  • هر اندازه صفحه‌ای که می‌خواهید APK شما پشتیبانی کند، در مانیفست روی true تنظیم شود. هر اندازه صفحه‌ای که می‌خواهید از آن اجتناب شود، روی نادرست تنظیم کنید.
  • فیلترهای مانیفست خود را برای اطلاعات متناقض بررسی کنید (یک APK که فقط از کیک کوچک در صفحه‌های XLARGE پشتیبانی می‌کند توسط کسی دیده نمی‌شود)
  • مانیفست هر APK باید حداقل در یکی از صفحات پشتیبانی شده، بافت OpenGL یا نسخه پلت فرم منحصر به فرد باشد.
  • سعی کنید هر APK را حداقل در یک دستگاه آزمایش کنید. به غیر از آن، شما یکی از قابل تنظیم ترین شبیه سازهای دستگاه را در کسب و کار دارید که روی دستگاه توسعه خود نشسته است. دیوانه شوید!

همچنین ارزش آن را دارد که APK کامپایل شده را قبل از ورود به بازار بررسی کنید تا مطمئن شوید که هیچ شگفتی وجود ندارد که بتواند برنامه شما را در Google Play پنهان کند. این در واقع با استفاده از ابزار "aapt" بسیار ساده است. Aapt (ابزار بسته بندی دارایی اندروید) بخشی از فرآیند ساخت برای ایجاد و بسته بندی برنامه های اندرویدی شما است و همچنین ابزار بسیار مفیدی برای بازرسی آنها است.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

وقتی خروجی aapt را بررسی می‌کنید، مطمئن شوید که مقادیر متناقضی برای صفحه‌های پشتیبانی و صفحه‌های سازگار نداشته باشید، و مقادیر «مصرف-ویژگی» ناخواسته‌ای که در نتیجه مجوزهای شما اضافه شده‌اند نداشته باشید. تنظیم در مانیفست در مثال بالا، APK برای اکثر دستگاه‌ها نامرئی خواهد بود.

چرا؟ با افزودن مجوز مورد نیاز SEND_SMS، ویژگی مورد نیاز android.hardware.telephony به طور ضمنی اضافه شد. از آنجایی که اکثر (اگر نه همه) دستگاه‌های xlarge تبلت‌هایی هستند که سخت‌افزار تلفن در آن‌ها وجود ندارد، Google Play در این موارد این APK را فیلتر می‌کند، تا زمانی که دستگاه‌های آینده عرضه شوند که هم به اندازه کافی بزرگ باشند که اندازه صفحه نمایش xlarge را گزارش کنند و هم دارای سخت‌افزار تلفن باشند.

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

<uses-feature android:name="android.hardware.telephony" android:required="false" />

الزامات android.hardware.touchscreen نیز به طور ضمنی اضافه شده است. اگر می‌خواهید APK شما در تلویزیون‌هایی که دستگاه‌های غیر لمسی هستند قابل مشاهده باشد، باید موارد زیر را به مانیفست خود اضافه کنید:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

پس از تکمیل چک لیست قبل از راه اندازی، فایل های APK خود را در Google Play آپلود کنید. ممکن است کمی طول بکشد تا برنامه هنگام مرور Google Play نمایش داده شود، اما زمانی که ظاهر شد، آخرین بررسی را انجام دهید. برای اطمینان از اینکه APK ها دستگاه های مورد نظر را هدف قرار می دهند، برنامه را در هر دستگاه آزمایشی دانلود کنید. تبریک می گویم، کار شما تمام شد!