نشر تطبيق React Native إلى متجر Google Play

من موسوعة حسوب
مراجعة 13:50، 9 أكتوبر 2021 بواسطة جميل-بيلوني (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يتطلب Android أن تُوقّع جميع التطبيقات رقميًا بشهادة قبل تثبيتها، لذلك لتوزيع تطبيقك Android عبر متجر Google Play، ستحتاج إلى إنشاء إصدار APK موقّع بمفتاح إصدار (release key)، والذي يجب بعدها استخدامه لجميع التحديثات مستقبلًا. أصبح بإمكان Google Play منذ عام 2017 إدارة توقيع الإصدارات تلقائيًا بفضل وظيفة توقيع التطبيقات من خلال Google Play. ومع ذلك، قبل رفع ثنائيّة تطبيقك (application binary) إلى Google Play، يجب توقيعه باستخدام مفتاح رفع (upload key). تصف صفحة توقيع التطبيقات في توثيق Android Developers الموضوعَ بالتفصيل. يغطي هذا الدليل العملية بإيجاز، وكذلك يسرد الخطوات المطلوبة لتحزيم حزمة JavaScript.

توليد مفتاح رفع

يمكنك توليد مفتاح توقيع خاص باستخدام أداة keytool. في Windows، يجب تشغيل keytool من ‎‎C:\Program Files\Java\jdkx.x.x_x\bin‎‎.

keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

يطالبك هذا الأمر بكلمات المرور الخاصة بكل من حقول keystore و المفتاح (key) و الاسم المميَّز (Distinguished Name) لمفتاحك. ثم يُنشئ keystore كملفٍ يسمى ‎‎my-upload-key.keystore‎‎.

يحتوي keystore على مفتاح واحد صالح لمدة 10000 يوم. الاسم المستعار (alias) هو الاسم الذي ستستخدمه لاحقًا عند توقيع تطبيقك، لذلك تذكر تدوينه.

في نظام Mac، إذا لم تكن متأكدًا من مكان مجلد JDK bin، فنفّذ الأمر التالي للعثور عليه:

/usr/libexec/java_home

سوف ُيخرج الأمر مسار مجلد jdk، والذي سيبدو على هذا الشكل:

/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home

انتقل إلى هذا المجلد باستخدام الأمر ‎‎cd /your/jdk/path‎‎ واستخدم الأمر keytool بصلاحية sudo كما هو موضح أدناه.

sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

ملاحظة: تذكر الاحتفاظ بملف keystore بشكل سريّ. في حالة فقدت مفتاح الرفع أو تم اختراقه، يجب عليك اتباع هذه التعليمات.

إعداد متغيرات Gradle

  1. ضع ملف ‎‎my-upload-key.keystore‎‎ في مجلد ‎‎android/app‎‎ داخل مشروعك.
  2. حرر الملف ‎‎~/.gradle/gradle.properties‎‎ أو ‎‎android/gradle.properties‎‎، وأضف ما يلي (استبدل ‎‎*****‎‎ بكلمة مرورِ keystore، والاسم المستعار، والمفتاح):
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****

ستكون هذه متغيرات Gradle عامة، والتي يمكننا استخدامها لاحقًا في إعداد Gradle لتوقيع تطبيقنا.

ملاحظة حول الأمان: إذا لم يعجبك تخزين كلمات المرور في نص عادي (plaintext) وكنتَ تعمل على OSX، يمكنك كذلك تخزين بياناتك في تطبيق Keychain Access. بعد ذلك يمكنك تخطي الصفين الأخيرين في ‎‎~/.gradle/gradle.properties‎‎.

إضافة إعداد التوقيع إلى إعداد Gradle في تطبيقك

آخر خطوة في الإعداد يجب القيام بها هي إعداد بناءات الإصدار لتوقيعها باستخدام مفتاح الرفع. حرّر الملف ‎‎android/app/build.gradle‎‎ في مجلد مشروعك، وأضف إعداد التوقيع:

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

توليد الإصدار AAB

نفِّذ ما يلي في طرفية:

$ cd android
$ ./gradlew bundleRelease

سيُجمِّع أمرُ ‎‎bundleRelease‎‎ الخاص بأداة Gradle شيفرة JavaScript اللازمة لتشغيل تطبيقك داخل حُزمة AAB (اختصار Android App Bundle). إذا احتجت إلى تغيير الطريقة التي تُجمَّع بها حزمة JavaScript أو طريقة تجميع الموارد القابلة للرسم (drawable resources) (على سبيل المثال، إذا غيّرت أسماء الملفات أو المجلدات الافتراضية أو الهيكل العام للمشروع)، فألقِ نظرة على ‎‎android/app/build.gradle‎‎ للاطلاع على كيفية تحديثه لتعكس هذه التغييرات.

ملاحظة: تأكد من أن gradle.properties لا يتضمن ‎‎org.gradle.configureondemand=true‎‎ لأن ذلك سيجعل بناء الإصدار يتخطى تجميع JavaScript والأصول في ملف ثنائية التطبيق (app binary).

يمكن العثور على ملفّ AAB المُنشأة تحت ‎‎android/app/build/outputs/bundle/release/app.aab‎‎، وهو جاهز للرفع إلى Google Play.

ملاحظة: لكي يقبل Google Play تنسيق AAB، يجب إعداد توقيع التطبيقات من Google Play (أو ما يُعرَف بميّزة App Signing by Google Play) لتطبيقك على Google Play Console. إذا كنت تقوم بتحديث تطبيقٍ موجودٍ لا يستخدم توقيع التطبيقات من Google Play، فيرجى مراجعة قسم التهجير لمعرفة كيفية إجراء تغيير الإعداد هذا.

اختبار بناء الإصدار الخاص بتطبيقك

قبل رفع بناء الإصدار إلى Play Store، تأكد من اختباره جيدًا. أولاً، أزِل تثبيت أي إصدار سابق من التطبيق الذي قمت بتثبيته مسبقا. ثمّ ثبِّته على الجهاز باستخدام:

npx react-native run-android --variant=release

لاحظ أن خيار ‎‎--variant=release‎‎ متاح فقط إذا أعددت التوقيع كما هو موضح أعلاه.

يمكنك إنهاء أي نسخِ محزِّمٍ (packager instances) قيد التشغيل، نظرًا لأن كل من إطار العمل وشيفرة JavaScript مدمجة في أصول APK.

النشر إلى المتاجر الأخرى

افتراضيًا، يحتوي ملف APK المولَّد على الشيفرة الأصيلة لكل من معماريات x86 و ARMv7a. ما يُسهِّل مشاركة ملفات APK تعمل على جميع أجهزة Android تقريبًا، لكنّ لهذا جانبًا سلبيًّا، وهو أنه سيكون هناك بعض الشيفرات الأصيلة غير المستخدمة على أي جهاز، مما يؤدي إلى ملفات APK أكبر حجمًا بلا حاجة.

يمكنك إنشاء ملفّ APK لكل معماريّة عبر تغيير السطر التالي في ‎‎android/app/build.gradle‎‎:

- ndk {
-   abiFilters "armeabi-v7a", "x86"
- }
- def enableSeparateBuildPerCPUArchitecture = false
+ def enableSeparateBuildPerCPUArchitecture = true

ارفع كلا هذين الملفين إلى متاجر التطبيقات التي تدعم استهداف الأجهزة، مثل Google Play وAmazon AppStore، وسيحصل المستخدمون تلقائيًا على ملفّ APK المناسب. إذا كنت تريد الرفع إلى أسواق أخرى، مثل APKFiles، التي لا تدعم ملفات APK متعددة للتطبيق الواحد، فغيِّر السطر التالي كذلك لإنشاء ملف APK العالمي الافتراضي مع ثنائيات لكل من وحدات المعالجة المركزية (CPU).

- universalApk false  // If true, also generate a universal APK
+ universalApk true  // If true, also generate a universal APK

تمكين Proguard لتقليل حجم ملف APK (اختياري)

Proguard هي أداة يمكنها تقليل حجم ملف APK بشكل طفيف. وذلك عن طريق إزالة أجزاءٍ من شيفرة Java في React Native (واعتمادياتها) التي لا يستخدمها تطبيقك. هام: تأكد من اختبار تطبيقك بدقة إذا مكّنت Proguard. غالبًا ما يتطلب برنامج Proguard إعدادات خاصة لكل مكتبة أصيلة تستخدمها. انظر ملفّ ‎‎app/proguard-rules.pro‎‎.

لتمكين Proguard، عدِّل ‎‎android/app/build.gradle‎‎:

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = true

تهجير تطبيقات React Native القديمة لاستخدام ميزة توقيع التطبيقات من Google Play

إذا كنت قيد التهجير من إصدار React Native سابق، فأغلب الظن أنّ تطبيقك لا يستخدم ميزة "توقيع التطبيقات من Google Play". نوصي بتمكين ذلك للاستفادة من ميّزات مثل تقسيم التطبيق تلقائيًّا. للتهجير من طريقة التوقيع القديمة، يجب أن تبدأ من خلال إنشاء مفتاح رفعٍ جديد، ثم استبدِل إعدادات توقيع الإصدار (release signing config) في ملفّ ‎‎android/app/build.gradle‎‎ لاستخدام مفتاح الرفع بدلاً من مفتاح الإصدار (انظر قسم إضافة إعداد التوقيع إلى إعداد Gradle في تطبيقك). بمجرد الانتهاء من ذلك، يجب عليك اتباع تعليمات Google Play لإرسال مفتاح الإصدار الأصلي إلى Google Play.

الأذونات الافتراضية

يضاف الإذن INTERNET بشكلٍ افتراضي إلى تطبيقك Android لأن كل التطبيقات تقريبًا تستخدمه، كما يضاف الإذن SYSTEM_ALERT_WINDOW إلى Android APK في وضع التنقيح (debug) لكنه سيحذف عند الإنشاء.

مصادر