mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-14 17:17:26 +00:00
Compare commits
14 Commits
manager-v7
...
manager-v7
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?selectableItemBackground"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:onClick="@{() -> item.toggle()}">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
@@ -38,10 +41,11 @@
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/hide_process_icon"
|
||||
android:focusable="true"
|
||||
android:clickable="true"
|
||||
style="@style/Widget.Icon"
|
||||
isChecked="@{item.isHidden}"
|
||||
android:background="@null"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
|
@@ -1,4 +1,3 @@
|
||||
# v7.5.0
|
||||
- Support new communication method (ContentProvider)
|
||||
- Fix several issues with hidden stub APK
|
||||
- Support using BiometricPrompt (face unlock)
|
||||
# v7.5.1
|
||||
- Fix toggling app components in MagiskHide screen
|
||||
- Update translations
|
||||
|
@@ -8,6 +8,7 @@
|
||||
<string name="settings">Configuració</string>
|
||||
<string name="install">Instal·lar</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-->
|
||||
<string name="magisk_version_error">Magisk no està instal·lat</string>
|
||||
|
@@ -7,6 +7,7 @@
|
||||
<string name="settings">Setelan</string>
|
||||
<string name="install">Pasang</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-->
|
||||
<string name="magisk_version_error">Magisk tidak terpasang.</string>
|
||||
@@ -16,17 +17,18 @@
|
||||
<string name="checking_safetyNet_status">Memeriksa status SafetyNet…</string>
|
||||
<string name="safetyNet_check_success">Pemeriksaan SafetyNet Berhasil</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="manager_up_to_date">Magisk Manager dalam versi terbaru</string>
|
||||
<string name="advanced_settings_title">Opsi Lanjutan</string>
|
||||
<string name="keep_force_encryption">Pertahankan enkripsi paksa</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="latest_version">Terbaru: %1$s</string>
|
||||
<string name="uninstall">Copot</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="core_only_enabled">(Mode core only aktif)</string>
|
||||
|
||||
@@ -73,7 +75,7 @@
|
||||
<string name="manager_update_title">Pembaruan Magisk Manager Tersedia!</string>
|
||||
|
||||
<!--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="direct_install">Pasang Langsung (Direkomendasikan)</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="download">Unduh</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="repo_cache_cleared">Cache repo dibersihkan</string>
|
||||
|
||||
@@ -100,7 +102,7 @@
|
||||
<string name="failure">Gagal</string>
|
||||
<string name="hide_manager_title">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="complete_uninstall">Copot Total</string>
|
||||
<string name="restore_img">Pulihkan Image</string>
|
||||
@@ -109,28 +111,29 @@
|
||||
<string name="restore_fail">Cadangan stock tidak ada!</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="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_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="authenticate">Otentikasi</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">Umum</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_message">File akan disimpan ke %1$s</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_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_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="system_default">(Default Sistem)</string>
|
||||
<string name="settings_update">Setelan 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_stable">Stabil</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_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_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_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_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">Apl 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="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_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="settings_owner_only">Pemilik Perangkat Saja</string>
|
||||
<string name="settings_owner_manage">Pemilik Perangkat Mengelola</string>
|
||||
<string name="settings_user_independent">Pengguna-Independen</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="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri.</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="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri</string>
|
||||
|
||||
<string name="mount_namespace_mode">Mode Mount Ruang Nama</string>
|
||||
<string name="settings_ns_global">Ruang Nama Global</string>
|
||||
<string name="settings_ns_requester">Ruang Nama Warisan</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="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="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="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>
|
||||
|
||||
<!--Superuser-->
|
||||
|
@@ -8,6 +8,7 @@
|
||||
<string name="settings">Ustawienia</string>
|
||||
<string name="install">Instaluj</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-->
|
||||
<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="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_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="settings_owner_only">Tylko Właściciel 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_msg">Chcete teraz nainštalovať %1$s?</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="release_notes">Poznámky k vydaniu</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_reboot">Magisk Manager zaplátal dtbo.img, prosím, reštartujte.</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_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="authenticate">Autentifikácia</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">Všeobecné</string>
|
||||
@@ -166,6 +166,9 @@
|
||||
<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_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="settings_owner_only">Iba majiteľ zariadenia</string>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# Magisk Documentation
|
||||
(Updated on 2019.12.29)
|
||||
(Updated on 2020.1.2)
|
||||
|
||||
- [Installation](install.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...]
|
||||
|
||||
Supported actions:
|
||||
unpack [-h] <bootimg>
|
||||
unpack [-n] [-h] <bootimg>
|
||||
Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,
|
||||
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',
|
||||
which will be parsed when repacking.
|
||||
Return values:
|
||||
@@ -45,7 +47,7 @@ Supported actions:
|
||||
|
||||
cpio <incpio> [commands...]
|
||||
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:
|
||||
exists ENTRY
|
||||
Return 0 if ENTRY exists, else return 1
|
||||
@@ -65,8 +67,9 @@ Supported actions:
|
||||
Test the current cpio's patch status
|
||||
Return values:
|
||||
0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)
|
||||
patch KEEPVERITY KEEPFORCEENCRYPT
|
||||
Ramdisk patches. KEEP**** are boolean values
|
||||
patch
|
||||
Apply ramdisk patches. Configure settings with env variables:
|
||||
KEEPVERITY KEEPFORCEENCRYPT
|
||||
backup ORIG
|
||||
Create ramdisk backups from ORIG
|
||||
restore
|
||||
@@ -74,17 +77,25 @@ Supported actions:
|
||||
sha1
|
||||
Print stock boot SHA1 if previously backed up in ramdisk
|
||||
|
||||
dtb-<cmd> <dtb>
|
||||
Do dtb related cmds to <dtb> (modifications are done directly)
|
||||
Supported commands:
|
||||
dump
|
||||
Dump all contents from dtb for debugging
|
||||
test
|
||||
Check if fstab has verity/avb flags
|
||||
Return values:
|
||||
0:flag exists 1:no flags
|
||||
patch
|
||||
dtb <input> <action> [args...]
|
||||
Do dtb related actions to <input>
|
||||
Supported actions:
|
||||
print [-f]
|
||||
Print all contents of dtb for debugging
|
||||
Specify [-f] to only print fstab nodes
|
||||
patch [OUT]
|
||||
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 <infile> with [method] (default: gzip), optionally to [outfile]
|
||||
@@ -95,12 +106,6 @@ Supported actions:
|
||||
Detect method and decompress <infile>, optionally to [outfile]
|
||||
<infile>/[outfile] can be '-' to be STDIN/STDOUT
|
||||
Supported methods: bzip2 gzip lz4 lz4_legacy lzma xz
|
||||
|
||||
sha1 <file>
|
||||
Print the SHA1 checksum for <file>
|
||||
|
||||
cleanup
|
||||
Cleanup the current working directory
|
||||
```
|
||||
|
||||
### magiskinit
|
||||
@@ -119,20 +124,22 @@ Usage: magiskpolicy [--options...] [policy statements...]
|
||||
Options:
|
||||
--help show help message for policy statements
|
||||
--load FILE load policies from FILE
|
||||
--load-split load from preloaded sepolicy or compile
|
||||
--load-split load from precompiled sepolicy or compile
|
||||
split policies
|
||||
--compile-split compile split cil policies
|
||||
--save FILE save policies to FILE
|
||||
--live directly apply sepolicy live
|
||||
--magisk inject built-in rules for a minimal
|
||||
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
|
||||
from current live policies (/sys/fs/selinux/policy)
|
||||
|
||||
One policy statement should be treated as one parameter;
|
||||
this means a full policy statement should be enclosed in quotes;
|
||||
multiple policy statements can be provided in a single command
|
||||
this means a full policy statement should be enclosed in quotes.
|
||||
Multiple policy statements can be provided in a single command.
|
||||
|
||||
The statements has a format of "<rule_name> [args...]"
|
||||
Multiple types and permissions can be grouped into collections
|
||||
@@ -173,10 +180,10 @@ Notes:
|
||||
Example: allow { s1 s2 } { t1 t2 } class *
|
||||
Will be expanded to:
|
||||
|
||||
allow s1 t1 class { all permissions }
|
||||
allow s1 t2 class { all permissions }
|
||||
allow s2 t1 class { all permissions }
|
||||
allow s2 t2 class { all permissions }
|
||||
allow s1 t1 class { all-permissions }
|
||||
allow s1 t2 class { all-permissions }
|
||||
allow s2 t1 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 SRC DEST clone SRC to DEST
|
||||
--sqlite SQL exec SQL commands to Magisk database
|
||||
--use-broadcast use broadcast for su logging and notify
|
||||
|
||||
Supported init triggers:
|
||||
post-fs-data, service, boot-complete
|
||||
@@ -269,5 +275,4 @@ Actions:
|
||||
ls Print the current hide list
|
||||
exec CMDs... Execute commands in isolated mount
|
||||
namespace and do all hide unmounts
|
||||
test Run process monitor test
|
||||
```
|
||||
|
@@ -138,7 +138,7 @@ protected:
|
||||
void early_mount() override;
|
||||
public:
|
||||
RootFSInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd) {
|
||||
persist_dir = "/dev/.magisk/mirror/persist/magisk";
|
||||
persist_dir = "/dev/mnt/persist/magisk";
|
||||
}
|
||||
|
||||
void start() override {
|
||||
|
@@ -94,7 +94,7 @@ static bool read_dt_fstab(cmdline *cmd, const char *name) {
|
||||
char path[128];
|
||||
int fd;
|
||||
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));
|
||||
close(fd);
|
||||
// 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); \
|
||||
}
|
||||
|
||||
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) {
|
||||
LOGD("Switch root to %s\n", path.data());
|
||||
vector<string> mounts;
|
||||
@@ -164,6 +144,45 @@ static void switch_root(const string &path) {
|
||||
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() {
|
||||
if (access("/overlay.d", F_OK) == 0)
|
||||
cp_afc("/overlay.d", "/dev/overlay.d");
|
||||
@@ -250,23 +269,5 @@ void mount_sbin() {
|
||||
xmkdir(MIRRDIR, 0);
|
||||
xmkdir(BLOCKDIR, 0);
|
||||
|
||||
// Mount persist partition
|
||||
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);
|
||||
mount_persist(BLOCKDIR, MIRRDIR);
|
||||
}
|
||||
|
@@ -221,46 +221,35 @@ static void sbin_overlay(const raw_data &self, const raw_data &config) {
|
||||
xsymlink("./magiskinit", "/sbin/supolicy");
|
||||
}
|
||||
|
||||
static void recreate_sbin(const char *mirror) {
|
||||
int src = xopen(mirror, O_RDONLY | O_CLOEXEC);
|
||||
int dest = xopen("/sbin", O_RDONLY | O_CLOEXEC);
|
||||
DIR *fp = fdopendir(src);
|
||||
char buf[256];
|
||||
bool use_bind_mount = true;
|
||||
for (dirent *entry; (entry = xreaddir(fp));) {
|
||||
static void recreate_sbin(const char *mirror, bool use_bind_mount) {
|
||||
auto dp = xopen_dir(mirror);
|
||||
int src = dirfd(dp.get());
|
||||
char buf[4096];
|
||||
for (dirent *entry; (entry = xreaddir(dp.get()));) {
|
||||
if (entry->d_name == "."sv || entry->d_name == ".."sv)
|
||||
continue;
|
||||
string sbin_path = "/sbin/"s + entry->d_name;
|
||||
struct stat st;
|
||||
fstatat(src, entry->d_name, &st, AT_SYMLINK_NOFOLLOW);
|
||||
if (S_ISLNK(st.st_mode)) {
|
||||
xreadlinkat(src, entry->d_name, buf, sizeof(buf));
|
||||
xsymlinkat(buf, dest, entry->d_name);
|
||||
xsymlink(buf, sbin_path.data());
|
||||
} else {
|
||||
char sbin_path[256];
|
||||
sprintf(buf, "%s/%s", mirror, entry->d_name);
|
||||
sprintf(sbin_path, "/sbin/%s", entry->d_name);
|
||||
|
||||
if (use_bind_mount) {
|
||||
auto mode = st.st_mode & 0777;
|
||||
// Create dummy
|
||||
if (S_ISDIR(st.st_mode))
|
||||
xmkdir(sbin_path, st.st_mode & 0777);
|
||||
xmkdir(sbin_path.data(), mode);
|
||||
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)) {
|
||||
// Bind mount failed, fallback to symlink
|
||||
remove(sbin_path);
|
||||
use_bind_mount = false;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
xmount(buf, sbin_path.data(), nullptr, MS_BIND, nullptr);
|
||||
} else {
|
||||
xsymlink(buf, sbin_path.data());
|
||||
}
|
||||
|
||||
xsymlink(buf, sbin_path);
|
||||
}
|
||||
}
|
||||
close(src);
|
||||
close(dest);
|
||||
}
|
||||
|
||||
#define ROOTMIR MIRRDIR "/system_root"
|
||||
@@ -304,7 +293,7 @@ void SARBase::patch_rootdir() {
|
||||
xmount(ROOTBLK, ROOTMIR, "erofs", MS_RDONLY, nullptr);
|
||||
|
||||
// Recreate original sbin structure
|
||||
recreate_sbin(ROOTMIR "/sbin");
|
||||
recreate_sbin(ROOTMIR "/sbin", true);
|
||||
|
||||
// Patch init
|
||||
raw_data init;
|
||||
@@ -491,7 +480,7 @@ int magisk_proxy_main(int argc, char *argv[]) {
|
||||
sbin_overlay(self, config);
|
||||
|
||||
// Create symlinks pointing back to /root
|
||||
recreate_sbin("/root");
|
||||
recreate_sbin("/root", false);
|
||||
|
||||
setenv("REMOUNT_ROOT", "1", 1);
|
||||
execv("/sbin/magisk", argv);
|
||||
|
@@ -73,6 +73,7 @@ private:
|
||||
uint8_t outbuf[CHUNK];
|
||||
|
||||
int write(const void *buf, size_t len, int flush) {
|
||||
int ret = 0;
|
||||
strm.next_in = (Bytef *) buf;
|
||||
strm.avail_in = len;
|
||||
do {
|
||||
@@ -91,9 +92,9 @@ private:
|
||||
LOGW("gzip %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||
return -1;
|
||||
}
|
||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
} while (strm.avail_out == 0);
|
||||
return len;
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -147,6 +148,7 @@ private:
|
||||
char outbuf[CHUNK];
|
||||
|
||||
int write(const void *buf, size_t len, int flush) {
|
||||
int ret = 0;
|
||||
strm.next_in = (char *) buf;
|
||||
strm.avail_in = len;
|
||||
do {
|
||||
@@ -165,9 +167,9 @@ private:
|
||||
LOGW("bzip2 %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||
return -1;
|
||||
}
|
||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
} while (strm.avail_out == 0);
|
||||
return len;
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -229,6 +231,7 @@ private:
|
||||
uint8_t outbuf[CHUNK];
|
||||
|
||||
int write(const void *buf, size_t len, lzma_action flush) {
|
||||
int ret = 0;
|
||||
strm.next_in = (uint8_t *) buf;
|
||||
strm.avail_in = len;
|
||||
do {
|
||||
@@ -239,9 +242,9 @@ private:
|
||||
LOGW("LZMA %s failed (%d)\n", mode ? "encode" : "decode", code);
|
||||
return -1;
|
||||
}
|
||||
bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
ret += bwrite(outbuf, sizeof(outbuf) - strm.avail_out);
|
||||
} while (strm.avail_out == 0);
|
||||
return len;
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -272,7 +275,7 @@ public:
|
||||
}
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
auto ret = len;
|
||||
int ret = 0;
|
||||
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
||||
if (!outbuf)
|
||||
read_header(inbuf, len);
|
||||
@@ -288,7 +291,7 @@ public:
|
||||
}
|
||||
len -= read;
|
||||
inbuf += read;
|
||||
bwrite(outbuf, write);
|
||||
ret += bwrite(outbuf, write);
|
||||
} while (len != 0 || write != 0);
|
||||
return ret;
|
||||
}
|
||||
@@ -323,9 +326,9 @@ public:
|
||||
}
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
auto ret = len;
|
||||
int ret = 0;
|
||||
if (!outbuf)
|
||||
write_header();
|
||||
ret += write_header();
|
||||
if (len == 0)
|
||||
return 0;
|
||||
auto inbuf = reinterpret_cast<const uint8_t *>(buf);
|
||||
@@ -339,7 +342,7 @@ public:
|
||||
}
|
||||
len -= read;
|
||||
inbuf += read;
|
||||
bwrite(outbuf, write);
|
||||
ret += bwrite(outbuf, write);
|
||||
} while (len != 0);
|
||||
return ret;
|
||||
}
|
||||
@@ -358,7 +361,7 @@ private:
|
||||
|
||||
static constexpr size_t BLOCK_SZ = 1 << 22;
|
||||
|
||||
void write_header() {
|
||||
int write_header() {
|
||||
LZ4F_preferences_t prefs {
|
||||
.autoFlush = 1,
|
||||
.compressionLevel = 9,
|
||||
@@ -372,7 +375,7 @@ private:
|
||||
outCapacity = LZ4F_compressBound(BLOCK_SZ, &prefs);
|
||||
outbuf = new uint8_t[outCapacity];
|
||||
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:
|
||||
explicit LZ4_decoder(stream_ptr &&base)
|
||||
: 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 {
|
||||
delete[] out_buf;
|
||||
delete[] buffer;
|
||||
delete[] buf;
|
||||
}
|
||||
|
||||
int write(const void *in, size_t size) override {
|
||||
auto ret = size;
|
||||
int ret = 0;
|
||||
auto inbuf = static_cast<const char *>(in);
|
||||
if (!init) {
|
||||
// Skip magic
|
||||
@@ -396,42 +399,48 @@ public:
|
||||
size -= 4;
|
||||
init = true;
|
||||
}
|
||||
int write;
|
||||
size_t consumed;
|
||||
do {
|
||||
for (int consumed; size != 0;) {
|
||||
if (block_sz == 0) {
|
||||
block_sz = *((unsigned *) inbuf);
|
||||
inbuf += sizeof(unsigned);
|
||||
size -= sizeof(unsigned);
|
||||
if (buf_off + size >= sizeof(block_sz)) {
|
||||
consumed = sizeof(block_sz) - buf_off;
|
||||
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) {
|
||||
consumed = block_sz - buf_off;
|
||||
memcpy(buffer + buf_off, inbuf, consumed);
|
||||
memcpy(buf + buf_off, inbuf, consumed);
|
||||
inbuf += 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) {
|
||||
LOGW("LZ4HC decompression failure (%d)\n", write);
|
||||
return -1;
|
||||
}
|
||||
bwrite(out_buf, write);
|
||||
ret += bwrite(out_buf, write);
|
||||
|
||||
// Reset
|
||||
buf_off = 0;
|
||||
block_sz = 0;
|
||||
} else {
|
||||
// Copy to internal buffer
|
||||
memcpy(buffer + buf_off, inbuf, size);
|
||||
memcpy(buf + buf_off, inbuf, size);
|
||||
buf_off += size;
|
||||
size = 0;
|
||||
break;
|
||||
}
|
||||
} while (size != 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
char *out_buf;
|
||||
char *buffer;
|
||||
char *buf;
|
||||
bool init;
|
||||
unsigned block_sz;
|
||||
int buf_off;
|
||||
@@ -440,12 +449,13 @@ private:
|
||||
class LZ4_encoder : public cpr_stream {
|
||||
public:
|
||||
explicit LZ4_encoder(stream_ptr &&base)
|
||||
: cpr_stream(std::move(base)), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
|
||||
init(false), buf_off(0), in_total(0) {}
|
||||
: cpr_stream(std::move(base)), outbuf(new char[LZ4_COMPRESSED]),
|
||||
buf(new char[LZ4_UNCOMPRESSED]), init(false), buf_off(0), in_total(0) {}
|
||||
|
||||
int write(const void *in, size_t size) override {
|
||||
int ret = 0;
|
||||
if (!init) {
|
||||
bwrite("\x02\x21\x4c\x18", 4);
|
||||
ret += bwrite("\x02\x21\x4c\x18", 4);
|
||||
init = true;
|
||||
}
|
||||
if (size == 0)
|
||||
@@ -453,21 +463,18 @@ public:
|
||||
in_total += size;
|
||||
const char *inbuf = (const char *) in;
|
||||
size_t consumed;
|
||||
int write;
|
||||
do {
|
||||
if (buf_off + size >= LZ4_UNCOMPRESSED) {
|
||||
consumed = LZ4_UNCOMPRESSED - buf_off;
|
||||
memcpy(buf + buf_off, inbuf, consumed);
|
||||
inbuf += consumed;
|
||||
size -= consumed;
|
||||
buf_off = LZ4_UNCOMPRESSED;
|
||||
|
||||
write = LZ4_compress_HC(buf, outbuf, LZ4_UNCOMPRESSED, LZ4_COMPRESSED, 9);
|
||||
if (write == 0) {
|
||||
LOGW("LZ4HC compression failure\n");
|
||||
return false;
|
||||
}
|
||||
bwrite(&write, sizeof(write));
|
||||
bwrite(outbuf, write);
|
||||
if (int written = write_block(); written < 0)
|
||||
return -1;
|
||||
else
|
||||
ret += written;
|
||||
|
||||
// Reset buffer
|
||||
buf_off = 0;
|
||||
@@ -478,15 +485,12 @@ public:
|
||||
size = 0;
|
||||
}
|
||||
} while (size != 0);
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
~LZ4_encoder() override {
|
||||
if (buf_off) {
|
||||
int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
|
||||
bwrite(&write, sizeof(write));
|
||||
bwrite(outbuf, write);
|
||||
}
|
||||
if (buf_off)
|
||||
write_block();
|
||||
bwrite(&in_total, sizeof(in_total));
|
||||
delete[] outbuf;
|
||||
delete[] buf;
|
||||
@@ -498,6 +502,17 @@ private:
|
||||
bool init;
|
||||
int buf_off;
|
||||
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) {
|
||||
|
@@ -11,8 +11,6 @@ import static android.os.Build.VERSION.SDK_INT;
|
||||
|
||||
public class DynAPK {
|
||||
|
||||
private static final int STUB_VERSION = 6;
|
||||
|
||||
// Indices of the object array
|
||||
private static final int STUB_VERSION_ENTRY = 0;
|
||||
private static final int CLASS_COMPONENT_MAP = 1;
|
||||
@@ -64,7 +62,7 @@ public class DynAPK {
|
||||
}
|
||||
|
||||
public static class Data {
|
||||
public int version = STUB_VERSION;
|
||||
public int version;
|
||||
public Map<String, String> classToComponent;
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,8 @@ import java.util.Map;
|
||||
import static com.topjohnwu.magisk.DynAPK.Data;
|
||||
|
||||
public class Mapping {
|
||||
private static final int STUB_VERSION = 7;
|
||||
|
||||
private static Map<String, String> map = new HashMap<>();
|
||||
private static Map<String, String> inverseMap;
|
||||
|
||||
@@ -29,6 +31,7 @@ public class Mapping {
|
||||
|
||||
public static Data data() {
|
||||
Data data = new Data();
|
||||
data.version = STUB_VERSION;
|
||||
data.classToComponent = inverseMap;
|
||||
return data;
|
||||
}
|
||||
|
Reference in New Issue
Block a user