Compare commits

...

14 Commits

Author SHA1 Message Date
topjohnwu
0b41cd8564 Fix sk strings 2020-01-10 01:55:23 +08:00
topjohnwu
7db523071d Update changelog 2020-01-10 01:41:39 +08:00
JoanVC100
974ee58b9c New string added 2020-01-10 01:37:32 +08:00
Kamil Kras
1e88f2c382 Updated polish translation
Added translation for:
unsupport_magisk_msg
settings_su_biometric_title
settings_su_biometric_summary
no_biometric
2020-01-10 01:37:20 +08:00
Vladimír Kubala
0bdcfcaaf5 Update Slovak translation 2020-01-10 01:37:05 +08:00
Albert I
5f9c78d04f app: l10n: Update Indonesian translations
Signed-off-by: Albert I <kras@raphielgang.org>
2020-01-10 01:36:55 +08:00
Viktor De Pasquale
afa178fdec Fixed the checkbox being wrongly recognized as clickable 2020-01-09 18:06:30 +01:00
topjohnwu
3a0e3c98f7 Minor adjustments to prevent crashes 2020-01-09 23:42:27 +08:00
topjohnwu
fafa92d44b Simplify rootfs persist mount 2020-01-08 22:42:54 +08:00
topjohnwu
242e64d72f Make write return something sane 2020-01-06 17:09:09 +08:00
topjohnwu
2262af728e Eliminate undefined behavior 2020-01-06 05:31:38 +08:00
topjohnwu
bce777d7c6 Set stub version in stub 2020-01-03 02:19:10 +08:00
topjohnwu
15bd2da824 Update magiskboot docs 2020-01-02 13:46:59 +08:00
topjohnwu
bd438ca288 Update docs 2020-01-02 13:45:08 +08:00
14 changed files with 206 additions and 174 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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>

View File

@@ -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-->

View File

@@ -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>

View File

@@ -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>

View File

@@ -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)

View File

@@ -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
``` ```

View File

@@ -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 {

View File

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

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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;
} }
} }

View File

@@ -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;
} }