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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
# Magisk Documentation
(Updated on 2019.12.29)
(Updated on 2020.1.2)
- [Installation](install.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...]
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
```

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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