Cara melewati daftar hitam API tersembunyi di Android 9+

click fraud protection

Google memperkenalkan pembatasan di Android 9 di mana API dapat diakses oleh pengembang. Berikut cara melewati batasan API tersembunyi tersebut.

Jauh di tahun 2018, Google merilis Android Pie. Di antara perubahan UI dan fitur baru, ada juga beberapa perubahan di sisi pengembang. Perubahan tersebut mencakup API baru, perbaikan bug untuk API yang sudah ada, dan juga pembatasan akses ke API tersembunyi.

Untungnya, ada cara untuk mengatasi pembatasan tersebut. Sebelum saya membahas cara melewati batasan tersebut, saya harus menjelaskan sedikit tentang apa itu API tersembunyi, mengapa API tersebut dibatasi, dan mengapa Anda mungkin ingin mengaksesnya.

API Tersembunyi adalah API di Android yang biasanya tidak dapat dilihat oleh pengembang aplikasi. Jika Anda melihat kode AOSP, Anda akan melihat sejumlah kelas, variabel, dan metode yang memiliki @hide anotasi di dalam blok komentar di atasnya.

Anotasi ini menginstruksikan alat apa pun yang digunakan Google saat mengompilasi SDK untuk mengecualikan item di bawahnya. SDK tersebut kemudian didistribusikan ke pengembang di dalam SDK yang diunduh melalui Android Studio. Kecuali Anda menggunakan SDK yang dimodifikasi, Android Studio akan menganggap item tersembunyi tersebut tidak ada. Jika Anda mencoba menggunakannya secara langsung, ia akan menampilkannya dengan warna merah dan menolak untuk dikompilasi.

Ada banyak alasan mengapa API disembunyikan. Beberapa hal hanya dimaksudkan untuk digunakan oleh aplikasi internal atau sistem dan tidak akan berfungsi jika digunakan oleh aplikasi pihak ketiga. Lainnya masih bersifat eksperimental atau tidak stabil, dan mungkin akan dihapus atau diubah di masa mendatang. Beberapa bahkan hanya API. Google tidak ingin menerapkan siklus penghentian normal jika dihapus.

Sedangkan SDK Android standar memiliki banyak di dalamnya, terkadang itu tidak cukup. Terkadang ada sesuatu yang ingin Anda lakukan yang sudah ada di Android, namun tidak diungkapkan secara publik.

Misalnya saja banyak aplikasi yang saya buat, termasuk Penyetel UI Sistem Dan Widget Layar Kunci, manfaatkan banyak API tersembunyi yang berbeda. SystemUI Tuner perlu mengakses beberapa opsi untuk melacak, mengubah, dan mengatur ulang dengan benar. Widget Lockscreen menggunakan beberapa untuk menampilkan wallpaper di bawahnya, antara lain.

Sebagian besar pengembang tidak perlu mengakses API tersembunyi, namun terkadang API tersebut bisa sangat berguna.

Dengan dirilisnya Android 9 (Pie), Google memperkenalkan daftar hitam API tersembunyi. Tidak semua API tersembunyi disertakan, dan terdapat tingkat daftar yang berbeda. API tersembunyi di daftar putih dapat diakses oleh siapa saja. API tersembunyi di daftar abu-abu terang dapat diakses oleh aplikasi apa pun, namun mungkin tidak dapat diakses di versi Android mendatang. Apa pun yang ada dalam daftar abu-abu gelap hanya dapat diakses oleh aplikasi yang menargetkan API level sebelum Pie (yaitu, sebelum API level 28). Aplikasi yang menargetkan Pie dan versi lebih baru akan ditolak aksesnya. Terakhir, API tersembunyi di daftar hitam tidak dapat diakses oleh aplikasi non-sistem (atau yang tidak masuk daftar putih), apa pun API targetnya.

Android 10 mengubah cara daftar disusun, dan sedikit menyederhanakannya, namun idenya tetap sama. API tersembunyi tertentu dapat diakses oleh aplikasi sementara yang lain diblokir. Android 11 memperkuat deteksi akses ke memblokir jalan pintas digunakan untuk Pie dan 10.

Di semua versi Android, setiap kali aplikasi pihak ketiga mencoba mengakses API tersembunyi yang masuk daftar hitam, Android akan memunculkan kesalahan "tidak ditemukan" yang sesuai.

Sebenarnya ada beberapa cara untuk melewati daftar hitam API yang tersembunyi. Tergantung pada kebutuhan Anda, Anda dapat memilih yang berfungsi untuk semua versi Android, yang hanya berfungsi untuk Android 9 dan 10, yang menggunakan kode C++ asli, dan yang sepenuhnya berbasis Java. Bahkan ada solusi pengembangan saja menggunakan ADB.

Solusi ADB

Jika perangkat Anda menjalankan Android Pie, jalankan dua perintah ADB berikut untuk mengaktifkan akses API tersembunyi.

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1

Jika perangkat Anda menjalankan Android 10 atau lebih baru, jalankan perintah ADB berikut untuk mengaktifkan akses API tersembunyi.

adb shell settings put global hidden_api_policy 1

Untuk kembali ke perilaku default, cukup ganti put dengan delete dan hapus 1.

Jelas sekali, perintah ini tidak terlalu berguna untuk aplikasi produksi. Saya dapat memberi tahu Anda secara langsung bahwa memberikan instruksi yang benar kepada pengguna tentang cara menggunakan ADB sangatlah sulit. Namun ini bisa berguna jika Anda perlu memperbarui aplikasi lama untuk mematuhi batasan baru.

Solusi asli/JNI

Ada dua cara untuk melewati daftar hitam API tersembunyi menggunakan JNI di aplikasi Android Anda. Satu berfungsi untuk Android 9 dan 10, dan yang lainnya berfungsi untuk Android 9 dan lebih baru.

Android 9 dan 10

Jika Anda sudah memiliki bagian asli aplikasi Anda, ini akan mudah diterapkan. Gunakan saja JNI_OnLoad() fungsi.

seni statis:: Waktu proses* waktu proses = nullptr;

extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}

Ketahuilah bahwa metode ini hanya berfungsi di Android 9 dan 10.

Android 9 dan lebih baru

Untuk versi Android apa pun, Anda memiliki dua perpustakaan pilihan untuk melewati batasan API tersembunyi: FreeReflection dan RestrictionBypass.

Keduanya mudah diimplementasikan dan digunakan.

Untuk mengimplementasikan FreeReflection, tambahkan ketergantungan ke build.gradle tingkat modul Anda.

implementation 'me.weishu: free_reflection: 3.0.1'

Lalu timpa attachBaseContext() di kelas Aplikasi Anda.

@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}

Jika Anda tidak memiliki kelas Aplikasi, Anda dapat menambahkannya dengan mudah. Buat kelas baru yang diperluas Application lalu arahkan ke AndroidManifest.xml Anda.

Contoh:

publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);

Reflection.unseal(base);
}
}

<manifest>
...
...
name=".App">
...
application>
manifest>

Untuk mengimplementasikan RestrictionBypass, tambahkan repositori JitPack ke build.gradle tingkat proyek Anda.

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Kemudian tambahkan ketergantungan ke build.gradle tingkat modul Anda.

implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'

Dan itu saja. Perpustakaan ini secara otomatis menghapus batasan daftar hitam.

Solusi Java

Meskipun solusi JNI efektif, ada kalanya Anda mungkin tidak ingin menggunakan kode asli. Jika Anda belum melakukan sesuatu dalam C++, hal ini dapat menambah ukuran yang tidak perlu, beserta batasan platform, pada aplikasi Anda. Untungnya, ada cara untuk melewati daftar hitam API tersembunyi hanya dengan menggunakan Java.

Android 9 dan 10

Di Android 9 dan 10, Anda dapat menggunakan apa yang disebut refleksi ganda atau refleksi meta untuk melewati daftar hitam API yang tersembunyi. Karena sistem hanya memeriksa panggilan aplikasi pihak ketiga, refleksi ganda membuat sistem mengira sistem membuat panggilan API tersembunyi.

Trik ini dapat digunakan untuk memanggil metode yang memberikan pengecualian API tersembunyi pada aplikasi Anda, yang diberi nama yang tepat setHiddenApiExemptions(). Cukup tambahkan kode berikut di awal siklus hidup aplikasi Anda (seperti Application's onCreate() metode), dan itu akan menangani melewati daftar hitam.

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" } });

Jika aplikasi Anda kompatibel dengan versi Android yang lebih rendah dari 9, ingatlah untuk menyertakannya dalam pemeriksaan versi.

Android 9 dan lebih baru

Untuk melewati daftar hitam API tersembunyi di Android 9 dan versi yang lebih baru, Anda dapat menggunakan perpustakaan LSPosed. Pustaka ini menggunakan API Tidak Aman dari Java, sehingga kecil kemungkinannya akan rusak.

Untuk mengimplementasikannya, cukup tambahkan ketergantungan ke build.gradle tingkat modul Anda.

implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'

Kemudian gunakan untuk melewati daftar hitam.

HiddenApiBypass.addHiddenApiExemptions("L");

Jika aplikasi Anda kompatibel dengan versi Android yang lebih rendah dari 9, ingatlah untuk menyertakannya dalam pemeriksaan versi.

Kesimpulan dan Info Lebih Lanjut

Ada banyak opsi untuk melewati daftar hitam API tersembunyi di Android, apa pun versi platform yang Anda targetkan atau gunakan. Jika Anda penasaran untuk mempelajari lebih lanjut tentang cara kerja metode dan pustaka ini, pastikan untuk memeriksa tautan berikut.

  • Tanya Jawab Stack Overflow Saya.
  • Pustaka Bypass API Tersembunyi LSpose di GitHub.
  • Pustaka RestrictionBypass ChickenHook di GitHub.
  • perpustakaan FreeReflection tiann di GitHub.
  • Dokumentasi Google tentang daftar hitam API tersembunyi.