الفرق بين المراجعتين لصفحة: «ReactNative/signed apk android»
سطر 79: | سطر 79: | ||
سيُجمِّع أمرُ <code>bundleRelease</code> الخاص بأداة Gradle شيفرة JavaScript اللازمة لتشغيل تطبيقك داخل حُزمة AAB (اختصار [https://developer.android.com/guide/app-bundle Android App Bundle]). إذا احتجت إلى تغيير الطريقة التي تُجمَّع بها حزمة JavaScript أو طريقة تجميع الموارد القابلة للرسم (drawable resources) (على سبيل المثال، إذا غيّرت أسماء الملفات أو المجلدات الافتراضية أو الهيكل العام للمشروع)، فألقِ نظرة على <code>android/app/build.gradle</code> للاطلاع على كيفية تحديثه لتعكس هذه التغييرات. | سيُجمِّع أمرُ <code>bundleRelease</code> الخاص بأداة Gradle شيفرة JavaScript اللازمة لتشغيل تطبيقك داخل حُزمة AAB (اختصار [https://developer.android.com/guide/app-bundle Android App Bundle]). إذا احتجت إلى تغيير الطريقة التي تُجمَّع بها حزمة JavaScript أو طريقة تجميع الموارد القابلة للرسم (drawable resources) (على سبيل المثال، إذا غيّرت أسماء الملفات أو المجلدات الافتراضية أو الهيكل العام للمشروع)، فألقِ نظرة على <code>android/app/build.gradle</code> للاطلاع على كيفية تحديثه لتعكس هذه التغييرات. | ||
'''ملاحظة:''' تأكد من أن gradle.properties لا يتضمن <code>org.gradle.configureondemand=true</code> لأن ذلك سيجعل بناء الإصدار يتخطى تجميع JavaScript والأصول في ملف ثنائية التطبيق (app binary). | '''ملاحظة:''' تأكد من أن <code>gradle.properties</code> لا يتضمن <code>org.gradle.configureondemand=true</code> لأن ذلك سيجعل بناء الإصدار يتخطى تجميع JavaScript والأصول في ملف ثنائية التطبيق (app binary). | ||
يمكن العثور على ملفّ AAB المُنشأة تحت <code>android/app/build/outputs/bundle/release/app.aab</code>، وهو جاهز للرفع إلى Google Play. | يمكن العثور على ملفّ AAB المُنشأة تحت <code>android/app/build/outputs/bundle/release/app.aab</code>، وهو جاهز للرفع إلى Google Play. | ||
'''ملاحظة:''' لكي يقبل Google Play تنسيق AAB، يجب إعداد توقيع التطبيقات من Google Play (App Signing by Google Play) لتطبيقك على Google Play Console. إذا كنت تقوم بتحديث تطبيقٍ موجودٍ لا يستخدم توقيع التطبيقات من Google Play، فيرجى مراجعة [ | '''ملاحظة:''' لكي يقبل Google Play تنسيق AAB، يجب إعداد توقيع التطبيقات من Google Play (أو ما يُعرَف بميّزة App Signing by Google Play) لتطبيقك على Google Play Console. إذا كنت تقوم بتحديث تطبيقٍ موجودٍ لا يستخدم توقيع التطبيقات من Google Play، فيرجى مراجعة [[ReactNative/signed apk android#.D8.AA.D9.87.D8.AC.D9.8A.D8.B1 .D8.AA.D8.B7.D8.A8.D9.8A.D9.82.D8.A7.D8.AA React Native .D8.A7.D9.84.D9.82.D8.AF.D9.8A.D9.85.D8.A9 .D9.84.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85 .D9.85.D9.8A.D9.91.D8.|قسم التهجير]] لمعرفة كيفية إجراء تغيير الإعداد هذا. | ||
== اختبار بناء الإصدار الخاص بتطبيقك == | == اختبار بناء الإصدار الخاص بتطبيقك == | ||
سطر 126: | سطر 126: | ||
==تهجير تطبيقات React Native القديمة لاستخدام ميّزة توقيع التطبيقات من Google Play== | ==تهجير تطبيقات React Native القديمة لاستخدام ميّزة توقيع التطبيقات من Google Play== | ||
إذا كنت قيد التهجير من إصدار React Native سابق، فأغلب الظن أنّ تطبيقك لا يستخدم ميزة "توقيع التطبيقات من Google Play". نوصي بتمكين ذلك للاستفادة من ميّزات مثل تقسيم التطبيق تلقائيًّا. للتهجير من طريقة التوقيع القديمة، يجب أن تبدأ من خلال إنشاء مفتاح رفعٍ | إذا كنت قيد التهجير من إصدار React Native سابق، فأغلب الظن أنّ تطبيقك لا يستخدم ميزة "توقيع التطبيقات من Google Play". نوصي بتمكين ذلك للاستفادة من ميّزات مثل تقسيم التطبيق تلقائيًّا. للتهجير من طريقة التوقيع القديمة، يجب أن تبدأ من خلال [[ReactNative/signed apk android#.D8.AA.D9.88.D9.84.D9.8A.D8.AF .D9.85.D9.81.D8.AA.D8.A7.D8.AD .D8.B1.D9.81.D8.B9|إنشاء مفتاح رفعٍ جديد]]، ثم استبدال إعدادات توقيع الإصدار (release signing config) في ملفّ <code>android/app/build.gradle</code> لاستخدام مفتاح الرفع بدلاً من مفتاح الإصدار (انظر قسم [[ReactNative/signed apk android#.D8.A5.D8.B6.D8.A7.D9.81.D8.A9 .D8.A5.D8.B9.D8.AF.D8.A7.D8.AF .D8.A7.D9.84.D8.AA.D9.88.D9.82.D9.8A.D8.B9 .D8.A5.D9.84.D9.89 .D8.A5.D8.B9.D8.AF.D8.A7.D8.AF Gradle .D9.81.D9.8A .D8.AA.D8.B7.D8.A8.D9.8A.D|إضافة إعداد التوقيع إلى إعداد Gradle]] في تطبيقك). بمجرد الانتهاء من ذلك، يجب عليك اتباع [https://support.google.com/googleplay/android-developer/answer/7384423 تعليمات Google Play] لإرسال مفتاح الإصدار الأصلي إلى Google Play. | ||
== مصادر == | == مصادر == | ||
* [https://facebook.github.io/react-native/docs/signed-apk-android صفحة Generating Signed APK في توثيق React Native الرسمي.] | * [https://facebook.github.io/react-native/docs/signed-apk-android صفحة Generating Signed APK في توثيق React Native الرسمي.] | ||
[[تصنيف:ReactNative]] | [[تصنيف:ReactNative]] |
مراجعة 19:56، 16 يوليو 2019
توليد ملف APK موقَّع (Generating Signed APK)
يتطلب Android أن تُوقّع جميع التطبيقات رقميًا بشهادة قبل تثبيتها، لذلك لتوزيع تطبيقك Android عبر متجر Google Play، ستحتاج إلى إنشاء إصدار APK موقّع بمفتاح إصدار (release key)، والذي يجب بعدها استخدامه لجميع التحديثات مستقبلًا. منذ عام 2017، أصبح بإمكان Google Play إدارة توقيع الإصدارات تلقائيًا بفضل وظيفة توقيع التطبيقات من خلال 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 -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
- ضع ملف
my-upload-key.keystore
في مجلد android/app
داخل مشروعك. - حرر الملف
~/.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
}
}
}
...
توليد ملفّ APK للإصدار (release APK)
نفِّذ ما يلي في طرفية:
$ 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، تأكد من اختباره جيدًا. أولاً، أزِل تثبيت أي إصدار سابق من التطبيق الذي قمت بتثبيته مسبقا. ثمّ ثبِّته على الجهاز باستخدام:
$ 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.