Hata Ayıklama Kısıtlama Denetleyicisi entegrasyon kılavuzu

AAOS Hata Ayıklama Kısıtlama Denetleyicisi'ni (DRC) entegre etmek için bu sayfadaki talimatları kullanın.

Şekil 1. DRC uygulaması örneği.

Mimari

DRC mimarisi Şekil 2'de gösterilmiştir. Kırmızıyla belirtilen bileşenler (jeton veren ve DRC), özelleştirebileceğiniz referans uygulamaları içerir.

Şekil 2. DRC mimarisi.

DRC nedir?

Araç ana birimi, DRC uygulamasını içerir (packages/apps/Car/DebuggingRestrictionController'teki referans uygulamaya bakın). Referans uygulama, jeton verenden erişim jetonu alma, jetonu doğrulama ve ardından jetonda belirtildiği şekilde hata ayıklama kısıtlaması değişikliklerini uygulama mantığını içerir. Mantık, araç tarafındaki temel kullanıcı deneyimi öğelerini içerir.

Jeton veren nedir?

Bu, kriptografik olarak imzalanmış erişim jetonları veren bir web hizmetidir (packages/apps/Car/DebuggingRestrictionController/server'teki referans uygulamaya bakın). Referans web hizmeti, dağıtılabilir bir Firebase Cloud işlevidir (daha fazla bilgi için Cloud Functions for Firebase başlıklı makaleyi inceleyin).

Ön koşullar

Referans uygulamayı dağıtmadan önce aşağıdaki görevleri tamamladığınızdan emin olun.

Erişim jetonlarını imzalamak için sertifikalar hazırlama

Jeton veren, erişim jetonları olarak JSON Web Signature'lar (JWS) oluşturur. Referans veren, optimum uyumluluk için yalnızca RS256 algoritmasını (SHA256 ile RSA imzaları) destekler. Anahtar rotasyonunu kolaylaştırmak için erişim jetonlarını imzalamak üzere tek bir sertifika yerine sertifika zinciri kullanın. Tipik bir sertifika zinciri, bir kök CA sertifikası, bir ara CA sertifikası ve bir son varlık sertifikasından oluşmalıdır.

JWS jetonlarını imzalayan son varlık sertifikası, standart bir TLS sertifikasından farklı değildir. DigiCert gibi herkese açık CA'lardan sertifika satın alabilir veya kendinden imzalı kök CA sertifikaları ya da donanım güvenlik modülleri kullanarak kendi sertifika zincirinizi yönetebilirsiniz. Son varlık sertifikası, Özne Alternatif Adı (SAN) uzantısı içeren bir X509v3 sertifikası olmalıdır. SAN uzantısı, jetonun yayıncısının tanımlayıcısını (ör. ana makine adı) içerir. Son olarak, jeton sağlayıcı yalnızca RS256'yı desteklediği için EC sertifikalarına kıyasla RSA sertifikaları tercih edilmelidir.

Google, packages/apps/Car/DebuggingRestrictionController/server/genkey.sh'te kendinden imzalı sertifika oluşturmak için bir kabuk komut dosyası sağlar.

Firebase'i ayarlama

Referans jetonu veren, Firebase Authentication ve Firebase Cloud Function'ı kullanır.

Firebase hesabınızı ayarlamak için:

  1. Firebase projesi oluşturmak için Firebase'i Android projenize ekleme başlıklı makaleyi inceleyin.
  2. Bazı Firebase kimlik doğrulayıcılarını etkinleştirmek için Firebase Authentication'ı kullanmaya nereden başlamalıyım? başlıklı makaleyi inceleyin.
  3. Boş bir Firebase Cloud Functions işlevi eklemek için Başlangıç bölümüne bakın.
  4. Henüz yapmadıysanız jeton sağlayıcıyı derlemek ve dağıtmak için Node.js, NPM ve Firebase araçlarını yükleyin.

DRC uygulamasını entegre etme

Referans DRC uygulaması packages/apps/Car/DebuggingRestrictionController'te bulunur. Uygulama, Soong ile AOSP'de paket halinde veya Gradle ile paketsiz derlenebilir.

Paketlenmiş derleme

Paketlenmiş uygulama oluşturmak için:

  1. google-services.json'daki applicationId, projectId ve apiKey dosyalarını packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java'e kopyalayın. Bu işlem, DRC uygulamasının Firebase'e doğru şekilde bağlanmasını sağlar.
  2. packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java'te şu sabitleri güncelleyin:
    • TOKEN_USES_SELF_SIGNED_CA, kendinden imzalı kök CA sertifikalarının kullanılıp kullanılmadığını gösterir. Etkinleştirilirse DRC uygulaması yalnızca ROOT_CA_CERT içinde belirtilen PEM kodlu kök CA sertifikasına güvenir.
    • TOKEN_ISSUER_API_NAME, Firebase Cloud işlevinin adıdır ve daha önce Firebase Console'da oluşturduğunuz Cloud işleviyle eşleşmelidir.
    • TOKEN_ISSUER_HOSTNAME, erişim jetonlarını imzalayacak olan son öğe sertifikasındaki Konu Alternatif Adı ile eşleşmelidir.
    • DRC_TEST_EMAIL ve DRC_TEST_PASSWORD, e-posta/şifre ile oturum açma özelliğini etkinleştirdiyseniz Firebase'de önceden hazırlanabilen isteğe bağlı bir test hesabının kimlik bilgileridir. Bunlar yalnızca enstrümante edilmiş testler için kullanılır.

Uygulama artık Firebase hesabınızı ve sertifikalarınızı kullanacak şekilde yapılandırılmıştır. Android 9 ve sonraki sürümlerde imtiyazlı izin izin verilenler listesine ekleme işlemini ayarlamanız gerekir. İzin verilenler listesi en az android.permission.MANAGE_USERS öğe içermelidir. Örnek:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

Paketlenmemiş derleme

Paketlenmemiş DRC derlemeleri, uygulamayı derlemek için Gradle'ı kullanır.

Paketlenmemiş bir derleme oluşturmak için:

  1. Android SDK'yı yüklediğinizi onaylayın.
  2. Uygulamanın kök dizininde local.properties adlı bir metin dosyası oluşturun.
  3. Android SDK'sının yerini ayarlayın:
     sdk.dir=path/to/android/sdk
  4. Firebase'i ayarlamak için google-services.jsonpackages/apps/Car/DebuggingRestrictionController/app'e kopyalayın. Gradle dosyayı ayrıştırır ve geri kalanını otomatik olarak ayarlar.
  5. Ortam değişkenlerini tanımlayın. Paketlenmiş derlemelerde olduğu gibi şunları belirtmeniz gerekir:
    • $TOKEN_USES_SELF_SIGNED_CA: true veya false;
    • $ROOT_CA_CERT: PEM kodlu kök CA sertifikasının yolu;
    • $TOKEN_ISSUER_API_NAME: Firebase Cloud işlevinin adı;
    • $TOKEN_ISSUER_HOST_NAME: Sertifikada SAN;
    • $DRC_TEST_EMAIL ve $DRC_TEST_EMAIL: test hesabı için kimlik bilgileri, yalnızca hata ayıklama derlemeleri.
  6. Uygulamayı Gradle ile derlemek için aşağıdaki gibi bir komut çalıştırın:
    $ ./gradlew build

Jeton sağlayıcıyı entegre etme

Referans jetonu veren, Node.js'te uygulanan bir Firebase Cloud Functions işlevidir. İşlev yalnızca kimliği doğrulanmış bir kullanıcı tarafından çağrılabilir. Uygulamayı dağıtmadan önce JWS jetonlarını imzalamak için kullanılan özel anahtarı ve sertifikaları ayarlamanız gerekir.

  1. Bir JSON dosyasını aşağıdaki içeriklerle doldurun:
    {
        "key": "---BEGIN PRIVATE KEY---\nRSA_PRIVATE_KEY\n-----END PRIVATE KEY-----\n",
        "certificates.0": "-----BEGIN CERTIFICATE-----\nTOKEN_SIGNING_CERT\n-----END CERTIFICATE-----\n",
        "certificates.1": "-----BEGIN CERTIFICATE-----\nINTERMEDIATE_CA_CERT\n-----END CERTIFICATE-----\n",
        "certificates.2": "-----BEGIN CERTIFICATE-----\nROOT_CA_CERT\n-----END CERTIFICATE-----\n",
        "expiration": "30m",
        "issuer": "Debugging Access Token Issuer",
        "audience": "IHU"
    }

    Sertifikalar, önce son varlık sertifikası ve sonunda kök CA sertifikası olacak şekilde sıralanır. Süre sonu, özelleştirilebilir. Dağıtılan bir jetonun bir DRC uygulaması tarafından alınıp kullanılabilmesi biraz zaman alıyorsa süre sonu daha uzun bir süreye ayarlanabilir. Jeton iptal etme işlemi desteklenmez.

  2. Yapılandırmayı Firebase'e yükleyin:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
  4. Firebase Cloud işlevini dağıtın:
  5. $ firebase deploy --only functions
  6. Jeton sağlayıcınızı yönetmek ve izlemek için İşlev dağıtımını ve çalışma zamanı seçeneklerini yönetme başlıklı makaleyi inceleyin.

Varsayılan kısıtlamaları ayarlama

Varsayılan kısıtlamalar ilk önyüklemeden önce uygulanabilir. Android çerçevesindeki varsayılanları geçersiz kılmak için bunu statik kaynak yer paylaşımlarıyla yapın. Kısıtlamalar, farklı kullanıcı türlerine göre uygulanabilir. Farklı kullanıcı türleri hakkında bilgi edinmek için Çok Kullanıcılı Destek başlıklı makaleyi inceleyin.

Başsız sistem kullanıcısı için varsayılan kısıtlama, frameworks/base/core/res/res/values/config.xml içindeki config_defaultFirstUserRestrictions dize dizisiyle yapılandırılabilir. Bu kısıtlamayı ayarladığınızda, kısıtlama kaldırılana kadar Android Debug Bridge (ADB) otomatik olarak devre dışı bırakılır. Örneğin:

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

Normal kullanıcılar (ör. sürücüler ve yolcular) ve misafirler için varsayılan kısıtlamalar frameworks/base/core/res/res/xml/config_user_types.xml'de yapılandırılabilir. Her kullanıcı türü için varsayılan kısıtlamaları ayarlamak üzere bu dizeleri üst üste bindirebilirsiniz. Örneğin:

<user-types>
  <full-type name="android.os.usertype.full.SECONDARY" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
  <full-type name="android.os.usertype.full.GUEST" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
</user-types>