Package Name هو معرّف فريد لتطبيقات Android يستند إلى تدوين النطاق العكسي (reverse domain notation). يستخدمه النظام لتمييز التطبيقات على جهاز المستخدم، و Google Play لتحديد المنتج، وخدمات Firebase لربط جميع تكوينات المشروع. وفقًا لـ وثائق مطوري Android، يبقى Package Name دون تغيير طوال دورة حياة التطبيق بعد النشر.
النقاط الرئيسية
Package Name هو سلسلة فريدة يستخدمها Android لتحديد التطبيق على مستوى نظام التشغيل. يتوافق مع حقل package في ملف AndroidManifest.xml وحقل applicationId في ملف build.gradle لوحدة التطبيق. بدون Package Name فريد، يستحيل تثبيت تطبيق على جهاز المستخدم.
على الجهاز، يعمل Package Name كمفتاح لإدارة التطبيقات: يخزن النظام البيانات والإعدادات والذاكرة المؤقتة لكل تطبيق في الدليل /data/data/[packageName]. لا يمكن لتطبيقين بهما نفس المعرّف التعايش — عند محاولة تثبيت تطبيق مكرر، يطلب النظام إزالة الموجود.
في Android Gradle Plugin الإصدار 0.11+، تم إدراج فصل بين Package Name (في البيان) و Application ID (في build.gradle). Application ID هو معرّف التطبيق الفعلي للنظام و Google Play. يستخدم Package Name في البيان لحل الموارد وتوليد فئة R. يوصى بإبقائهما متطابقين للبساطة.
// build.gradle (Module: app)
android {
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 24
targetSdkVersion 34
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
يسمح حقل applicationIdSuffix بإضافة لاحقة إلى Application ID لتكوينات بناء مختلفة. يمكن أن يكون للإصدار التصحيحي المعرف com.example.app.debug، مما يسمح بتثبيته بجانب الإصدار الإنتاجي للاختبار المتوازي.
Google Play يفرض قواعد صارمة لـ Package Name يجب اتباعها عند النشر. يجب أن يكون المعرّف فريدًا عبر المتجر بأكمله، ويتوافق مع المتطلبات النحوية، ولا ينتهك سياسات العلامات التجارية.
Package Name يمكن أن يحتوي فقط على حروف لاتينية (A-Z, a-z)، وأرقام (0-9)، ونقطة (.)، وشرطة سفلية (_). الحد الأقصى للطول هو 150 حرفًا. يجب أن يبدأ كل قطاع بين النقاط بحرف. الشرطات والمسافات والأحرف الخاصة محظورة بقواعد Google Play.
| المتطلب | القيمة | مثال |
|---|---|---|
| الأحرف المسموح بها | حروف لاتينية، أرقام، نقطة، شرطة سفلية | com.example.my_app |
| الحد الأقصى للطول | 150 حرفًا | com.example.verylongappname |
| بداية القطاع | حرف فقط | com — ليس 3com |
| محظور | شرطات، مسافات، سيريليكي | com.example-app — خطأ |
| الفرادة | عالمية في Google Play | يتم التحقق عند الإنشاء |
الفرادة لـ Package Name هي متطلب مطلق لمتجر Google Play. إذا كان تطبيق آخر يستخدم المعرّف المحدد، سيتم رفض النشر. Google لا تُفرج عن معرّفات التطبيقات المحذوفة، لذا فإن اختيار أول Package Name هو قرار حاسم لكل مطور.
تدوين النطاق العكسي هو معيار تسمية حيث يكتب اسم نطاق الشركة بترتيب عكسي: com.example بدلاً من example.com. يضمن هذا النظام الفرادة العالمية للمعرّفات لأن كل اسم نطاق فريد بطبيعته.
يستخدم المطورون عادةً بادئة تتوافق مع TLD لنطاقهم: com للمؤسسات التجارية، org للمنظمات غير الربحية، io للمشاريع التكنولوجية، net لخدمات الشبكات والحلول. وبالنسبة للمشاريع الشخصية، يمكن استخدام com.github.username أو com.email.
بالنسبة للتطبيقات المنشورة على iOS و Android، يوصى باستخدام نفس المعرّف على كلتا المنصتين. يبسط هذا التكامل مع Firebase و AppsFlyer و Adjust وأنظمة تحليل أخرى التي ترتبط بمعرّف المشروع. على سبيل المثال، com.mycompany.myapp سيكون Bundle ID على iOS و Package Name على Android.
تكوين Package Name في مشروع Android يتضمن تغيير applicationId في build.gradle وهيكل الدليل المقابل لكود Java/Kotlin. يوفر Android Studio أدوات لإعادة هيكلة Package Name، ولكن للمشاريع المعقدة يوصى بالترحيل التدريجي.
// يتوافق مسار الملف مع Package Name
// com/example/myapp/MainActivity.kt
package com.example.myapp
import android.os.Bundle
import androidx.activity.ComponentActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
في Kotlin و Java، يجب أن يتوافق Package Name في ملفات المصدر مع هيكل الدليل. عند تغيير Package Name في build.gradle، يجب نقل الملفات إلى الأدلة المقابلة وتحديث جميع تصريحات package و import. يمكن Android Studio القيام بذلك تلقائيًا عبر Refactor -> Move، ولكن للمشاريع الكبيرة بعشرات الملفات، يوصى بالتحقق من النتيجة بعد إعادة الهيكلة.
إذا كان المشروع يستخدم Data Binding أو View Binding أو Hilt، فإن تغيير Package Name سيؤثر أيضًا على الفئات المولّدة. تُنشأ فئات الربط بناءً على Package Name للوحدة ودليل layout. بعد تغيير المعرّف، ستحتاج إلى إعادة بناء المشروع لتحديث جميع المراجع المولّدة. يوصى بإجراء بناء نظيف بعد تغيير Package Name لتجنب أخطاء المراجع القديمة المخزنة مؤقتًا.
في Gradle 7.0+، تم إدراج دعم لـ namespace في build.gradle، والذي حل محل حقل package في AndroidManifest.xml لأغراض توليد فئة R والموارد. في نفس الوقت، يظل applicationId هو معرّف التطبيق الفعلي للنظام و Google Play. يسمح هذا بوجود applicationId و namespace مختلفين، وهو أمر مفيد لوحدات المكتبات حيث يكون namespace ثابتًا بينما يمكن أن يتغير المعرّف العام أثناء البناء.
للمشاريع ذات الهيكل الوحداتي، قد يؤثر تغيير Package Name لوحدة واحدة على عمليات الاستيراد في الوحدات الأخرى. إذا كانت وحدة data تحتوي على حزمة com.example.data ووحدة domain تستخدم فئاتها، بعد تغيير المعرّف، قم بتحديث عمليات الاستيراد في جميع الوحدات التابعة. يُبسط Android Gradle Plugin الإصدار 8.0+ هذه العملية من خلال التوليد التلقائي لـ namespace من build.gradle.
للحصول على Application ID الحالي، استخدم الفئة BuildConfig: BuildConfig.APPLICATION_ID. هذا مفيد للمنطق الشرطي في الكود، الارتباط بالبيئة أو عرض المعرّف في شاشات التصحيح. يتولّد BuildConfig تلقائيًا بناءً على build.gradle.
// الحصول على Application ID في وقت التشغيل
val packageName = BuildConfig.APPLICATION_ID
val packageManager = packageManager
val appInfo = packageManager.getPackageInfo(packageName, 0)
println("App version: ${appInfo.versionName} (${appInfo.versionCode})")
println("Package: $packageName")
تغيير Package Name بعد نشر تطبيق على Google Play هو عملية تعني إنشاء منتج جديد بالكامل. لا يسمح النظام بتحديث تطبيق موجود بـ Package Name مختلف، لذا فإن قرار تغيير المعرّف يعادل إعادة تشغيل المشروع في المتجر.
عند تغيير Package Name، تُفقد: جميع التقييمات والمراجعات، إحصائيات التثبيت، تكامل Google Services (إذا لم يتم الترحيل)، روابط مشروع Firebase (يتطلب إنشاء google-services.json جديد). لن يتلقى المستخدمون تحديثًا تلقائيًا — سيرون التطبيق الجديد في المتجر.
تغيير Package Name قد يكون مبررًا أثناء إعادة تسمية الشركة، نقل التطبيق إلى حساب مطور آخر، أو عند إنشاء إصدار منفصل لمنطقة أخرى. في أي حال، قبل التغيير، يوصى بإشعار المستخدمين من خلال التطبيق القديم وإعداد خطة ترحيل مع نقل البيانات. بدون خطة ترحيل، سيفقد المستخدمون الوصول إلى المحتوى المشترى والاشتراكات وبيانات التطبيق المحفوظة. تشمل الترحيل نقل قاعدة البيانات والملفات عبر SharedPreferences أو Room.
قبل تغيير Package Name، تأكد من أن المعرّف الجديد فريد ويتوافق مع قواعد التسمية. أنشئ تطبيقًا جديدًا في Google Play بـ Package Name الجديد وانشره كمنتج منفصل. في وصف التطبيق القديم، أضف رابطًا للتطبيق الجديد. فكر في استخدام Google Play Custom Store Listing لتوجيه المستخدمين.
الأسئلة الشائعة
في Package Name، يسمح باستخدام شرطة السفل (_)، ولكن لا يسمح باستخدام الشرطة (-). نادرًا ما تستخدم الشرطة السفلية ولكنها مقبولة: com.example.my_app. الشرطات محظورة بقواعد Google Play وستؤدي إلى خطأ أثناء النشر. يوصى باستخدام النقطة فقط كفاصل للقطاعات.
Package Name هو المعرّف في AndroidManifest.xml المستخدم لحل الموارد وتوليد فئة R. Application ID هو الحقل في build.gradle الذي يحدد معرّف التطبيق للنظام و Google Play Store. يوصى بإبقائهما متطابقين، ولكن تسمح الاختلافات عند استخدام applicationIdSuffix.
استخدم تدوين النطاق العكسي لشركتك أو اسمك المستعار: com.domain.appname. تأكد من أن المعرّف فريد في Google Play. تجنب الكلمات الشائعة (todo, test, app) وتحقق من عدم اشتغال المعرّف من قبل مطور آخر عن طريق البحث في Google Play.
نعم، قبل النشر على Google Play، يمكن تغيير Package Name دون عواقب. بعد التغيير، سيكون من الضروري إعادة توليد google-services.json، تحديث هيكل الدليل وتحقق جميع عمليات الاستيراد. Android Studio يوفر أدوات Refactor -> Move لأتمتة العملية.
Package Name مع شهادة التوقيع يشكّلان رابطًا فريدًا يحدد التطبيق في Google Play. حتى إذا كان لتطبيقين Package Names مختلفان، فقد يكونا موقعين بنفس المفتاح. تغيير شهادة التوقيع ممكن من خلال Key Rotation في Play Console دون فقدان المعرّف.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.