Android 9'dan (API düzeyi 28) itibaren platform, SDK olmayan arayüzleri vardır. Bu kısıtlamalar, bir uygulama ya da yansıma veya JNI kullanarak herkese açık kullanıcı adını edinmeye çalışıyor. Bu kısıtlamalar, kullanıcı ve geliştiricinin iyileştirilmesine yardımcı olmak için uygulanmıştır ve kullanıcılar için kilitlenme ve acil durum kullanımına yönelik riskleri azaltmak üzere birlikte çalışır. Bu kararla ilgili daha fazla bilgi edinmek için Kararlılığı Artırma başlıklı makaleyi inceleyin. SDK dışı arayüzlerin kullanımını azaltarak
SDK ve SDK dışı arayüzler arasındaki farkları açıklama
Genel olarak, herkese açık SDK arayüzleri, Android çerçevesi Paket Dizini. SDK olmayan arayüzlerin kullanımı soyutladığı için bu arayüzler de otomatik olarak haber verilmeksizin değiştirilebilir.
Kilitlenmeleri ve beklenmeyen davranışları önlemek için uygulamalar, resmi olarak yalnızca SDK'daki sınıfların belgelenmiş bölümlerini gözden geçirin. Bu aynı zamanda sunumlarınızın bir kullanıcı veya sağlayıcıyla etkileşimde bulunduğunuzda SDK'da listelenmeyen düşünme egzersizlerini kullanan bir sınıf oluşturur.
SDK olmayan API listeleri
Android'in her sürümünde SDK dışı diğer arayüzler kısıtlanmıştır. Biz bu kısıtlamaların yayın iş akışınızı etkileyebileceğini biliyor ve SDK dışı arayüzlerin kullanımını tespit edecek araçlara sahip olduğunuzdan emin olun. Bu, bize geri bildirim gönderin ve yeni politikalara uyum sağlamak için zaman kazanın.
SDK dışı kısıtlamaların geliştirme iş akışınız üzerindeki etkisini en aza indirmek için SDK dışı arayüzler, kullanımlarının ne kadar sıkı olduğunu tanımlayan listelere ayrılır. hedeflenmekte olan API düzeyine bağlı olarak kısıtlanır. Aşağıdaki tablo şu listelerin her birini açıklar:
Liste | Kod etiketleri | Açıklama |
---|---|---|
Engellenenler listesi |
|
Uygulamanız ne olursa olsun kullanamayacağınız SDK dışı arayüzler hedef API düzeyi. Uygulamanız bu arayüzlerden birine erişmeye çalışırsa sistem bir hata verir. |
Koşula bağlı olarak engellendi |
|
Android 9'dan (API düzeyi 28) itibaren her API düzeyinde SDK olmayan özellikler Uygulama söz konusu API düzeyini hedeflediğinde kısıtlanan arayüzler. Bu listeler maksimum API düzeyi ile etiketlenir
( Uygulamanız, yalnızca düzeyinde bir kontrol gerçekleştirirseniz, sistem bu API, Google Analytics 4'ün bir parçası engellenenler listesine ekleyin. |
Desteklenmiyor |
|
Kısıtlanmamış ve uygulamanızın kullanabileceği SDK olmayan arayüzler. Not
Ancak bu arayüzlerin desteklenmediğini ve
haber verilmeksizin değiştirilebilir. Bu arayüzler şu anda
gelecekteki Android sürümlerinde koşullu olarak engellenecektir
max-target-x listesi. |
SDK |
|
özgürce kullanılabilen ve artık resmi olarak belgelenmiş Android çerçevesi Paket Dizini. |
API'leri test et |
|
Dahili sistem testi için kullanılan arayüzler. Örneğin, Uyumluluk Test Paketi (CTS) aracılığıyla testi kolaylaştırır. Test API'leri SDK'nın bir parçası değildir. Şunun içinde başlıyor: Android 11 (API düzeyi 30), test API'leri engellenenler listesine dahildir. uygulamaların, hedef API düzeyleri ne olursa olsun bunları kullanmasına izin verilmez. Tümü test API'leri desteklenmez ve tercih edebilirsiniz. |
Uygulamanızın hedef API'sine bağlı olarak bazı SDK dışı arayüzleri kullanabilirsiniz düzeyinde) olduğu gibi, SDK olmayan herhangi bir yöntem veya alanın kullanılması her zaman en iyi şekilde yararlanabilirsiniz. Uygulamanız SDK dışı arayüz kullanıyorsa SDK arayüzlerine veya diğer alternatiflere geçiş. Bir SDK dışı bir arayüz kullanmaya alternatif olarak, yeni bir herkese açık API isteğinde bulunun.
Bir arayüzün hangi listeye ait olduğunu belirleme
SDK olmayan arayüzlerin listeleri, platformun bir parçası olarak oluşturulur. Bkz. aşağıdaki bölümleri inceleyebilirsiniz.
Android 15
Android 15 (API düzeyi 35) için SDK olmayan tüm arayüzler ve bunlara karşılık gelen listeler:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
40134e205e58922a708c453726b279a296e6a1f34a988abd90cec0f3432ea5a9
.
Android 15'teki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi edinmek için: Android 15'te SDK dışı arayüz kısıtlamalarında yapılan güncellemeler adlı makaleyi inceleyin.
Android 14
Android 14 (API düzeyi 34) için SDK olmayan tüm arayüzler ve bunlara karşılık gelen listeler:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
7e00db074cbe51c51ff4b411f7b48e98692951395c5c17d069c822cc1d0eae0f
.
Android 14'teki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi edinmek için: Android 14'te SDK dışı arayüz kısıtlamalarında yapılan güncellemeler adlı makaleyi inceleyin.
Android 13
Android 13 (API düzeyi 33) için, şunların açıklandığı aşağıdaki dosyayı indirebilirsiniz: SDK olmayan tüm arayüzler ve bunlara karşılık gelen listeler:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
233a277aa8ac475b6df61bffd95665d86aac6eb2ad187b90bf42a98f5f2a11a3
.
Android 13'teki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi edinmek için: koşullu olarak ayarlanan API'ler için önerilen herkese açık API alternatifleri dahil Android 13'te engellenmiş. SDK dışı arayüzde yapılan güncellemelere bakın kısıtlamalar hakkında bilgi edinin.
Android 12
Android 12 (API düzeyi 31) için SDK olmayan tüm arayüzler ve bunlara karşılık gelen listeler:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
40674ff4291eb268f86561bf687e69dbd013df9ec9531a460404532a4ac9a761
.
Android 12'deki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi edinmek için: koşullu olarak ayarlanan API'ler için önerilen herkese açık API alternatifleri dahil daha fazla bilgi için Şunlar için değişiklikleri listeleme bölümüne bakın: Android 12.
Android 11
Android 11 (API düzeyi 30) için şu dosyayı indirebilirsiniz: aşağıda açıklandığı gibi, SDK dışı tüm arayüzler ve bunlara karşılık gelen listeler açıklanmıştır:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
a19d839f4f61dc9c94960ae977b2e0f3eb30f880ba1ffe5108e790010b477a56
.
Android 11'deki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi: koşullu olarak engellenen API'ler için önerilen herkese açık API alternatifleri Android 11 için Android 11 için değişiklikleri listeleme bölümüne bakın.
Android 10
Android 10 (API düzeyi 29) için şu dosyayı indirebilirsiniz: aşağıda açıklandığı gibi, SDK dışı tüm arayüzler ve bunlara karşılık gelen listeler açıklanmıştır:
Dosya: hiddenapi-flags.csv
SHA-256 sağlaması:
f22a59c215e752777a114bd9b07b0b6b4aedfc8e49e6efca0f99681771c5bfeb
.
Android 10'daki SDK dışı API listesi değişiklikleri hakkında daha fazla bilgi: koşullu olarak engellenen API'ler için önerilen herkese açık API alternatifleri Android 10 için Android 10 için değişiklikleri listeleme bölümüne bakın.
Android 9
Android 9 (API düzeyi 28) için aşağıdaki metin dosyası,
Kısıtlanmamış SDK olmayan API'ler (gri listede):
hiddenapi-light-greylist.txt
.
Engellenenler listesi (blacklist
) ve koşullu olarak engellenen API'lerin listesi (koyu gri)
listesi), derleme zamanında türetilir.
AOSP'den liste oluşturma
AOSP ile çalışırken, yeni bir sürüm tanımlamak için hiddenapi-flags.csv
SDK dışı tüm arayüzleri ve bunlara karşılık gelen listelerini içerir. Bunun için,
AOSP kaynağını indirin ve ardından aşağıdaki komutu çalıştırın:
m out/soong/hiddenapi/hiddenapi-flags.csv
Ardından dosyayı aşağıdaki konumda bulabilirsiniz:
out/soong/hiddenapi/hiddenapi-flags.csv
Kısıtlanmış SDK dışı arayüzlere erişildiğinde beklenen davranış
Aşağıdaki tabloda, uygulamanız durumunda gerçekleşebilecek davranışlar Engellenenler listesinde olan SDK olmayan bir arayüze erişmeye çalışıyor.
Erişim araçları | Sonuç |
---|---|
Bir alanı referans gösteren Dalvik talimatı | NoSuchFieldError atıldı |
Bir yöntemi referans alan Dalvik talimatı | NoSuchMethodError atıldı |
Class.getDeclaredField() veya Class.getField() kullanarak düşünme |
NoSuchFieldException atıldı |
Class.getDeclaredMethod() , Class.getMethod() kullanarak düşünme |
NoSuchMethodException atıldı |
Class.getDeclaredFields() , Class.getFields() kullanarak düşünme |
SDK olmayan üyeler sonuçlarda yer almıyor |
Class.getDeclaredMethods() , Class.getMethods() kullanarak düşünme |
SDK olmayan üyeler sonuçlarda yer almıyor |
env->GetFieldID() kullanılarak JNI |
NULL geri döndü, NoSuchFieldError atıldı |
env->GetMethodID() kullanılarak JNI |
NULL geri döndü, NoSuchMethodError atıldı |
Uygulamanızı SDK olmayan arayüzler için test etme
SDK olmayan arayüzleri test etmek için kullanabileceğiniz çeşitli yöntemler vardır: en iyi şekilde yararlanabilirsiniz.
Hata ayıklaması yapılabilir bir uygulama kullanarak test etme
SDK olmayan arayüzleri test etmek için kendi oluşturduğunuz Android 9 (API düzeyi 28) çalıştıran bir cihazda veya emülatörde hata ayıklanabilir uygulama ya da daha yüksek olabilir. Kullandığınız cihazın veya emülatörün Uygulamanızın hedef API düzeyini.
Uygulamanızda testler çalıştırırken uygulamanızın SDK dışı belirli arayüzlere erişmesi. Uygulamanızın günlük mesajlarını inceleyebilirsiniz. şu ayrıntıları bulabilirsiniz:
- Tanımlayan sınıf, ad ve tür ( Android çalışma zamanı).
- Erişim araçları: bağlama, yansıma kullanarak veya JNI kullanma.
- SDK dışı arayüzün ait olduğu liste.
adb logcat
Çalışan uygulamanın PID'si. Örneğin, günlükteki bir giriş aşağıdaki gibi olabilir:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
StrictMode API'sini kullanarak test etme
Ayrıca, StrictMode
API'yi kullanarak SDK dışı arayüzleri test edebilirsiniz. Şunu kullanın:
detectNonSdkApiUsage
yöntemini kullanabilirsiniz.
StrictMode
API, SDK dışı her kullanım için geri çağırma alabilirsiniz
arayüz oluşturmak için penaltyListener
kullanarak
ele alacağız. Geri çağırmada sağlanan Violation
nesnesi,
Throwable
ve ekteki yığın izleme (stack trace), kullanım bağlamını sağlar.
Sürüm aracını kullanarak test etme
APK'nızda verdex statik analiz aracını da çalıştırabilirsiniz. Veridex aracı Üçüncü taraf kitaplıklar da dahil olmak üzere APK'nın tüm kod tabanını tarar ve bulduğu SDK dışı arayüzlerin tüm kullanımlarını bildirir.
Veridex aracının sınırlamaları şunlardır:
- Uygulama, JNI üzerinden yapılan çağrıları algılayamaz.
- Yansıma yoluyla yalnızca bir çağrı alt kümesini algılayabilir.
- Etkin olmayan kod yollarıyla ilgili analizi API düzeyindeki kontrollerle sınırlıdır.
- Yalnızca SSE4.2 ve POPCNT talimatlarını destekleyen makinelerde çalıştırılabilir.
Windows
Yerel Windows ikili programları sağlanmamıştır ancak veridex aracını şurada çalıştırabilirsiniz: Linux için Windows Alt Sistemi'ni kullanarak Linux ikili programlarını yürüterek Windows (WSL) tuşlarına basın. Bu bölümdeki adımları uygulamadan önce WSL'yi yükleyin ve Linux dağıtımınız olarak Ubuntu'yu seçmeniz gerekir.
Ubuntu yüklendikten sonra bir Ubuntu terminali başlatın ve şu adımları uygulayın:
- Önceden oluşturulmuş Android çalışma zamanı sürümlerinden veridex aracını indirin. depodur.
appcompat.tar.gz
dosyasının içeriğini çıkarın.- Çıkarılan klasörde
veridex-linux.zip
dosyasını bulup çıkarın. Sıkıştırılmamış klasöre gidin ve aşağıdaki komutu çalıştırın;
your-app.apk
, test etmek istediğiniz APK'dır:./appcompat.sh --dex-file=your-app.apk
macOS
Veridex aracını macOS'te çalıştırmak için aşağıdaki adımları uygulayın:
- Önceden oluşturulmuş Android çalışma zamanı sürümlerinden veridex aracını indirin. depodur.
appcompat.tar.gz
dosyasının içeriğini çıkarın.- Çıkarılan klasörde
veridex-mac.zip
dosyasını bulup çıkarın. Sıkıştırılmamış klasöre gidin ve aşağıdaki komutu çalıştırın;
/path-from-root/your-app.apk
, APK'nın yoludur sisteminizin kök dizininden başlayarak test etmek istediğiniz yeni bir komut dosyası oluşturun:./appcompat.sh --dex-file=/path-from-root/your-app.apk
Linux
Linux'ta veridex aracını çalıştırmak için aşağıdaki adımları uygulayın:
- Önceden oluşturulmuş Android çalışma zamanı sürümlerinden veridex aracını indirin. depodur.
appcompat.tar.gz
dosyasının içeriğini çıkarın.- Çıkarılan klasörde
veridex-linux.zip
dosyasını bulup çıkarın. Sıkıştırılmamış klasöre gidin ve aşağıdaki komutu çalıştırın;
your-app.apk
, test etmek istediğiniz APK'dır:./appcompat.sh --dex-file=your-app.apk
Android Studio lint aracını kullanarak test etme
Uygulamanızı Android Studio'da her derlediğinizde, lint aracı sorunları çözebilmelisiniz. Uygulamanız SDK olmayan arayüzler kullanıyorsa arayüzlerin hangi listeye ait olduğuna bağlı olarak, hatalar veya uyarılar .
Ayrıca, lint aracını komut satırından çalıştırabilir veya incelemeler çalıştırabilirsiniz. manuel olarak düzenleyebilirsiniz.
Play Console'u kullanarak test etme
Uygulamanızı Play Console'da bir test kanalına yüklediğinizde, uygulamanız Potansiyel sorunlar açısından otomatik olarak test edilir ve elde edilir. Uygulamanız SDK olmayan arayüzler kullanıyorsa o arayüzlerin hangi listeye ait olduğuna bağlı olarak lansman öncesi rapora dahil edilir.
Daha fazla bilgi için Lansman öncesi uygulamayı kullanma konusundaki Android Uyumluluğu bölümüne bakın. raporlarından yararlanabilirsiniz.
Yeni bir herkese açık API isteğinde bulunun
Bir özellik için SDK dışı arayüz kullanmanın alternatifini uygulamanızda özellik isteği oluşturarak yeni bir herkese açık API isteğinde bulunabilirsiniz sorun izleyicimize göz atın.
Özellik isteği oluştururken aşağıdaki bilgileri sağlayın:
- Şurada görülen tam tanımlayıcı da dahil olmak üzere, desteklenmeyen API'yi kullandığınız
Accessing hidden ...
logcat mesajı var. - Üst düzey kullanıcılarla ilgili ayrıntılar da dahil olmak üzere, bu API'leri neden kullanmanız gerekiyor? gereken bir diğer unsur da bu.
- İlgili herkese açık SDK API'lerinin amaçlarınız için neden yeterli olmadığı
- Denediğiniz diğer alternatifler ve işe yaramama nedenleri.
Bu ayrıntıları özellik isteğinizde sağladığınızda, yeni bir genel API verilme olasılığını gösterir.
Diğer sorular
Bu bölümde, geliştiricilerin sorduğu diğer soruların sık sorulan sorular:
Genel sorular
Google, sorun izleyici aracılığıyla tüm uygulamaların ihtiyaçlarını yakalayabileceğinden nasıl emin olabilir?
Android 9 (API düzeyi 28) için ilk listeleri, aşağıdaki yöntemlerle desteklenen uygulamaların analizi:
- Play'deki ve Play dışındaki en popüler uygulamalar için manuel test
- dahili raporlar
- dahili kullanıcılardan otomatik veri toplama
- geliştirici önizleme raporları
- daha ihtiyatlı bir şekilde daha fazla veriyi kapsamak üzere tasarlanmış yanlış pozitifler
Her yeni sürümün listelerini değerlendirirken API kullanımını, sorun izleyici aracılığıyla geliştirici geri bildirimi alın.
SDK dışı arayüzlere erişimi nasıl etkinleştirebilirim?
Adb kullanarak geliştirme cihazlarında SDK dışı arayüzlere erişimi etkinleştirebilirsiniz API'nin zorunlu kılma politikasını değiştirmek için komut dosyası kullanıyorsanız. Kullandığınız komutlar değişkenlik gösterebilir. veya API düzeyine göre değişir. Bu komutlar rootlanmış bir cihaz gerektirmez.
- Android 10 (API düzeyi 29) veya sonraki sürümler
Erişimi etkinleştirmek için aşağıdaki adb'yi kullanın
komut:
adb shell settings put global hidden_api_policy 1
API'yi zorunlu kılma politikasını varsayılan ayarlara sıfırlamak için şunu kullanın: şu komutu kullanın:
adb shell settings delete global hidden_api_policy
- Android 9 (API düzeyi 28)
Erişimi etkinleştirmek için aşağıdaki adb komutlarını kullanın:
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
API'yi zorunlu kılma politikasını varsayılan ayarlara sıfırlamak için şunu kullanın: şu komutları kullanın:
adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
API yaptırım politikasındaki tam sayıyı aşağıdakilerden birine ayarlayabilirsiniz değerleri:
- 0: SDK olmayan arayüzlerin tüm algılamasını devre dışı bırakın. Bu ayarın kullanılması şunları devre dışı bırakır:
SDK dışı arayüz kullanımıyla ilgili tüm günlük mesajlarını gösterir ve
StrictMode
API'yi kullanan bir uygulamadır. Bu ayar önerilmez. - 1: Tüm SDK dışı arayüzlere erişimi etkinleştirin, ancak günlük mesajlarını
SDK dışı arayüz kullanımlarıyla ilgili uyarılar. Bu ayarı kullandığınızda şunları yapabilirsiniz:
StrictMode
API'yi kullanarak uygulamanızı test edin. - 2: Engellenenler listesine ait olan veya hedef API düzeyiniz için koşullu olarak engellenmiş olmalıdır.
SDK olmayan arayüz listeleri hakkında sorular
Sistem görüntüsünde SDK olmayan API listelerini nerede bulabilirim?
Bunlar, platform dex dosyalarındaki alan ve yöntem erişim işareti bitlerinde kodlanır. Sistem görüntüsünde bu listeleri içeren ayrı bir dosya yoktur.
SDK dışı API listeleri, aynı Android sürümlerine sahip farklı OEM cihazlarda aynı mı?
OEM'ler kendi arayüzlerini engellenenler listesine (kara liste) ekleyebilir, ancak bunu yapamazlar AOSP SDK dışı API listelerindeki arayüzleri kaldırma CDD bu tür değişiklikleri engeller CTS testleri Android Çalışma Zamanının listeyi zorunlu kılmasını sağlar.
İlgili uygulamaların uyumluluğu hakkında sorular
Yerel kodda NDK olmayan arayüzler için herhangi bir kısıtlama var mı?
Android SDK'sı Java arayüzleri içerir. Platformda kısıtlamalar Android 7'de (API düzeyi 26) yerel C/C++ kodu için NDK olmayan arayüzlere erişim. Daha fazla bilgi için Özel C/C++ Sembolüyle Kararlılığı Artırma Android N'deki kısıtlamalar.
Dex2oat veya DEX dosyası işlemeyi kısıtlamaya yönelik bir plan var mı?
Dex2oat ikili programına erişimi kısıtlamak için etkin bir planımız yok ancak DEX dosya biçiminin kararlı veya Dalvik Yürütülebilir biçiminde herkese açık olarak belirtilen bölümler. Dex2oat ve belirtilmemiş kısımları değiştirme veya kaldırma hakkını saklı tutarız. değiştirebilirsiniz. Ayrıca, dex2oat tarafından üretilen türetilmiş dosyaların ODEX (OAT olarak da bilinir), VDEX ve CDEX belirtilmemiş biçimlerdir.
Önemli bir üçüncü taraf SDK (örneğin, kod karartma aracı) SDK dışı arayüzleri kullanmaktan kaçınsa da gelecekteki Android sürümleriyle uyumluluğu korumayı taahhüt ederse ne olur? Bu durumda Android, uyumluluk gereksinimlerinden feragat edebilir mi?
Her SDK için uyumluluk şartlarından feragat etme planımız bulunmamaktadır. Eğer Bir SDK geliştiricisinin uyumluluğu yalnızca Google Play'deki arayüzlere bağlı olarak desteklenmeyen (eski adıyla gri) listelerin geri kalanına SDK arayüzlerini veya diğer alternatifleri kullanın ve her seferinde yeni bir herkese açık API isteğinde bulunun SDK dışı bir arayüz kullanmanın alternatifi bulamazlar.
SDK dışı arayüz kısıtlamaları yalnızca üçüncü taraf uygulamaları değil, sistem ve birinci taraf uygulamaları da dahil olmak üzere tüm uygulamalar için geçerli midir?
Evet, ancak platform anahtarı ve bazı sistem görüntüleri ile imzalanan uygulamalar muaf tutulur
Bu muafiyetlerin yalnızca sisteme dahil olan uygulamalar için geçerli olduğunu unutmayın.
görüntüsü (veya güncellenmiş sistem görüntüsü uygulamaları). Bu liste yalnızca şu uygulamalarda kullanılabilir:
yerine özel platform API'lerinde derleyerek (ör.
LOCAL_PRIVATE_PLATFORM_APIS := true
) bilgileri gösterilir.