mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-15 22:37:24 +00:00
Compare commits
14 Commits
manager-v7
...
v20.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0b41cd8564 | ||
![]() |
7db523071d | ||
![]() |
974ee58b9c | ||
![]() |
1e88f2c382 | ||
![]() |
0bdcfcaaf5 | ||
![]() |
5f9c78d04f | ||
![]() |
afa178fdec | ||
![]() |
3a0e3c98f7 | ||
![]() |
fafa92d44b | ||
![]() |
242e64d72f | ||
![]() |
2262af728e | ||
![]() |
bce777d7c6 | ||
![]() |
15bd2da824 | ||
![]() |
bd438ca288 |
@@ -18,6 +18,9 @@
|
|||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
android:onClick="@{() -> item.toggle()}">
|
android:onClick="@{() -> item.toggle()}">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
@@ -38,10 +41,11 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/hide_process_icon"
|
android:id="@+id/hide_process_icon"
|
||||||
android:focusable="true"
|
|
||||||
android:clickable="true"
|
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
isChecked="@{item.isHidden}"
|
isChecked="@{item.isHidden}"
|
||||||
|
android:background="@null"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
# v7.5.0
|
# v7.5.1
|
||||||
- Support new communication method (ContentProvider)
|
- Fix toggling app components in MagiskHide screen
|
||||||
- Fix several issues with hidden stub APK
|
- Update translations
|
||||||
- Support using BiometricPrompt (face unlock)
|
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
<string name="settings">Configuració</string>
|
<string name="settings">Configuració</string>
|
||||||
<string name="install">Instal·lar</string>
|
<string name="install">Instal·lar</string>
|
||||||
<string name="unsupport_magisk_title">Versió de Magisk incompatible</string>
|
<string name="unsupport_magisk_title">Versió de Magisk incompatible</string>
|
||||||
|
<string name="unsupport_magisk_msg">Aquesta versió de Magisk Manager no suporta versions de Magisk més petites que la %1$s.\n\nL\'App es comportarà com si Magisk no estigués instal·lat, si us plau actualitzi Magisk el més aviat possible.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk no està instal·lat</string>
|
<string name="magisk_version_error">Magisk no està instal·lat</string>
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
<string name="settings">Setelan</string>
|
<string name="settings">Setelan</string>
|
||||||
<string name="install">Pasang</string>
|
<string name="install">Pasang</string>
|
||||||
<string name="unsupport_magisk_title">Versi Magisk Tidak Didukung</string>
|
<string name="unsupport_magisk_title">Versi Magisk Tidak Didukung</string>
|
||||||
|
<string name="unsupport_magisk_msg">Magisk Manager versi ini tidak mendukung versi Magisk di bawah %1$s.\n\nAplikasi akan bertingkah seperti tidak ada Magisk terpasang, silakan perbarui Magisk sesegera mungkin.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk tidak terpasang.</string>
|
<string name="magisk_version_error">Magisk tidak terpasang.</string>
|
||||||
@@ -16,17 +17,18 @@
|
|||||||
<string name="checking_safetyNet_status">Memeriksa status SafetyNet…</string>
|
<string name="checking_safetyNet_status">Memeriksa status SafetyNet…</string>
|
||||||
<string name="safetyNet_check_success">Pemeriksaan SafetyNet Berhasil</string>
|
<string name="safetyNet_check_success">Pemeriksaan SafetyNet Berhasil</string>
|
||||||
<string name="safetyNet_api_error">Kesalahan pada API SafetyNet</string>
|
<string name="safetyNet_api_error">Kesalahan pada API SafetyNet</string>
|
||||||
<string name="safetyNet_res_invalid">Tanggapan tidak valid.</string>
|
<string name="safetyNet_res_invalid">Tanggapan tidak valid</string>
|
||||||
<string name="magisk_up_to_date">Magisk dalam versi terbaru</string>
|
<string name="magisk_up_to_date">Magisk dalam versi terbaru</string>
|
||||||
<string name="manager_up_to_date">Magisk Manager dalam versi terbaru</string>
|
<string name="manager_up_to_date">Magisk Manager dalam versi terbaru</string>
|
||||||
<string name="advanced_settings_title">Opsi Lanjutan</string>
|
<string name="advanced_settings_title">Opsi Lanjutan</string>
|
||||||
<string name="keep_force_encryption">Pertahankan enkripsi paksa</string>
|
<string name="keep_force_encryption">Pertahankan enkripsi paksa</string>
|
||||||
<string name="keep_dm_verity">Pertahankan AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Pertahankan AVB 2.0/dm-verity</string>
|
||||||
|
<string name="recovery_mode">Mode Pemulihan</string>
|
||||||
<string name="current_installed">Terpasang: %1$s</string>
|
<string name="current_installed">Terpasang: %1$s</string>
|
||||||
<string name="latest_version">Terbaru: %1$s</string>
|
<string name="latest_version">Terbaru: %1$s</string>
|
||||||
<string name="uninstall">Copot</string>
|
<string name="uninstall">Copot</string>
|
||||||
<string name="uninstall_magisk_title">Copot Magisk</string>
|
<string name="uninstall_magisk_title">Copot Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Semua modul akan dinonaktifkan/dihapus. Root akan dihapus, dan berpotensi mengenkripsi data Anda jika belum.</string>
|
<string name="uninstall_magisk_msg">Semua modul akan dinonaktifkan/dihapus!\nRoot akan dihapus!\nData Anda berpotensi terenkripsi jika belum!</string>
|
||||||
<string name="update">Perbarui</string>
|
<string name="update">Perbarui</string>
|
||||||
<string name="core_only_enabled">(Mode core only aktif)</string>
|
<string name="core_only_enabled">(Mode core only aktif)</string>
|
||||||
|
|
||||||
@@ -73,7 +75,7 @@
|
|||||||
<string name="manager_update_title">Pembaruan Magisk Manager Tersedia!</string>
|
<string name="manager_update_title">Pembaruan Magisk Manager Tersedia!</string>
|
||||||
|
|
||||||
<!--Installation-->
|
<!--Installation-->
|
||||||
<string name="manager_download_install">Tekan untuk unduh dan pasang.</string>
|
<string name="manager_download_install">Tekan untuk unduh dan pasang</string>
|
||||||
<string name="download_zip_only">Unduh Zip Saja</string>
|
<string name="download_zip_only">Unduh Zip Saja</string>
|
||||||
<string name="direct_install">Pasang Langsung (Direkomendasikan)</string>
|
<string name="direct_install">Pasang Langsung (Direkomendasikan)</string>
|
||||||
<string name="install_inactive_slot">Pasang ke Slot Nonaktif (Setelah OTA)</string>
|
<string name="install_inactive_slot">Pasang ke Slot Nonaktif (Setelah OTA)</string>
|
||||||
@@ -89,7 +91,7 @@
|
|||||||
<string name="repo_install_msg">Apakah Anda ingin memasang %1$s sekarang?</string>
|
<string name="repo_install_msg">Apakah Anda ingin memasang %1$s sekarang?</string>
|
||||||
<string name="download">Unduh</string>
|
<string name="download">Unduh</string>
|
||||||
<string name="reboot">Reboot</string>
|
<string name="reboot">Reboot</string>
|
||||||
<string name="settings_reboot_toast">Reboot untuk menerapkan perubahan.</string>
|
<string name="settings_reboot_toast">Reboot untuk menerapkan perubahan</string>
|
||||||
<string name="release_notes">Catatan rilis</string>
|
<string name="release_notes">Catatan rilis</string>
|
||||||
<string name="repo_cache_cleared">Cache repo dibersihkan</string>
|
<string name="repo_cache_cleared">Cache repo dibersihkan</string>
|
||||||
|
|
||||||
@@ -100,7 +102,7 @@
|
|||||||
<string name="failure">Gagal</string>
|
<string name="failure">Gagal</string>
|
||||||
<string name="hide_manager_title">Menyembunyikan Magisk Manager…</string>
|
<string name="hide_manager_title">Menyembunyikan Magisk Manager…</string>
|
||||||
<string name="hide_manager_fail_toast">Kesalahan menyembunyikan Magisk Manager.</string>
|
<string name="hide_manager_fail_toast">Kesalahan menyembunyikan Magisk Manager.</string>
|
||||||
<string name="open_link_failed_toast">Tidak ada aplikasi ditemukan untuk membuka tautan.</string>
|
<string name="open_link_failed_toast">Tidak ada aplikasi ditemukan untuk membuka tautan</string>
|
||||||
<string name="warning">Peringatan</string>
|
<string name="warning">Peringatan</string>
|
||||||
<string name="complete_uninstall">Copot Total</string>
|
<string name="complete_uninstall">Copot Total</string>
|
||||||
<string name="restore_img">Pulihkan Image</string>
|
<string name="restore_img">Pulihkan Image</string>
|
||||||
@@ -109,28 +111,29 @@
|
|||||||
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
||||||
<string name="proprietary_title">Unduh Kode Proprieter</string>
|
<string name="proprietary_title">Unduh Kode Proprieter</string>
|
||||||
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak menyertakan kode API proprieter Google SafetyNet.\n\nAkankah Anda mengizinkan Magisk Manager untuk mengunduh sebuah ekstensi (berisi GoogleApiClient) untuk pemeriksaan SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak menyertakan kode API proprieter Google SafetyNet.\n\nAkankah Anda mengizinkan Magisk Manager untuk mengunduh sebuah ekstensi (berisi GoogleApiClient) untuk pemeriksaan SafetyNet?</string>
|
||||||
<string name="setup_fail">Penyiapan gagal.</string>
|
<string name="setup_fail">Penyiapan gagal</string>
|
||||||
<string name="env_fix_title">Memerlukan Penyiapan Tambahan</string>
|
<string name="env_fix_title">Memerlukan Penyiapan Tambahan</string>
|
||||||
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan untuk Magisk dapat bekerja dengan baik. Ia akan mengunduh zip penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan untuk Magisk dapat bekerja dengan baik. Ia akan mengunduh zip penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
||||||
<string name="setup_msg">Menjalankan penyiapan lingkungan…</string>
|
<string name="setup_msg">Menjalankan penyiapan lingkungan…</string>
|
||||||
|
<string name="authenticate">Otentikasi</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Umum</string>
|
<string name="settings_general_category">Umum</string>
|
||||||
<string name="settings_dark_theme_title">Tema Gelap</string>
|
<string name="settings_dark_theme_title">Tema Gelap</string>
|
||||||
<string name="settings_dark_theme_summary">Aktifkan tema gelap.</string>
|
<string name="settings_dark_theme_summary">Aktifkan tema gelap</string>
|
||||||
<string name="settings_download_path_title">Lokasi unduhan</string>
|
<string name="settings_download_path_title">Lokasi unduhan</string>
|
||||||
<string name="settings_download_path_message">File akan disimpan ke %1$s</string>
|
<string name="settings_download_path_message">File akan disimpan ke %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Bersihkan Cache Repo</string>
|
<string name="settings_clear_cache_title">Bersihkan Cache Repo</string>
|
||||||
<string name="settings_clear_cache_summary">Bersihkan informasi ter-cache untuk repo online. Ini memaksa apl untuk menyegarkan secara online.</string>
|
<string name="settings_clear_cache_summary">Bersihkan informasi ter-cache untuk repo online. Ini memaksa apl untuk menyegarkan secara online</string>
|
||||||
<string name="settings_hide_manager_title">Sembunyikan Magisk Manager</string>
|
<string name="settings_hide_manager_title">Sembunyikan Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Pak ulang Magisk Manager dengan nama paket acak.</string>
|
<string name="settings_hide_manager_summary">Pak ulang Magisk Manager dengan nama paket dan apl acak</string>
|
||||||
<string name="settings_restore_manager_title">Pulihkan Magisk Manager</string>
|
<string name="settings_restore_manager_title">Pulihkan Magisk Manager</string>
|
||||||
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan paket asli</string>
|
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan paket dan nama asli</string>
|
||||||
<string name="language">Bahasa</string>
|
<string name="language">Bahasa</string>
|
||||||
<string name="system_default">(Default Sistem)</string>
|
<string name="system_default">(Default Sistem)</string>
|
||||||
<string name="settings_update">Setelan Pembaruan</string>
|
<string name="settings_update">Setelan Pembaruan</string>
|
||||||
<string name="settings_check_update_title">Periksa Pembaruan</string>
|
<string name="settings_check_update_title">Periksa Pembaruan</string>
|
||||||
<string name="settings_check_update_summary">Secara periodik memeriksa pembaruan di latar belakang.</string>
|
<string name="settings_check_update_summary">Secara periodik memeriksa pembaruan di latar belakang</string>
|
||||||
<string name="settings_update_channel_title">Kanal Pembaruan</string>
|
<string name="settings_update_channel_title">Kanal Pembaruan</string>
|
||||||
<string name="settings_update_stable">Stabil</string>
|
<string name="settings_update_stable">Stabil</string>
|
||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
@@ -138,11 +141,15 @@
|
|||||||
<string name="settings_update_custom_msg">Masukkan sebuah URL kustom</string>
|
<string name="settings_update_custom_msg">Masukkan sebuah URL kustom</string>
|
||||||
<string name="settings_core_only_title">Magisk Mode Core Only</string>
|
<string name="settings_core_only_title">Magisk Mode Core Only</string>
|
||||||
<string name="settings_core_only_summary">Aktifkan fitur inti saja. MagiskSU dan MagiskHide akan tetap diaktifkan</string>
|
<string name="settings_core_only_summary">Aktifkan fitur inti saja. MagiskSU dan MagiskHide akan tetap diaktifkan</string>
|
||||||
<string name="settings_magiskhide_summary">Sembunyikan Magisk dari berbagai bentuk pendeteksian.</string>
|
<string name="settings_magiskhide_summary">Sembunyikan Magisk dari berbagai bentuk pendeteksian</string>
|
||||||
<string name="settings_hosts_title">Host tanpa sistem</string>
|
<string name="settings_hosts_title">Host tanpa sistem</string>
|
||||||
<string name="settings_hosts_summary">Dukungan host tanpa sistem untuk apl pemblokir iklan.</string>
|
<string name="settings_hosts_summary">Dukungan host tanpa sistem untuk apl pemblokir iklan</string>
|
||||||
<string name="settings_hosts_toast">Ditambahkan modul host tanpa sistem</string>
|
<string name="settings_hosts_toast">Ditambahkan modul host tanpa sistem</string>
|
||||||
|
|
||||||
|
<string name="settings_app_name">Ketik nama apl yang diinginkan</string>
|
||||||
|
<string name="settings_app_name_hint">Nama baru</string>
|
||||||
|
<string name="settings_app_name_helper">Apl akan dipak ulang ke nama ini</string>
|
||||||
|
<string name="settings_app_name_error">Format tidak valid</string>
|
||||||
<string name="settings_su_app_adb">Apl dan ADB</string>
|
<string name="settings_su_app_adb">Apl dan ADB</string>
|
||||||
<string name="settings_su_app">Apl saja</string>
|
<string name="settings_su_app">Apl saja</string>
|
||||||
<string name="settings_su_adb">ADB saja</string>
|
<string name="settings_su_adb">ADB saja</string>
|
||||||
@@ -160,22 +167,25 @@
|
|||||||
<string name="request_timeout_summary">%1$d detik</string>
|
<string name="request_timeout_summary">%1$d detik</string>
|
||||||
<string name="settings_su_reauth_title">Otentikasi ulang setelah pembaruan</string>
|
<string name="settings_su_reauth_title">Otentikasi ulang setelah pembaruan</string>
|
||||||
<string name="settings_su_reauth_summary">Otentikasi ulang izin superuser setelah pembaruan sebuah aplikasi</string>
|
<string name="settings_su_reauth_summary">Otentikasi ulang izin superuser setelah pembaruan sebuah aplikasi</string>
|
||||||
|
<string name="settings_su_biometric_title">Aktifkan Otentikasi Biometrik</string>
|
||||||
|
<string name="settings_su_biometric_summary">Gunakan otentikasi biometrik untuk mengizinkan permintaan superuser</string>
|
||||||
|
<string name="no_biometric">Perangkat tidak didukung atau tidak ada opsi biometrik yang diaktifkan</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mode Multipengguna</string>
|
<string name="multiuser_mode">Mode Multipengguna</string>
|
||||||
<string name="settings_owner_only">Pemilik Perangkat Saja</string>
|
<string name="settings_owner_only">Pemilik Perangkat Saja</string>
|
||||||
<string name="settings_owner_manage">Pemilik Perangkat Mengelola</string>
|
<string name="settings_owner_manage">Pemilik Perangkat Mengelola</string>
|
||||||
<string name="settings_user_independent">Pengguna-Independen</string>
|
<string name="settings_user_independent">Pengguna-Independen</string>
|
||||||
<string name="owner_only_summary">Hanya pemilik yang memiliki akses root.</string>
|
<string name="owner_only_summary">Hanya pemilik yang memiliki akses root</string>
|
||||||
<string name="owner_manage_summary">Hanya pemilik yang dapat mengelola akses root dan menerima permintaan.</string>
|
<string name="owner_manage_summary">Hanya pemilik yang dapat mengelola akses root dan menerima permintaan</string>
|
||||||
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri.</string>
|
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Mode Mount Ruang Nama</string>
|
<string name="mount_namespace_mode">Mode Mount Ruang Nama</string>
|
||||||
<string name="settings_ns_global">Ruang Nama Global</string>
|
<string name="settings_ns_global">Ruang Nama Global</string>
|
||||||
<string name="settings_ns_requester">Ruang Nama Warisan</string>
|
<string name="settings_ns_requester">Ruang Nama Warisan</string>
|
||||||
<string name="settings_ns_isolate">Ruang Nama Terisolasi</string>
|
<string name="settings_ns_isolate">Ruang Nama Terisolasi</string>
|
||||||
<string name="global_summary">Semua sesi root menggunakan mount ruang nama global.</string>
|
<string name="global_summary">Semua sesi root menggunakan mount ruang nama global</string>
|
||||||
<string name="requester_summary">Sesi root akan mewarisi ruang nama peminta mereka.</string>
|
<string name="requester_summary">Sesi root akan mewarisi ruang nama peminta mereka</string>
|
||||||
<string name="isolate_summary">Setiap sesi root akan memiliki ruang nama tersendiri.</string>
|
<string name="isolate_summary">Setiap sesi root akan memiliki ruang nama tersendiri</string>
|
||||||
<string name="settings_download_path_error">Kesalahan membuat folder. Folder harus dapat diakses dari direktori penyimpanan root dan bukan merupakan file.</string>
|
<string name="settings_download_path_error">Kesalahan membuat folder. Folder harus dapat diakses dari direktori penyimpanan root dan bukan merupakan file.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
<string name="settings">Ustawienia</string>
|
<string name="settings">Ustawienia</string>
|
||||||
<string name="install">Instaluj</string>
|
<string name="install">Instaluj</string>
|
||||||
<string name="unsupport_magisk_title">Nieobsługiwana Wersja Magisk</string>
|
<string name="unsupport_magisk_title">Nieobsługiwana Wersja Magisk</string>
|
||||||
|
<string name="unsupport_magisk_msg">Ta wersja Magisk Managera nie obsługuje wersji Magiska poniżej %1$s.\n\nZaktualizuj Magisk.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk nie jest zainstalowany.</string>
|
<string name="magisk_version_error">Magisk nie jest zainstalowany.</string>
|
||||||
@@ -166,7 +167,10 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekund</string>
|
<string name="request_timeout_summary">%1$d sekund</string>
|
||||||
<string name="settings_su_reauth_title">Ponowienie uwierzytelnienia po aktualizacji</string>
|
<string name="settings_su_reauth_title">Ponowienie uwierzytelnienia po aktualizacji</string>
|
||||||
<string name="settings_su_reauth_summary">Ponowne uwierzytelnianie uprawnienia superużytkownika po aktualizacji aplikacji</string>
|
<string name="settings_su_reauth_summary">Ponowne uwierzytelnianie uprawnienia superużytkownika po aktualizacji aplikacji</string>
|
||||||
|
<string name="settings_su_biometric_title">Uwierzytelnianie odciskiem palca</string>
|
||||||
|
<string name="settings_su_biometric_summary">Użyj odcisku palca aby przyznać uprawnienia superużytkownika</string>
|
||||||
|
<string name="no_biometric">Niewspierane urządzenie lub brak odcisku palca</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Tryb Multiusera</string>
|
<string name="multiuser_mode">Tryb Multiusera</string>
|
||||||
<string name="settings_owner_only">Tylko Właściciel Urządzenia</string>
|
<string name="settings_owner_only">Tylko Właściciel Urządzenia</string>
|
||||||
<string name="settings_owner_manage">Zarządzanie Właścicielami Urządzenia</string>
|
<string name="settings_owner_manage">Zarządzanie Właścicielami Urządzenia</string>
|
||||||
|
@@ -90,11 +90,10 @@
|
|||||||
<string name="repo_install_title">Nainštalovať %1$s</string>
|
<string name="repo_install_title">Nainštalovať %1$s</string>
|
||||||
<string name="repo_install_msg">Chcete teraz nainštalovať %1$s?</string>
|
<string name="repo_install_msg">Chcete teraz nainštalovať %1$s?</string>
|
||||||
<string name="download">Stiahnuť</string>
|
<string name="download">Stiahnuť</string>
|
||||||
<string name="reboot">Reštart</string>
|
<string name="reboot">Reštartovať</string>
|
||||||
<string name="settings_reboot_toast">Pre aplikovanie nastavení je potrebný reštart</string>
|
<string name="settings_reboot_toast">Pre aplikovanie nastavení je potrebný reštart</string>
|
||||||
<string name="release_notes">Poznámky k vydaniu</string>
|
<string name="release_notes">Poznámky k vydaniu</string>
|
||||||
<string name="repo_cache_cleared">Cache repo odstránená</string>
|
<string name="repo_cache_cleared">Cache repo odstránená</string>
|
||||||
|
|
||||||
<string name="dtbo_patched_title">DTBO bol zaplátaný!</string>
|
<string name="dtbo_patched_title">DTBO bol zaplátaný!</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager zaplátal dtbo.img, prosím, reštartujte.</string>
|
<string name="dtbo_patched_reboot">Magisk Manager zaplátal dtbo.img, prosím, reštartujte.</string>
|
||||||
<string name="flashing">Flashovanie</string>
|
<string name="flashing">Flashovanie</string>
|
||||||
@@ -115,6 +114,7 @@
|
|||||||
<string name="env_fix_title">Vyžaduje sa ďalšie nastavenie</string>
|
<string name="env_fix_title">Vyžaduje sa ďalšie nastavenie</string>
|
||||||
<string name="env_fix_msg">Vaše zariadenie si vyžaduje ďalšie nastavenie pre správne fungovanie Magisk. Stiahne sa inštalačný zip súbor Magisk, chcete pokračovať teraz?</string>
|
<string name="env_fix_msg">Vaše zariadenie si vyžaduje ďalšie nastavenie pre správne fungovanie Magisk. Stiahne sa inštalačný zip súbor Magisk, chcete pokračovať teraz?</string>
|
||||||
<string name="setup_msg">Nastavenie je spustené…</string>
|
<string name="setup_msg">Nastavenie je spustené…</string>
|
||||||
|
<string name="authenticate">Autentifikácia</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Všeobecné</string>
|
<string name="settings_general_category">Všeobecné</string>
|
||||||
@@ -166,6 +166,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekúnd</string>
|
<string name="request_timeout_summary">%1$d sekúnd</string>
|
||||||
<string name="settings_su_reauth_title">Overenie autentifikácie po upgrade</string>
|
<string name="settings_su_reauth_title">Overenie autentifikácie po upgrade</string>
|
||||||
<string name="settings_su_reauth_summary">Overí autentifikáciu oprávnení superuser po upgrade aplikácie</string>
|
<string name="settings_su_reauth_summary">Overí autentifikáciu oprávnení superuser po upgrade aplikácie</string>
|
||||||
|
<string name="settings_su_biometric_title">Povoliť biometrickú autentifikáciu</string>
|
||||||
|
<string name="settings_su_biometric_summary">Použite biometrickú autentifikáciu pre povolenie žiadostí superuser</string>
|
||||||
|
<string name="no_biometric">Nepodporované zariadenia alebo biometria nie je povolená v nastaveniach</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Režim viacerých používateľov</string>
|
<string name="multiuser_mode">Režim viacerých používateľov</string>
|
||||||
<string name="settings_owner_only">Iba majiteľ zariadenia</string>
|
<string name="settings_owner_only">Iba majiteľ zariadenia</string>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# Magisk Documentation
|
# Magisk Documentation
|
||||||
(Updated on 2019.12.29)
|
(Updated on 2020.1.2)
|
||||||
|
|
||||||
- [Installation](install.md)
|
- [Installation](install.md)
|
||||||
- [Tutorials](tutorials.md)
|
- [Tutorials](tutorials.md)
|
||||||
|
@@ -25,9 +25,11 @@ The concept of `magiskboot` is to make boot image modification simpler. For unpa
|
|||||||
Usage: magiskboot <action> [args...]
|
Usage: magiskboot <action> [args...]
|
||||||
|
|
||||||
Supported actions:
|
Supported actions:
|
||||||
unpack [-h] <bootimg>
|
unpack [-n] [-h] <bootimg>
|
||||||
Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,
|
Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,
|
||||||
second, dtb, extra, and recovery_dtbo into current directory.
|
second, dtb, extra, and recovery_dtbo into current directory.
|
||||||
|
If '-n' is provided, it will not attempt to decompress kernel or
|
||||||
|
ramdisk.cpio from their original formats.
|
||||||
If '-h' is provided, it will dump header info to 'header',
|
If '-h' is provided, it will dump header info to 'header',
|
||||||
which will be parsed when repacking.
|
which will be parsed when repacking.
|
||||||
Return values:
|
Return values:
|
||||||
@@ -45,7 +47,7 @@ Supported actions:
|
|||||||
|
|
||||||
cpio <incpio> [commands...]
|
cpio <incpio> [commands...]
|
||||||
Do cpio commands to <incpio> (modifications are done directly)
|
Do cpio commands to <incpio> (modifications are done directly)
|
||||||
Each command is a single argument, use quotes if necessary
|
Each command is a single argument, add quotes for each command
|
||||||
Supported commands:
|
Supported commands:
|
||||||
exists ENTRY
|
exists ENTRY
|
||||||
Return 0 if ENTRY exists, else return 1
|
Return 0 if ENTRY exists, else return 1
|
||||||
@@ -65,8 +67,9 @@ Supported actions:
|
|||||||
Test the current cpio's patch status
|
Test the current cpio's patch status
|
||||||
Return values:
|
Return values:
|
||||||
0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)
|
0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)
|
||||||
patch KEEPVERITY KEEPFORCEENCRYPT
|
patch
|
||||||
Ramdisk patches. KEEP**** are boolean values
|
Apply ramdisk patches. Configure settings with env variables:
|
||||||
|
KEEPVERITY KEEPFORCEENCRYPT
|
||||||
backup ORIG
|
backup ORIG
|
||||||
Create ramdisk backups from ORIG
|
Create ramdisk backups from ORIG
|
||||||
restore
|
restore
|
||||||
@@ -74,17 +77,25 @@ Supported actions:
|
|||||||
sha1
|
sha1
|
||||||
Print stock boot SHA1 if previously backed up in ramdisk
|
Print stock boot SHA1 if previously backed up in ramdisk
|
||||||
|
|
||||||
dtb-<cmd> <dtb>
|
dtb <input> <action> [args...]
|
||||||
Do dtb related cmds to <dtb> (modifications are done directly)
|
Do dtb related actions to <input>
|
||||||
Supported commands:
|
Supported actions:
|
||||||
dump
|
print [-f]
|
||||||
Dump all contents from dtb for debugging
|
Print all contents of dtb for debugging
|
||||||
test
|
Specify [-f] to only print fstab nodes
|
||||||
Check if fstab has verity/avb flags
|
patch [OUT]
|
||||||
Return values:
|
|
||||||
0:flag exists 1:no flags
|
|
||||||
patch
|
|
||||||
Search for fstab and remove verity/avb
|
Search for fstab and remove verity/avb
|
||||||
|
If [OUT] is not specified, it will directly output to <input>
|
||||||
|
Configure with env variables: KEEPVERITY TWOSTAGEINIT
|
||||||
|
|
||||||
|
split <input>
|
||||||
|
Split image.*-dtb into kernel + kernel_dtb
|
||||||
|
|
||||||
|
sha1 <file>
|
||||||
|
Print the SHA1 checksum for <file>
|
||||||
|
|
||||||
|
cleanup
|
||||||
|
Cleanup the current working directory
|
||||||
|
|
||||||
compress[=method] <infile> [outfile]
|
compress[=method] <infile> [outfile]
|
||||||
Compress <infile> with [method] (default: gzip), optionally to [outfile]
|
Compress <infile> with [method] (default: gzip), optionally to [outfile]
|
||||||
@@ -95,12 +106,6 @@ Supported actions:
|
|||||||
Detect method and decompress <infile>, optionally to [outfile]
|
Detect method and decompress <infile>, optionally to [outfile]
|
||||||
<infile>/[outfile] can be '-' to be STDIN/STDOUT
|
<infile>/[outfile] can be '-' to be STDIN/STDOUT
|
||||||
Supported methods: bzip2 gzip lz4 lz4_legacy lzma xz
|
Supported methods: bzip2 gzip lz4 lz4_legacy lzma xz
|
||||||
|
|
||||||
sha1 <file>
|
|
||||||
Print the SHA1 checksum for <file>
|
|
||||||
|
|
||||||
cleanup
|
|
||||||
Cleanup the current working directory
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### magiskinit
|
### magiskinit
|
||||||
@@ -119,20 +124,22 @@ Usage: magiskpolicy [--options...] [policy statements...]
|
|||||||
Options:
|
Options:
|
||||||
--help show help message for policy statements
|
--help show help message for policy statements
|
||||||
--load FILE load policies from FILE
|
--load FILE load policies from FILE
|
||||||
--load-split load from preloaded sepolicy or compile
|
--load-split load from precompiled sepolicy or compile
|
||||||
split policies
|
split policies
|
||||||
--compile-split compile split cil policies
|
--compile-split compile split cil policies
|
||||||
--save FILE save policies to FILE
|
--save FILE save policies to FILE
|
||||||
--live directly apply sepolicy live
|
--live directly apply sepolicy live
|
||||||
--magisk inject built-in rules for a minimal
|
--magisk inject built-in rules for a minimal
|
||||||
Magisk selinux environment
|
Magisk selinux environment
|
||||||
|
--apply FILE apply rules from FILE, read and parsed
|
||||||
|
line by line as policy statements
|
||||||
|
|
||||||
If neither --load or --compile-split is specified, it will load
|
If neither --load or --compile-split is specified, it will load
|
||||||
from current live policies (/sys/fs/selinux/policy)
|
from current live policies (/sys/fs/selinux/policy)
|
||||||
|
|
||||||
One policy statement should be treated as one parameter;
|
One policy statement should be treated as one parameter;
|
||||||
this means a full policy statement should be enclosed in quotes;
|
this means a full policy statement should be enclosed in quotes.
|
||||||
multiple policy statements can be provided in a single command
|
Multiple policy statements can be provided in a single command.
|
||||||
|
|
||||||
The statements has a format of "<rule_name> [args...]"
|
The statements has a format of "<rule_name> [args...]"
|
||||||
Multiple types and permissions can be grouped into collections
|
Multiple types and permissions can be grouped into collections
|
||||||
@@ -173,10 +180,10 @@ Notes:
|
|||||||
Example: allow { s1 s2 } { t1 t2 } class *
|
Example: allow { s1 s2 } { t1 t2 } class *
|
||||||
Will be expanded to:
|
Will be expanded to:
|
||||||
|
|
||||||
allow s1 t1 class { all permissions }
|
allow s1 t1 class { all-permissions }
|
||||||
allow s1 t2 class { all permissions }
|
allow s1 t2 class { all-permissions }
|
||||||
allow s2 t1 class { all permissions }
|
allow s2 t1 class { all-permissions }
|
||||||
allow s2 t2 class { all permissions }
|
allow s2 t2 class { all-permissions }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -202,7 +209,6 @@ Advanced Options (Internal APIs):
|
|||||||
--clone-attr SRC DEST clone permission, owner, and selinux context
|
--clone-attr SRC DEST clone permission, owner, and selinux context
|
||||||
--clone SRC DEST clone SRC to DEST
|
--clone SRC DEST clone SRC to DEST
|
||||||
--sqlite SQL exec SQL commands to Magisk database
|
--sqlite SQL exec SQL commands to Magisk database
|
||||||
--use-broadcast use broadcast for su logging and notify
|
|
||||||
|
|
||||||
Supported init triggers:
|
Supported init triggers:
|
||||||
post-fs-data, service, boot-complete
|
post-fs-data, service, boot-complete
|
||||||
@@ -269,5 +275,4 @@ Actions:
|
|||||||
ls Print the current hide list
|
ls Print the current hide list
|
||||||
exec CMDs... Execute commands in isolated mount
|
exec CMDs... Execute commands in isolated mount
|
||||||
namespace and do all hide unmounts
|
namespace and do all hide unmounts
|
||||||
test Run process monitor test
|
|
||||||
```
|
```
|
||||||
|
@@ -138,7 +138,7 @@ protected:
|
|||||||
void early_mount() override;
|
void early_mount() override;
|
||||||
public:
|
public:
|
||||||
RootFSInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd) {
|
RootFSInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd) {
|
||||||
persist_dir = "/dev/.magisk/mirror/persist/magisk";
|
persist_dir = "/dev/mnt/persist/magisk";
|
||||||
}
|
}
|
||||||
|
|
||||||
void start() override {
|
void start() override {
|
||||||
|
@@ -94,7 +94,7 @@ static bool read_dt_fstab(cmdline *cmd, const char *name) {
|
|||||||
char path[128];
|
char path[128];
|
||||||
int fd;
|
int fd;
|
||||||
sprintf(path, "%s/fstab/%s/dev", cmd->dt_dir, name);
|
sprintf(path, "%s/fstab/%s/dev", cmd->dt_dir, name);
|
||||||
if ((fd = xopen(path, O_RDONLY | O_CLOEXEC)) >= 0) {
|
if ((fd = open(path, O_RDONLY | O_CLOEXEC)) >= 0) {
|
||||||
read(fd, path, sizeof(path));
|
read(fd, path, sizeof(path));
|
||||||
close(fd);
|
close(fd);
|
||||||
// Some custom treble use different names, so use what we read
|
// Some custom treble use different names, so use what we read
|
||||||
@@ -119,26 +119,6 @@ if (!is_lnk("/" #name) && read_dt_fstab(cmd, #name)) { \
|
|||||||
mount_list.emplace_back("/" #name); \
|
mount_list.emplace_back("/" #name); \
|
||||||
}
|
}
|
||||||
|
|
||||||
void RootFSInit::early_mount() {
|
|
||||||
full_read("/init", self.buf, self.sz);
|
|
||||||
|
|
||||||
LOGD("Reverting /init\n");
|
|
||||||
root = xopen("/", O_RDONLY | O_CLOEXEC);
|
|
||||||
rename("/.backup/init", "/init");
|
|
||||||
|
|
||||||
// Mount sbin overlay for persist, but move it and add to cleanup list
|
|
||||||
mount_sbin();
|
|
||||||
xmount("/sbin", "/dev", nullptr, MS_MOVE, nullptr);
|
|
||||||
mount_list.emplace_back("/dev");
|
|
||||||
mount_list.emplace_back("/dev/.magisk/mirror/persist");
|
|
||||||
mount_list.emplace_back("/dev/.magisk/mirror/cache");
|
|
||||||
|
|
||||||
mount_root(system);
|
|
||||||
mount_root(vendor);
|
|
||||||
mount_root(product);
|
|
||||||
mount_root(odm);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void switch_root(const string &path) {
|
static void switch_root(const string &path) {
|
||||||
LOGD("Switch root to %s\n", path.data());
|
LOGD("Switch root to %s\n", path.data());
|
||||||
vector<string> mounts;
|
vector<string> mounts;
|
||||||
@@ -164,6 +144,45 @@ static void switch_root(const string &path) {
|
|||||||
chroot(".");
|
chroot(".");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mount_persist(const char *dev_base, const char *mnt_base) {
|
||||||
|
string mnt_point = mnt_base + "/persist"s;
|
||||||
|
strcpy(partname, "persist");
|
||||||
|
sprintf(block_dev, "%s/persist", dev_base);
|
||||||
|
if (setup_block(false) < 0) {
|
||||||
|
// Fallback to cache
|
||||||
|
strcpy(partname, "cache");
|
||||||
|
sprintf(block_dev, "%s/cache", dev_base);
|
||||||
|
if (setup_block(false) < 0) {
|
||||||
|
// Try NVIDIA's BS
|
||||||
|
strcpy(partname, "CAC");
|
||||||
|
if (setup_block(false) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xsymlink("./cache", mnt_point.data());
|
||||||
|
mnt_point = mnt_base + "/cache"s;
|
||||||
|
}
|
||||||
|
xmkdir(mnt_point.data(), 0755);
|
||||||
|
xmount(block_dev, mnt_point.data(), "ext4", 0, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RootFSInit::early_mount() {
|
||||||
|
full_read("/init", self.buf, self.sz);
|
||||||
|
|
||||||
|
LOGD("Reverting /init\n");
|
||||||
|
root = xopen("/", O_RDONLY | O_CLOEXEC);
|
||||||
|
rename("/.backup/init", "/init");
|
||||||
|
|
||||||
|
mount_root(system);
|
||||||
|
mount_root(vendor);
|
||||||
|
mount_root(product);
|
||||||
|
mount_root(odm);
|
||||||
|
|
||||||
|
xmkdir("/dev/mnt", 0755);
|
||||||
|
mount_persist("/dev/block", "/dev/mnt");
|
||||||
|
mount_list.emplace_back("/dev/mnt/persist");
|
||||||
|
mount_list.emplace_back("/dev/mnt/cache");
|
||||||
|
}
|
||||||
|
|
||||||
void SARBase::backup_files() {
|
void SARBase::backup_files() {
|
||||||
if (access("/overlay.d", F_OK) == 0)
|
if (access("/overlay.d", F_OK) == 0)
|
||||||
cp_afc("/overlay.d", "/dev/overlay.d");
|
cp_afc("/overlay.d", "/dev/overlay.d");
|
||||||
@@ -250,23 +269,5 @@ void mount_sbin() {
|
|||||||
xmkdir(MIRRDIR, 0);
|
xmkdir(MIRRDIR, 0);
|
||||||
xmkdir(BLOCKDIR, 0);
|
xmkdir(BLOCKDIR, 0);
|
||||||
|
|
||||||
// Mount persist partition
|
mount_persist(BLOCKDIR, MIRRDIR);
|
||||||
strcpy(partname, "persist");
|
|
||||||
strcpy(block_dev, BLOCKDIR "/persist");
|
|
||||||
const char *mnt_point = MIRRDIR "/persist";
|
|
||||||
if (setup_block(false) < 0) {
|
|
||||||
// Fallback to cache
|
|
||||||
strcpy(partname, "cache");
|
|
||||||
strcpy(block_dev, BLOCKDIR "/cache");
|
|
||||||
if (setup_block(false) < 0) {
|
|
||||||
// Try NVIDIA's BS
|
|
||||||
strcpy(partname, "CAC");
|
|
||||||
if (setup_block(false) < 0)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mnt_point = MIRRDIR "/cache";
|
|
||||||
xsymlink("./cache", MIRRDIR "/persist");
|
|
||||||
}
|
|
||||||
xmkdir(mnt_point, 0755);
|
|
||||||
xmount(block_dev, mnt_point, "ext4", 0, nullptr);
|
|
||||||
}
|
}
|
||||||
|
@@ -221,46 +221,35 @@ static void sbin_overlay(const raw_data &self, const raw_data &config) {
|
|||||||
xsymlink("./magiskinit", "/sbin/supolicy");
|
xsymlink("./magiskinit", "/sbin/supolicy");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void recreate_sbin(const char *mirror) {
|
static void recreate_sbin(const char *mirror, bool use_bind_mount) {
|
||||||
int src = xopen(mirror, O_RDONLY | O_CLOEXEC);
|
auto dp = xopen_dir(mirror);
|
||||||
int dest = xopen("/sbin", O_RDONLY | O_CLOEXEC);
|
int src = dirfd(dp.get());
|
||||||
DIR *fp = fdopendir(src);
|
char buf[4096];
|
||||||
char buf[256];
|
for (dirent *entry; (entry = xreaddir(dp.get()));) {
|
||||||
bool use_bind_mount = true;
|
|
||||||
for (dirent *entry; (entry = xreaddir(fp));) {
|
|
||||||
if (entry->d_name == "."sv || entry->d_name == ".."sv)
|
if (entry->d_name == "."sv || entry->d_name == ".."sv)
|
||||||
continue;
|
continue;
|
||||||
|
string sbin_path = "/sbin/"s + entry->d_name;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
fstatat(src, entry->d_name, &st, AT_SYMLINK_NOFOLLOW);
|
fstatat(src, entry->d_name, &st, AT_SYMLINK_NOFOLLOW);
|
||||||
if (S_ISLNK(st.st_mode)) {
|
if (S_ISLNK(st.st_mode)) {
|
||||||
xreadlinkat(src, entry->d_name, buf, sizeof(buf));
|
xreadlinkat(src, entry->d_name, buf, sizeof(buf));
|
||||||
xsymlinkat(buf, dest, entry->d_name);
|
xsymlink(buf, sbin_path.data());
|
||||||
} else {
|
} else {
|
||||||
char sbin_path[256];
|
|
||||||
sprintf(buf, "%s/%s", mirror, entry->d_name);
|
sprintf(buf, "%s/%s", mirror, entry->d_name);
|
||||||
sprintf(sbin_path, "/sbin/%s", entry->d_name);
|
|
||||||
|
|
||||||
if (use_bind_mount) {
|
if (use_bind_mount) {
|
||||||
|
auto mode = st.st_mode & 0777;
|
||||||
// Create dummy
|
// Create dummy
|
||||||
if (S_ISDIR(st.st_mode))
|
if (S_ISDIR(st.st_mode))
|
||||||
xmkdir(sbin_path, st.st_mode & 0777);
|
xmkdir(sbin_path.data(), mode);
|
||||||
else
|
else
|
||||||
close(xopen(sbin_path, O_CREAT | O_WRONLY | O_CLOEXEC, st.st_mode & 0777));
|
close(xopen(sbin_path.data(), O_CREAT | O_WRONLY | O_CLOEXEC, mode));
|
||||||
|
|
||||||
if (xmount(buf, sbin_path, nullptr, MS_BIND, nullptr)) {
|
xmount(buf, sbin_path.data(), nullptr, MS_BIND, nullptr);
|
||||||
// Bind mount failed, fallback to symlink
|
} else {
|
||||||
remove(sbin_path);
|
xsymlink(buf, sbin_path.data());
|
||||||
use_bind_mount = false;
|
|
||||||
} else {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xsymlink(buf, sbin_path);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close(src);
|
|
||||||
close(dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ROOTMIR MIRRDIR "/system_root"
|
#define ROOTMIR MIRRDIR "/system_root"
|
||||||
@@ -304,7 +293,7 @@ void SARBase::patch_rootdir() {
|
|||||||
xmount(ROOTBLK, ROOTMIR, "erofs", MS_RDONLY, nullptr);
|
xmount(ROOTBLK, ROOTMIR, "erofs", MS_RDONLY, nullptr);
|
||||||
|
|
||||||
// Recreate original sbin structure
|
// Recreate original sbin structure
|
||||||
recreate_sbin(ROOTMIR "/sbin");
|
recreate_sbin(ROOTMIR "/sbin", true);
|
||||||
|
|
||||||
// Patch init
|
// Patch init
|
||||||
raw_data init;
|
raw_data init;
|
||||||
@@ -491,7 +480,7 @@ int magisk_proxy_main(int argc, char *argv[]) {
|
|||||||
sbin_overlay(self, config);
|
sbin_overlay(self, config);
|
||||||
|
|
||||||
// Create symlinks pointing back to /root
|
// Create symlinks pointing back to /root
|
||||||
recreate_sbin("/root");
|
recreate_sbin("/root", false);
|
||||||
|
|
||||||
setenv("REMOUNT_ROOT", "1", 1);
|
setenv("REMOUNT_ROOT", "1", 1);
|
||||||
execv("/sbin/magisk", argv);
|
execv("/sbin/magisk", argv);
|
||||||
|
@@ -73,6 +73,7 @@ private:
|
|||||||
uint8_t outbuf[CHUNK];
|
uint8_t outbuf[CHUNK];
|
||||||
|
|
||||||
int write(const void *buf, size_t len, int flush) {
|
int write(const void *buf, size_t len, int flush) {
|
||||||
|
int ret = 0;
|
||||||
strm.next_in = (Bytef *) buf;
|
strm.next_in = (Bytef *) buf;
|
||||||
strm.avail_in = len;
|
strm.avail_in = len;
|
||||||
do {
|
do {
|
||||||
@@ -91,9 +92,9 @@ private:
|
|||||||
LOGW("gzip %s failed (%d)\n", mode ? "encode" : "decode", code);
|
LOGW("gzip %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||||
} while (strm.avail_out == 0);
|
} while (strm.avail_out == 0);
|
||||||
return len;
|
return ret;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -147,6 +148,7 @@ private:
|
|||||||
char outbuf[CHUNK];
|
char outbuf[CHUNK];
|
||||||
|
|
||||||
int write(const void *buf, size_t len, int flush) {
|
int write(const void *buf, size_t len, int flush) {
|
||||||
|
int ret = 0;
|
||||||
strm.next_in = (char *) buf;
|
strm.next_in = (char *) buf;
|
||||||
strm.avail_in = len;
|
strm.avail_in = len;
|
||||||
do {
|
do {
|
||||||
@@ -165,9 +167,9 @@ private:
|
|||||||
LOGW("bzip2 %s failed (%d)\n", mode ? "encode" : "decode", code);
|
LOGW("bzip2 %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||||
} while (strm.avail_out == 0);
|
} while (strm.avail_out == 0);
|
||||||
return len;
|
return ret;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -229,6 +231,7 @@ private:
|
|||||||
uint8_t outbuf[CHUNK];
|
uint8_t outbuf[CHUNK];
|
||||||
|
|
||||||
int write(const void *buf, size_t len, lzma_action flush) {
|
int write(const void *buf, size_t len, lzma_action flush) {
|
||||||
|
int ret = 0;
|
||||||
strm.next_in = (uint8_t *) buf;
|
strm.next_in = (uint8_t *) buf;
|
||||||
strm.avail_in = len;
|
strm.avail_in = len;
|
||||||
do {
|
do {
|
||||||
@@ -239,9 +242,9 @@ private:
|
|||||||
LOGW("LZMA %s failed (%d)\n", mode ? "encode" : "decode", code);
|
LOGW("LZMA %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||||
} while (strm.avail_out == 0);
|
} while (strm.avail_out == 0);
|
||||||
return len;
|
return ret;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -272,7 +275,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int write(const void *buf, size_t len) override {
|
int write(const void *buf, size_t len) override {
|
||||||
auto ret = len;
|
int ret = 0;
|
||||||
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
||||||
if (!outbuf)
|
if (!outbuf)
|
||||||
read_header(inbuf, len);
|
read_header(inbuf, len);
|
||||||
@@ -288,7 +291,7 @@ public:
|
|||||||
}
|
}
|
||||||
len -= read;
|
len -= read;
|
||||||
inbuf += read;
|
inbuf += read;
|
||||||
bwrite(outbuf, write);
|
ret += bwrite(outbuf, write);
|
||||||
} while (len != 0 || write != 0);
|
} while (len != 0 || write != 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -323,9 +326,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int write(const void *buf, size_t len) override {
|
int write(const void *buf, size_t len) override {
|
||||||
auto ret = len;
|
int ret = 0;
|
||||||
if (!outbuf)
|
if (!outbuf)
|
||||||
write_header();
|
ret += write_header();
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
||||||
@@ -339,7 +342,7 @@ public:
|
|||||||
}
|
}
|
||||||
len -= read;
|
len -= read;
|
||||||
inbuf += read;
|
inbuf += read;
|
||||||
bwrite(outbuf, write);
|
ret += bwrite(outbuf, write);
|
||||||
} while (len != 0);
|
} while (len != 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -358,7 +361,7 @@ private:
|
|||||||
|
|
||||||
static constexpr size_t BLOCK_SZ = 1 << 22;
|
static constexpr size_t BLOCK_SZ = 1 << 22;
|
||||||
|
|
||||||
void write_header() {
|
int write_header() {
|
||||||
LZ4F_preferences_t prefs {
|
LZ4F_preferences_t prefs {
|
||||||
.autoFlush = 1,
|
.autoFlush = 1,
|
||||||
.compressionLevel = 9,
|
.compressionLevel = 9,
|
||||||
@@ -372,7 +375,7 @@ private:
|
|||||||
outCapacity = LZ4F_compressBound(BLOCK_SZ, &prefs);
|
outCapacity = LZ4F_compressBound(BLOCK_SZ, &prefs);
|
||||||
outbuf = new uint8_t[outCapacity];
|
outbuf = new uint8_t[outCapacity];
|
||||||
size_t write = LZ4F_compressBegin(ctx, outbuf, outCapacity, &prefs);
|
size_t write = LZ4F_compressBegin(ctx, outbuf, outCapacity, &prefs);
|
||||||
bwrite(outbuf, write);
|
return bwrite(outbuf, write);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -380,15 +383,15 @@ class LZ4_decoder : public cpr_stream {
|
|||||||
public:
|
public:
|
||||||
explicit LZ4_decoder(stream_ptr &&base)
|
explicit LZ4_decoder(stream_ptr &&base)
|
||||||
: cpr_stream(std::move(base)), out_buf(new char[LZ4_UNCOMPRESSED]),
|
: cpr_stream(std::move(base)), out_buf(new char[LZ4_UNCOMPRESSED]),
|
||||||
buffer(new char[LZ4_COMPRESSED]), init(false), block_sz(0), buf_off(0) {}
|
buf(new char[LZ4_COMPRESSED]), init(false), block_sz(0), buf_off(0) {}
|
||||||
|
|
||||||
~LZ4_decoder() override {
|
~LZ4_decoder() override {
|
||||||
delete[] out_buf;
|
delete[] out_buf;
|
||||||
delete[] buffer;
|
delete[] buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int write(const void *in, size_t size) override {
|
int write(const void *in, size_t size) override {
|
||||||
auto ret = size;
|
int ret = 0;
|
||||||
auto inbuf = static_cast<const char *>(in);
|
auto inbuf = static_cast<const char *>(in);
|
||||||
if (!init) {
|
if (!init) {
|
||||||
// Skip magic
|
// Skip magic
|
||||||
@@ -396,42 +399,48 @@ public:
|
|||||||
size -= 4;
|
size -= 4;
|
||||||
init = true;
|
init = true;
|
||||||
}
|
}
|
||||||
int write;
|
for (int consumed; size != 0;) {
|
||||||
size_t consumed;
|
|
||||||
do {
|
|
||||||
if (block_sz == 0) {
|
if (block_sz == 0) {
|
||||||
block_sz = *((unsigned *) inbuf);
|
if (buf_off + size >= sizeof(block_sz)) {
|
||||||
inbuf += sizeof(unsigned);
|
consumed = sizeof(block_sz) - buf_off;
|
||||||
size -= sizeof(unsigned);
|
memcpy(buf + buf_off, inbuf, consumed);
|
||||||
|
memcpy(&block_sz, buf, sizeof(block_sz));
|
||||||
|
buf_off = 0;
|
||||||
|
} else {
|
||||||
|
consumed = size;
|
||||||
|
memcpy(buf + buf_off, inbuf, size);
|
||||||
|
}
|
||||||
|
inbuf += consumed;
|
||||||
|
size -= consumed;
|
||||||
} else if (buf_off + size >= block_sz) {
|
} else if (buf_off + size >= block_sz) {
|
||||||
consumed = block_sz - buf_off;
|
consumed = block_sz - buf_off;
|
||||||
memcpy(buffer + buf_off, inbuf, consumed);
|
memcpy(buf + buf_off, inbuf, consumed);
|
||||||
inbuf += consumed;
|
inbuf += consumed;
|
||||||
size -= consumed;
|
size -= consumed;
|
||||||
|
|
||||||
write = LZ4_decompress_safe(buffer, out_buf, block_sz, LZ4_UNCOMPRESSED);
|
int write = LZ4_decompress_safe(buf, out_buf, block_sz, LZ4_UNCOMPRESSED);
|
||||||
if (write < 0) {
|
if (write < 0) {
|
||||||
LOGW("LZ4HC decompression failure (%d)\n", write);
|
LOGW("LZ4HC decompression failure (%d)\n", write);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bwrite(out_buf, write);
|
ret += bwrite(out_buf, write);
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
buf_off = 0;
|
buf_off = 0;
|
||||||
block_sz = 0;
|
block_sz = 0;
|
||||||
} else {
|
} else {
|
||||||
// Copy to internal buffer
|
// Copy to internal buffer
|
||||||
memcpy(buffer + buf_off, inbuf, size);
|
memcpy(buf + buf_off, inbuf, size);
|
||||||
buf_off += size;
|
buf_off += size;
|
||||||
size = 0;
|
break;
|
||||||
}
|
}
|
||||||
} while (size != 0);
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char *out_buf;
|
char *out_buf;
|
||||||
char *buffer;
|
char *buf;
|
||||||
bool init;
|
bool init;
|
||||||
unsigned block_sz;
|
unsigned block_sz;
|
||||||
int buf_off;
|
int buf_off;
|
||||||
@@ -440,12 +449,13 @@ private:
|
|||||||
class LZ4_encoder : public cpr_stream {
|
class LZ4_encoder : public cpr_stream {
|
||||||
public:
|
public:
|
||||||
explicit LZ4_encoder(stream_ptr &&base)
|
explicit LZ4_encoder(stream_ptr &&base)
|
||||||
: cpr_stream(std::move(base)), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
|
: cpr_stream(std::move(base)), outbuf(new char[LZ4_COMPRESSED]),
|
||||||
init(false), buf_off(0), in_total(0) {}
|
buf(new char[LZ4_UNCOMPRESSED]), init(false), buf_off(0), in_total(0) {}
|
||||||
|
|
||||||
int write(const void *in, size_t size) override {
|
int write(const void *in, size_t size) override {
|
||||||
|
int ret = 0;
|
||||||
if (!init) {
|
if (!init) {
|
||||||
bwrite("\x02\x21\x4c\x18", 4);
|
ret += bwrite("\x02\x21\x4c\x18", 4);
|
||||||
init = true;
|
init = true;
|
||||||
}
|
}
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
@@ -453,21 +463,18 @@ public:
|
|||||||
in_total += size;
|
in_total += size;
|
||||||
const char *inbuf = (const char *) in;
|
const char *inbuf = (const char *) in;
|
||||||
size_t consumed;
|
size_t consumed;
|
||||||
int write;
|
|
||||||
do {
|
do {
|
||||||
if (buf_off + size >= LZ4_UNCOMPRESSED) {
|
if (buf_off + size >= LZ4_UNCOMPRESSED) {
|
||||||
consumed = LZ4_UNCOMPRESSED - buf_off;
|
consumed = LZ4_UNCOMPRESSED - buf_off;
|
||||||
memcpy(buf + buf_off, inbuf, consumed);
|
memcpy(buf + buf_off, inbuf, consumed);
|
||||||
inbuf += consumed;
|
inbuf += consumed;
|
||||||
size -= consumed;
|
size -= consumed;
|
||||||
|
buf_off = LZ4_UNCOMPRESSED;
|
||||||
|
|
||||||
write = LZ4_compress_HC(buf, outbuf, LZ4_UNCOMPRESSED, LZ4_COMPRESSED, 9);
|
if (int written = write_block(); written < 0)
|
||||||
if (write == 0) {
|
return -1;
|
||||||
LOGW("LZ4HC compression failure\n");
|
else
|
||||||
return false;
|
ret += written;
|
||||||
}
|
|
||||||
bwrite(&write, sizeof(write));
|
|
||||||
bwrite(outbuf, write);
|
|
||||||
|
|
||||||
// Reset buffer
|
// Reset buffer
|
||||||
buf_off = 0;
|
buf_off = 0;
|
||||||
@@ -478,15 +485,12 @@ public:
|
|||||||
size = 0;
|
size = 0;
|
||||||
}
|
}
|
||||||
} while (size != 0);
|
} while (size != 0);
|
||||||
return true;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
~LZ4_encoder() override {
|
~LZ4_encoder() override {
|
||||||
if (buf_off) {
|
if (buf_off)
|
||||||
int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
|
write_block();
|
||||||
bwrite(&write, sizeof(write));
|
|
||||||
bwrite(outbuf, write);
|
|
||||||
}
|
|
||||||
bwrite(&in_total, sizeof(in_total));
|
bwrite(&in_total, sizeof(in_total));
|
||||||
delete[] outbuf;
|
delete[] outbuf;
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
@@ -498,6 +502,17 @@ private:
|
|||||||
bool init;
|
bool init;
|
||||||
int buf_off;
|
int buf_off;
|
||||||
unsigned in_total;
|
unsigned in_total;
|
||||||
|
|
||||||
|
int write_block() {
|
||||||
|
int written = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
|
||||||
|
if (written == 0) {
|
||||||
|
LOGW("LZ4HC compression failure\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bwrite(&written, sizeof(written));
|
||||||
|
bwrite(outbuf, written);
|
||||||
|
return written + sizeof(written);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
stream_ptr get_encoder(format_t type, stream_ptr &&base) {
|
stream_ptr get_encoder(format_t type, stream_ptr &&base) {
|
||||||
|
@@ -11,8 +11,6 @@ import static android.os.Build.VERSION.SDK_INT;
|
|||||||
|
|
||||||
public class DynAPK {
|
public class DynAPK {
|
||||||
|
|
||||||
private static final int STUB_VERSION = 6;
|
|
||||||
|
|
||||||
// Indices of the object array
|
// Indices of the object array
|
||||||
private static final int STUB_VERSION_ENTRY = 0;
|
private static final int STUB_VERSION_ENTRY = 0;
|
||||||
private static final int CLASS_COMPONENT_MAP = 1;
|
private static final int CLASS_COMPONENT_MAP = 1;
|
||||||
@@ -64,7 +62,7 @@ public class DynAPK {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class Data {
|
public static class Data {
|
||||||
public int version = STUB_VERSION;
|
public int version;
|
||||||
public Map<String, String> classToComponent;
|
public Map<String, String> classToComponent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,8 @@ import java.util.Map;
|
|||||||
import static com.topjohnwu.magisk.DynAPK.Data;
|
import static com.topjohnwu.magisk.DynAPK.Data;
|
||||||
|
|
||||||
public class Mapping {
|
public class Mapping {
|
||||||
|
private static final int STUB_VERSION = 7;
|
||||||
|
|
||||||
private static Map<String, String> map = new HashMap<>();
|
private static Map<String, String> map = new HashMap<>();
|
||||||
private static Map<String, String> inverseMap;
|
private static Map<String, String> inverseMap;
|
||||||
|
|
||||||
@@ -29,6 +31,7 @@ public class Mapping {
|
|||||||
|
|
||||||
public static Data data() {
|
public static Data data() {
|
||||||
Data data = new Data();
|
Data data = new Data();
|
||||||
|
data.version = STUB_VERSION;
|
||||||
data.classToComponent = inverseMap;
|
data.classToComponent = inverseMap;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user