Java SDK kitaplığını uygulama

Android platformu çok sayıda paylaşılan Java kitaplığı içerir isteğe bağlı olarak Uygulama manifest'indeki <uses-library> etiketi. Uygulamalar bağlantısı kitaplıklara karşı denemeler yapın; bu nedenle bunları Android API'nin geri kalanı gibi ele alın ve araç desteği açısından önemlidir. Bununla birlikte, çoğu kütüphanede bu özellikler yoktur.

java_sdk_library modül türü, kitaplıkların yönetilmesine yardımcı olur yardımcı olur. Cihaz üreticileri bu mekanizmayı kendi başlarına kullanabilirler. yönelik olarak, API'leri için geriye dönük uyumluluğu sürdürmek amacıyla paylaşılan Java kitaplıklarını geliştirdiler. Cihaz üreticileri <uses-library> etiketini kullanabilirsiniz. java_sdk_library, bu Java kitaplıklarının API kararlı.

java_sdk_library, java_sdk_library tarihine kadar uygulanan kitaplıklar derleme dosyası (Android.bp) aracılığıyla aşağıdaki işlemleri gerçekleştirin:

  • Saplama kitaplıkları stubs içermek için oluşturulur, stubs.system ve stubs.test. Bu saplama kitaplıkları @hide tanınması ile oluşturulur, @SystemApi ve @TestApi ek açıklamaları.
  • java_sdk_library, API spesifikasyon dosyalarını yönetir (ör. current.txt) dizininden çıkarabilirsiniz. Bu dosyalar emin olmak amacıyla, en son kodla karşılaştırılarak kontrol edebilirsiniz. Bunlar farklıysa nasıl güncelleyeceğinizi açıklıyor. üzerinde yapılan tüm güncelleme değişikliklerini manuel olarak inceleyin. emin olmanız gerekir.

    Tüm API'leri güncellemek için m update-api kullanın. Bir API'nin güncel olduğunu doğrulamak için m checkapi kullanın.
  • API spesifikasyon dosyaları, en son API'nin geriye dönük uyumlu olduğundan emin olmak için yayınlanmış Android sürümlerini önceki sürümlerle birlikte. Sağlanan java_sdk_library modül AOSP kapsamında, daha önce yayınlanan sürümlerini prebuilts/sdk/<latest number>.
  • API spesifikasyon dosyaları kontrolleriyle ilgili olarak, aşağıdakilerden biri:
    • Kontrollerin devam etmesine izin verin. (Hiçbir şey yapmayın.)
    • java_sdk_library bölümüne şu öğeleri ekleyerek kontrolleri devre dışı bırakın:
      unsafe_ignore_missing_latest_api: true,
    • Yeni java_sdk_library modülleri için boş API'ler sağlayın şeklinde module_name.txt adlı boş metin dosyaları oluşturarak version/scope/api dizininde yer alır.
  • Çalışma zamanı için uygulama kitaplığı yüklüyse bir XML dosyası oluşturulup yüklenmeli.

java_sdk_library nasıl çalışır?

X adlı bir java_sdk_library şunları oluşturur:

  1. Uygulama kitaplığının iki kopyası: X adlı bir kitaplık ve X.impl adlı bir diğeri. X kitaplığı yüklendi cihaz üzerinde. X.impl kitaplığı yalnızca açıkça erişim olduğunda bulunur uygulama kitaplığı diğer modüller tarafından gereklidir (örneğin, teşvik etmek anlamına gelir. Açık erişimin nadiren gerekli olduğunu unutmayın.
  2. Erişimi özelleştirmek için kapsamlar etkinleştirilebilir ve devre dışı bırakılabilir. (Java'ya benzer) anahtar kelime erişimi değiştiricileri gibi, herkese açık kapsam da çok çeşitli erişimler sağlar; CANNOT TRANSLATE test kapsamı, yalnızca testte kullanılan API'ler içerir.) Etkinleştirilen her kapsam için kitaplığı şunları oluşturur:
    • Bir saplama kaynak modülü (droidstubs modül türünde) - tüketir ve bir dizi saplama kaynağı çıkışını sağlar. API spesifikasyon dosyası.
    • Bir saplama kitaplığı (java_library modül türünde) - derlenen sürümünü kullanıma sunduk. Bunu derlemek için kullanılan kitaplıklar java_sdk_library içinde sağlananlarla aynıdır. Bu, uygulama ayrıntıları API koçanlarına sızmaz.
    • Saplamaları derlemek için ek kitaplıklara ihtiyacınız varsa stub_only_libs stub_only_static_libs bunların tedarik edilmesini sağlayacak.

java_sdk_libraryX” olarak adlandırılır ve "X" olarak derlendiğinden emin olun. somut olarak ortaya koyar. Derleme uygun bir kitaplık seçer. Sahip olduğunuz derlemenin ön planda olup olmadığını görmek için saplamalarınızı hatalar. Aşağıdaki kılavuzdan yararlanarak gerekli düzeltmeleri yapın:

  • Komut satırına bakarak uygun bir kitaplığa sahip olduğunuzu doğrulayın ve kapsamınızı belirlemek için orada hangi saplamaların listelendiğini inceleyin:
    • Kapsam çok geniş: Bağımlı kitaplık için belirli bir API kapsamı gerekiyor. Ama kitaplıkta bu kapsamın dışında kalan API'leri görürsünüz. Örneğin: herkese açık API'lere dahil edilen sistem API'leri dahil edilir.
    • Kapsam çok dar: Bağımlı kitaplığın tüm olması gerekir. Örneğin, bağlı kitaplıkta, sistem API'sini alır, ancak bunun yerine genel API'yi alır. Bu genellikle gerekli API'ler eksik olduğundan derleme hatası.
  • Kitaplığı düzeltmek için aşağıdakilerden yalnızca birini yapın:
    • İhtiyacınız olan sürümü seçmek için sdk_version kodunu değiştirin. VEYA
    • Uygun kitaplığı açıkça belirtin (ör. <X>.stubs) veya <X>.stubs.system.

java_sdk_library X kullanımı

X uygulama kitaplığı, apex.java_libs. Bununla birlikte, bir Sog sınırlaması nedeniyle, X alanına başka bir java_sdk_library modülünden referans veriliyor aynı APEX kitaplığı içinde, X.impl açıkça X kitaplığı değil, kullanılmalıdır.

java_sdk_library öğesine başka bir yerden referans verildiğinde bir saplama emin olabilirsiniz. Saplama kitaplığı, modülünün sdk_version özellik ayarını değiştirin. Örneğin, Yeşil Ofis’teki sdk_version: "current" genel saplamaları kullanırken, sdk_version: "system_current" parametresini belirten modül sistem koçları. Tam eşleşme bulunamazsa en yakın saplama kitaplığı kullanılır. Yalnızca herkese açık bir API sağlayan bir java_sdk_library herkese açık kostümleri sağlamak.

Java SDK kitaplığıyla akış derleme
Şekil 1. Java SDK kitaplığıyla akış derleme
'nı inceleyin.

Örnekler ve kaynaklar

srcs ve api_packages özellikleri java_sdk_library vardır.

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

AOSP, yeni java_sdk_library kullanımını önerir (ancak şart değildir) örnekleri, kullanmak istedikleri API kapsamlarını açıkça etkinleştirir. Ayrıca transkriptinizi (isteğe bağlı olarak) mevcut java_sdk_library örneklerini şuna taşıyın: kullanacakları API kapsamlarını açıkça etkinleştirmelidir:

java_sdk_library {
         name: "lib",
         public: {
           enabled: true,
         },
         system: {
           enabled: true,
         },
         …
    }

Çalışma zamanı için kullanılan impl kitaplığını yapılandırmak için tüm hostdex gibi normal java_library özellikleri compile_dex ve errorprone.

java_sdk_library {
        name: "android.test.base",

        srcs: ["src/**/*.java"],

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

Saplama kitaplıklarını yapılandırmak için aşağıdaki özellikleri kullanın:

  • merge_annotations_dirs ve merge_inclusion_annotations_dirs.
  • api_srcs: Belgenin parçası olan isteğe bağlı kaynak dosyaların listesi kitaplığının parçası değildir.
  • stubs_only_libs: Şurada bulunan Java kitaplıklarının listesi: sınıf yolu.
  • hidden_api_packages: Olması gereken paket adlarının listesi API'den gizlenmiştir.
  • droiddoc_options: Şunun için ek bağımsız değişken: metalava olarak değiştirin.
  • droiddoc_option_files: Başvuruda bulunulabilecek dosyaları listeler droiddoc_options içinden $(location <label>) kullanarak, Burada <file>, listedeki bir giriştir.
  • annotations_enabled.

java_sdk_library bir java_library ancak değil droidstubs modülü, dolayısıyla droidstubs modülünün tümünü desteklemez özellikler. Aşağıdaki örnek, android.test.mock kitaplık derlemesi dosyası olarak kaydedebilirsiniz.

java_sdk_library {
        name: "android.test.mock",

        srcs: [":android-test-mock-sources"],
        api_srcs: [
            // Note: The following aren’t APIs of this library. Only APIs under the
            // android.test.mock package are taken. These do provide private APIs
            // to which android.test.mock APIs reference. These classes are present
            // in source code form to access necessary comments that disappear when
            // the classes are compiled into a Jar library.
            ":framework-core-sources-for-test-mock",
            ":framework_native_aidl",
        ],

        libs: [
            "framework",
            "framework-annotations-lib",
            "app-compat-annotations",
            "Unsupportedappusage",
        ],

        api_packages: [
            "android.test.mock",
        ],
        permitted_packages: [
            "android.test.mock",
        ],
        compile_dex: true,
        default_to_stubs: true,
    }

Geriye dönük uyumluluğu koruma

Derleme sistemi, API'lerin geriye dönük olarak korunup korunmadığını kontrol eder. oluşturulan dosyalarla en güncel API dosyalarını karşılaştırarak Derleme sırasında API dosyaları. java_sdk_library, aşağıdakileri gerçekleştirir: prebuilt_apis tarafından sağlanan bilgileri kullanarak uyumluluk kontrolü gerçekleştirin. java_sdk_library ile oluşturulan tüm kitaplıklarda API dosyaları olmalıdır prebuilt_apis üzerinde api_dirs uygulamasının son sürümünde yer alır. Sürümü yayınladığınızda API, dosyaları ve saplamaları listeler kitaplıkları, PRODUCT=sdk_phone_armv7-sdk ile dist derlemesi ile edinilebilir.

api_dirs özelliği, API sürümü dizinlerinin listesidir prebuilt_apis içinde. API sürümü dizinleri aşağıdaki gibi olmalıdır: Android.bp dizin düzeyinde bulunur.

prebuilt_apis {
       name: "foo",
       api_dirs: [
           "1",
           "2",
             ....
           "30",
           "current",
       ],
    }

version/scope/api/ ile dizinleri yapılandırın dizin altındaki yapıyı oluşturuyor. version API düzeyine karşılık gelir ve scope, dizinin herkese açık mı, sistem mi yoksa test mi olduğunu kontrol eder.

  • version/scope Java kitaplıkları içerir.
  • version/scope/api, API içeriyor .txt dosya. Adlı boş metin dosyaları oluştur module_name.txt ve module_name-removed.txt burada.
     ├── 30
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.mock-removed.txt
          │       │   └── android.test.mock.txt
          │       └── android.test.mock.jar
          └── Android.bp