AIDL, ek açıklama eklenmiş öğe hakkında AIDL derleyicisine ek bilgi veren ek açıklamaları destekler. Bu bilgiler, oluşturulan kaba kodunu da etkiler.
Söz dizimi Java'ya benzer:
@AnnotationName(argument1=value, argument2=value) AidlEntity
Burada AnnotationName, açıklamanın adı, AidlEntity ise interface Foo, void method() veya int arg gibi bir AIDL öğesidir. Bir ek açıklama, onu takip eden varlığa eklenir.
Bazı ek açıklamalar, önceki örnekte gösterildiği gibi parantez içinde bağımsız değişkenler içerebilir. Bağımsız değişkeni olmayan notlar için parantez gerekmez. Örneğin:
@AnnotationName AidlEntity
Bu notlar, Java notlarına benzese de aynı değildir. Tüm ek açıklamalar önceden tanımlanmıştır ve nereye eklenebilecekleri konusunda kısıtlamalar vardır. Bazı ek açıklamalar yalnızca belirli bir arka ucu etkiler ve diğer arka uçlarda işlem yapmaz.
Önceden tanımlanmış AIDL ek açıklamalarının listesini aşağıda bulabilirsiniz:
| Ek açıklamalar | Android sürümüne eklendi |
|---|---|
nullable | 7 |
utf8InCpp | 7 |
VintfStability | 11 |
UnsupportedAppUsage | 10 |
Hide | 11 |
Backing | 11 |
NdkOnlyStableParcelable | 14 |
JavaOnlyStableParcelable | 11 |
JavaDerive | 12 |
JavaPassthrough | 12 |
FixedSize | 12 |
Descriptor | 12 |
nullable
nullable, açıklama eklenen öğenin değerinin boş olabileceğini belirtir.
Bu ek açıklamayı yalnızca yöntem dönüş türlerine, yöntem parametrelerine ve paketlenebilir alanlara ekleyebilirsiniz:
interface IFoo {
// method return types
@nullable Data method();
// method parameters
void method2(in @nullable Data d);
}
parcelable Data {
// parcelable fields
@nullable Data d;
}
Açıklamalar temel türlere eklenemez. Aşağıdaki bir hatadır:
void method(in @nullable int a); // int is a primitive type
Bu ek açıklama, Java arka ucu için işlem yapmaz. Java'da tüm ilkel olmayan türler referansla iletilir. Bu durum null olabilir.
CPP arka ucunda @nullable T, Android 11 veya önceki sürümlerde std::unique_ptr<T>, Android 12 veya sonraki sürümlerde ise std::optional<T> ile eşlenir.
NDK arka ucunda @nullable T, std::optional<T> ile eşlenir.
Rust arka ucunda @nullable T, Option<T> ile eşlenir.
T[] veya List<T> gibi liste benzeri bir tür için L, @nullable L, std::optional<std::vector<std::optional<T>>> ile eşlenir (veya Android 11 ya da önceki sürümlerdeki PBM arka ucu için std::unique_ptr<std::vector<std::unique_ptr<T>>>).
Bu eşlemenin bir istisnası vardır. T, IBinder veya AIDL arayüzü olduğunda @nullable, Java, CPP ve NDK arka uçları için işlem yapmaz. Ör
neğin, CPP arka ucunda hem @nullable IBinder hem de IBinder, android::sp<IBinder> ile eşit şekilde eş
lenir. , güçlü
bir işaretçi olduğundan zaten boş değer atanabilir. (CPP ve NDK okumaları boş değer atanabilirliği zorunlu kılmaya devam eder ancak tür
android::sp<IBinder> veya ndk::SpAIBinder olarak kalır.)
Rust arka ucunda, Default (IBinder, AIDL arayüzleri, ParcelFileDescriptor ve yapılandırılmamış parcelable'lar) uygulamayan türler, bağlamlarına bağlı olarak Option<T> ile eşlenir:
- Yöntem dönüş türleri,
inparametreleri veinoutparametreleri: Bu türler yalnızca@nullableile açıklama eklenmişse veOption<T>(veyainparametreleri içinOption<&T>veinoutparametreleri için&mut Option<T>) ile eşlenmişse null olabilir.@nullableolmadan doğrudanT(veya&Tve&mut T) ile eşlenir. - Parcelable alanları ve
outparametreleri: Oluşturulan Rust parcelable'larıDefaultveoutparametreleri varsayılan olarak başlatıldığından, bu türler@nullableolmadan bile her zamanOption<T>ile eşlenir (bu bağlamlardaki sabit boyutlu diziler[Option<T>; N]ile,outparametrelerindeki dinamik diziler iseVec<Option<T>>ile eşlenir).@nullableile açıklama eklenmediğinde, paketleme sırasında çalışma zamanında boş olmama durumu yine zorunlu kılınır (değerNoneiseStatusCode::UNEXPECTED_NULLdöndürülür).
Android 13'ten itibaren, yinelemeli türleri modellemek için @nullable(heap=true), paketlenebilir alanlarda kullanılabilir. @nullable(heap=true), yöntem parametreleri veya dönüş türleriyle kullanılamaz. Bu ifadeyle açıklama eklendiğinde alan, CPP ve NDK arka uçlarında yığın olarak ayrılmış bir referansla std::unique_ptr<T> eşlenir. @nullable(heap=true), Java arka ucunda no-op'tur.
utf8InCpp
utf8InCpp, CPP arka ucu için String öğesinin UTF8 biçiminde temsil edildiğini beyan eder. Adından da anlaşılacağı gibi, ek açıklama diğer arka uçlar için işlem yapmaz.
Özellikle String, Java arka ucunda her zaman UTF16, NDK arka ucunda ise UTF8'dir.
Bu ek açıklama, dönüş değerleri, parametreler, sabit bildirimleri ve paketlenebilir alanlar dahil olmak üzere String türünün kullanılabildiği her yere eklenebilir.
CPP arka ucu için AIDL'deki @utf8InCpp String, std::string ile eşlenir. Burada, ek açıklama içermeyen String, UTF16'nın kullanıldığı android::String16 ile eşlenir.
VintfStability
VintfStability, kullanıcı tanımlı bir türün (arayüz, paketlenebilir ve enum) sistem ve satıcı alanlarında kullanılabileceğini beyan eder. Sistem-satıcı birlikte çalışabilirliği hakkında daha fazla bilgi için HAL'ler için AIDL başlıklı makaleyi inceleyin.
Ek açıklama, türün imzasını değiştirmez ancak ayarlandığında türün örneği kararlı olarak işaretlenir. Böylece, satıcı ve sistem süreçleri arasında taşınabilir.
Açıklama yalnızca kullanıcı tanımlı tür bildirimlerine eklenebilir.
@VintfStability
interface IFoo {
....
}
@VintfStability
parcelable Data {
....
}
@VintfStability
enum Type {
....
}
Bir tür VintfStability ile açıklama eklenmişse türde referans verilen diğer türlere de bu şekilde açıklama eklenmelidir. Aşağıdaki örnekte, hem Data hem de IBar, VintfStability ile açıklama eklenmelidir:
@VintfStability
interface IFoo {
void doSomething(in IBar b); // references IBar
void doAnother(in Data d); // references Data
}
@VintfStability // required
interface IBar {...}
@VintfStability // required
parcelable Data {...}
Ayrıca, VintfStability ile ek açıklama eklenmiş türleri tanımlayan AIDL dosyaları yalnızca aidl_interface Soong modül türü kullanılarak oluşturulabilir. Bu türde, stability özelliği vintf olarak ayarlanır:
aidl_interface {
name: "my_interface",
srcs: [...],
stability: "vintf",
}
UnsupportedAppUsage
UnsupportedAppUsage ek açıklaması, ek açıklama eklenen AIDL türünün eski uygulamalar tarafından erişilebilen SDK olmayan arayüzün bir parçası olduğunu gösterir.
Gizli API'ler hakkında daha fazla bilgi için SDK olmayan arayüzlerde kısıtlamalar başlıklı makaleyi inceleyin.
UnsupportedAppUsage ek açıklaması, oluşturulan kodun davranışını etkilemez. Ek açıklama, yalnızca aynı ada sahip Java ek açıklamasıyla oluşturulan Java sınıfına ek açıklama ekler:
// in AIDL
@UnsupportedAppUsage
interface IFoo {...}
// in Java
@android.compat.annotation.UnsupportedAppUsage
public interface IFoo {...}
Bu, Java dışı arka uçlar için işlem yapmayan bir işlemdir.
Backing ek açıklaması
Backing ek açıklaması, AIDL enum türünün depolama türünü belirtir:
@Backing(type="int")
enum Color { RED, BLUE, }
CPP arka ucunda bu, int32_t türünde bir C++ enum sınıfı yayar:
enum class Color : int32_t {
RED = 0,
BLUE = 1,
}
Ek açıklama çıkarılırsa type değerinin byte olduğu varsayılır. Bu değer, CPP arka ucu için int8_t ile eşlenir.
type bağımsız değişkeni yalnızca aşağıdaki tam sayı türlerine ayarlanabilir:
byte(8 bit genişliğinde)int(32 bit genişliğinde)long(64 bit genişliğinde)
NdkOnlyStableParcelable
NdkOnlyStableParcelable, diğer sabit AIDL türlerinden referans verilebilmesi için paketlenebilir bir bildirimi (tanım değil) sabit olarak işaretler. Bu, JavaOnlyStableParcelable'ye benzer ancak NdkOnlyStableParcelable, Java yerine NDK arka ucu için paketlenebilir bir bildirimi kararlı olarak işaretler.
Bu paketlenebilir öğeyi kullanmak için:
ndk_headerdeğerini belirtmeniz gerekir.- Paketlenebilir öğeyi belirten bir NDK kitaplığınız olmalı ve kitaplık, kitaplığa derlenmelidir. Örneğin, bir
cc_*modülündeki temel derleme sistemindestatic_libsveyashared_libskullanın.aidl_interfaceiçinAndroid.bptarihindeadditional_shared_librariesbölümüne kitaplığı ekleyin.
JavaOnlyStableParcelable
JavaOnlyStableParcelable, diğer sabit AIDL türlerinden referans verilebilmesi için paketlenebilir bir bildirimi (tanım değil) sabit olarak işaretler.
Kararlı AIDL, kullanıcı tanımlı tüm türlerin kararlı olmasını gerektirir. Parcelable'lar için kararlı olabilmek, alanlarının AIDL kaynak dosyasında açıkça açıklanmasını gerektirir:
parcelable Data { // Data is a structured parcelable.
int x;
int y;
}
parcelable AnotherData { // AnotherData is also a structured parcelable
Data d; // OK, because Data is a structured parcelable
}
Parcelable yapılandırılmamışsa (veya yalnızca bildirilmişse) referans verilemez:
parcelable Data; // Data is NOT a structured parcelable
parcelable AnotherData {
Data d; // Error
}
JavaOnlyStableParcelable, referans verdiğiniz parcelable Android SDK'nın bir parçası olarak güvenli bir şekilde kullanılabildiğinde kontrolü geçersiz kılmanıza olanak tanır:
@JavaOnlyStableParcelable
parcelable Data;
parcelable AnotherData {
Data d; // OK
}
JavaDerive
JavaDerive Java arka ucunda paketlenebilir türler için otomatik olarak yöntemler oluşturur:
@JavaDerive(equals = true, toString = true)
parcelable Data {
int number;
String str;
}
Açıklama, neyin oluşturulacağını kontrol etmek için ek parametreler gerektirir. Desteklenen parametreler şunlardır:
equals=true,equalsvehashCodeyöntemlerini oluşturur.toString=true, türün adını ve alanlarını yazdırantoStringyöntemini oluşturur (ör.Data{number: 42, str: foo}).
JavaDefault (desteği sonlandırıldı)
Android 13'te eklenen JavaDefault, varsayılan uygulama sürümü oluşturma desteğinin (setDefaultImpl için) oluşturulup oluşturulmayacağını kontrol eder. Yerden tasarruf etmek için bu destek artık varsayılan olarak oluşturulmaz.
JavaPassthrough
JavaPassthrough, oluşturulan Java API'sinin rastgele bir Java ek açıklamasıyla açıklanmasına olanak tanır.
AIDL'deki bu ek açıklamalar:
@JavaPassthrough(annotation="@android.annotation.Alice")
@JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
oluşturulan Java kodunda aşağıdaki gibi olur:
@android.annotation.Alice
@com.android.Alice(arg=com.android.Alice.Value.A)
annotation parametresinin değeri doğrudan yayınlanır. AIDL derleyicisi, parametrenin değerini incelemez. Java düzeyinde söz dizimi hatası varsa bu hata AIDL derleyicisi tarafından değil, Java derleyicisi tarafından yakalanır.
Bu ek açıklama herhangi bir AIDL öğesine eklenebilir. Bu ek açıklama, Java dışı arka uçlar için işlem yapmaz.
RustDerive
RustDerive, oluşturulan Rust türleri için özellikleri otomatik olarak uygular.
Açıklama, neyin oluşturulacağını kontrol etmek için ek parametreler gerektirir. Desteklenen parametreler şunlardır:
Copy=trueClone=trueOrd=truePartialOrd=trueEq=truePartialEq=trueHash=true
Bu özelliklerin açıklamaları için Rust belgelerine bakın.
FixedSize
FixedSize, yapılandırılmış bir paketlenebilir öğeyi sabit boyutlu olarak işaretler. İşaretlendikten sonra, paketlenebilir nesneye yeni alanlar ekleyemezsiniz. Parcelable'ın tüm alanları, ilkel türler, numaralandırmalar, sabit boyutlu diziler ve FixedSize ile işaretlenmiş diğer parcelable'lar dahil olmak üzere sabit boyutlu türler olmalıdır.
FixedSize nesneler, ndk arka ucunda sabit boyutlara ve hizalamalara sahiptir.
| Tür | Boyut (bayt) | Hizalama (bayt) |
|---|---|---|
boolean |
1 |
1 |
byte |
1 |
1 |
char |
2 |
2 |
int |
4 |
4 |
long |
8 |
8 |
float |
4 |
4 |
double |
8 |
8 |
parcelable |
Tüm alanların toplam boyutu | Tüm alanların en büyük hizalaması |
union |
Tüm alanların en büyük boyutu | Tüm alanların en büyük hizalaması |
enum |
Destekleme türünün boyutu | Destek türünün hizalanması |
T[N] (sabit boyutlu dizi) |
T * N boyutu |
T ile eşleşme |
String, IBinder, FileDescriptor, ParcelFileDescriptor |
N/A |
N/A |
Tanımlayıcı
Descriptor bir arayüzün arayüz tanımlayıcısını zorunlu olarak belirtir:
package android.foo;
@Descriptor(value="android.bar.IWorld")
interface IHello {...}
Bu arayüzün tanımlayıcısı android.bar.IWorld'dır. Descriptor ek açıklaması eksikse tanımlayıcı android.foo.IHello olur.
Bu, daha önce yayınlanmış bir arayüzü yeniden adlandırmak için kullanışlıdır. Yeniden adlandırılan arayüzün tanımlayıcısını, yeniden adlandırma işleminden önceki arayüzün tanımlayıcısıyla aynı yapmak, iki arayüzün birbirleriyle iletişim kurmasını sağlar.
@hide in comments
AIDL derleyicisi, yorumlardaki @hide öğesini tanır ve metalava'nın alması için Java çıkışına iletir. Bu yorum, Android derleme sisteminin AIDL API'lerinin SDK API'leri olmadığını tanımasını sağlar.
Yorumlarda @deprecated
AIDL derleyicisi, yorumlardaki @deprecated işaretini artık kullanılmaması gereken bir AIDL öğesini tanımlayan etiket olarak algılar:
interface IFoo {
/** @deprecated use bar() instead */
void foo();
void bar();
}
Her arka uç, arka uca özgü bir açıklama veya özellik ile kullanımdan kaldırılan öğeleri işaretler. Böylece, istemci kodu kullanımdan kaldırılan öğelere başvurursa uyarılır. Örneğin, @Deprecated ek açıklaması ve @deprecated
etiketi, Java ile oluşturulan koda eklenir.