Aplikasi saya memiliki fungsionalitas tertentu yang hanya akan berfungsi pada perangkat di mana root tersedia. Daripada memiliki fitur ini gagal ketika digunakan (dan kemudian menunjukkan pesan kesalahan yang sesuai kepada pengguna), saya lebih suka kemampuan untuk memeriksa diam-diam apakah root tersedia terlebih dahulu, dan jika tidak, sembunyikan opsi masing-masing di tempat pertama. .
Apakah ada cara untuk melakukan ini?
Jawaban:
Ini adalah kelas yang akan memeriksa Root salah satu dari tiga cara.
sumber
su
biner sementara tidak di-root.Jika Anda sudah menggunakan Fabric / Firebase Crashlytics, Anda dapat menelepon
Ini adalah implementasi metode itu saat ini:
sumber
Pustaka RootTools menawarkan metode sederhana untuk memeriksa root:
Referensi
sumber
Dalam aplikasi saya, saya memeriksa apakah perangkat di-rooting atau tidak dengan menjalankan perintah "su". Tetapi hari ini saya telah menghapus bagian dari kode saya ini. Mengapa?
Karena aplikasi saya menjadi pembunuh memori. Bagaimana? Biarkan saya menceritakan kisah saya kepada Anda.
Ada beberapa keluhan bahwa aplikasi saya memperlambat perangkat (Tentu saja saya pikir itu tidak benar). Saya mencoba mencari tahu mengapa. Jadi saya menggunakan MAT untuk mendapatkan timbunan dan analisis, dan semuanya tampak sempurna. Tetapi setelah meluncurkan ulang aplikasi saya berkali-kali saya menyadari bahwa perangkat semakin lambat dan menghentikan aplikasi saya tidak membuatnya lebih cepat (kecuali saya me-restart perangkat). Saya menganalisis file dump lagi saat perangkat sangat lambat. Tapi semuanya masih sempurna untuk file dump. Kemudian saya melakukan apa yang harus dilakukan pada awalnya. Saya mendaftar proses.
Surprize; ada banyak proses untuk aplikasi saya (dengan tag proses aplikasi saya di manifes). Beberapa dari mereka adalah zombie, beberapa dari mereka tidak.
Dengan contoh aplikasi yang memiliki Kegiatan tunggal dan menjalankan perintah "su" saja, saya menyadari bahwa proses zombie sedang dibuat pada setiap peluncuran aplikasi. Awalnya zombie ini mengalokasikan 0KB tetapi dari sesuatu yang terjadi dan proses zombie memegang hampir KB yang sama dengan proses utama aplikasi saya dan mereka menjadi proses standar.
Ada laporan bug untuk masalah yang sama pada bugs.sun.com: http://bugs.sun.com/view_bug.do?bug_id=6474073 ini menjelaskan jika perintah tidak ditemukan, zombie akan dibuat dengan metode exec () . Tetapi saya masih tidak mengerti mengapa dan bagaimana mereka bisa menjadi proses standar dan memiliki KB yang signifikan. (Ini tidak terjadi setiap saat)
Anda dapat mencoba jika ingin dengan contoh kode di bawah ini;
Metode eksekusi perintah sederhana;
Untuk menyimpulkan; Saya tidak punya saran bagi Anda untuk menentukan apakah perangkat di-rooting atau tidak. Tetapi jika saya jadi Anda, saya tidak akan menggunakan Runtime.getRuntime (). Exec ().
Ngomong-ngomong; RootTools.isRootAvailable () menyebabkan masalah yang sama.
sumber
Banyak jawaban yang tercantum di sini memiliki masalah bawaan:
The RootTools perpustakaan dari Stericson tampaknya akan memeriksa akar yang lebih sah. Ini juga memiliki banyak alat dan utilitas tambahan jadi saya sangat merekomendasikannya. Namun, tidak ada penjelasan tentang cara khusus memeriksa root, dan mungkin sedikit lebih berat daripada yang dibutuhkan sebagian besar aplikasi.
Saya telah membuat beberapa metode utilitas yang secara longgar didasarkan pada pustaka RootTools. Jika Anda hanya ingin memeriksa apakah executable "su" ada di perangkat, Anda dapat menggunakan metode berikut:
Metode ini hanya loop melalui direktori yang tercantum dalam variabel lingkungan "PATH" dan memeriksa apakah ada file "su" di salah satu dari mereka.
Untuk benar-benar memeriksa akses root, perintah "su" harus benar-benar dijalankan. Jika aplikasi seperti SuperUser diinstal, maka pada titik ini mungkin meminta akses root, atau jika sudah diberikan / ditolak bersulang mungkin ditampilkan yang menunjukkan apakah akses diberikan / ditolak. Perintah yang baik untuk dijalankan adalah "id" sehingga Anda dapat memverifikasi bahwa id pengguna sebenarnya 0 (root).
Berikut adalah contoh metode untuk menentukan apakah akses root telah diberikan:
Sangat penting untuk benar-benar menguji menjalankan perintah "su" karena beberapa emulator memiliki "su" yang dapat dieksekusi yang sudah diinstal, tetapi hanya mengizinkan pengguna tertentu untuk mengaksesnya seperti adb shell.
Penting juga untuk memeriksa keberadaan executable "su" sebelum mencoba menjalankannya, karena android telah dikenal tidak membuang proses yang mencoba menjalankan perintah yang hilang dengan benar. Proses hantu ini dapat menjalankan konsumsi memori dari waktu ke waktu.
sumber
Perbarui 2017
Anda dapat melakukannya sekarang dengan Google Safetynet API . SafetyNet API menyediakan API Pengesahan yang membantu Anda menilai keamanan dan kompatibilitas lingkungan Android tempat aplikasi Anda berjalan.
Pengesahan ini dapat membantu untuk menentukan apakah perangkat tertentu telah dirusak atau dimodifikasi.
API Pengesahan mengembalikan respons JWS seperti ini
Mengurai respons ini dapat membantu Anda menentukan apakah perangkat di-rooting atau tidak
Anda dapat melakukannya di sisi klien tetapi disarankan untuk mengurai respon di sisi server. Arsitektur server klien dasar dengan API jaring pengaman akan terlihat seperti ini: -
sumber
Pemeriksaan root di tingkat Java bukanlah solusi yang aman. Jika aplikasi Anda memiliki Masalah Keamanan untuk dijalankan pada perangkat yang di-rooting, silakan gunakan solusi ini.
Jawaban Kevin berfungsi kecuali telepon juga memiliki aplikasi seperti RootCloak. Aplikasi semacam itu memiliki Handle over Java API setelah ponsel di-rooting dan mereka mengejek API ini untuk mengembalikan ponsel tidak di-rooting.
Saya telah menulis kode tingkat asli berdasarkan jawaban Kevin, ia berfungsi bahkan dengan RootCloak! Juga tidak menyebabkan masalah kebocoran memori.
Dalam kode Java Anda, Anda perlu membuat kelas RootUtils wrapper untuk membuat panggilan asli
sumber
http://code.google.com/p/roottools/
Jika Anda tidak ingin menggunakan file jar cukup gunakan kode:
Program akan mencoba menemukan folder su:
Contoh:
sumber
checkRootMethod4()
dengan Jawaban Kevin .== true
ke boolean, itu tidak menambah apa pun dan tidak terlihat bagus.if (isRooted())
periksa alih-alih secara eksplisit menulis true. Lebih baik mengikuti pola penulisan kodeAlih-alih menggunakan isRootAvailable () Anda dapat menggunakan isAccessGiven (). Langsung dari wiki RootTools :
Referensi
sumber
Beberapa build yang dimodifikasi digunakan untuk mengatur properti sistem
ro.modversion
untuk tujuan ini. Hal-hal tampaknya telah pindah; build saya dari TheDude beberapa bulan lalu memiliki ini:Emulator dari 1,5 SDK di sisi lain, menjalankan gambar 1,5, juga memiliki root, mungkin mirip dengan Android Dev Phone 1 (yang mungkin ingin Anda izinkan) dan memiliki ini:
Sedangkan untuk ritel build, saya tidak punya satu untuk dikerjakan, tetapi berbagai pencarian di bawah
site:xda-developers.com
informatif. Ini adalah G1 di Belanda , Anda bisa lihat yangro.build.tags
tidak memilikinyatest-keys
, dan saya pikir itu mungkin properti paling andal untuk digunakan.sumber
RootBeer adalah root memeriksa perpustakaan Android oleh Scott dan Matthew. Ini menggunakan berbagai pemeriksaan untuk menunjukkan apakah perangkat di-rooting atau tidak.
sumber
Saya sarankan menggunakan kode asli untuk deteksi root. Ini adalah contoh lengkapnya .
Pembungkus JAWA :
Pembungkus JNI (asli-lib.c) :
konstanta:
deteksi root dari kode asli:
sumber
Ini kode saya berdasarkan beberapa jawaban di sini:
sumber
Lebih jauh ke jawaban @Kevins, saya baru saja menemukan saat menggunakan sistemnya, bahwa Nexus 7.1 kembali
false
untuk ketiga metode - Tidak adawhich
perintah, tidaktest-keys
danSuperSU
tidak diinstal pada/system/app
.Saya menambahkan ini:
Ini sedikit kurang berguna dalam beberapa situasi (jika Anda memerlukan jaminan akses root) karena SuperSU sepenuhnya dapat diinstal pada perangkat yang tidak memiliki akses SU.
Namun, karena SuperSU mungkin diinstal dan berfungsi tetapi tidak dalam
/system/app
direktori, kasing tambahan ini akan membasmi (haha) kasing kasing tersebut .sumber
sumber
Dua ide tambahan, jika Anda ingin memeriksa apakah suatu perangkat mampu melakukan root dari aplikasi Anda:
Runtime.getRuntime().exec()
/system/app/Superuser.apk
lokasisumber
Menggunakan C ++ dengan ndk adalah pendekatan terbaik untuk mendeteksi root bahkan jika pengguna menggunakan aplikasi yang menyembunyikan root-nya seperti RootCloak. Saya menguji kode ini dengan RootCloak dan saya dapat mendeteksi root bahkan jika pengguna mencoba menyembunyikannya. Jadi file cpp Anda ingin:
Dan Anda akan memanggil fungsi dari kode java Anda sebagai berikut
sumber
sumber
Ada Safety Net Attestation API dari layanan Google play yang dengannya kami dapat menilai perangkat dan menentukan apakah perangkat itu di-rooting / dirusak.
Silakan buka jawaban saya untuk berurusan dengan perangkat yang di-rooting:
https://stackoverflow.com/a/58304556/3908895
sumber
Lupakan semua yang mendeteksi aplikasi root dan binary su. Periksa proses daemon root. Ini dapat dilakukan dari terminal dan Anda dapat menjalankan perintah terminal dalam suatu aplikasi. Coba satu garis ini.
Anda tidak perlu izin root untuk mencapai ini juga.
sumber
Memang itu adalah pertanyaan yang menarik dan sejauh ini tidak ada yang pantas mendapatkan penghargaan. Saya menggunakan kode berikut:
Kode ini tentu bukan antipeluru, karena jaringan tidak tersedia sehingga Anda mendapatkan pengecualian. Jika metode ini mengembalikan true maka 99% Anda bisa yakin, jika tidak hanya 50% yang tidak. Izin jaringan juga dapat merusak solusinya.
sumber
Menggunakan perpustakaan saya di rootbox , itu cukup mudah. Periksa kode yang diperlukan di bawah ini:
sumber