1
Ringkasan Proyek
android-hidden-api adalah repository yang menyediakan bahan untuk memakai API Android yang disembunyikan Google, baik pada tahap kompilasi maupun pada tahap runtime. Hidden API adalah class dan method di android.jar yang bertanda @hide, sedangkan internal API adalah isi package com.android.internal di framework.jar; README tetap menyebut keduanya sebagai hidden API. README.md:3-81
Hidden API dan internal API
Perbedaan istilah ini menentukan alat yang dipakai, jadi keduanya perlu dipisahkan lebih dulu.
| Istilah | Lokasi | Isi |
|---|---|---|
| Hidden API | android.jar | class dan method dengan atribut javadoc @hide |
| Internal API | framework.jar, package com.android.internal | class dan resource internal framework |
README menegaskan bahwa satu istilah tetap dipakai untuk dua asal yang berbeda, sehingga pembaca harus memeriksa lokasi asalnya saat mencari sebuah API. README.md:3-81
Dua jalur pemakaian
Repository ini tidak memaksa satu cara. Ada jalur jar kustom untuk urusan kompilasi, dan jalur artifact untuk urusan resource internal.
graph TD
dev["developer"] --> pick{"perlu apa?"}
pick -->|"compile melawan hidden API"| jar["custom android.jar"]
pick -->|"hanya resource internal"| lib["artifact android-hidden-api"]
jar --> script["cli/hiddenjar"]
jar --> task["task buildHiddenJar"]
script --> sdk["platforms/android-XX/android.jar"]
task --> sdk
sdk --> build["kompilasi lolos"]
lib --> acc["InternalAccessor"]
lib --> hold["ResourcesHolder"]
acc --> read["resource com.android.internal terbaca"]
build -.->|"runtime API 28+"| block["non-SDK blocklist"]
style pick fill:#f59e0b,color:#000
style sdk fill:#336791,color:#fff
style lib fill:#8b5cf6,color:#fff
style acc fill:#8b5cf6,color:#fff
style hold fill:#8b5cf6,color:#fff
style build fill:#2d7d46,color:#fff
style read fill:#2d7d46,color:#fff
style block fill:#dc2626,color:#fff
%% fig: Dua jalur pemakaian android-hidden-api
%% desc: Jalur jar kustom membuka kompilasi melawan hidden API, jalur artifact membuka resource internal saat runtime, dan non-SDK blocklist tetap berlaku pada runtime.Jalur pertama menaruh custom android.jar ke <SDK location>/platforms/, mengganti misalnya android-30/android.jar, lalu menaikkan compileSdkVersion dan targetSdkVersion sebelum build ulang. README.md:14-202 Jar kustom itu dibuat oleh hiddenjar, sebuah CLI yang menarik framework jar dari emulator atau device berjalan lewat adb, mengubah DEX menjadi .class, menggabungkan seluruh $BOOTCLASSPATH termasuk modul mainline/APEX, memangkas hasilnya menjadi stub signature-only, lalu memverifikasi bahwa jar tersebut benar-benar dapat mengompilasi satu hidden API. README.md:26-353 Skripnya tersedia dalam dua versi, cli/hiddenjar untuk macOS/Linux dan cli/hiddenjar.ps1 untuk Windows, dengan VERSION="1.0.0" dan dex-tools 2.4.37. cli/hiddenjar:15-19
Jalur yang sama dapat dijalankan lewat Gradle wrapper melalui task buildHiddenJar, hiddenJarDoctor, dan restoreHiddenJar. build.gradle:111-1294 Prasyaratnya JDK, adb, serta emulator berjalan pada API ≥ 34 atau device fisik; citra emulator yang lebih lama mungkin membawa framework.jar yang sudah dipangkas. README.md:37-435
| Aspek | Custom android.jar | Artifact android-hidden-api |
|---|---|---|
| Alat utama | cli/hiddenjar atau task Gradle buildHiddenJar | InternalAccessor dan ResourcesHolder |
| Yang dibuka | hidden class dan method saat kompilasi | resource com.android.internal.R saat runtime |
| Letak hasil | <SDK location>/platforms/android-30/android.jar | deklarasi implementation di blok dependencies |
| Batas | tidak melewati non-SDK blocklist saat runtime | tidak menyentuh hidden class atau method |
Jalur resource internal
Jalur kedua ditujukan untuk pemakaian resource internal saja. Cukup tambahkan implementation 'com.anggrayudi:android-hidden-api:X.Y'; bila memakai versi SNAPSHOT, repository snapshot ditambahkan ke blok allprojects. README.md:105-1146 Pemakaiannya berupa panggilan statis seperti InternalAccessor.getString("accept") dan InternalAccessor.getColor("config_defaultNotificationColor"). README.md:134-1387
InternalAccessor menyatakan dirinya sebagai utilitas untuk seluruh resource di class com.android.internal.R dan tidak lagi memakai Java reflection. resources-helper/src/main/java/com/anggrayudi/hiddenapi/InternalAccessor.java:14-198 ResourcesHolder sejak versi 0.0.5 dialihkan fungsinya: menyimpan objek apa pun dan mengirimnya lewat Broadcast, bukan lagi menampung resource hasil reflection. resources-helper/src/main/java/com/anggrayudi/hiddenapi/ResourcesHolder.java:20-239
Rincian keduanya ada di InternalAccessor: Membaca Resource com.android.internal dan ResourcesHolder dan Pengiriman via Broadcast.
Batas dukungan
⚠️ Custom
android.jarhanya membuka tahap kompilasi. Sejak Android 9 (API 28), Android tetap menegakkan non-SDK blocklist untuk aplikasi non-system saat runtime. README.md:99-10010
Dokumen metode build menulis batas yang sama: "Compile-time success ≠ runtime access." docs/BUILD_CUSTOM_ANDROID_JAR_FROM_EMULATOR.md:38-3911 Perilaku runtime dibahas lebih jauh di Batas Runtime dan Cakupan Hidden API.
Isi repository
settings.gradle hanya memuat dua modul, yaitu :resources-helper dan :sample. settings.gradle:912 Keduanya dikompilasi dengan compileSdkVersion 37, minSdkVersion 23, dan targetSdkVersion 37. build.gradle:24-3613 Koordinat publikasinya GROUP=com.anggrayudi dengan artifact android-hidden-api pada VERSION_NAME=35.0-SNAPSHOT, dan deskripsi POM-nya "A library that provides access to Android hidden APIs and internal resources." gradle.properties:20-2914
Langkah pemasangan jar, opsi CLI, dan konfigurasi build dibahas terpisah di Memasang Custom android.jar ke SDK, Panduan CLI hiddenjar, dan Konfigurasi Build Gradle. Susunan modul di dalam repository dijelaskan di Arsitektur Repository.