Google, Android 9'da geliştiricilerin API'lere erişebileceği kısıtlamalar getirdi. Bu gizli API kısıtlamalarını nasıl aşacağınız aşağıda açıklanmıştır.
Google, 2018'de Android Pie'ı piyasaya sürdü. Arayüz değişiklikleri ve yeni özellikler arasında geliştirici tarafında da bazı değişiklikler vardı. Bu değişiklikler arasında yeni API'ler, mevcut API'ler için hata düzeltmeleri ve ayrıca gizli API'lere erişim kısıtlamaları.
Neyse ki bu kısıtlamaları aşmanın yolları var. Kısıtlamaları nasıl aşacağım konusuna girmeden önce, gizli API'lerin ne olduğunu, neden kısıtlandıklarını ve neden bunlara erişmek isteyebileceğinizi biraz açıklamam gerekiyor.
Gizli API'ler, Android'de uygulama geliştiricilerin normalde göremediği API'lerdir. AOSP'nin koduna bakarsanız, bir grup sınıf, değişken ve yöntemin @hide
üstlerindeki bir yorum bloğunun içindeki ek açıklama.
Bu ek açıklama, Google'ın SDK'yı derlerken altındaki öğeyi hariç tutmak için kullandığı araç hakkında talimat verir. Bu SDK daha sonra Android Studio aracılığıyla indirilen SDK'ların içindeki geliştiricilere dağıtılır. Değiştirilmiş bir SDK kullanmadığınız sürece, Android Studio bu gizli öğelerden herhangi birinin var olmadığını düşünecektir. Birini doğrudan kullanmaya çalışırsanız kırmızı renkte gösterecek ve derlemeyi reddedecektir.
Bir API'nin gizlenmesinin birçok nedeni vardır. Bazı şeylerin yalnızca dahili veya sistem uygulamaları tarafından kullanılması amaçlanmıştır ve üçüncü taraf bir uygulama tarafından kullanıldığında çalışmaz. Diğerleri deneysel veya kararsızdır ve gelecekte kaldırılabilir veya değiştirilebilir. Hatta bazıları yalnızca Google'ın kaldırılmaları durumunda normal kullanımdan kaldırma döngüsünü uygulamak istemediği API'lerdir.
Standart Android SDK'nın bir özelliği varken pay içinde bazen yeterli olmuyor. Bazen yapmak istediğiniz, Android'de zaten mevcut olan ancak kamuya açıklanmayan bir şey vardır.
Örneğin, yaptığım uygulamaların çoğu Sistem Arayüzü Ayarlayıcısı Ve Kilit Ekranı Widget'ları, bir dizi farklı gizli API'den yararlanın. SystemUI Tuner'ın seçenekleri doğru bir şekilde izlemek, değiştirmek ve sıfırlamak için bazılarına erişmesi gerekiyor. Kilit Ekranı Widget'ları, diğer şeylerin yanı sıra, altındaki duvar kağıdını göstermek için bazılarını kullanır.
Çoğu geliştiricinin gizli API'lere erişmesine gerek yoktur, ancak bazen oldukça yararlı olabilirler.
Android 9'un (Pie) piyasaya sürülmesiyle Google, gizli API kara listesini tanıttı. Her gizli API dahil edilmedi ve farklı düzeylerde listeler mevcuttu. Beyaz listedeki gizli API'lere herkes erişebilir. Açık gri listedeki gizli API'lere herhangi bir uygulama tarafından erişilebilir ancak Android'in gelecek sürümlerinde erişilemeyebilir. Koyu gri listedeki herhangi bir şeye yalnızca Pie'dan önceki API seviyelerini (yani API seviyesi 28'den önceki) hedefleyen uygulamalar tarafından erişilebilir. Pie ve sonraki sürümleri hedefleyen uygulamaların erişimi reddedilecek. Son olarak, kara listedeki gizli API'lere, hedef API ne olursa olsun, sistem dışı (veya beyaz listede olmayan) herhangi bir uygulama tarafından erişilemedi.
Android 10, listelerin düzenlenme biçimini değiştirdi ve onları biraz basitleştirdi ancak fikir aynı kaldı. Bazı gizli API'lere uygulamalar tarafından erişilebilirken diğerleri engellendi. Android 11 erişim tespitini güçlendirdi ile bypass'ı engelle Pie ve 10 için kullanılır.
Tüm Android sürümlerinde, üçüncü taraf bir uygulama kara listeye alınmış gizli bir API'ye erişmeye çalıştığında, Android uygun "bulunamadı" hatasını verir.
Aslında gizli API kara listesini aşmanın pek çok yolu var. İhtiyaçlarınıza bağlı olarak, tüm Android sürümleri için çalışanları, yalnızca Android 9 ve 10 için çalışanları, yerel C++ kodunu kullananları ve tamamen Java tabanlı olanları seçebilirsiniz. ADB'yi kullanarak yalnızca geliştirme amaçlı bir geçici çözüm bile var.
ADB'ye Geçici Çözüm
Cihazınız Android Pie çalıştırıyorsa gizli API erişimini etkinleştirmek için aşağıdaki iki ADB komutunu çalıştırın.
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
Cihazınız Android 10 veya sonraki bir sürümü çalıştırıyorsa gizli API erişimini etkinleştirmek için aşağıdaki ADB komutunu çalıştırın.
adb shell settings put global hidden_api_policy 1
Varsayılan davranışa geri dönmek için yalnızca değiştirin put
ile delete
ve şunu kaldırın 1
.
Açıkçası, bu komutlar bir üretim uygulaması için tam olarak kullanışlı değildir. Kullanıcılara ADB'nin nasıl kullanılacağı konusunda doğru şekilde talimat vermenin inanılmaz derecede zor olduğunu ilk elden söyleyebilirim. Ancak eski bir uygulamayı yeni kısıtlamalara uyacak şekilde güncellemeniz gerekiyorsa bunlar yararlı olabilir.
Yerel/JNI geçici çözümü
Android uygulamanızda JNI kullanarak gizli API kara listesini atlamanın iki yolu vardır. Biri Android 9 ve 10'da, diğeri ise Android 9 ve sonraki sürümlerde çalışıyor.
Android9 ve 10
Uygulamanızın yerel bir bölümü zaten varsa, bunu uygulamak kolay olacaktır. Sadece şunu kullan JNI_OnLoad()
işlev.
statik resim:: Çalışma zamanı* çalışma zamanı = nullptr;
extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}
Bu yöntemin yalnızca Android 9 ve 10'da çalıştığını unutmayın.
Android 9 ve üzeri
Android'in herhangi bir sürümü için, gizli API kısıtlamasını atlamak için iki kitaplık arasından seçim yapabilirsiniz: FreeReflection ve RestrictionBypass.
Her ikisinin de uygulanması ve kullanılması kolaydır.
FreeReflection'ı uygulamak içinbağımlılığı modül düzeyinde build.gradle'ınıza ekleyin.
implementation 'me.weishu: free_reflection: 3.0.1'
Sonra geçersiz kıl attachBaseContext()
Uygulama sınıfınızda.
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
Bir Uygulama sınıfınız yoksa, onu oldukça kolay bir şekilde ekleyebilirsiniz. Genişleyen yeni bir sınıf oluşturun Application
ve ardından AndroidManifest.xml dosyanızda bunun üzerine gelin.
Örnek:
publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
}
<manifest>
...
...
name=".App">
...
application>
manifest>
RestrictionBypass'ı uygulamak içinJitPack deposunu proje düzeyindeki build.gradle'ınıza ekleyin.
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Daha sonra bağımlılığı modül düzeyinde build.gradle'ınıza ekleyin.
implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'
Ve bu kadar. Bu kütüphane kara liste kısıtlamalarını otomatik olarak kaldırır.
Java'ya geçici çözüm
JNI çözümleri etkili olsa da yerel kodu kullanmak istemeyebileceğiniz zamanlar olabilir. Halihazırda C++'da bir şeyler yapmıyorsanız, uygulamanıza platform kısıtlamalarının yanı sıra gereksiz boyut da eklenebilir. Neyse ki, yalnızca Java kullanarak gizli API kara listesini atlamanın yolları var.
Android9 ve 10
Android 9 ve 10'da, gizli API kara listesini atlamak için çift yansıma veya meta yansıma olarak adlandırılabilecek yöntemi kullanabilirsiniz. Sistem yalnızca hangi üçüncü taraf uygulamaların aradığını kontrol ettiğinden, çift yansıma, sistemin gizli API çağrıları yaptığını düşünmesini sağlar.
Bu numara, uygulamanıza uygun şekilde adlandırılmış gizli API muafiyetleri verecek bir yöntemi çağırmak için kullanılabilir. setHiddenApiExemptions()
. Aşağıdaki kodu uygulamanızın yaşam döngüsünün başlarında bir yere eklemeniz yeterlidir (Uygulamanın onCreate()
yöntemi) ve kara listeyi atlamayı halledecektir.
Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", newClass[] { String[].class} );
Object vmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(vmRuntime, newString[][] { newString[] { "L" } });
Uygulamanız Android'in 9'dan düşük sürümleriyle uyumluysa bunu bir sürüm kontrolüne eklemeyi unutmayın.
Android 9 ve üzeri
Android 9 ve sonraki sürümlerde gizli API kara listesini atlamak için LSPosed'in kitaplığını kullanabilirsiniz. Bu kitaplık Java'nın Güvenli Olmayan API'sini kullanır, dolayısıyla bozulması pek olası değildir.
Bunu uygulamak için bağımlılığı modül düzeyinde build.gradle'ınıza eklemeniz yeterlidir.
implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'
Daha sonra kara listeyi atlamak için kullanın.
HiddenApiBypass.addHiddenApiExemptions("L");
Uygulamanız Android'in 9'dan düşük sürümleriyle uyumluysa bunu bir sürüm kontrolüne eklemeyi unutmayın.
Sonuç ve Daha Fazla Bilgi
Hedeflediğiniz veya kullandığınız platform sürümü ne olursa olsun, Android'de gizli API kara listesini atlamak için birçok seçenek vardır. Bu yöntemlerin ve kitaplıkların nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız aşağıdaki bağlantılara göz atmayı unutmayın.
- Yığın Taşması Soru-Cevaplarım.
- LSposed'ın GitHub'daki Gizli API Bypass kütüphanesi.
- ChickenHook'un GitHub'daki RestrictionBypass kütüphanesi.
- tiann'ın GitHub'daki FreeReflection kütüphanesi.
- Google'ın gizli API kara listesine ilişkin belgeleri.