إعداد مشروعك، الإصدار 4.99 والإصدارات الأقدم

يسرد هذا الدليل متطلبات إعدادات التصميم لاستخدام حزمة تطوير البرامج (SDK) للتنقّل على Android. تفترض التعليمات أنّ لديك بيئة تطوير متكاملة (IDE) لنظام التشغيل Android مثبّتة وأنّك على دراية بعملية تطوير تطبيقات Android.

الحدّ الأدنى لمتطلبات استخدام حزمة Navigation SDK

تنطبق هذه المتطلبات على الإصدار 4.99 من حزمة تطوير البرامج (SDK) للتنقّل على أجهزة Android والإصدارات الأقدم.

  • وحدة تحكّم Google Cloud

    مشروع تم تفعيل Navigation SDK فيه لإعداد هذه الميزة، يُرجى التواصل مع ممثل "منصة خرائط Google".

  • يجب أن يستهدف تطبيقك المستوى 30 أو مستوى أعلى لواجهة برمجة التطبيقات.

  • لتشغيل تطبيق تم إنشاؤه باستخدام حزمة تطوير البرامج (SDK) للتنقّل، يجب أن يكون جهاز Android مثبّتًا عليه خدمات Google Play ومفعَّلة.

  • يجب إضافة نص الإسناد والترخيص إلى التطبيق.

إعداد مشاريعك: مشروع على Cloud Console ومشروع Android

قبل إنشاء تطبيق أو اختباره، عليك إنشاء مشروع في Cloud Console وإضافة بيانات اعتماد مفتاح واجهة برمجة التطبيقات. يجب أن يتضمّن المشروع إعدادات تتيح الوصول إلى حزمة تطوير البرامج (SDK) للتنقّل. يتم منح جميع المفاتيح ضمن مشروع Cloud Console إمكانية الوصول نفسها إلى Navigation SDK. يمكن أن يرتبط المفتاح بأكثر من مشروع تطوير واحد. إذا كان لديك مشروع حالي في وحدة التحكّم، يمكنك إضافة مفتاح إليه.

خطوات الإعداد

  1. في متصفّح الويب المفضّل لديك، سجِّل الدخول إلى وحدة تحكّم Cloud وأنشئ مشروعك في وحدة تحكّم Cloud.
  2. في بيئة التطوير المتكاملة (IDE)، مثل "استوديو Android"، أنشئ مشروعًا لتطوير تطبيق Android ودوِّن اسم الحزمة.
  3. تواصَل مع ممثل "منصة خرائط Google" لمنح إذن الوصول إلى حزمة تطوير البرامج (SDK) للتنقّل لمشروعك على Cloud Console.
  4. أثناء استخدام لوحة بيانات Cloud Console في متصفّح الويب، أنشِئ بيانات اعتماد لإنشاء مفتاح واجهة برمجة تطبيقات يتضمّن قيودًا.
  5. في صفحة مفتاح واجهة برمجة التطبيقات، انقر على "تطبيقات Android" في قسم قيود التطبيقات.
  6. انقر على إضافة اسم الحزمة وبصمة الإصبع، ثم أدخِل اسم الحزمة لمشروع التطوير وبصمة الإصبع SHA-1 لهذا المفتاح.
  7. انقر على حفظ.

إضافة حزمة تطوير البرامج (SDK) للتنقّل إلى مشروعك

تتوفّر حزمة تطوير البرامج (SDK) للتنقّل باستخدام Maven أو كحزمة AAR. بعد إنشاء مشروع التطوير، يمكنك دمج حزمة تطوير البرامج (SDK) فيه باستخدام إحدى الطرق التالية.

استخدام Maven للإصدار 4.5 من حزمة تطوير البرامج (SDK) للتنقّل والإصدارات الأحدث (يُنصح به)

يستخدم ما يلي مستودع Maven الخاص بـ google()، وهو الطريقة الأبسط والمقترَحة لإضافة حزمة تطوير البرامج (SDK) للتنقّل إلى مشروعك

  1. أضِف التبعية التالية إلى إعدادات Gradle أو Maven، مع استبدال العنصر النائب VERSION_NUMBER بإصدار حزمة تطوير البرامج (SDK) للتنقّل في Android.

    Gradle

    أضِف ما يلي إلى ملف build.gradle على مستوى الوحدة:

    dependencies {
    ...
    implementation 'com.google.android.libraries.navigation:navigation:VERSION_NUMBER'
    }
    

    في حال الترقية من مستودع Maven الأصلي، يُرجى العِلم أنّ أسماء المجموعات والقطع الأثرية قد تغيّرت، ولم يعُد المكوّن الإضافي com.google.cloud.artifactregistry.gradle-plugin ضروريًا.

    وأضِف ما يلي إلى ملف build.gradle ذي المستوى الأعلى:

    allprojects {
    ...
    // Required: you must exclude the Google Play service Maps SDK from
    // your transitive dependencies to make nsure there won't be
    // multiple copies of Google Maps SDK in your binary, as the Navigation
    // SDK already bundles the Google Maps SDK.
    configurations {
           implementation {
               exclude group: 'com.google.android.gms', module: 'play-services-maps'
           }
    }
    }
    

    Maven

    أضِف ما يلي إلى ملف pom.xml:

    <dependencies>
    ...
    <dependency>
         <groupId>com.google.android.libraries.navigation</groupId>
         <artifactId>navigation</artifactId>
         <version>VERSION_NUMBER</version>
    </dependency>
    </dependencies>
    

    إذا كانت لديك أي تبعيات تستخدم حزمة تطوير البرامج بالاستناد إلى بيانات &quot;خرائط Google&quot;، عليك استبعاد التبعية في كل تبعية مُعلَنة تعتمد على حزمة تطوير البرامج بالاستناد إلى بيانات &quot;خرائط Google&quot;.

    <dependencies>
    <dependency>
    <groupId>project.that.brings.in.maps</groupId>
    <artifactId>MapsConsumer</artifactId>
    <version>1.0</version>
         <exclusions>
           <!-- Navigation SDK already bundles Maps SDK. You must exclude it to prevent duplication-->
           <exclusion>  <!-- declare the exclusion here -->
             <groupId>com.google.android.gms</groupId>
             <artifactId>play-services-maps</artifactId>
           </exclusion>
         </exclusions>
    </dependency>
    </dependencies>
    

استخدام Maven مع حزمة Navigation SDK قبل الإصدار 4.5 أو مع حزمة Driver SDK

ستظل حزمة تطوير البرامج (SDK) للتنقّل متاحة باستخدام مستودع Maven الأصلي خلال الفترة المتبقية من الإصدارات 4. هذه هي المكتبة نفسها التي تتضمّن جميع التحديثات نفسها مثل الإصدار أعلاه، وتوفّر التوافق مع حزمة تطوير البرامج (SDK) للسائق والمكتبات الأخرى أثناء عملية النقل. يتطلّب استخدام هذه التبعية تسجيل الدخول إلى مشروعك على السحابة الإلكترونية باستخدام gcloud عند التجميع.

  1. اضبط بيئتك للوصول إلى مستودع Maven من Google على النحو الموضّح في قسم المتطلبات الأساسية ضِمن مستندات حزمة تطوير البرامج (SDK) للمستهلك. يتم التحكّم في الوصول إلى حزمة تطوير البرامج (SDK) للتنقّل من خلال مجموعة Workspace.
  2. أضِف التبعية التالية إلى إعدادات Gradle أو Maven، مع استبدال العنصر النائب VERSION_NUMBER بإصدار حزمة تطوير البرامج (SDK) الخاصة بالتنقّل.

    Gradle

    أضِف ما يلي إلى ملف build.gradle على مستوى الوحدة:

    dependencies {
    ...
    implementation 'com.google.android.maps:navsdk:VERSION_NUMBER'
    }
    

    وأضِف ما يلي إلى ملف build.gradle ذي المستوى الأعلى:

    allprojects {
    ...
    // Required: you must exclude the Google Play service Maps SDK from
    // your transitive dependencies to make sure there won't be
    // multiple copies of Google Maps SDK in your binary, as the Navigation
    // SDK already bundles the Google Maps SDK.
    configurations {
            implementation {
                exclude group: 'com.google.android.gms', module: 'play-services-maps'
            }
    }
    }
    

    Maven

    أضِف ما يلي إلى ملف pom.xml:

    <dependencies>
    ...
    <dependency>
         <groupId>com.google.android.maps</groupId>
         <artifactId>navsdk</artifactId>
         <version>VERSION_NUMBER</version>
    </dependency>
    </dependencies>
    

    إذا كانت لديك أي تبعيات تستخدم حزمة تطوير البرامج بالاستناد إلى بيانات &quot;خرائط Google&quot;، عليك استبعاد التبعية في كل تبعية مُعلَنة تعتمد على حزمة تطوير البرامج بالاستناد إلى بيانات &quot;خرائط Google&quot;.

    <dependencies>
    <dependency>
    <groupId>project.that.brings.in.maps</groupId>
    <artifactId>MapsConsumer</artifactId>
    <version>1.0</version>
         <exclusions>
           <!-- Navigation SDK already bundles Maps SDK. You must exclude it to prevent duplication-->
           <exclusion>  <!-- declare the exclusion here -->
             <groupId>com.google.android.gms</groupId>
             <artifactId>play-services-maps</artifactId>
           </exclusion>
         </exclusions>
    </dependency>
    </dependencies>
    

استخدام حزمة AAR تم تنزيلها (لا يُنصح به)

تتوفّر حزمة تطوير البرامج (SDK) للتنقّل أيضًا كـ حزمة AAR. بعد إنشاء مشروع التطوير، يمكنك دمج حزمة تطوير البرامج (SDK). تفترض هذه التعليمات استخدام "استوديو Android" كبيئة تطوير متكاملة (IDE).

  1. نزِّل أحدث إصدار من حزمة تطوير البرامج (SDK) للتنقّل من مجلد Google Drive المشترَك واستخرِجه. إذا لم يكن لديك إذن الوصول، يُرجى التواصل مع ممثّل عن Google.

  2. في استوديو Android، افتح مشروعًا وأضِف حزمة خدمات Google Play باستخدام SDK Manager.

  3. من دليل ملف ZIP، انسخ libs/google_navigation_navmap.aar إلى دليل app/libs الخاص بمشروعك.

  4. أضِف ما يلي إلى ملف build.gradle على مستوى الوحدة:

    implementation(name: 'google_navigation_navmap', ext: 'aar')
    

    وأضِف ما يلي إلى ملف build.gradle ذي المستوى الأعلى:

    allprojects {
       ...
       // Required: you must exclude the Google Play service Maps SDK from
       // your transitive dependencies to make sure there won't be
       // multiple copies of Google Maps SDK in your binary, as the Navigation
       // SDK already bundles the Google Maps SDK.
       configurations {
           implementation {
               exclude group: 'com.google.android.gms', module: 'play-services-maps'
           }
       }
    }
    

ضبط الإصدار

بعد إنشاء المشروع، يمكنك ضبط الإعدادات لإنشاء حزمة تطوير البرامج (SDK) للتنقّل واستخدامها بنجاح.

تعديل المواقع المحلية

  • في مجلد Gradle Scripts، افتح ملف local.properties وأضِف android.useDeprecatedNdk=true.

تعديل نص Gradle البرمجي للإصدار

  • افتح ملف build.gradle (Module:app) واتّبِع الإرشادات التالية لتعديل الإعدادات بما يتوافق مع متطلبات حزمة تطوير البرامج (SDK) الخاصة بالتنقّل ويمكنك أيضًا ضبط خيارات التحسين.

    الإعدادات المطلوبة لـ Navigation SDK

    1. اضبط minSdkVersion على 23 أو أعلى.
    2. اضبط قيمة targetSdkVersion على 30 أو أكثر.
    3. أضِف إعداد dexOptions يزيد من javaMaxHeapSize.
    4. اضبط الموقع الجغرافي للمكتبات الإضافية.
    5. أضِف repositories وdependencies لحزمة تطوير البرامج (SDK) للتنقّل.
    6. استبدِل أرقام الإصدارات في التبعيات بأحدث الإصدارات المتاحة.

    الإعدادات الاختيارية لتقليل وقت الإنشاء

    • فعِّل تقليص حجم الرموز البرمجية والموارد باستخدام R8/ProGuard لإزالة الرموز البرمجية والموارد غير المستخدَمة من التبعيات. إذا استغرقت خطوة R8/ProGuard وقتًا طويلاً للتشغيل، ننصحك بتفعيل ملفات DEX المتعددة لأعمال التطوير.
    • تقليل عدد اللغات المترجَمة المضمّنة في الإصدار: اضبط resConfigs للغة واحدة أثناء عملية التطوير. بالنسبة إلى الإصدار النهائي، اضبط resConfigs للغات التي تستخدمها فعليًا. يتضمّن Gradle تلقائيًا سلاسل الموارد لجميع اللغات التي تتيحها حزمة تطوير البرامج (SDK) للتنقّل.

في ما يلي مثال على نص Gradle البرمجي لإنشاء التطبيق. اطّلِع على نماذج التطبيقات لمعرفة المجموعات المحدَّثة من التبعيات، لأنّ إصدار حزمة تطوير البرامج (SDK) للتنقّل الذي تستخدمه قد يكون متقدّمًا أو متأخرًا قليلاً عن هذا المستند.

apply plugin: 'com.android.application'
apply plugin: 'com.google.cloud.artifactregistry.gradle-plugin'

ext {
    androidxVersion = "1.0.0"
    lifecycle_version = "1.1.1"
}

android {
    compileSdkVersion 30
    buildToolsVersion '28.0.3'

    defaultConfig {
        applicationId "<your id>"
        // Navigation SDK supports SDK 23 and later.
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        // Set this to the languages you actually use, otherwise you'll include resource strings
        // for all languages supported by the Navigation SDK.
        resConfigs "en"
        multiDexEnabled true
    }

    dexOptions {
        // This increases the amount of memory available to the dexer. This is required to build
        // apps using the Navigation SDK.
        javaMaxHeapSize "4g"
    }
    buildTypes {
        // Run ProGuard. Note that the Navigation SDK includes its own ProGuard configuration.
        // The configuration is included transitively by depending on the Navigation SDK.
        // If the ProGuard step takes too long, consider enabling multidex for development work
        // instead.
        all {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

// This tells Gradle where to look to find additional libraries - in this case, the
// google_navigation_navmap.aar file.
repositories {
    flatDir {
        dirs 'libs'
    }
    google()

    // Required for accessing the Navigation SDK on Google's Maven repository.
    maven {
        url "artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation"
    }
}

dependencies {
    // Include the Google Navigation SDK
    implementation 'com.google.android.maps:navsdk:4.4.0'

    // The included AAR file under libs can be used instead of the Maven repository.
    // Uncomment the line below and comment out the previous dependency to use
    // the AAR file instead. Make sure that you add the AAR file to the libs directory.
    // implementation(name: 'google_navigation_navmap', ext: 'aar')

    // These dependencies are required for the Navigation SDK to function
    // properly at runtime.
    implementation 'org.chromium.net:cronet-fallback:69.3497.100'
    // Optional for Cronet users:
    // implementation 'org.chromium.net:cronet-api:69.3497.100'
    implementation 'androidx.appcompat:appcompat:${androidxVersion}'
    implementation 'androidx.cardview:cardview:${androidxVersion}'
    implementation 'com.google.android.material:material:${androidxVersion}'
    implementation 'androidx.mediarouter:mediarouter:${androidxVersion}'
    implementation 'androidx.preference:preference:${androidxVersion}'
    implementation 'androidx.recyclerview:recyclerview:${androidxVersion}'
    implementation 'androidx.legacy:legacy-support-v4:${androidxVersion}'
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    implementation 'com.github.bumptech.glide:okhttp-integration:4.9.0'
    implementation 'android.arch.lifecycle:common-java8:$lifecycle_version'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.google.android.datatransport:transport-api:2.2.0'
    implementation 'com.google.android.datatransport:transport-backend-cct:2.2.0'
    implementation 'com.google.android.datatransport:transport-runtime:2.2.0'
    implementation 'joda-time:joda-time:2.9.9'
    annotationProcessor 'androidx.annotation:annotation:1.1.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

إضافة مفتاح واجهة برمجة التطبيقات إلى تطبيقك

يتناول هذا القسم طريقة تخزين مفتاح واجهة برمجة التطبيقات بحيث يمكن لتطبيقك الإشارة إليه بأمان. يجب عدم إدخال مفتاح واجهة برمجة التطبيقات في نظام التحكّم في الإصدارات، لذا ننصح بتخزينه في ملف secrets.properties في الدليل الجذري لمشروعك واستبعاد هذا الملف من نظام التحكّم في الإصدارات. لمزيد من المعلومات حول ملفات خصائص Gradle، يُرجى الاطّلاع على ملفات خصائص Gradle.

لتبسيط هذه المهمة، ننصحك باستخدام المكوّن الإضافي Secrets Gradle لأجهزة Android.

لتثبيت المكوّن الإضافي Secrets Gradle لأجهزة Android وتخزين مفتاح واجهة برمجة التطبيقات، اتّبِع الخطوات التالية:

  1. في استوديو Android، افتح ملف build.gradle.kts أو build.gradle ذي المستوى الأعلى وأضِف الرمز التالي إلى مجموعة plugins.

    Kotlin

    plugins {
        // ...
        id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
    }

    Groovy

    plugins {
        // ...
        id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false
    }
  2. افتح ملف build.gradle.kts أو build.gradle على مستوى الوحدة وأضِف الرمز التالي إلى العنصر plugins.

    Kotlin

    plugins {
        id("com.android.application")
        // ...
        id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    }

    Groovy

    plugins {
        id 'com.android.application'
        // ...
        id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    }
  3. إذا كنت تستخدم &quot;استوديو Android&quot;، زامن مشروعك مع Gradle.
  4. افتح ملف secrets.properties في الدليل ذي المستوى الأعلى، ثم أضِف الرمز التالي. استبدِل YOUR_API_KEY بمفتاح واجهة برمجة التطبيقات الخاص بك. تأكَّد من إضافة secrets.properties إلى ملف .gitignore (أو استبعاده من نظام التحكّم في الإصدارات) كي لا يتم التحقّق من مفتاح واجهة برمجة التطبيقات في نظام التحكّم في الإصدارات.
    MAPS_API_KEY=YOUR_API_KEY
  5. أنشئ ملف local.defaults.properties في الدليل ذي المستوى الأعلى، وهو المجلد نفسه الذي يحتوي على ملف secrets.properties، ثم أضِف الرمز التالي.

    MAPS_API_KEY=DEFAULT_API_KEY

    الغرض من هذا الملف هو توفير موقع احتياطي لمفتاح واجهة برمجة التطبيقات في حال عدم العثور على ملف secrets.properties حتى لا تفشل عمليات الإنشاء. قد يحدث ذلك إذا نسخت التطبيق من نظام تحكّم في الإصدارات يحذف secrets.properties ولم تنشئ بعد ملف secrets.properties على جهازك لتقديم مفتاح واجهة برمجة التطبيقات.

  6. يمكنك إضافة مفتاح واجهة برمجة التطبيقات إلى ملف AndroidManifest.xml أو تقديم مفتاح واجهة برمجة التطبيقات آليًا.
    • أضِف مفتاح واجهة برمجة التطبيقات إلى AndroidManifest.xml:
      <meta-data
          android:name="com.google.android.geo.API_KEY"
          android:value="${MAPS_API_KEY}" />
              

      ملاحظة: com.google.android.geo.API_KEY هو اسم البيانات الوصفية المقترَح لمفتاح واجهة برمجة التطبيقات. يمكن استخدام مفتاح بهذا الاسم للمصادقة على واجهات برمجة تطبيقات متعددة مستندة إلى &quot;خرائط Google&quot; على نظام Android الأساسي، بما في ذلك حزمة تطوير البرامج (SDK) الخاصة بالتنقّل على Android. لضمان التوافق مع الأنظمة القديمة، تتيح واجهة برمجة التطبيقات أيضًا استخدام الاسم com.google.android.maps.v2.API_KEY. يسمح هذا الاسم القديم بالمصادقة على الإصدار 2 من واجهة برمجة التطبيقات لخدمة &quot;خرائط Google&quot; لنظام التشغيل Android فقط. يمكن لأي تطبيق تحديد اسم واحد فقط من أسماء البيانات الوصفية لمفتاح واجهة برمجة التطبيقات. في حال تحديد كليهما، ستعرض واجهة برمجة التطبيقات استثناءً.

    • قدِّم مفتاح واجهة برمجة التطبيقات آليًا:

      يوفّر المكوّن الإضافي Secrets Gradle المفتاح في فئة BuildConfig. في عملية إعداد تطبيقك (على سبيل المثال، في إجراء Application.onCreate())، استدعِ الإجراء على النحو التالي:

      Kotlin

      1. أضِف عبارات الاستيراد التالية:
        import com.google.android.libraries.navigation.NavigationApi
      2. أضِف ما يلي إلى طريقة Application.onCreate():
        NavigationApi.setApiKey(BuildConfig.MAPS_API_KEY)

      جافا

      1. أضِف عبارات الاستيراد التالية:
        import com.google.android.libraries.navigation.NavigationApi;
      2. أضِف ما يلي إلى طريقة Application.onCreate():
        NavigationApi.setApiKey(BuildConfig.MAPS_API_KEY);
      ملاحظة: عند استخدام setApiKey()، يُرجى مراعاة ما يلي:
      • يُرجى تقديم مفتاح واجهة برمجة تطبيقات غير فارغ.
      • يجب استدعاء setApiKey() مرة واحدة فقط خلال فترة استخدام التطبيق. تُظهر الطريقة IllegalStateException إذا تم استدعاؤها أكثر من مرة.
      • يجب استدعاء setApiKey() قبل إعداد أي مكوّنات أخرى في حزمة تطوير البرامج (SDK) للتنقّل، مثل Navigator.
      • يؤدي المفتاح الذي تقدّمه باستخدام هذه الطريقة إلى إلغاء أي مفتاح واجهة برمجة تطبيقات في AndroidManifest.xml.
      • استخدِم الإصدار 7.6 أو إصدارًا أحدث من حزمة تطوير البرامج (SDK) الخاصة بـ Navigation.
  7. في استوديو Android، افتح ملف build.gradle.kts أو build.gradle على مستوى الوحدة وعدِّل السمة secrets. إذا لم تكن السمة secrets متوفّرة، أضِفها.

    عدِّل سمات المكوّن الإضافي لضبط propertiesFileName على "secrets.properties"، واضبط defaultPropertiesFileName على "local.defaults.properties"، واضبط أي سمات أخرى.

    Kotlin

    secrets {
        // To add your Maps API key to this project:
        // 1. If the secrets.properties file does not exist, create it in the root directory (the same folder as the root local.properties file).
        // 2. Add this line, where YOUR_API_KEY is your API key:
        //        MAPS_API_KEY=YOUR_API_KEY
        propertiesFileName = "secrets.properties"
    
        // A properties file containing default secret values. This file can be
        // checked in version control.
        defaultPropertiesFileName = "local.defaults.properties"
    }

    Groovy

    secrets {
        // To add your Maps API key to this project:
        // 1. If the secrets.properties file does not exist, create it in the root directory (the same folder as the root local.properties file).
        // 2. Add this line, where YOUR_API_KEY is your API key:
        //        MAPS_API_KEY=YOUR_API_KEY
        propertiesFileName = "secrets.properties"
    
        // A properties file containing default secret values. This file can be
        // checked in version control.
        defaultPropertiesFileName = "local.defaults.properties"
    }

تضمين الإحالات المطلوبة في تطبيقك

إذا كنت تستخدم حزمة تطوير البرامج (SDK) للتنقّل في Android في تطبيقك، يجب تضمين نص تحديد المصدر وتراخيص البرامج المفتوحة المصدر كجزء من قسم الإشعارات القانونية في تطبيقك.

يمكنك العثور على نص تحديد المصدر المطلوب وتراخيص البرامج المفتوحة المصدر في ملف ZIP الخاص بحزمة تطوير البرامج (SDK) للتنقّل على أجهزة Android:

  • NOTICE.txt
  • LICENSES.txt