1
mirror of https://github.com/topjohnwu/Magisk synced 2025-11-07 22:52:31 +01:00

Compare commits

...

341 Commits
v18.1 ... v19.1

Author SHA1 Message Date
topjohnwu
4040a0242f Update app changelog 2019-05-01 14:11:10 -04:00
topjohnwu
781ec810d9 Remove unnecessary applets of MagiskInit 2019-05-01 13:55:59 -04:00
topjohnwu
9e90a71c04 Update installation instruction for latest release 2019-05-01 13:50:10 -04:00
zertyuiop
5571714b26 Update Russian translation
Added missing strings
2019-05-01 13:49:59 -04:00
xorcan
e0d1f02ef5 Update strings.xml 2019-05-01 13:49:51 -04:00
xorcan
1b729e5ff2 updade Turkish
latest
2019-05-01 13:49:44 -04:00
davidtrpcevski
51e587d4e8 Add full Macedonian translation 2019-05-01 13:49:34 -04:00
topjohnwu
ac9c55dbc1 Add info regarding signing certificates
Close #961
2019-05-01 03:27:06 -04:00
topjohnwu
0893ac3141 No more old module exists 2019-05-01 01:23:07 -04:00
topjohnwu
fb40e96917 Update outputs 2019-05-01 01:22:37 -04:00
topjohnwu
4ca25f74c6 More robust mounting scripts
Close #1376
2019-04-30 17:35:58 -04:00
osm0sis
7fda917b86 Fix addon.d error OUTFD derp 2019-04-30 17:09:25 -04:00
osm0sis
e6bd5f2c40 Display error if actual Magisk addon.d script cannot be run
- this would likely occur on an FDE device with block map OTAs (a la LineageOS) since they do not require/request decrypt
- for reference all other addon.d "v1" cases should work fine:
  1) FDE with openrecovery script works fine since it requests decrypt
  2) FBE with openrecovery script OR block map work fine since /data/adb remains accessible
2019-04-30 10:27:29 -04:00
topjohnwu
8a904ee384 Update native external dependencies 2019-04-30 01:31:07 -04:00
topjohnwu
00a9f18a1e Build with -Wall 2019-04-29 21:26:43 -04:00
topjohnwu
8d68ebb074 Revert ioctl rules 2019-04-29 21:25:57 -04:00
topjohnwu
5f53cfb4a9 Update sepolicy rules 2019-04-29 20:26:51 -04:00
topjohnwu
a2fa8d8be1 Stop fdsan complains 2019-04-29 20:04:39 -04:00
topjohnwu
70a3c78ebb Simplify magiskinit logging 2019-04-29 19:53:22 -04:00
topjohnwu
54d1207f92 Auto remove post_ota.sh 2019-04-24 01:59:47 -04:00
topjohnwu
003e44fb84 Remove requirement to use early-init daemon
We used to construct /sbin tmpfs overlay in early-init stage after
SELinux is properly initialized. However the way it is implemented
(forking daemon from magiskinit with complicated file waiting triggers)
is extremely complicated and error prone.

This commit moves the construction of the sbin overlay to pre-init
stage. The catch is that since SELinux is not present at that point,
proper selabel has to be reconstructed afterwards. Some additional
SEPolicy rules are added to make sure init can access magisk binaries,
and the secontext relabeling task is assigned to the main Magisk daemon.
2019-04-24 00:13:48 -04:00
topjohnwu
515f346dcc Monitor app_process
Some stupid Samsung ROMs will spawn multiple zygote daemons. Since we
switched to ptrace based process monitoring, we have to know all zygote
processes to trace. This is an attempt to fix this issue.

Close #1272
2019-04-22 16:36:23 -04:00
topjohnwu
6050c4e8ba Fix strings.xml 2019-04-21 21:01:49 -04:00
tarasyyyk
158af8819a added stub Ukrainian translation 2019-04-21 19:18:15 -04:00
tarasyyyk
7787bb31fa updated Ukrainian translation: 'Patch File' strings 2019-04-21 19:18:15 -04:00
cristisilaghi
a1fe3e7ccd Update Romanian 2019-04-21 19:18:04 -04:00
dark-basic
4316028b23 Update strings.xml
Restructured based on original string. New missing lines added
2019-04-21 19:17:56 -04:00
topjohnwu
f2b52755d6 Track all input devices with KEY_VOLUMEUP
This should in theory should support more devices for detecting the
volume up press on boot.

Close #1346
2019-04-21 19:09:08 -04:00
topjohnwu
f315c4416b Upgrade libsu 2019-04-19 01:07:39 -04:00
topjohnwu
4e7dafb0e4 Use bitset instead of vector 2019-04-13 02:43:43 -04:00
topjohnwu
a6395d35db Refactor with AS 3.5 2019-04-12 01:58:42 -04:00
Viktor De Pasquale
a028cd5cec Updated locations of nearly all files
This has been done in preparations for rewrite to kotlin and upcoming design changes.
Nothing should be broken but use caution.
2019-04-12 01:44:55 -04:00
Viktor De Pasquale
540000d26e Fixed butter knife not building with kotlin 2019-04-12 01:44:55 -04:00
Viktor De Pasquale
888c656aa8 Added kotlin support 2019-04-12 01:44:55 -04:00
topjohnwu
8d4c407201 Directly communicate with Activity
Since Android Q does not allow launching activities from the background
(Services/BroadcastReceivers) and our native process is root, directly
launch activities and use it for communication between native and app.

The target activity is not exported, so non-root apps cannot send an
intent to fool Magisk Manager. This is as safe as the previous
implementation, which uses protected system broadcasts.

This also workaround broadcast limitations in many ROMs (especially
in Chinese ROMs) which blocks the su request dialog if the app is
frozen/force stopped by the system.

Close #1326
2019-04-10 23:35:31 -04:00
topjohnwu
fdeede23f7 Don't build test APKs 2019-04-10 23:33:22 -04:00
topjohnwu
53c5ca59b6 Cleanup SuLogger 2019-04-10 18:09:41 -04:00
topjohnwu
679db97209 Always run su requests in new tasks 2019-04-10 18:05:19 -04:00
topjohnwu
fbdd72273e Restructure SuRequestActivity 2019-04-10 17:02:32 -04:00
topjohnwu
0165602515 More cleanups 2019-04-10 13:54:33 -04:00
topjohnwu
96127f8bd1 Lock orientation in SuRequestActivity
Fix #1302, close #1318
2019-04-10 05:36:02 -04:00
topjohnwu
0dbdf336d6 Update dependencies 2019-04-10 05:17:03 -04:00
topjohnwu
48879df2da Some cleanups 2019-04-10 05:15:20 -04:00
topjohnwu
b067a5bb13 Use root to launch su request Activity on Q 2019-04-10 05:03:26 -04:00
topjohnwu
4b54cf1288 Compile with Android Q SDK
We upgrade compileSdkVersion to Q, but keep targetSdkVersion as 28.
The reason is because targeting Q will no longer allow us to execute
native binaries in an app's private data, which Magisk Manager relies
a lot for performing stock boot image patches in non rooted environment.
For more information regarding this issue, check this link:
https://redd.it/b2inbu

Some workarounds has been discovered (https://github.com/termux/proot),
however for the time being there is no point to introduce these huge
hacks just for targeting Q, which we don't benefit anything.
2019-04-10 02:17:08 -04:00
topjohnwu
6128c24f96 Drastically improve module download service 2019-04-10 02:00:48 -04:00
topjohnwu
d9c58f307f Remove unused resources 2019-04-09 04:44:09 -04:00
Lukas Novotny
b521fbeeda Update Czech translation 2019-04-09 04:38:35 -04:00
Rom
d00a3b89f2 Update French translation 2019-04-09 04:38:23 -04:00
vvb2060
3d15518191 Update zh-rCN translation 2019-04-09 04:38:09 -04:00
Ingan121
9b6535fdf5 Update Korean translations 2019-04-09 04:37:58 -04:00
topjohnwu
e0424fdba3 Remove patch format options
Output format will be the same as input
2019-04-09 04:37:34 -04:00
Ian Macdonald
7481c53451 Update samsung.md 2019-04-08 21:07:36 -04:00
topjohnwu
7219947237 Update libsu
Close #1314
2019-04-08 21:05:11 -04:00
topjohnwu
b72004e9cc Move methods 2019-04-08 17:35:32 -04:00
topjohnwu
f187213568 Run update check service only in background 2019-04-08 17:35:32 -04:00
topjohnwu
fc0df84edd Keep track of foreground activity 2019-04-08 17:35:32 -04:00
topjohnwu
f24df4f43d Don't allow cloning root nodes
The root nodes are /system and /vendor. Adding new files into these
directories, although works on some devices, mostly bootloops on many
devices out there. So don't allow it, which also makes the whole magic
mounting logic much easier and extensible.
2019-04-08 12:30:57 -04:00
topjohnwu
dab32e1599 Use our own device nodes for mirrors 2019-04-08 01:40:04 -04:00
topjohnwu
bc286fd4d3 Upgrade Android Studio 2019-04-07 23:03:43 -04:00
topjohnwu
befe1a83b5 Use real system_root mirror 2019-04-07 14:22:45 -04:00
topjohnwu
82ea9db9fd Don't override arguments 2019-04-06 17:19:47 -04:00
topjohnwu
c5758b3f2d Update scripts 2019-04-06 13:04:17 -04:00
topjohnwu
ace3708c9c Update key combo for download mode 2019-04-06 04:45:51 -04:00
topjohnwu
fc5026d268 Add info regarding direct upgrades 2019-04-06 03:08:42 -04:00
topjohnwu
77fd0e54be Better wording 2019-04-06 03:05:41 -04:00
John Wu
24490e0ff5 Update samsung.md 2019-04-06 02:55:11 -04:00
topjohnwu
da3937ff4e Reboot after env_fix 2019-04-06 01:56:47 -04:00
topjohnwu
ebe1ab982e Add Samsung instructions 2019-04-06 01:25:11 -04:00
John Wu
98590cb00d Upload Samsung bootloader image 2019-04-05 23:35:00 -04:00
topjohnwu
ff95f634f0 Use release canary APK in stub 2019-04-05 21:07:59 -04:00
topjohnwu
ced9b4a8ee Default to beta channel if detected 2019-04-05 20:48:19 -04:00
topjohnwu
7af7910e78 Revert "Revert to old find boot order"
This reverts commit 5203886f0b.
2019-04-05 15:18:39 -04:00
vvb2060
a4f5d47e72 get_flags need before find_boot_image 2019-04-05 15:18:28 -04:00
topjohnwu
6953cc2411 Use separate flags for 64-bit 2019-04-05 15:17:59 -04:00
topjohnwu
6a0b2ddee9 Let stub APK respect canary builds 2019-04-05 07:15:54 -04:00
topjohnwu
24f5bc98d8 Add boot_complete trigger back
Samsung does not like running cmd before system services are started.
Instead of failing, it will enter an infinite wait on binder.
Move APK installation to boot complete to make sure pm can be run
without blocking process.
2019-04-05 07:00:30 -04:00
topjohnwu
5203886f0b Revert to old find boot order 2019-04-04 20:01:59 -04:00
topjohnwu
c10b376575 Support patching full ODIN firmware 2019-04-04 07:27:43 -04:00
topjohnwu
ceb21ced2b Small changes 2019-04-04 02:30:03 -04:00
topjohnwu
86789a8694 Add logging in magiskinit 2019-04-04 00:26:16 -04:00
topjohnwu
ca2235aee7 Update strings 2019-04-03 17:59:54 -04:00
topjohnwu
a385e5cd92 Use wrapper script on system with APEX
Thanks to moving libandroidicu.so to APEX runtime linker namespace,
we need a wrapper to link against libsqlite.so on Q
2019-04-03 17:25:47 -04:00
topjohnwu
0c7a95bdf6 Small net update 2019-04-03 01:01:18 -04:00
topjohnwu
036b5acf42 Update Markwon to 3.0.0 2019-04-02 23:58:19 -04:00
topjohnwu
056dafc59f Use R8 full mode
R8 FTW!
2019-04-02 16:32:40 -04:00
topjohnwu
a9c90718d6 Update some dependencies 2019-04-02 01:50:25 -04:00
topjohnwu
cc77a24502 Prevent accidental magiskinit execution
Close #1281
2019-04-01 17:14:18 -04:00
topjohnwu
71a91ac7a7 Boot to recovery if volume up key is held
Forseeing the future that more and more A only system-as-root devices
would have similar bootloader behavior as the latest Samsung devices
(that is, no ramdisk will be loaded into memory when booting from
the boot partition), a solution/workaround has to be made when Magisk
is installed to the recovery partition, making custom recoveries
unable to co-exist with Magisk.

This commit allows magiskinit to read input device events from the
kernel to detect when a user holds volume key up to toggle whether
system-as-root mode is enabled. When system-as-root mode is disabled,
magiskinit will boot with ramdisk instead of cloning rootfs from system,
which in this case will boot to the recovery.
2019-04-01 03:01:05 -04:00
topjohnwu
08a70f033a Add entrypoint to build test
Just for convenience, nothing special here
2019-04-01 02:46:09 -04:00
topjohnwu
1b0c36dbd5 Remove outdated comments 2019-03-31 15:40:55 -04:00
topjohnwu
91da1cf817 Make on_install happen earlier to allow more customization 2019-03-31 15:37:12 -04:00
topjohnwu
c577a9525d Remove simple mount mode
This mode is proven to have no difference than normal post-fs-data
module mounting. No reason to keep this code in the sources.
2019-03-31 15:10:01 -04:00
topjohnwu
0149b1368d Several improvements 2019-03-31 06:32:33 -04:00
topjohnwu
cd6bcb97ef Cleanup stuffs 2019-03-31 00:48:22 -04:00
topjohnwu
df4161ffcc Reboot to recovery when running as recovery 2019-03-30 06:49:29 -04:00
topjohnwu
7a133eaf03 Block vaultkeeper and flash_recovery service 2019-03-30 04:13:45 -04:00
topjohnwu
1cd45b53b1 Support recovery based Magisk
Some devices (mainly new Samsung phones we're talking here...) using
A only system-as-root refuse to load ramdisk when booted with boot
no matter what we do. With many A only system-as-root devices, even
though their boot image is kernel only, we can still be able to add
a ramdisk section into the image and force the kernel to use it as
rootfs. However the bootloader on devices like the S10 simply does
not load anything within boot image into memory other than the kernel.
This gives as the only option is to install Magisk on the recovery
partition. This commits adds proper support for these kind of scenarios.
2019-03-30 00:49:48 -04:00
topjohnwu
5b30c77403 Fix strings 2019-03-29 10:39:11 -04:00
Gozzwip
8248480d56 Translation done
Please change the name of the language to Azərbaycanca
2019-03-29 10:37:28 -04:00
Vladimír Kubala
345d992d39 Update Slovak translations 2019-03-29 10:36:47 -04:00
topjohnwu
a7f6afa4bc Add 7.1.1 changelog 2019-03-29 10:31:08 -04:00
topjohnwu
d22c7de79a Don't care minMagiskVersion
It will be sanitized by magiskbot anyways
2019-03-29 10:25:07 -04:00
topjohnwu
3eae9494ce Add 7.1.0 changelog 2019-03-28 09:53:05 -04:00
topjohnwu
be7e737253 Add a small notice for migration 2019-03-28 08:37:23 -04:00
topjohnwu
b6eb912dba Fix links in table of contents 2019-03-28 07:03:38 -04:00
topjohnwu
8049b08918 More precise new installer detection 2019-03-28 06:33:24 -04:00
Oliver Cervera
d1fa5be210 Update Italian translations
- added new strings from Welcome Activity
- misc fixes
2019-03-28 05:52:46 -04:00
Cristian Silaghi
fdbb1af02c Update Romanian language 2019-03-28 05:52:25 -04:00
topjohnwu
c85a5cae88 Update links 2019-03-28 05:45:58 -04:00
topjohnwu
649ef53409 Update many details in docs 2019-03-28 05:25:20 -04:00
topjohnwu
e784212283 Update tools docs 2019-03-28 04:54:06 -04:00
topjohnwu
66eb1078fe Update docs for module devs 2019-03-28 04:48:46 -04:00
topjohnwu
1c09b3642f Properly setup update flag in module installer 2019-03-27 22:20:39 -04:00
topjohnwu
d08b1a6639 Remove com.google.android.gms from default list
It seems that even adding this to the list doesn't 100% works on all
devices out there, and some even reported crashes on several Google
services. Disable it for now and do further investigations in the future.
2019-03-27 21:33:04 -04:00
topjohnwu
10f50e2401 Revert to old behavior on old MagiskHide versions 2019-03-27 20:43:38 -04:00
topjohnwu
8e9a7b25a1 Upgrade Android Studio 2019-03-27 18:31:50 -04:00
topjohnwu
4859ee2da9 Inject module-installer.sh if new format is detected 2019-03-24 06:20:57 -04:00
topjohnwu
b45db44ad9 Update transitions 2019-03-24 04:29:09 -04:00
topjohnwu
e25ce63872 Remove AppUtils 2019-03-24 02:16:19 -04:00
topjohnwu
162eeaa0a6 Improve repo adapter 2019-03-24 02:02:34 -04:00
topjohnwu
f36ce905aa Improve repo adapter
Fix #435
2019-03-23 23:18:26 -04:00
topjohnwu
8ac3aaf36c Rename Topic -> Event 2019-03-23 21:58:42 -04:00
topjohnwu
a199b0ace1 Use ZIPFILE instead of ZIP
The tool zip reads , we don't want it
2019-03-23 20:49:16 -04:00
topjohnwu
2f2108e4e8 Fix typo in module installer 2019-03-23 05:28:43 -04:00
topjohnwu
f5f7fd9132 Add com.android.google gms to default hide list
Close #1235
2019-03-23 04:39:34 -04:00
topjohnwu
f9ae4ab475 Add base Magisk module installer script 2019-03-23 04:27:36 -04:00
topjohnwu
8de03eef3f Allow modules to have custom uninstaller script 2019-03-23 03:50:55 -04:00
topjohnwu
8df942f96e Adjust scripting 2019-03-23 03:36:35 -04:00
topjohnwu
9bb2243b56 Switch to skip_mount instead of auto_mount
95%+ of existing modules enables auto mount (obviously).
Switching auto mount to opt-out makes more sense than opt-in as
in previous module format. The file 'auto_mount' will be ignored, and
the file 'skip_mount' will be checked to toggle the mounting behavior.

After scanning through the current Magisk Module Repo modules, no
modules are using custom bind mounting; all modules with auto mount
disabled have empty system folder, which means this change will not
affect any existing module.
2019-03-23 03:05:38 -04:00
topjohnwu
db06038548 Fix Magisk installation 2019-03-22 02:48:42 -04:00
topjohnwu
ecb33d3176 Cleanup scripts 2019-03-22 02:32:21 -04:00
topjohnwu
eae1c17738 Remove features before aborting 2019-03-22 02:01:36 -04:00
topjohnwu
ea55532e33 Copy busybox instead of bind mounting 2019-03-22 01:52:13 -04:00
topjohnwu
2a40cb60a9 Behave more sane in extreme conditions 2019-03-22 01:50:33 -04:00
topjohnwu
d371d017b7 Update dependencies 2019-03-22 00:49:55 -04:00
topjohnwu
1d9359d563 Fix additional setup 2019-03-20 03:20:02 -04:00
topjohnwu
945f88105f Support system-as-root devices with monolithic sepolicy 2019-03-18 04:54:15 -04:00
topjohnwu
957feca626 Limit sepolicy load to Android Q only
It seems both Android cancers, Samsung and Huawei devices, don't
like preloading sepolicy. For a temporary solution now is to limit
the sepolicy loading to Android Q only.
2019-03-16 17:15:48 -04:00
topjohnwu
c0447009db Allow entrypoint for rootfs construction simulation 2019-03-16 04:45:56 -04:00
topjohnwu
8893cbd64a Modularize MagiskInit 2019-03-15 14:46:30 -04:00
topjohnwu
f0240b1f06 Support Android Q new split sepolicy setup 2019-03-15 06:17:37 -04:00
topjohnwu
e476c18c99 Don't load sepolicy on Huawei devices
Of course, the cancer of Android, Huawei, has to do some f**king weird
modifications to the Linux kernel. Its kernel only accepts 1 single
policy load in its lifetime, a second load will result in ENOMEM error.
Since Huawei devices always use their own stupid ramdisk setup and not
system-as-root, not loading sepolicy is not a concern (for now).
2019-03-14 22:48:23 -04:00
topjohnwu
a1b5185ecb Make sure rootfs file selabels are correct
Android Q init assumes rootfs to always be on EXT4 images, thus
never runs restorecon on the whole root directory. This is an issue
because some folders in rootfs were set with special selabels in
the system partition, but when copying over to initramfs by magiskinit,
these labels will not be preserved.

So the solution is to relabel the files in rootfs with the original
context right? Yes, but rootfs does not allow security xattr to be set
on files before the kernel SELinux initializes with genfs_contexts.
We have to load our sepolicy to the kernel before we clone the root
directory from system partition, which we will also restore the selabel
in the meantime.

Unfortunately this means that for each reboot, the exact same policy
will be loaded to the kernel twice: once in magiskinit so we can label
rootfs properly, and once by the original init, which is part of the
boot procedure. There is no easy way to prevent init from loading
sepolicy, as init will refuse to continue if policy loading has failed.
2019-03-14 22:27:29 -04:00
topjohnwu
981e90cc32 Don't remove SafetyNet from hide list 2019-03-14 07:00:36 -04:00
topjohnwu
da0a72e8b0 Improve builtin selinux implementation 2019-03-14 06:34:22 -04:00
topjohnwu
b7e2e972c7 Support boot_img_hdr_v2 2019-03-13 16:51:22 -04:00
topjohnwu
650b2ce6b1 Fix config bugs 2019-03-13 15:25:53 -04:00
topjohnwu
ecf3d30349 Only show expansion when necessary 2019-03-13 08:15:02 -04:00
topjohnwu
15ddd0e284 More MagiskHide list UI improvements 2019-03-13 07:49:12 -04:00
topjohnwu
18ac6b270f Make Expandable more extensible 2019-03-13 06:12:02 -04:00
topjohnwu
3e35de9b39 Small UI improvements 2019-03-13 05:11:18 -04:00
topjohnwu
1e24c72c11 Use our own existing implementation 2019-03-13 01:37:35 -04:00
vvb2060
217564963d New MagiskHide UI 2019-03-12 17:20:08 -04:00
topjohnwu
f2f4649ab0 Don't crash when encounter unexpected XML input 2019-03-12 17:19:29 -04:00
Oliver Cervera
4395ffec5f Update it-it stub
Better wording!
2019-03-12 17:04:23 -04:00
topjohnwu
9a7a26407a Update build script 2019-03-12 17:01:37 -04:00
topjohnwu
5072a67807 Update AGP and R8 2019-03-12 16:53:07 -04:00
topjohnwu
dce0b6c05a Always detach all child threads before leaving 2019-03-12 16:48:01 -04:00
topjohnwu
a4a661bf34 Small code restructuring 2019-03-11 12:44:50 -04:00
topjohnwu
771e500468 Use dark theme by default 2019-03-11 07:39:01 -04:00
topjohnwu
7e3ff03109 Default to canary channel if running canary build 2019-03-11 07:38:31 -04:00
topjohnwu
a1827fd680 Make sure to read db before 2019-03-11 07:30:37 -04:00
topjohnwu
9ce334feac Update the way to deal with configs 2019-03-11 07:03:36 -04:00
topjohnwu
ed11e0bff6 Fix repackage manager settings migration 2019-03-11 05:43:48 -04:00
topjohnwu
5111086637 Don't care if child threads were unknown 2019-03-10 01:46:32 -05:00
topjohnwu
20f204810e Use RAII to detach PIDs 2019-03-10 01:14:41 -05:00
topjohnwu
4581354e7a Allow zygote to execve
Allow zygote to execute other programs (such as dex2oat).
This fixes the bug that cause ART framework boot images failed to load
and result to extremely serious performance degradation.

Fix #1195
2019-03-09 22:58:05 -05:00
topjohnwu
faf4d76388 Use large vector<bool> instead of set<pid>
vector<bool> uses bitsets, so we actually only use 12k memory to
store all 3 possible PID info tables. PID checkup will be now become
O(1) instead of O(logn).

P.S. The reason why we don't use unordered_map is because including it
will result in significant binary size increase (might be due to the
complex hash table STL implementation? I really don't know).
2019-03-09 22:28:43 -05:00
topjohnwu
a46e255709 Fix strings.xml 2019-03-09 05:47:19 -05:00
Vladimír Kubala
63e2bbb4d1 Slovak translation update 2019-03-09 05:37:50 -05:00
bubuleur
c3dabae237 Update French Language
Small correction line 108 thank you
2019-03-09 05:37:41 -05:00
topjohnwu
f1abcbb7fb Update WorkManager 2019-03-09 05:36:49 -05:00
topjohnwu
70efddb90f Only use SELinux if necessary in init 2019-03-09 05:30:42 -05:00
topjohnwu
f24a5dfd45 More efficient xml parsing 2019-03-09 04:27:04 -05:00
topjohnwu
081074ad9d Better zygote process detection 2019-03-08 23:53:53 -05:00
topjohnwu
ab0cc78d2c Update README.md 2019-03-08 10:23:42 -05:00
topjohnwu
de5c902fdb Remove app-core module
Less confusion
2019-03-08 10:19:22 -05:00
topjohnwu
cf65169c99 Separate stub Magisk Manager to a module 2019-03-08 10:16:02 -05:00
topjohnwu
745865ee53 Add canary channels
Only show if user is already on canary channels
2019-03-08 06:23:13 -05:00
topjohnwu
c134fb1939 Remove unnecessary rules 2019-03-08 04:21:23 -05:00
topjohnwu
0204d05316 Remove Zygote notifier
Temporary trigger process scan on packages.xml updates, will find better methods
2019-03-08 03:35:17 -05:00
topjohnwu
c345633d80 Fix build error
Close #1182
2019-03-08 01:01:42 -05:00
topjohnwu
a57a94040e Update some format magics 2019-03-08 00:47:15 -05:00
topjohnwu
1bde78d121 Rename patch_level -> os_patch_level 2019-03-07 21:59:03 -05:00
topjohnwu
bbd014ad1b More saftey checks and improvements 2019-03-07 21:49:47 -05:00
topjohnwu
1287372f5a Support patching header in magiskboot 2019-03-07 21:32:01 -05:00
topjohnwu
d2cb638fcd Use our own function to parse int 2019-03-07 20:31:35 -05:00
topjohnwu
bbe4b69c8d Fix LZ4FEncoder constructor 2019-03-07 19:58:59 -05:00
topjohnwu
7f08c06943 Remove unnecessary '--' from magiskboot actions 2019-03-07 18:07:23 -05:00
topjohnwu
8f4a6415cd Use ToT r8 for releases 2019-03-07 17:33:06 -05:00
topjohnwu
0442d6d509 Only compress kernel and ramdisk if input not compressed 2019-03-07 07:24:20 -05:00
lindwurm
a3fc6d2a27 l10n: Update Japanese translation
Signed-off-by: lindwurm <lindwurm.q@gmail.com>
2019-03-07 06:10:42 -05:00
linar10
7db05ac927 Update strings.xml 2019-03-07 06:10:29 -05:00
Igor Dyatlov
8bed93b3c5 Updated Russian translation 2019-03-07 06:10:14 -05:00
topjohnwu
915b49014f Build libsqlite.so only with magisk
Fix #1175
2019-03-07 05:21:27 -05:00
topjohnwu
c699f30831 Fix some build issues 2019-03-07 05:05:46 -05:00
topjohnwu
3e73e3a906 Play with Java streams 2019-03-07 03:43:28 -05:00
topjohnwu
32c65d8a88 Upgrade Android Studio 2019-03-07 03:41:24 -05:00
topjohnwu
a49328edd3 Workaround Binder transaction limits 2019-03-07 02:07:34 -05:00
topjohnwu
9a15365a57 Welcome, Java 8/9 APIs
Fix #1162
2019-03-07 00:01:07 -05:00
topjohnwu
82c864d57e Make zygote notifier more reliable 2019-03-06 18:22:04 -05:00
topjohnwu
6226f875ff Make db settings constructor more readable 2019-03-06 08:21:23 -05:00
topjohnwu
370015a853 Modernize database code (again) 2019-03-06 08:16:12 -05:00
topjohnwu
6597b7adc0 Add MicroG DroidGuardHelper as target
MicroG uses a different package to handle DroidGuard service (SafetyNet),
but still uses the same com.google.android.gms.unstable process name.
Thanks to the changes in 4e53ebfe, we can target both official GMS
and MicroG SafetyNet services at the same time.
2019-03-06 05:43:52 -05:00
topjohnwu
4e53ebfe44 Use both package name and process name as key
Different packages could potentially use the same process name,
and they shouldn't conflict with each other.
2019-03-06 05:40:52 -05:00
topjohnwu
04ef1e6405 Make parse prop file a util function 2019-03-05 20:27:09 -05:00
topjohnwu
b278d07b05 Switch to Zygote ptrace-ing
No matter if we use the old, buggy, error prone am_proc_start monitoring,
or the new APK inotify method, both methods rely on MagiskHide 'reacting'
fast enough to hijack the process before any detection has been done.

However, this is not reliable and practical. There are apps that utilize
native libraries to start detects and register SIGCONT signal handlers
to mitigate all existing MagiskHide process monitoring mechanism. So
our only solution is to hijack an app BEFORE it is started.

All Android apps' process is forked from zygote, so it is easily the
target to be monitored. All forks will be notified, and subsequent
thread spawning (Android apps are heaviliy multithreaded) from children
are also closely monitored to find the earliest possible point to
identify what the process will eventually be (before am_proc_bound).

ptrace is extremely complicated and very difficult to get right. The
current code is heaviliy tested on a stock Android 9.0 Pixel system,
so in theory it should work fine on most devices, but more tests and
potentially fixes are expected to follow this commit.
2019-03-05 20:23:27 -05:00
topjohnwu
6c3896079d Add zygote server notifier 2019-03-05 20:23:27 -05:00
topjohnwu
e73fa57d54 Update Android Studio 2019-03-05 07:38:40 -05:00
topjohnwu
eaa9c7e2a0 Android Q init is not always a symlink 2019-03-03 14:56:36 -05:00
topjohnwu
14ae29d907 Support Android Q new init setup 2019-03-03 06:35:25 -05:00
linar10
e8f35b02ca Update strings.xml 2019-03-02 05:49:37 -05:00
topjohnwu
dee3c3e7ba Workaround seccomp on MagiskBoot
Close #1150
2019-03-02 05:46:15 -05:00
topjohnwu
d8cd2031c7 SIGSTOP any possible process ASAP
Shut down any UID matching process and resume if it turns out not to
be our target. Since we will record every single process we have ever
paused, this means that the same process will not be paused erroneously
for another time.

This is an optimization to hijack the app as soon as possible.
2019-03-02 04:24:41 -05:00
topjohnwu
7203e7df5c Create mapping from watch descriptor to UID 2019-03-02 03:44:24 -05:00
topjohnwu
b51feffe80 Limit process name match to cmdline only
We are only interested in Zygote forked processed
2019-03-01 18:13:41 -05:00
topjohnwu
b1afd554fc Application Component Granularity MagiskHide
Before switching to the new MagiskHide implementation (APK inotify),
logcat parsing provides us lots of information to target a process.
We were targeting components so that apps with multi-processes
can still be hidden properly.

After switching to the new implementation, our granularity is limited
to the UID of the process. This is especially dangerous since Android
allow apps signed with the same signature to share UIDs, and many system
apps utilize this for elevated permissions for some services.

This commit introduces process name matching. We could not blanketly
target an UID, so the workaround is to verify its process name before
unmounting.

The tricky thing is that any app developer is allowed to name the
process of its component to whatever they want; there is no 'one
rule to catch them all' to target a specific package. As a result,
Magisk Manager is updated to scan through all components of all apps,
and show different processes of the same app, each as a separate
hide target in the list.

The hide target database also has to be updated accordingly.
Each hide target is now a <package name, process name> pair. The
magiskhide CLI and Magisk Manager is updated to support this new
target format.
2019-03-01 17:08:08 -05:00
topjohnwu
885e3c574b Upgrade dependencies 2019-02-28 23:42:33 -05:00
topjohnwu
05dd5f3396 Only load config prop when needed
Close #922
2019-02-28 23:42:33 -05:00
SakuraSa233
ec3c43faf1 update: Japanese translation 2019-02-28 05:57:53 -05:00
topjohnwu
e72c6685ed Support A only System-as-root Devices
Most Chinese devices (and supposedly Galaxy S10) running Android Pie
is using system-as-root without A/B partition.

https://source.android.com/devices/bootloader/system-as-root#about-system-as-root

According to the docs above, these devices will have a ramdisk block
with size 0 in their boot images. Since magiskinit can run independently
on system-as-root devices, we simply just create an empty ramdisk with
magiskinit added as init.

Huge thanks to @vvb2060 for the heads up and original PR.
Close #980, close #1102
2019-02-28 05:46:36 -05:00
Cristian Silaghi
99d6bd8efc Minor changes for Romanian 2019-02-27 16:44:49 -05:00
linar10
4c8587a9f2 Update strings.xml 2019-02-27 16:44:41 -05:00
John Wu
54a8a05dae Small adjustments in connect.cpp 2019-02-27 16:44:27 -05:00
John Wu
164a99681b Make case Intent.ACTION_REBOOT fall through 2019-02-27 16:44:27 -05:00
vvb2060
0eef4eacd6 Use REBOOT foreground broadcast 2019-02-27 16:44:27 -05:00
topjohnwu
5764f0c839 Compiler flag enhancements
- Enable LTO
- Add -fomit-frame-pointer for even smaller binary size

This commit is inspired by #1075. Close #1075.
2019-02-26 03:42:44 -05:00
topjohnwu
f28e425542 Fix strings resources 2019-02-26 03:13:49 -05:00
Hugwalk
d1a4f046e9 Recreate translations for Chinese (Taiwan)
Fixed wordings to fit Taiwanese accent.
e.g. 日誌 (log) to 記錄檔

Kept proper nouns in English
e.g. Superuser instead of 超級使用者

Removed westernised Chinese as much as possible.
2019-02-26 03:08:29 -05:00
Gozzwip
2ce1dc4afe new translations 2019-02-26 03:07:45 -05:00
linar10
37ac249fd7 Update strings.xml 2019-02-26 03:07:29 -05:00
vvb2060
f152bea8d8 Trim dev name 2019-02-26 03:04:17 -05:00
Oliver Cervera
7b089b888a Update Italian Translation
Minor changes
2019-02-26 02:47:01 -05:00
Cristian Silaghi
68f0e1fe39 Update Romanian translation 2019-02-26 02:46:50 -05:00
topjohnwu
8032bd0bac Introduce /data mirror
Since we switched to imageless Magisk, module files are directly
stored in /data. However, /data is mounted with nosuid, which also
prevents SELinux typetransition to work (auto transition from one
domain to another when executing files with specific context).
This could cause serious issues when we are replacing system critical
components (e.g. app_process for Xposed), because most of them
are daemons that run in special process domains.

This commit introduced /data mirror. Using similar mirroring technique
we used for system and vendor, we mount another mirror that mounts
/data without nosuid flag. All module files are then mounted from this
mirror mountpoint instead of directly from /data.

Close #1080
2019-02-25 06:13:42 -05:00
topjohnwu
0c227f2917 Always clone attribute from existing files to module files
This makes sure no weird permission/SELinux issues shall happen
2019-02-25 05:17:08 -05:00
topjohnwu
c9fa8118d1 Some code adjustments 2019-02-24 23:09:34 -05:00
topjohnwu
63b18246d8 Add compressed ramdisk support 2019-02-24 20:39:01 -05:00
topjohnwu
16ec37a226 Fix compression without outname 2019-02-24 17:45:08 -05:00
topjohnwu
bd4e5bfc1a Some minor optmizations 2019-02-24 17:45:08 -05:00
topjohnwu
621fd0ee29 Fix SEGV_ACCERR on some 64 bit devices 2019-02-24 08:20:05 -05:00
topjohnwu
6ca8db2f0c Welcome to the 64 bit world!
Close #854
2019-02-24 08:13:27 -05:00
topjohnwu
ea129fb206 Allow cpio mv to override existing entries 2019-02-24 05:11:36 -05:00
topjohnwu
3356d7b6ff More friendly to obscure/outdated custom recoveries
Close #1049
2019-02-24 04:45:47 -05:00
topjohnwu
c84023bdc2 Fix crashes when removing verity_key 2019-02-24 04:29:15 -05:00
topjohnwu
86f778c0aa Group unsupported formats into the same code 2019-02-24 02:30:04 -05:00
topjohnwu
defbbdfe21 Update scripts 2019-02-24 02:11:11 -05:00
topjohnwu
0f46493477 Compile magiskboot as static 2019-02-23 17:01:44 -05:00
topjohnwu
340bac7e42 Add decompression command 2019-02-23 16:53:51 -05:00
topjohnwu
1d3ce9fef1 Support loading CPIO from a chunk of bytes 2019-02-23 16:16:35 -05:00
topjohnwu
4a398642b8 Set mode in constructor 2019-02-23 15:22:11 -05:00
topjohnwu
9c89e56c56 Add ramdisk compression option 2019-02-23 15:04:15 -05:00
topjohnwu
267c59b1f1 Add truncate while open 2019-02-23 13:08:54 -05:00
topjohnwu
2ab17204c6 Add stream output for CPIO 2019-02-23 05:06:07 -05:00
topjohnwu
75939047d1 Fix bugs in compression 2019-02-23 04:51:13 -05:00
topjohnwu
2d7f130d2c Introduce Java-like OutputStream 2019-02-23 04:51:13 -05:00
topjohnwu
f7ae72a36c Move CPIO to libutils 2019-02-23 02:42:26 -05:00
topjohnwu
391783e268 Introduce mmap based CPIO class 2019-02-23 02:23:24 -05:00
topjohnwu
6f12c08204 Use ordered map to store CPIO entries 2019-02-22 22:53:20 -05:00
topjohnwu
cb8fe70734 Modernize CPIO code 2019-02-22 02:56:18 -05:00
topjohnwu
69d10b747a Directly use FDT headers for detection 2019-02-21 05:24:05 -05:00
topjohnwu
da3394f34e Move image parsing out of header searching 2019-02-21 05:08:38 -05:00
topjohnwu
b4c2a9f49f More macro magic 2019-02-21 04:14:52 -05:00
topjohnwu
7cee77f57a Some C++ magic to make code cleaner 2019-02-21 02:54:37 -05:00
topjohnwu
f28bd1972f Adjust LZ4F block size 2019-02-21 00:52:47 -05:00
topjohnwu
0f92d1de1b Fix bzip2 decompression 2019-02-20 20:53:54 -05:00
topjohnwu
e59c5c8780 Modernize compress and decompress 2019-02-20 20:49:26 -05:00
kirill9617
86d8026301 Update format.h
GZIP magic is \x1f\x8b\x08 not \x1f\x8b\x08\x00
2019-02-20 03:53:41 -05:00
topjohnwu
d67b827338 Rewrite compression with OOP 2019-02-20 02:10:06 -05:00
topjohnwu
660e0dc09a Fix MagiskHide unmount daemon
Close #1101
2019-02-19 01:50:41 -05:00
John Wu
3ebc886f8a Make sure PPID exists 2019-02-18 03:45:01 -05:00
vvb2060
5b54ef840a Skip same mount namespace 2019-02-18 03:45:01 -05:00
linar10
c08b0d4974 update pl 2019-02-18 03:33:25 -05:00
dark-basic
7d652afd87 Small Changes. Very Small.
I hope it does not have to be adjusted again. Since the text does not appear completely. (Only appears when the rotation of the screen is horizontal)
2019-02-18 03:33:08 -05:00
corsicanu
0f61c627b1 Support deodexed ROM on Pie (Samsung)
- cc @abrahamgcc
2019-02-18 03:32:56 -05:00
lindwurm
7126648404 l10n: ja: Update Japanese translations
Signed-off-by: lindwurm <lindwurm.q@gmail.com>
2019-02-18 03:32:27 -05:00
lindwurm
4a5e2dc9c7 l10n: ja: Fix strings for UI
* strings "インストール", "タップしてSafetyNetチェックを開始" are too long to show in button

Signed-off-by: lindwurm <lindwurm.q@gmail.com>
2019-02-18 03:32:27 -05:00
HemanthJabalpuri
10613686ed Fix bootloop when removing system SuperSU in <5.0 2019-02-18 03:31:16 -05:00
topjohnwu
17ab55115a Add newlines before rc scripts
Based on #1090, thanks to @shakalaca. Close #1090, close #1086
2019-02-18 03:30:30 -05:00
topjohnwu
2708c74ebe Add O_CLOEXEC to opens 2019-02-18 03:25:21 -05:00
topjohnwu
50ff11405f Swap out inotify fd before adding watch targets 2019-02-18 03:18:11 -05:00
topjohnwu
31a27838f5 Fix help message for magisk 2019-02-18 03:09:01 -05:00
topjohnwu
2f1b0fe57f Remove unused scripts 2019-02-18 03:08:40 -05:00
topjohnwu
692f893e1f Monitor /data/system/packages.xml
Reinstalling system apps as data creates tons of issues.
Calling pm path <pkg> is extremely expensive and doesn't work in post-fs-data.
Parse through packages.xml to get APK path and UID at the same time.
As a bonus, we don't need to traverse /data/app for packages anymore.
2019-02-18 03:05:13 -05:00
topjohnwu
14aa6041ec Use a better function to read through files 2019-02-17 22:30:23 -05:00
topjohnwu
fb55fe184c Hide useless error message 2019-02-16 03:41:37 -05:00
topjohnwu
6412bfc7b5 Only care about the first event 2019-02-16 02:49:36 -05:00
topjohnwu
3c56f38229 Change most logs to debug logs 2019-02-16 02:30:48 -05:00
topjohnwu
f4f2274c60 Auto reinstall system apps on hide list
Since we are parsing through /data/app/ to find target APKs for
monitoring, system apps will not be covered in this case.
Automatically reinstall system apps as if they received an update
and refresh the monitor target after it's done.

As a bonus, use RAII idioms for locking pthread_mutex_t.
2019-02-16 02:24:35 -05:00
topjohnwu
19ee189468 Separate scripting code 2019-02-15 20:45:05 -05:00
topjohnwu
a19c7215d2 Better nice name 2019-02-15 04:31:39 -05:00
topjohnwu
8b84039f1f Run service scripts actually in parallel 2019-02-15 01:30:47 -05:00
topjohnwu
9430dbb96c Make sure logcat process does not become a zombie 2019-02-14 17:36:18 -05:00
topjohnwu
4872df6a46 Support old APK paths and don't crash when not match 2019-02-14 16:38:28 -05:00
topjohnwu
014105f0a0 Bring back log dumping 2019-02-14 04:27:30 -05:00
topjohnwu
b106d1c501 Fix stupid mistake 2019-02-14 04:24:30 -05:00
topjohnwu
99db0672b4 Minor MagiskHide adjustments
- Fail fast on unsupported systems
- Show proper fail message on unsupported systems
- inotify_fd shall be swapped out before closing to prevent
  the proc_monitor thread to read from incomplete inotify fd
2019-02-14 04:08:05 -05:00
topjohnwu
d584360de2 More optimized APK traversal 2019-02-14 00:52:59 -05:00
topjohnwu
4eed6794c7 More MagiskHide optimizations
- Use a general procfs traversal function with callbacks
- Much better functions for killing processes
2019-02-13 20:16:26 -05:00
topjohnwu
c66cabd80f Several MagiskHide improvements
- Directly get UID instead of traversing /data/data everytime
- Use /data/user_de/0 instead of /data/data on Android 7.0+
- Update hide_uid set incrementally when adding/initializing targets
- Guard hide_uid set with the same lock as hide_list vector
- Do not add GMS package into database; only add to in-memory list
2019-02-13 06:16:26 -05:00
Park Ju Hyung
24da3485bd Hardcode GMS unstable to MagiskHide
With the new detection method, it is impossible to check for components.

Remove additional checks for components and simply hardcode string to
proc_monitor.cpp and query cmdline to see if it's GMS unstable.

This addresses wasted resources on applying custom namespace
on all GMS processes.

Signed-off-by: Park Ju Hyung <qkrwngud825@gmail.com>
2019-02-12 23:39:57 -05:00
Park Ju Hyung
7384d2d330 Completely rework MagiskHide
Previous MagiskHide detects new app launches via listening through logcat
and filtering launch info messages.

This is extremely inefficient and prone to cause multiple issues both
theoratically and practically.

Rework this by using inotify to detect open() syscalls to target APKs.

This also solves issues related to Zygote-forked caching mechanisms such as
OnePlus OxygenOS' embryo.

Signed-off-by: Park Ju Hyung <qkrwngud825@gmail.com>
2019-02-12 23:39:57 -05:00
topjohnwu
e5940168fe Fix string resources 2019-02-12 17:03:20 -05:00
Igor Sorocean
6855baf0f8 Update romanian translation 2019-02-12 17:01:11 -05:00
Fatih Fırıncı
dfd16e8fef Update strings.xml 2019-02-12 17:01:01 -05:00
Remita Amine
98a36819bc Limit Boot Image selection dialog to File Managers 2019-02-12 17:00:48 -05:00
marciozomb13
de8bc9ca9d Update strings.xml
PT-rBR update
2019-02-12 17:00:32 -05:00
topjohnwu
c137f2de4f Remove SDK 16 support completely
Android 4.1 init miss several significant features Magisk reply on,
so the final decision is to forget about it in the future.

Pull minSdkVersion of Magisk Manager back to 17 and remove some
unnecessary adjustments done for SDK 16
2019-02-12 16:58:05 -05:00
topjohnwu
0f55fcafe8 Migrate EXT4 images instead of removing them 2019-02-12 16:13:31 -05:00
topjohnwu
ed027ec3ee Refactor build flags 2019-02-12 05:17:02 -05:00
topjohnwu
b3fd79cbb9 Add more cmdline options and specify as internal API 2019-02-12 04:05:51 -05:00
topjohnwu
ed4df87b57 Remove imgtool 2019-02-12 02:44:46 -05:00
topjohnwu
1321f097b8 Remove usage of magisk.img
Mounting ext4 images causes tons of issues, such as unmountable with broken F2FS drivers.
Resizing is also very complicated and does not work properly on all devices.
Each step in either measuring free space, resizing, and shrinking the image is a
point of failure, and either step's failure could cause the module system completely broken.

The new method is to directly store modules into /data/adb/modules, and for module installation
on boot /data/adb/modules_update. Several compatibility layers has been done: the new path is
bind mounted to the old path (/sbin/.magisk/img), and the helper functions in util_functions.sh
will now transparently make existing modules install to the new location without any changes.

MagiskHide is also updated to unmount module files stored in this new location.
2019-02-12 02:14:57 -05:00
Aidan Holland
cfa28f0c4a Empty Exceptions 2019-02-11 17:14:29 -05:00
topjohnwu
ab47b717b1 Reorganize scripts 2019-02-11 17:14:07 -05:00
Aidan Holland
65ebb0d2f8 Misc Formatting
* PEP8 and linting
* empty exceptions
2019-02-11 03:18:15 -05:00
Rom
49640ce03a Update French translation 2019-02-11 03:06:44 -05:00
vvb2060
e05cdc83f3 fix extract_bb 2019-02-11 02:35:04 -05:00
topjohnwu
992a9ea2f9 Fix EMUI 9 detection 2019-02-11 02:26:15 -05:00
topjohnwu
228351fc13 Prevent bootloop on non system-as-root devices
Close #1058
2019-02-10 13:51:41 -05:00
topjohnwu
8a5b6f2b86 Block all signals in daemon 2019-02-10 04:18:50 -05:00
topjohnwu
71ecbb3af3 Clean/refactor includes 2019-02-10 03:57:51 -05:00
topjohnwu
5746614ccf Keep track of timestamps and skip old logs 2019-02-10 03:16:52 -05:00
topjohnwu
3a422c3f15 Remove magisklogd, use threads and BlockingQueue 2019-02-10 01:05:19 -05:00
topjohnwu
b3242322fd Harden socket verification
- Do not allow connections to magiskd from binaries other than the one started the server
- Do not allow connections to magisklogd without root access
2019-02-09 15:02:46 -05:00
Licaon_Kter
9826640ae6 f-strings need Python 3.6
...this is a blocker for F-Droid since Debian Strech has only Python 3.5.x
2019-02-09 05:35:05 -05:00
topjohnwu
1f5267204b Better cmdline parsing 2019-02-09 05:23:56 -05:00
topjohnwu
ed25e1bbd6 Directly inject services into init.rc 2019-02-09 02:48:05 -05:00
topjohnwu
c8491d008f Move sbin overlay creation to magiskinit 2019-02-09 01:51:46 -05:00
Mevlüt TOPÇU
08e3405394 Update strings.xml 2019-02-07 00:45:51 -05:00
dark-basic
4ebfa07186 Some adjustments - Update Strings
I changed some words for their synonyms. In order to verify how it behaves on screens less than 5 inches.
(Some changes were made, since several devices I have, some words do not appear yet having space)
2019-02-07 00:45:43 -05:00
Erfan Abdi
6698c189fc Support non-ext4 filesystem for vendor and system
Signed-off-by: Erfan Abdi <erfangplus@gmail.com>
2019-02-07 00:45:30 -05:00
topjohnwu
f0639390aa Update dependencies 2019-02-07 00:37:40 -05:00
topjohnwu
bbdfed2d5a Fix strings 2019-02-05 00:52:52 -05:00
Madis
7f4daa2c50 Estonian update 2019-02-05 00:50:53 -05:00
Gozzwip
baf9b67b35 Creating Azerbaijani file 2019-02-05 00:50:40 -05:00
Mevlüt TOPÇU
caf73b0b36 Update Turksih language
Merge please

Thank you
2019-02-05 00:50:28 -05:00
Furkan
acf87c2794 fix one word 2019-02-05 00:50:17 -05:00
topjohnwu
7f5f6b54fb Ask for fingerprint before deleting policy
Close #1038
2019-02-04 23:08:06 -05:00
topjohnwu
a08eb8a446 Hide install button by default
Close #1037
2019-02-04 22:56:45 -05:00
443 changed files with 16515 additions and 13367 deletions

1
.gitattributes vendored
View File

@@ -16,3 +16,4 @@ chromeos/** binary
*.exe binary
*.apk binary
*.png binary
*.jpg binary

1
.gitignore vendored
View File

@@ -15,4 +15,3 @@ native/out
/.idea
/build
/captures
.externalNativeBuild

View File

@@ -1,41 +1,75 @@
# Magisk
[Downloads](https://github.com/topjohnwu/Magisk/releases) | [Documentation](https://topjohnwu.github.io/Magisk/) | [XDA Thread](https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445)
[Downloads](https://github.com/topjohnwu/Magisk/releases) \| [Documentation](https://topjohnwu.github.io/Magisk/) \| [XDA Thread](https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445)
## Introduction
Magisk is a suite of open source tools for customizing Android, supporting devices higher than Android 4.2 (API 17). It covers the fundamental parts for Android customization: root, boot scripts, SELinux patches, AVB2.0 / dm-verity / forceencrypt removals etc.
Furthermore, Magisk provides a **Systemless Interface** to alter the system (or vendor) arbitrarily while the actual partitions stay completely intact. With its systemless nature along with several other hacks, Magisk can hide modifications from nearly any system integrity verifications used in banking apps, corporation monitoring apps, game cheat detections, and most importantly [Google's SafetyNet API](https://developer.android.com/training/safetynet/index.html).
## Bug Reports
**Make sure to install the latest [Canary Build](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337) before reporting any bugs!** **DO NOT** report bugs that is already fixed upstream. Follow the instructions in the [Canary Channel XDA Thread](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337), and report a bug either by opening an issue on GitHub or directly in the thread.
## Building Environment Requirements
1. Python 3: run `build.py` script
2. Java Development Kit (JDK) 8: Compile Magisk Manager and sign zips
3. Latest Android SDK: set `ANDROID_HOME` environment variable to the path to Android SDK
4. Android NDK: Install NDK along with SDK (`$ANDROID_HOME/ndk-bundle`), or optionally specify a custom path `ANDROID_NDK_HOME`
5. (Windows Only) Python package Colorama: Install with `pip install colorama`, used for ANSI color codes
- Python 3: run `build.py` script
- Java Development Kit (JDK) 8: Compile Magisk Manager and sign zips
- Latest Android SDK: set `ANDROID_HOME` environment variable to the path to Android SDK
- Android NDK: Install NDK along with SDK (`$ANDROID_HOME/ndk-bundle`), or optionally specify a custom path `ANDROID_NDK_HOME`
- (Windows Only) Python package Colorama: Install with `pip install colorama`, used for ANSI color codes
## Building Notes and Instructions
1. Clone sources with submodules: `git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git`
2. Building is supported on macOS, Linux, and Windows. Official releases are built and tested with [FrankeNDK](https://github.com/topjohnwu/FrankeNDK); point `ANDROID_NDK_HOME` to FrankeNDK if you want to use it for compiling.
3. Set configurations in `config.prop`. A sample file `config.prop.sample` is provided as an example.
4. Run `build.py` with argument `-h` to see the built-in help message. The `-h` option also works for each supported actions, e.g. `./build.py binary -h`
5. By default, `build.py` build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the `-r, --release` flag), you need a Java Keystore file `release-key.jks` (only `JKS` format is supported) to sign APKs and zips. For more information, check out [Google's Official Documentation](https://developer.android.com/studio/publish/app-signing.html#signing-manually).
- Clone sources with submodules: `git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git`
- Building is supported on macOS, Linux, and Windows. Official releases are built and tested with [FrankeNDK](https://github.com/topjohnwu/FrankeNDK); point `ANDROID_NDK_HOME` to FrankeNDK if you want to use it for compiling.
- Set configurations in `config.prop`. A sample file `config.prop.sample` is provided as an example.
- Run `build.py` with argument `-h` to see the built-in help message. The `-h` option also works for each supported actions, e.g. `./build.py binary -h`
- By default, `build.py` build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the `-r, --release` flag), you need a Java Keystore file `release-key.jks` (only `JKS` format is supported) to sign APKs and zips. For more information, check out [Google's Official Documentation](https://developer.android.com/studio/publish/app-signing.html#signing-manually).
## Translations
Default string resources for Magisk Manager are scattered throughout
- `app/src/main/res/values/strings.xml`
- `stub/src/main/res/values/strings.xml`
- `shared/src/main/res/values/strings.xml`
Translate each and place them in the respective locations (`<module>/src/main/res/values-<lang>/strings.xml`).
## Signature Verification
Official release zips and APKs are signed with my personal private key. You can verify the key certificate to make sure the binaries you downloaded are not manipulated in anyway.
``` bash
# Use the keytool command from JDK to print certificates
keytool -printcert -jarfile <APK or Magisk zip>
# The output should contain the following signature
Owner: CN=John Wu, L=Taipei, C=TW
Issuer: CN=John Wu, L=Taipei, C=TW
Serial number: 50514879
Valid from: Sun Aug 14 13:23:44 EDT 2016 until: Tue Jul 21 13:23:44 EDT 2116
Certificate fingerprints:
MD5: CE:DA:68:C1:E1:74:71:0A:EF:58:89:7D:AE:6E:AB:4F
SHA1: DC:0F:2B:61:CB:D7:E9:D3:DB:BE:06:0B:2B:87:0D:46:BB:06:02:11
SHA256: B4:CB:83:B4:DA:D9:9F:99:7D:BE:87:2F:01:3A:A1:6C:14:EE:C4:1D:16:70:21:F3:71:F7:E1:33:0F:27:3E:E6
Signature algorithm name: SHA256withRSA
Version: 3
```
## License
```
Magisk, including all git submodules are free software:
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
Magisk, including all git submodules are free software:
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
```
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

2
app-core/.gitignore vendored
View File

@@ -1,2 +0,0 @@
/build
src/main/res/raw/util_functions.sh

View File

@@ -1,21 +0,0 @@
apply plugin: 'com.android.library'
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api project(':net')
api project(':signing')
api 'org.kamranzafar:jtar:2.3'
def libsuVersion = '2.3.0'
api "com.github.topjohnwu.libsu:core:${libsuVersion}"
api "com.github.topjohnwu.libsu:io:${libsuVersion}"
}

View File

@@ -1,4 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.topjohnwu.magisk.core" >
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
</manifest>

View File

@@ -1,61 +0,0 @@
package com.topjohnwu.magisk;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Build;
import android.preference.PreferenceManager;
import com.topjohnwu.magisk.core.BuildConfig;
import com.topjohnwu.magisk.database.MagiskDB;
import com.topjohnwu.magisk.database.RepoDatabaseHelper;
import com.topjohnwu.magisk.utils.LocaleManager;
import com.topjohnwu.magisk.utils.RootUtils;
import com.topjohnwu.net.Networking;
import com.topjohnwu.superuser.Shell;
import java.util.concurrent.ThreadPoolExecutor;
public class App extends Application {
public static App self;
public static ThreadPoolExecutor THREAD_POOL;
// Global resources
public SharedPreferences prefs;
public MagiskDB mDB;
public RepoDatabaseHelper repoDB;
static {
Shell.Config.setFlags(Shell.FLAG_MOUNT_MASTER | Shell.FLAG_USE_MAGISK_BUSYBOX);
Shell.Config.verboseLogging(BuildConfig.DEBUG);
Shell.Config.addInitializers(RootUtils.class);
Shell.Config.setTimeout(2);
THREAD_POOL = (ThreadPoolExecutor) AsyncTask.THREAD_POOL_EXECUTOR;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
self = this;
Context de = this;
if (Build.VERSION.SDK_INT >= 24) {
de = createDeviceProtectedStorageContext();
de.moveSharedPreferencesFrom(this, PreferenceManager.getDefaultSharedPreferencesName(base));
}
prefs = PreferenceManager.getDefaultSharedPreferences(de);
mDB = new MagiskDB(this);
Networking.init(this);
LocaleManager.setLocale(this);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleManager.setLocale(this);
}
}

View File

@@ -1,64 +0,0 @@
package com.topjohnwu.magisk.container;
import org.kamranzafar.jtar.TarHeader;
import java.io.File;
import java.util.Arrays;
public class TarEntry extends org.kamranzafar.jtar.TarEntry {
public TarEntry(File file, String entryName) {
super(file, entryName);
}
/*
* Workaround missing java.nio.file.attribute.PosixFilePermission
* Simply just assign a default permission to the file
* */
@Override
public void extractTarHeader(String entryName) {
int permissions = file.isDirectory() ? 000755 : 000644;
header = TarHeader.createHeader(entryName, file.length(), file.lastModified() / 1000, file.isDirectory(), permissions);
header.userName = new StringBuffer("");
header.groupName = header.userName;
}
/*
* Rewrite the header to GNU format
* */
@Override
public void writeEntryHeader(byte[] outbuf) {
super.writeEntryHeader(outbuf);
System.arraycopy("ustar \0".getBytes(), 0, outbuf, 257, TarHeader.USTAR_MAGICLEN);
getOctalBytes(header.mode, outbuf, 100, TarHeader.MODELEN);
getOctalBytes(header.userId, outbuf, 108, TarHeader.UIDLEN);
getOctalBytes(header.groupId, outbuf, 116, TarHeader.GIDLEN);
getOctalBytes(header.size, outbuf, 124, TarHeader.SIZELEN);
getOctalBytes(header.modTime, outbuf, 136, TarHeader.MODTIMELEN);
Arrays.fill(outbuf, 148, 148 + TarHeader.CHKSUMLEN, (byte) ' ');
Arrays.fill(outbuf, 329, 329 + TarHeader.USTAR_DEVLEN, (byte) '\0');
Arrays.fill(outbuf, 337, 337 + TarHeader.USTAR_DEVLEN, (byte) '\0');
// Recalculate checksum
getOctalBytes(computeCheckSum(outbuf), outbuf, 148, TarHeader.CHKSUMLEN);
}
/*
* Proper octal to ASCII conversion
* */
private void getOctalBytes(long value, byte[] buf, int offset, int length) {
int idx = length - 1;
buf[offset + idx] = 0;
--idx;
for (long val = value; idx >= 0; --idx) {
buf[offset + idx] = (byte) ((byte) '0' + (byte) (val & 7));
val = val >> 3;
}
}
}

View File

@@ -1,42 +0,0 @@
package com.topjohnwu.magisk.utils;
import android.content.Context;
import com.topjohnwu.magisk.Config;
import com.topjohnwu.magisk.Const;
import com.topjohnwu.magisk.core.R;
import com.topjohnwu.superuser.Shell;
import com.topjohnwu.superuser.ShellUtils;
import com.topjohnwu.superuser.io.SuFile;
import java.io.InputStream;
import androidx.annotation.NonNull;
public class RootUtils extends Shell.Initializer {
public static void rmAndLaunch(String rm, String launch) {
Shell.su(Utils.fmt("(rm_launch %d %s %s)&", Const.USER_ID, rm, launch)).exec();
}
@Override
public boolean onInit(Context context, @NonNull Shell shell) {
Shell.Job job = shell.newJob();
if (shell.isRoot()) {
job.add(context.getResources().openRawResource(R.raw.util_functions))
.add(context.getResources().openRawResource(R.raw.utils));
Const.MAGISK_DISABLE_FILE = new SuFile("/cache/.disable_magisk");
Config.loadMagiskInfo();
} else {
InputStream nonroot = context.getResources().openRawResource(R.raw.nonroot_utils);
job.add(nonroot);
}
job.add("mount_partitions", "get_flags", "run_migrations", "export BOOTMODE=true").exec();
Config.keepVerity = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPVERITY"));
Config.keepEnc = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPFORCEENCRYPT"));
Config.recovery = Boolean.parseBoolean(ShellUtils.fastCmd("echo $RECOVERYMODE"));
return true;
}
}

View File

@@ -1,108 +0,0 @@
package com.topjohnwu.magisk.utils;
import com.topjohnwu.superuser.internal.UiThreadHandler;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.Set;
import androidx.annotation.IntDef;
public class Topic {
public static final int MAGISK_HIDE_DONE = 0;
public static final int MODULE_LOAD_DONE = 1;
public static final int REPO_LOAD_DONE = 2;
public static final int UPDATE_CHECK_DONE = 3;
public static final int LOCALE_FETCH_DONE = 4;
@IntDef({MAGISK_HIDE_DONE, MODULE_LOAD_DONE, REPO_LOAD_DONE,
UPDATE_CHECK_DONE, LOCALE_FETCH_DONE})
@Retention(RetentionPolicy.SOURCE)
public @interface TopicID {}
// We will not dynamically add topics, so use arrays instead of hash tables
private static Store[] topicList = new Store[5];
public static void subscribe(Subscriber sub, @TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
topicList[topic] = new Store();
topicList[topic].subscribers.add(sub);
if (topicList[topic].published) {
sub.onPublish(topic, topicList[topic].results);
}
}
}
public static void subscribe(AutoSubscriber sub) {
subscribe(sub, sub.getSubscribedTopics());
}
public static void unsubscribe(Subscriber sub, @TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].subscribers.remove(sub);
}
}
public static void unsubscribe(AutoSubscriber sub) {
unsubscribe(sub, sub.getSubscribedTopics());
}
public static void publish(@TopicID int topic, Object... results) {
publish(true, topic, results);
}
public static void publish(boolean persist, @TopicID int topic, Object... results) {
if (topicList[topic] == null)
topicList[topic] = new Store();
if (persist) {
topicList[topic].results = results;
topicList[topic].published = true;
}
for (Subscriber sub : topicList[topic].subscribers) {
UiThreadHandler.run(() -> sub.onPublish(topic, results));
}
}
public static void reset(@TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].published = false;
topicList[topic].results = null;
}
}
public static boolean isPublished(@TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
return false;
if (!topicList[topic].published)
return false;
}
return true;
}
public static boolean isPublished(AutoSubscriber sub) {
return isPublished(sub.getSubscribedTopics());
}
private static class Store {
boolean published = false;
Set<Subscriber> subscribers = new HashSet<>();
Object[] results;
}
public interface Subscriber {
void onPublish(int topic, Object[] result);
}
public interface AutoSubscriber extends Subscriber {
@TopicID
int[] getSubscribedTopics();
}
}

View File

@@ -1,7 +0,0 @@
# Magisk Manager
This repo is no longer an independent component. It is merged into the [Magisk Project](https://github.com/topjohnwu/Magisk).
# Translations
The default (English) strings are mainly in `src/full/res/values/strings.xml`; some are scattered in `src/main/res/values/strings.xml` and `src/stub/res/values/strings.xml`.
Translations are highly appreciated via pull requests here on Github.
Place translated XMLs in the corresponding locale folder.

View File

@@ -1,81 +1,66 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
def configProps = new Properties()
def configPath = project.hasProperty('configPath') ? project.configPath : rootProject.file('config.prop')
configProps.load(new FileInputStream(configPath))
kapt {
correctErrorTypes = true
useBuildCache = true
mapDiagnosticLocations = true
javacOptions {
option("-Xmaxerrs", 1000)
}
}
android {
defaultConfig {
applicationId 'com.topjohnwu.magisk'
vectorDrawables.useSupportLibrary = true
}
signingConfigs {
config {
storeFile rootProject.file('release-key.jks')
storePassword configProps['keyStorePass']
keyAlias configProps['keyAlias']
keyPassword configProps['keyPass']
versionName configProps['appVersion']
versionCode configProps['appVersionCode'] as Integer
javaCompileOptions {
annotationProcessorOptions {
argument('butterknife.debuggable', 'false')
}
}
}
buildTypes {
debug {
// If keystore exists, sign the APK with custom signature
if (signingConfigs.config.storeFile.exists())
signingConfig signingConfigs.config
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
flavorDimensions 'mode'
productFlavors {
full {
versionName configProps['appVersion']
versionCode configProps['appVersionCode'] as Integer
javaCompileOptions {
annotationProcessorOptions {
argument('butterknife.debuggable', 'false')
}
}
}
stub {
versionCode 1
versionName 'stub'
}
}
lintOptions {
disable 'MissingTranslation'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':net')
fullImplementation project(':app-core')
fullImplementation 'ru.noties:markwon:2.0.1'
fullImplementation 'com.caverock:androidsvg-aar:1.3'
implementation project(':shared')
implementation project(':signing')
implementation 'com.github.topjohnwu:jtar:1.0.0'
implementation 'net.sourceforge.streamsupport:android-retrostreams:1.7.0'
implementation 'com.github.sevar83:indeterminate-checkbox:1.0.5'
def markwonVersion = '3.0.0'
implementation "ru.noties.markwon:core:${markwonVersion}"
implementation "ru.noties.markwon:html:${markwonVersion}"
implementation "ru.noties.markwon:image-svg:${markwonVersion}"
def androidXVersion = "1.0.0"
implementation 'androidx.core:core:1.0.1'
fullImplementation 'androidx.constraintlayout:constraintlayout:1.1.3'
fullImplementation 'androidx.appcompat:appcompat:1.0.2'
fullImplementation "androidx.preference:preference:${androidXVersion}"
fullImplementation "androidx.recyclerview:recyclerview:${androidXVersion}"
fullImplementation "androidx.cardview:cardview:${androidXVersion}"
fullImplementation "com.google.android.material:material:${androidXVersion}"
fullImplementation 'android.arch.work:work-runtime:1.0.0-beta03'
fullImplementation 'androidx.room:room-runtime:2.0.0'
fullImplementation 'androidx.transition:transition:1.0.1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation "androidx.preference:preference:${androidXVersion}"
implementation "androidx.recyclerview:recyclerview:${androidXVersion}"
implementation "androidx.cardview:cardview:${androidXVersion}"
implementation "com.google.android.material:material:${androidXVersion}"
implementation 'androidx.work:work-runtime:2.0.1'
implementation 'androidx.transition:transition:1.1.0-beta01'
def butterKnifeVersion = '10.0.0'
fullImplementation "com.jakewharton:butterknife-runtime:${butterKnifeVersion}"
fullAnnotationProcessor "com.jakewharton:butterknife-compiler:${butterKnifeVersion}"
def libsuVersion = '2.5.0'
implementation "com.github.topjohnwu.libsu:core:${libsuVersion}"
implementation "com.github.topjohnwu.libsu:io:${libsuVersion}"
def butterKnifeVersion = '10.1.0'
implementation "com.jakewharton:butterknife-runtime:${butterKnifeVersion}"
kapt "com.jakewharton:butterknife-compiler:${butterKnifeVersion}"
}

View File

@@ -29,12 +29,18 @@
void onResponse(int);
}
# DelegateWorker
-keep,allowobfuscation class * extends com.topjohnwu.magisk.model.worker.DelegateWorker
# BootSigner
-keepclassmembers class com.topjohnwu.signer.BootSigner { *; }
-keepclassmembers class com.topjohnwu.signing.BootSigner { *; }
# SVG
-dontwarn com.caverock.androidsvg.SVGAndroidRenderer
# RetroStreams
-dontwarn java9.**
# Strip logging
-assumenosideeffects class com.topjohnwu.magisk.utils.Logger {
public *** debug(...);
@@ -43,4 +49,8 @@
# Excessive obfuscation
-repackageclasses 'a'
-allowaccessmodification
-optimizationpasses 6
# QOL
-dontnote **
-dontwarn com.caverock.androidsvg.**
-dontwarn ru.noties.markwon.**

View File

@@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.topjohnwu.magisk">
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:name="a.e"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="UnusedAttribute,GoogleAppIndexingWarning">
<!-- Activities -->
<activity
android:name="a.b"
android:configChanges="orientation|screenSize"
android:exported="true" />
<activity
android:name="a.c"
android:configChanges="orientation|screenSize"
android:exported="true"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="a.f"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="nosensor"
android:theme="@style/AppTheme.NoDrawer" />
<!-- Superuser -->
<activity
android:name="a.m"
android:directBootAware="true"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:taskAffinity="a.m"
android:theme="@style/SuRequest" />
<!-- Receiver -->
<receiver
android:name="a.h"
android:directBootAware="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCALE_CHANGED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<!-- Service -->
<service android:name="a.j" />
<!-- Hardcode GMS version -->
<meta-data
android:name="com.google.android.gms.version"
android:value="12451000" />
</application>
</manifest>

View File

@@ -1,235 +0,0 @@
package com.topjohnwu.magisk;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.topjohnwu.magisk.components.BaseActivity;
import com.topjohnwu.magisk.container.Policy;
import com.topjohnwu.magisk.utils.FingerprintHelper;
import com.topjohnwu.magisk.utils.SuConnector;
import com.topjohnwu.magisk.utils.Utils;
import java.io.IOException;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import butterknife.BindView;
public class SuRequestActivity extends BaseActivity {
@BindView(R.id.su_popup) LinearLayout suPopup;
@BindView(R.id.timeout) Spinner timeout;
@BindView(R.id.app_icon) ImageView appIcon;
@BindView(R.id.app_name) TextView appNameView;
@BindView(R.id.package_name) TextView packageNameView;
@BindView(R.id.grant_btn) Button grant_btn;
@BindView(R.id.deny_btn) Button deny_btn;
@BindView(R.id.fingerprint) ImageView fingerprintImg;
@BindView(R.id.warning) TextView warning;
private SuConnector connector;
private Policy policy;
private CountDownTimer timer;
private FingerprintHelper fingerprintHelper;
private SharedPreferences timeoutPrefs;
@Override
public int getDarkTheme() {
return R.style.SuRequest_Dark;
}
@Override
public void finish() {
if (timer != null)
timer.cancel();
if (fingerprintHelper != null)
fingerprintHelper.cancel();
super.finish();
}
@Override
public void onBackPressed() {
if (policy != null) {
handleAction(Policy.DENY);
} else {
finish();
}
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
PackageManager pm = getPackageManager();
app.mDB.clearOutdated();
timeoutPrefs = Utils.getDEContext().getSharedPreferences("su_timeout", 0);
// Get policy
Intent intent = getIntent();
try {
String socketName = intent.getStringExtra("socket");
connector = new SuConnector(socketName) {
@Override
protected void onResponse() throws IOException {
out.writeInt(policy.policy);
}
};
Bundle bundle = connector.readSocketInput();
int uid = Integer.parseInt(bundle.getString("uid"));
policy = app.mDB.getPolicy(uid);
if (policy == null) {
policy = new Policy(uid, pm);
}
} catch (IOException | PackageManager.NameNotFoundException e) {
e.printStackTrace();
finish();
return;
}
// Never allow com.topjohnwu.magisk (could be malware)
if (TextUtils.equals(policy.packageName, BuildConfig.APPLICATION_ID)) {
finish();
return;
}
switch ((int) Config.get(Config.Key.SU_AUTO_RESPONSE)) {
case Config.Value.SU_AUTO_DENY:
handleAction(Policy.DENY, 0);
return;
case Config.Value.SU_AUTO_ALLOW:
handleAction(Policy.ALLOW, 0);
return;
case Config.Value.SU_PROMPT:
default:
}
// If not interactive, response directly
if (policy.policy != Policy.INTERACTIVE) {
handleAction();
return;
}
setContentView(R.layout.activity_request);
new SuRequestActivity_ViewBinding(this);
appIcon.setImageDrawable(policy.info.loadIcon(pm));
appNameView.setText(policy.appName);
packageNameView.setText(policy.packageName);
if (Build.VERSION.SDK_INT >= 17) {
warning.setCompoundDrawablesRelativeWithIntrinsicBounds(
AppCompatResources.getDrawable(this, R.drawable.ic_warning), null, null, null);
} else {
warning.setCompoundDrawablesWithIntrinsicBounds(
AppCompatResources.getDrawable(this, R.drawable.ic_warning), null, null, null);
}
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.allow_timeout, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
timeout.setAdapter(adapter);
timeout.setSelection(timeoutPrefs.getInt(policy.packageName, 0));
timer = new CountDownTimer((int) Config.get(Config.Key.SU_REQUEST_TIMEOUT) * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
deny_btn.setText(getString(R.string.deny_with_str, "(" + millisUntilFinished / 1000 + ")"));
}
@Override
public void onFinish() {
deny_btn.setText(getString(R.string.deny_with_str, "(0)"));
handleAction(Policy.DENY);
}
};
boolean useFP = FingerprintHelper.useFingerprint();
if (useFP) {
try {
fingerprintHelper = new FingerprintHelper() {
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
warning.setText(errString);
}
@Override
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
warning.setText(helpString);
}
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
handleAction(Policy.ALLOW);
}
@Override
public void onAuthenticationFailed() {
warning.setText(R.string.auth_fail);
}
};
fingerprintHelper.authenticate();
} catch (Exception e) {
e.printStackTrace();
useFP = false;
}
}
if (!useFP) {
grant_btn.setOnClickListener(v -> {
handleAction(Policy.ALLOW);
timer.cancel();
});
grant_btn.requestFocus();
}
grant_btn.setVisibility(useFP ? View.GONE : View.VISIBLE);
fingerprintImg.setVisibility(useFP ? View.VISIBLE : View.GONE);
deny_btn.setOnClickListener(v -> {
handleAction(Policy.DENY);
timer.cancel();
});
suPopup.setOnClickListener(v -> cancelTimeout());
timeout.setOnTouchListener((v, event) -> cancelTimeout());
timer.start();
}
private boolean cancelTimeout() {
timer.cancel();
deny_btn.setText(getString(R.string.deny));
return false;
}
private void handleAction() {
connector.response();
finish();
}
private void handleAction(int action) {
int pos = timeout.getSelectedItemPosition();
timeoutPrefs.edit().putInt(policy.packageName, pos).apply();
handleAction(action, Config.Value.TIMEOUT_LIST[pos]);
}
private void handleAction(int action, int time) {
policy.policy = action;
if (time >= 0) {
policy.until = (time == 0) ? 0 : (System.currentTimeMillis() / 1000 + time * 60);
app.mDB.updatePolicy(policy);
}
handleAction();
}
}

View File

@@ -1,169 +0,0 @@
package com.topjohnwu.magisk.adapters;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.topjohnwu.magisk.Const;
import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.utils.Topic;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.superuser.Shell;
import com.topjohnwu.superuser.internal.UiThreadHandler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
public class ApplicationAdapter extends RecyclerView.Adapter<ApplicationAdapter.ViewHolder> {
private static PackageInfo PLATFORM;
private List<PackageInfo> fullList, showList;
private List<String> hideList;
private PackageManager pm;
private boolean showSystem;
public ApplicationAdapter(Context context) {
fullList = showList = Collections.emptyList();
hideList = Collections.emptyList();
pm = context.getPackageManager();
showSystem = false;
if (PLATFORM == null) {
try {
PLATFORM = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
} catch (PackageManager.NameNotFoundException ignored) {}
}
AsyncTask.SERIAL_EXECUTOR.execute(this::loadApps);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_app, parent, false);
return new ViewHolder(v);
}
@WorkerThread
private void loadApps() {
fullList = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
hideList = Shell.su("magiskhide --ls").exec().getOut();
for (Iterator<PackageInfo> i = fullList.iterator(); i.hasNext(); ) {
PackageInfo info = i.next();
if (Const.HIDE_BLACKLIST.contains(info.packageName) ||
/* Do not show disabled apps */
!info.applicationInfo.enabled ||
/* Never show platform apps */
PLATFORM.signatures[0].equals(info.signatures[0])) {
i.remove();
}
}
Collections.sort(fullList, (a, b) -> {
boolean ah = hideList.contains(a.packageName);
boolean bh = hideList.contains(b.packageName);
if (ah == bh) {
return Utils.getAppLabel(a.applicationInfo, pm)
.compareToIgnoreCase(Utils.getAppLabel(b.applicationInfo, pm));
} else if (ah) {
return -1;
} else {
return 1;
}
});
Topic.publish(false, Topic.MAGISK_HIDE_DONE);
}
public void setShowSystem(boolean b) {
showSystem = b;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ApplicationInfo info = showList.get(position).applicationInfo;
holder.appIcon.setImageDrawable(info.loadIcon(pm));
holder.appName.setText(Utils.getAppLabel(info, pm));
holder.appPackage.setText(info.packageName);
holder.checkBox.setOnCheckedChangeListener(null);
holder.checkBox.setChecked(hideList.contains(info.packageName));
holder.checkBox.setOnCheckedChangeListener((v, isChecked) -> {
if (isChecked) {
Shell.su("magiskhide --add " + info.packageName).submit();
hideList.add(info.packageName);
} else {
Shell.su("magiskhide --rm " + info.packageName).submit();
hideList.remove(info.packageName);
}
});
}
@Override
public int getItemCount() {
return showList.size();
}
private boolean contains(String s, String filter) {
return s.toLowerCase().contains(filter);
}
// Show if have launch intent or not system app
private boolean systemFilter(PackageInfo info) {
if (showSystem)
return true;
return (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 ||
pm.getLaunchIntentForPackage(info.packageName) != null;
}
public void filter(String constraint) {
AsyncTask.SERIAL_EXECUTOR.execute(() -> {
showList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
for (PackageInfo info : fullList) {
if (systemFilter(info))
showList.add(info);
}
} else {
String filter = constraint.toLowerCase();
for (PackageInfo info : fullList) {
if ((contains(Utils.getAppLabel(info.applicationInfo, pm), filter) ||
contains(info.packageName, filter)) && systemFilter(info)) {
showList.add(info);
}
}
}
UiThreadHandler.run(this::notifyDataSetChanged);
});
}
public void refresh() {
AsyncTask.SERIAL_EXECUTOR.execute(this::loadApps);
}
static class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.app_icon) ImageView appIcon;
@BindView(R.id.app_name) TextView appName;
@BindView(R.id.package_name) TextView appPackage;
@BindView(R.id.checkbox) CheckBox checkBox;
ViewHolder(View itemView) {
super(itemView);
new ApplicationAdapter$ViewHolder_ViewBinding(this, itemView);
}
}
}

View File

@@ -1,100 +0,0 @@
package com.topjohnwu.magisk.components;
import android.app.Service;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.widget.Toast;
import com.topjohnwu.magisk.ClassMap;
import com.topjohnwu.magisk.Const;
import com.topjohnwu.magisk.FlashActivity;
import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.container.Repo;
import com.topjohnwu.magisk.uicomponents.ProgressNotification;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.net.Networking;
import com.topjohnwu.superuser.Shell;
import com.topjohnwu.superuser.ShellUtils;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import androidx.annotation.Nullable;
public class DownloadModuleService extends Service {
private boolean running = false;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (flags == 0 && running) {
Utils.toast(R.string.dl_one_module, Toast.LENGTH_LONG);
} else {
running = true;
Shell.EXECUTOR.execute(() -> {
Repo repo = intent.getParcelableExtra("repo");
boolean install = intent.getBooleanExtra("install", false);
dlProcessInstall(repo, install);
stopSelf();
});
}
return START_REDELIVER_INTENT;
}
private void dlProcessInstall(Repo repo, boolean install) {
File output = new File(Const.EXTERNAL_PATH, repo.getDownloadFilename());
ProgressNotification progress = new ProgressNotification(output.getName());
startForeground(progress.hashCode(), progress.getNotification());
try {
InputStream in = Networking.get(repo.getZipUrl())
.setDownloadProgressListener(progress)
.execForInputStream().getResult();
removeTopFolder(in, new BufferedOutputStream(new FileOutputStream(output)));
if (install) {
progress.dismiss();
Intent intent = new Intent(this, ClassMap.get(FlashActivity.class));
intent.setData(Uri.fromFile(output))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP);
startActivity(intent);
} else {
progress.dlDone();
}
} catch (Exception e) {
e.printStackTrace();
progress.dlFail();
}
}
private void removeTopFolder(InputStream in, OutputStream out) throws IOException {
try (ZipInputStream zin = new ZipInputStream(in);
ZipOutputStream zout = new ZipOutputStream(out)) {
ZipEntry entry;
int off = -1;
while ((entry = zin.getNextEntry()) != null) {
if (off < 0)
off = entry.getName().indexOf('/') + 1;
String path = entry.getName().substring(off);
if (path.isEmpty())
continue;
zout.putNextEntry(new ZipEntry(path));
if (!entry.isDirectory())
ShellUtils.pump(zin, zout);
}
}
}
}

View File

@@ -1,103 +0,0 @@
package com.topjohnwu.magisk.uicomponents;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import com.caverock.androidsvg.SVG;
import com.topjohnwu.magisk.App;
import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.net.Networking;
import com.topjohnwu.net.ResponseListener;
import com.topjohnwu.signing.ByteArrayStream;
import com.topjohnwu.superuser.ShellUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.Callable;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import ru.noties.markwon.Markwon;
import ru.noties.markwon.SpannableConfiguration;
import ru.noties.markwon.spans.AsyncDrawable;
public class MarkDownWindow {
private static final SpannableConfiguration config = SpannableConfiguration.builder(App.self)
.asyncDrawableLoader(new Loader()).build();
public static void show(Activity activity, String title, String url) {
Networking.get(url).getAsString(new Listener(activity, title));
}
public static void show (Activity activity, String title, InputStream is) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ShellUtils.pump(is, baos);
new Listener(activity, title).onResponse(baos.toString());
} catch (IOException ignored) {}
}
static class Listener implements ResponseListener<String> {
Activity activity;
String title;
Listener(Activity a, String t) {
activity = a;
title = t;
}
@Override
public void onResponse(String md) {
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setTitle(title);
View mv = LayoutInflater.from(activity).inflate(R.layout.markdown_window, null);
Markwon.setMarkdown(mv.findViewById(R.id.md_txt), config, md);
alert.setView(mv);
alert.setNegativeButton(R.string.close, (dialog, id) -> dialog.dismiss());
alert.show();
}
}
static class Loader implements AsyncDrawable.Loader {
@Override
public void load(@NonNull String url, @NonNull AsyncDrawable asyncDrawable) {
App.THREAD_POOL.submit((Callable<?>) () -> {
InputStream is = Networking.get(url).execForInputStream().getResult();
if (is == null)
return null;
ByteArrayStream buf = new ByteArrayStream();
buf.readFrom(is);
// First try default drawables
Drawable drawable = Drawable.createFromStream(buf.getInputStream(), "");
if (drawable == null) {
// SVG
SVG svg = SVG.getFromInputStream(buf.getInputStream());
int width = Utils.dpInPx((int) svg.getDocumentWidth());
int height = Utils.dpInPx((int) svg.getDocumentHeight());
final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
final Canvas canvas = new Canvas(bitmap);
float density = App.self.getResources().getDisplayMetrics().density;
canvas.scale(density, density);
svg.renderToCanvas(canvas);
drawable = new BitmapDrawable(App.self.getResources(), bitmap);
}
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
asyncDrawable.setResult(drawable);
return null;
});
}
@Override
public void cancel(@NonNull String url) {}
}
}

View File

@@ -1,53 +0,0 @@
package com.topjohnwu.magisk.utils;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;
import com.topjohnwu.magisk.ClassMap;
import com.topjohnwu.magisk.Config;
import com.topjohnwu.magisk.Const;
import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.components.UpdateCheckService;
import com.topjohnwu.magisk.tasks.CheckUpdates;
import java.util.concurrent.TimeUnit;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
public class AppUtils {
public static void scheduleUpdateCheck() {
if (Config.get(Config.Key.CHECK_UPDATES)) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest request = new PeriodicWorkRequest
.Builder(ClassMap.get(UpdateCheckService.class), 12, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork(
Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID,
ExistingPeriodicWorkPolicy.REPLACE, request);
} else {
WorkManager.getInstance().cancelUniqueWork(Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID);
CheckUpdates.check();
}
}
public static void openLink(Context context, Uri link) {
Intent intent = new Intent(Intent.ACTION_VIEW, link);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(intent);
} else {
Utils.toast(R.string.open_link_failed_toast, Toast.LENGTH_SHORT);
}
}
}

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"/>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#757575"
android:pathData="M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z"/>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M13,7h-2v2h2L13,7zM13,11h-2v6h2v-6zM17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14z"/>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#757575"
android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z"/>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#757575"
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
</vector>

File diff suppressed because one or more lines are too long

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0" >
<path
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2c-1.1,0 -2,0.9 -2,2S10.9,8 12,8zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2c1.1,0 2,-0.9 2,-2S13.1,10 12,10zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2c1.1,0 2,-0.9 2,-2S13.1,16 12,16z"
android:fillColor="#757575"/>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#757575"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

View File

@@ -1,8 +0,0 @@
# v7.0.0
- Major UI redesign!
- Render Markdown natively (no more buggy WebView!)
- Support down to Android 4.1 (native Magisk only support Android 4.2 though)
- Significantly improve Magisk log disply performance
- Fix post OTA scripts for A/B devices
- Reduce memory usages when verifying and signing boot image
- Drop support for Magisk lower than v18.0

View File

@@ -1,189 +0,0 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<resources>
<string name="advanced_settings_title">إعدادات متقدمة</string>
<string name="app_changelog">تغييرات التطبيق</string>
<string name="app_translators">مترجم التطبيق</string>
<string name="author">انشئ بواسطة %1$s</string>
<string name="auto_response">استجابة تلقائية</string>
<string name="checking_for_updates">البحث عن تحديثات…</string>
<string name="checking_safetyNet_status">التحقق من حالة SafetyNet…</string>
<string name="close">إغلاق</string>
<string name="command">الأمر: %1$s</string>
<string name="deny">رفض</string>
<string name="deny_with_str">رفض%1$s</string>
<string name="disable_file_created">سيتم تعطيل الإضافة في إعادة التشغيل التالي</string>
<string name="disable_file_removed">سيتم تمكين الإضافة في إعادة التشغيل التالي</string>
<string name="download">التنزيل</string>
<string name="downloads">التنزيلات</string>
<string name="forever">للابد</string>
<string name="grant">سماح</string>
<string name="install">التثبيت</string>
<string name="installed">مثبت</string>
<string name="internal_storage">"يتم تخزين الملف المضغوط في:
[التخزين الداخلي]%1$s"</string>
<string name="keep_dm_verity">إبقاء AVB 2.0/dm-verity</string>
<string name="keep_force_encryption">الحفاظ علي قوه التشفير</string>
<string name="log">السجل</string>
<string name="log_is_empty">السجل فارغ</string>
<string name="logs_cleared">تم حذف السجل بنجاح</string>
<string name="magisk_update_title">تحديث Magisk جديد متوفر!</string>
<string name="magisk_version_error">Magisk غير مثبت</string>
<string name="menuClearLog">حذف السجل الآن</string>
<string name="menuReload">إعادة تحميل</string>
<string name="modules">الإضافات</string>
<string name="multiuser_mode">وضع تعدد المستخدمين</string>
<string name="no_apps_found">لا توجد تطبيقات</string>
<string name="no_info_provided">(لم يتم توفير أي معلومات)</string>
<string name="no_modules_found">لم يعثر على الإضافات</string>
<string name="none">بدون</string>
<string name="not_installed">غير مثبت</string>
<string name="once">مرة</string>
<string name="owner_manage_summary">يمكن للمالك فقط إدارة صلاحيات الروت وتلقي مطالبات الطلب</string>
<string name="owner_only_summary">المالك فقط لديه صلاحيات الروت</string>
<string name="prompt">طلب</string>
<string name="reboot">إعادة التشغيل</string>
<string name="release_notes">ملاحظات الإصدار</string>
<string name="remove_file_created">سيتم حذف الإضافة في إعادة التشغيل التالي</string>
<string name="remove_file_deleted">لن يتم حذف الإضافة في إعادة التشغيل التالي</string>
<string name="repo_cache_cleared">تم مسح الذاكرة المؤقته للمستودع</string>
<string name="repo_install_msg">هل تريد تثبيت %1$s ?</string>
<string name="repo_install_title">تثبيت %1$s</string>
<string name="request_timeout">مهلة الطلب</string>
<string name="request_timeout_summary">%1$d ثانية</string>
<string name="safetyNet_check_success">نجح فحص SafetyNet</string>
<string name="safetyNet_check_text">انقر لبدء فحص SafetyNet</string>
<string name="safetyNet_res_invalid">الاستجابة غير صالحه</string>
<string name="settings">الإعدادات</string>
<string name="settings_clear_cache_summary">حذف المعلومات المخزنة مؤقتا للمستودع على الانترنت، يجبر التطبيق لتحديث عبر الانترنت</string>
<string name="settings_clear_cache_title">حذف الذاكرة المؤقتة للمستودع</string>
<string name="settings_core_only_summary">تمكين الميزات الأساسية فقط، لن يتم تحميل جميع الإضافات. MagiskSU، MagiskHide، systemless hosts، و لا يزال ممكنا</string>
<string name="settings_core_only_title">Magisk الوضع الأساسي فقط</string>
<string name="settings_dark_theme_summary">تفعيل السمة الغامقة</string>
<string name="settings_dark_theme_title">السمة الغامقة</string>
<string name="settings_general_category">عام</string>
<string name="settings_hosts_summary">Systemless يدعم تطبيقات حجب الإعلانات</string>
<string name="settings_hosts_title">تمكين المضيفين(الهوست) لـ systemless</string>
<string name="settings_magiskhide_summary">إخفاء Magisk من مختلف الاكتشافات</string>
<string name="settings_owner_manage">إدارة مالك الجهاز</string>
<string name="settings_owner_only">مالك الجهاز فقط</string>
<string name="settings_reboot_toast">إعادة التشغيل لتطبيق الإعدادات</string>
<string name="settings_su_adb">ADB فقط</string>
<string name="settings_su_app">التطبيقات فقط</string>
<string name="settings_su_app_adb">التطبيقات و ADB</string>
<string name="settings_su_disable">معطل</string>
<string name="settings_su_request_10">10 ثواني</string>
<string name="settings_su_request_20">20 ثانية</string>
<string name="settings_su_request_30">30 ثانية</string>
<string name="settings_su_request_60">60 ثانية</string>
<string name="settings_user_independent">مستخدم مستقل</string>
<string name="sixtymin">60 دقائق</string>
<string name="su_allow_toast">%1$s يتم منح صلاحيات Superuser</string>
<string name="su_deny_toast">%1$s يتم رفض صلاحيات Superuser</string>
<string name="su_request_title">Superuser طلبات</string>
<string name="su_revoke_msg">تأكيد لسحب صلاحيات %1$s ?</string>
<string name="su_revoke_title">سحب؟</string>
<string name="su_snack_deny">Superuser الصلاحيات لـ %1$s تم رفضها</string>
<string name="su_snack_grant">Superuser الصلاحيات لـ %1$s تم منحها</string>
<string name="su_snack_log_off">السجلات لـ %1$s تم تعطيلها</string>
<string name="su_snack_log_on">السجلات لـ %1$s تم تفعيلها</string>
<string name="su_snack_notif_off">الإشعارات لـ %1$s تم تعطيلها</string>
<string name="su_snack_notif_on">الإشعارات لـ %1$s تم تفعيلها</string>
<string name="su_snack_revoke">%1$s الصلاحيات سحبت</string>
<string name="su_warning">"منح حق الوصول الكامل إلى جهازك.
رفض إذا كنت غير متأكد!"</string>
<string name="superuser">Superuser</string>
<string name="superuser_access">Superuser صلاحيات</string>
<string name="superuser_notification">Superuser إشعارات</string>
<string name="target_uid">الهدف UID: %1$d</string>
<string name="tenmin">10 دقائق</string>
<string name="thirtymin">30 دقائق</string>
<string name="toast">ملاحظة منبثقة</string>
<string name="translators">xx6600xx ,silent_6600</string>
<string name="twentymin">20 دقائق</string>
<string name="uninstall">إلغاء التثبيت</string>
<string name="uninstall_magisk_title">إلغاء تثبيت Magisk</string>
<string name="update_available">يتوفر تحديث</string>
<string name="update_file_created">سيتم تحديث الإضافة في إعادة التشغيل التالي</string>
<string name="user_indepenent_summary">كل مستخدم لديه قواعد روت منفصلة خاصة به</string>
<string name="android_o_not_support">لا يدعم إصدار الأندرويد +8.0</string>
<string name="auth_fail">فشل المصادقة</string>
<string name="auth_fingerprint">مصادقة البصمة</string>
<string name="boot_file_patch_msg">حدد الذاكرة المؤقتة لنسخة boot الأصلية بتنسيق img. أو .img.tar</string>
<string name="complete_uninstall">إلغاء التثبيت بالكامل</string>
<string name="direct_install">تثبيت مباشر (موصى به)</string>
<string name="disable_fingerprint">لم يتم تعيين بصمات الأصابع أو لا يوجد جهاز مدعوم</string>
<string name="download_zip_only">تحميل ملف zip فقط</string>
<string name="dtbo_patched_reboot">قام مدير Magisk بتصحيح dtbo.img ، يرجى إعادة التشغيل</string>
<string name="dtbo_patched_title">تم تصحيح DTBO!</string>
<string name="env_fix_msg">يحتاج جهازك إلى إعداد إضافي لـ Magisk للعمل بشكل صحيح. سيتم تنزيل ملف zip لتثبيت Magisk ، هل تريد المتابعة الآن؟</string>
<string name="env_fix_title">يتطلب إعداد إضافي</string>
<string name="flashing">التثبيت</string>
<string name="global_summary">تستخدم كافة جلسات الجذر مساحة الأسم ذات التركيب العالمي</string>
<string name="hide_manager_fail_toast">فشل إخفاء مدير Magisk …</string>
<string name="hide_manager_title">إخفاء مدير Magisk…</string>
<string name="install_inactive_slot">التثبيت على فتحة غير نشطة (بعد OTA)</string>
<string name="install_inactive_slot_msg">"سيتم إجبار جهازك للتمهيد على الفتحة غير النشطة الحالية بعد إعادة التشغيل!
فقط استخدام هذا الخيار بعد الانتهاء من OTA.
استمرار؟"</string>
<string name="invalid_update_channel">قناة تحديث غير صالحة</string>
<string name="isolate_summary">سيكون لكل جلسة جذر مساحة الاسم الخاصة بها معزولة</string>
<string name="language">اللغة</string>
<string name="update_channel">تحديثات Magisk</string>
<string name="manager_download_install">اضغط للتنزيل والتثبيت</string>
<string name="manager_update_title">تحديث مدير Magisk الجديد متوفر!</string>
<string name="menuSaveLog">حفظ السجل</string>
<string name="mount_namespace_mode">وضع تركيب مساحة الأسم</string>
<string name="open_link_failed_toast">لم يتم العثور على تطبيق لفتح الرابط …</string>
<string name="patch_boot_file">تصحيح ملف صورة boot</string>
<string name="proprietary_notice">مدير Magisk هو FOSS ، والذي لا يحتوي على شفرة API الخاصة بشركة SafetyNet الخاصة بشركة Google.
هل تسمح لـ Magisk Manager بتنزيل ملحق (يحتوي على GoogleApiClient) لعمليات التحقق من SafetyNet؟ "</string>
<string name="proprietary_title">تحميل رمز الملكية</string>
<string name="reboot_bootloader">إعادة تمهيد إلى وضع Bootloader</string>
<string name="reboot_download">إعادة تمهيد إلى وضع التحميل</string>
<string name="reboot_recovery">إعادة تمهيد إلى وضع الإسترداد</string>
<string name="requester_summary">"سترث جلسات الجذر مساحة الأسماء المطلوبة الخاصة بها"</string>
<string name="restore_done">تمت الأستعادة!</string>
<string name="restore_fail">النسخ الاحتياطي الأصلي غير موجود!</string>
<string name="restore_img">استعادة الصور</string>
<string name="restore_img_msg">الأستعادة …</string>
<string name="safetyNet_api_error">خطأ SafetyNet API</string>
<string name="select_method">حدد الطريقة</string>
<string name="settings_boot_format_summary">"حدد تنسيق ملف boot المصحح للإخراج.
اختر img. للتثبيت من خلال وضع fastboot/ التحميل ؛ اختر img.tar. للتثبيت مع ODIN. "</string>
<string name="settings_boot_format_title">تنسيق إخراج ملف Boot المصحح</string>
<string name="settings_check_update_summary">التحقق من التحديثات في الخلفية بشكل دوري</string>
<string name="settings_check_update_title">تفقد التحديث</string>
<string name="settings_hide_manager_summary">أعد حزم مدير Magisk مع اسم حزمة عشوائية</string>
<string name="settings_hide_manager_title">إخفاء مدير Magisk</string>
<string name="settings_ns_global">مساحة الاسم العالمية</string>
<string name="settings_ns_isolate">مساحة الاسم المعزولة</string>
<string name="settings_ns_requester">وراثة مساحة الاسم</string>
<string name="settings_restore_manager_summary">استعادة مدير Magisk مع الحزمة الأصلية</string>
<string name="settings_restore_manager_title">استعادة مدير Magisk</string>
<string name="settings_su_fingerprint_summary">أستخدام ماسح بصمات الأصابع للسماح بطلبات المستخدم المتميز</string>
<string name="settings_su_fingerprint_title">تمكين مصادقة البصمة</string>
<string name="settings_su_reauth_summary">أعد المصادقة على صلاحيات المستخدم المتميز بعد إجراء ترقيات للتطبيق</string>
<string name="settings_su_reauth_title">إعادة المصادقة بعد الترقية</string>
<string name="settings_update">تحديث الاعدادات</string>
<string name="settings_update_beta">بيتا</string>
<string name="settings_update_channel_title">قناة التحديث</string>
<string name="settings_update_custom">مخصص</string>
<string name="settings_update_custom_msg">أدخل عنوان URL مخصص</string>
<string name="settings_update_stable">مستقر</string>
<string name="setup_done">تم الإعداد</string>
<string name="setup_fail">فشل الإعداد</string>
<string name="setup_msg">تشغيل إعداد البيئة…</string>
<string name="setup_title">إعداد إضافي</string>
<string name="sort_by_name">الترتيب حسب الاسم</string>
<string name="sort_by_update">فرز حسب آخر تحديث</string>
<string name="sorting_order">ترتيب الفرز</string>
<string name="system_default">(أفتراضي النظام)</string>
<string name="uninstall_magisk_msg">سيتم تعطيل/إزالة جميع الوحدات. ستتم إزالة الجذر ، وربما تشفير بياناتك إذا كانت بياناتك غير مشفرة حالياً</string>
<string name="update">تحديث</string>
<string name="updated_on">تم التحديث في: %1$s</string>
<string name="warning">تحذير</string>
<string name="downloading_toast">جاري التنزيل %1$s</string>
<string name="download_file_error">خطأ تنزيل الملف</string>
<string name="no_rw_storage">أن هذه الميزة لا تعمل دون الحصول على إذن الكتابة على التخزين الخارجي.</string>
</resources>

View File

@@ -1,212 +0,0 @@
<resources>
<!--Welcome Activity-->
<string name="modules">Модули</string>
<string name="downloads">Изтегляния</string>
<string name="superuser">Superuser</string>
<string name="log">Дневник</string>
<string name="settings">Настройки</string>
<string name="install">Инсталиране</string>
<!--Status Fragment-->
<string name="magisk_version_error">Magisk не е инсталиран.</string>
<string name="checking_for_updates">Проверяваме за актуализации…</string>
<string name="invalid_update_channel">Невалиден канал за актуализации</string>
<string name="safetyNet_check_text">Докоснете за стартиране на SafetyNet проверката.</string>
<string name="checking_safetyNet_status">Проверка статуса на SafetyNet…</string>
<string name="safetyNet_check_success">SafetyNet проверката е успешна.</string>
<string name="safetyNet_api_error">Грешка в SafetyNet ППИ</string>
<string name="safetyNet_res_invalid">Невалиден отговор</string>
<!--Install Fragment-->
<string name="advanced_settings_title">Допълнителни настройки</string>
<string name="keep_force_encryption">Запазване на наложеното криптиране</string>
<string name="keep_dm_verity">Запазване на AVB 2.0/dm-verity</string>
<string name="current_installed">Инсталирана: %1$s</string>
<string name="latest_version">Най-нова: %1$s</string>
<string name="uninstall">Деинсталиране</string>
<string name="uninstall_magisk_title">Деинсталиране на Magisk</string>
<string name="uninstall_magisk_msg">Всички модули ще бъдат изключени/премахнати. Руут достъпът ще бъде премахнат и е възможно криптиране на данните Ви.</string>
<string name="update">Актуализация</string>
<!--Module Fragment-->
<string name="no_info_provided">(Не е представена информация)</string>
<string name="no_modules_found">Няма намерени модули.</string>
<string name="update_file_created">Модулът ще бъде обновен при следващото рестартиране.</string>
<string name="remove_file_created">Модулът ще бъде премахнат при следващото рестартиране.</string>
<string name="remove_file_deleted">Модулът няма да бъде премахнат при следващото рестартиране.</string>
<string name="disable_file_created">Модулът ще бъде изключен при следващото рестартиране.</string>
<string name="disable_file_removed">Модулът ще бъде активиран при следващото рестартиране.</string>
<string name="author">Създаден от %1$s</string>
<string name="reboot_recovery">Рестартиране в режима за възстановяване</string>
<string name="reboot_bootloader">Рестартиране в буутлоудъра</string>
<string name="reboot_download">Рестартиране в даунлоуд режима</string>
<!--Repo Fragment-->
<string name="update_available">Налице е актуализация.</string>
<string name="installed">Инсталирани</string>
<string name="not_installed">Не са инсталирани</string>
<string name="updated_on">Актуализиран на: %1$s</string>
<string name="sorting_order">Сортиране</string>
<string name="sort_by_name">Сортиране по наименование</string>
<string name="sort_by_update">Сортиране по последно обновяване</string>
<!--Log Fragment-->
<string name="menuSaveLog">Запазване на доклад</string>
<string name="menuReload">Презареждане</string>
<string name="menuClearLog">Изчистване на дневника</string>
<string name="logs_cleared">Успешно изчистване на дневника.</string>
<string name="log_is_empty">Дневникът е празен.</string>
<!--About Activity-->
<string name="app_changelog">Списък с промени</string>
<string name="translators" />
<string name="app_translators">Преводачи</string>
<!--Toasts, Dialogs-->
<string name="close">Затваряне</string>
<string name="repo_install_title">Инсталиране на %1$s</string>
<string name="repo_install_msg">Желаете ли да инсталирате %1$s сега?</string>
<string name="download">Изтегляне</string>
<string name="reboot">Рестартиране</string>
<string name="magisk_update_title">Налице е нова версия на Magisk.</string>
<string name="settings_reboot_toast">Трябва да рестартирате устройството, за да бъдат приложени настройките.</string>
<string name="release_notes">Бележки</string>
<string name="repo_cache_cleared">Кешът на хранилището е изчистен.</string>
<string name="internal_storage">Архивът е записан във:\n[Вътрешната памет]%1$s.</string>
<string name="manager_update_title">Налице е нова версия на Magisk Manager.</string>
<string name="manager_download_install">Докоснете за изтегляне и инсталиране.</string>
<string name="dtbo_patched_title">DTBO беше модифициран!</string>
<string name="dtbo_patched_reboot">Magisk Manager модифицира dtbo.img, моля да рестартирате устройството.</string>
<string name="update_channel">Актуализации на Magisk</string>
<string name="flashing">Инсталиране</string>
<string name="hide_manager_title">Скриване на Magisk Manager…</string>
<string name="hide_manager_fail_toast">Скриването на Magisk Manager бе неуспешно.</string>
<string name="open_link_failed_toast">Не бе намерено приложение за отваряне на линка.</string>
<string name="download_zip_only">Изтегляне само на архив</string>
<string name="patch_boot_file">Модифициране на Boot образа</string>
<string name="direct_install">Директно инсталиране (Препоръчва се.)</string>
<string name="install_inactive_slot">Инсталиране на неактивен слот (След OTA)</string>
<string name="warning">Внимание</string>
<string name="install_inactive_slot_msg">Вашето устройство НАЛОЖИТЕЛНО ще стартира текущия неактивен слот при следващото рестартиране.\nИзползвайте тази опция само след като приключи инсталирането на OTA.\nПродължаване?</string>
. <string name="select_method">Избор на метод</string>
<string name="boot_file_patch_msg">Изберете стоков boot образ с формат .img или .img.tar.</string>
<string name="complete_uninstall">Пълно деинсталиране</string>
<string name="restore_img">Възстановяване на образи</string>
<string name="restore_img_msg">Възстановяване…</string>
<string name="restore_done">Възстановяването е успешно!</string>
<string name="restore_fail">Не е налице архив на стоковия образ!</string>
<string name="proprietary_title">Изтегляне на патентования код</string>
<string name="proprietary_notice">Magisk Manager е FOSS и затова не включва патентования код за SafetyNet ППИ на Google.\n\nПозволявате ли на Magisk Manager да изтегли добавката (включва GoogleApiClient) за SafetyNet проверки?</string>
<string name="setup_done">Първоначалната настройка е готова.</string>
<string name="setup_fail">Първоначалната настройка е неуспешна.</string>
<string name="env_fix_title">Изисква допълнително настройване</string>
<string name="env_fix_msg">Вашето устройство се нуждае от допълнително надстройване на Magisk, за да работи нормално. Ще бъде изтеглен архивът за надстройка на Magisk. Желаете ли да продължите?</string>
<string name="setup_title">Допълнително надстройване</string>
<string name="setup_msg">Надстройването на средата е в ход…</string>
<string name="download_file_error">Грешка при изтеглянето на файла.</string>
<string name="downloading_toast">Изтегляне на %1$s</string>
<string name="no_rw_storage">Тази функция няма да работи без разрешение за запис във външната памет.</string>
<!--Settings Activity -->
<string name="settings_general_category">Общи</string>
<string name="settings_dark_theme_title">Тъмна тема</string>
<string name="settings_dark_theme_summary">Включване на тъмната тема</string>
<string name="settings_clear_cache_title">Изчистване кеша на хранилището</string>
<string name="settings_clear_cache_summary">Изчистване на кешираната информация на онлайн хранилището за принудителното му обновяване.</string>
<string name="settings_hide_manager_title">Скриване на Magisk Manager</string>
<string name="settings_hide_manager_summary">Смяна пакетното наименование на Magisk Manager със случайно наименование.</string>
<string name="settings_restore_manager_title">Възстановяване на Magisk Manager</string>
<string name="settings_restore_manager_summary">Възстановяване на оригиналното пакетно наименование на Magisk Manager.</string>
<string name="language">Език</string>
<string name="system_default">(Системен)</string>
<string name="settings_update">Настройки за актуализиране</string>
<string name="settings_check_update_title">Проверка за актуализации</string>
<string name="settings_check_update_summary">Периодично проверяване за актуализации във фонов режим.</string>
<string name="settings_update_channel_title">Канал за актуализации</string>
<string name="settings_update_stable">Стабилен</string>
<string name="settings_update_beta">Бета</string>
<string name="settings_update_custom">Потребителски</string>
<string name="settings_update_custom_msg">Въведете потребителски URL</string>
<string name="settings_boot_format_title">Изходен формат за модифициран boot образ</string>
<string name="settings_boot_format_summary">Избор на изходен формат за модифициран boot образ.\nИзберете .img за инсталиране чрез fastboot/даунлоуд режима; изберете .img.tar за инсталиране чрез ODIN.</string>
<string name="settings_core_only_title">Режим Magisk Core Only</string>
<string name="settings_core_only_summary">Работят само основни функции, като MagiskSU и MagiskHide, без всякакви модули.</string>
<string name="settings_magiskhide_summary">Скриване на Magisk от различни детектори.</string>
<string name="settings_hosts_title">Несистемни хостове</string>
<string name="settings_hosts_summary">Поддръжка на несистемни хостове за използване на приложения, блокиращи реклами.</string>
<string name="settings_hosts_toast">Бе добавен модул с несистемни хостове.</string>
<string name="settings_su_app_adb">Приложения и ADB</string>
<string name="settings_su_app">Само приложения</string>
<string name="settings_su_adb">Само ADB</string>
<string name="settings_su_disable">Изключен</string>
<string name="settings_su_request_10">10 секунди</string>
<string name="settings_su_request_15">15 секунди</string>
<string name="settings_su_request_20">20 секунди</string>
<string name="settings_su_request_30">30 секунди</string>
<string name="settings_su_request_45">45 секунди</string>
<string name="settings_su_request_60">60 секунди</string>
<string name="superuser_access">Superuser достъп</string>
<string name="auto_response">Автоматичен отговор</string>
<string name="request_timeout">Време за запитване</string>
<string name="superuser_notification">Superuser известие</string>
<string name="request_timeout_summary">%1$d секунди</string>
<string name="settings_su_reauth_title">Повторно запитване след актуализация</string>
<string name="settings_su_reauth_summary">Повторно запитване за Superuser достъп след актуализация на приложенията.</string>
<string name="settings_su_fingerprint_title">Superuser права само с пръстов отпечатък</string>
<string name="settings_su_fingerprint_summary">Използване на сензора за пръстови отпечатъци за разрешаване на Superuser достъп.</string>
<string name="auth_fingerprint">Удостоверете с пръстов отпечатък.</string>
<string name="multiuser_mode">Потребителски достъп</string>
<string name="settings_owner_only">Само собственик</string>
<string name="settings_owner_manage">Управление от страна на собственика</string>
<string name="settings_user_independent">Независими потребители</string>
<string name="owner_only_summary">Само собственикът има руут достъп.</string>
<string name="owner_manage_summary">Само собственикът може да управлява руут достъпа и да получава запитвания за достъп.</string>
<string name="user_indepenent_summary">Всеки потребител има собствени правила за руут достъп.</string>
<string name="mount_namespace_mode">Монтиране по именни пространства</string>
<string name="settings_ns_global">Глобално</string>
<string name="settings_ns_requester">Наследено</string>
<string name="settings_ns_isolate">Изолирано</string>
<string name="global_summary">Всички сесии с руут достъп използват глобалното именно пространство.</string>
<string name="requester_summary">Всички сесии с руут достъп наследяват именното пространство на запитващото приложение.</string>
<string name="isolate_summary">Всички сесии с руут достъп имат собствени именни пространства.</string>
<string name="android_o_not_support">Не поддържа Android 8.0+.</string>
<string name="disable_fingerprint">Не са добавени пръстови отпечатъци или устройството не поддържа тази функция.</string>
<!--Superuser-->
<string name="su_request_title">Запитване за Superuser достъп</string>
<string name="deny_with_str">Отказ%1$s</string>
<string name="deny">Отказ</string>
<string name="prompt">Запитване</string>
<string name="grant">Разрешаване</string>
<string name="su_warning">Дава пълен достъп до устройството Ви.\Откажете, ако не сте сигурен/на.</string>
<string name="forever">Завинаги</string>
<string name="once">Веднъж</string>
<string name="tenmin">10 мин</string>
<string name="twentymin">20 мин</string>
<string name="thirtymin">30 мин</string>
<string name="sixtymin">60 мин</string>
<string name="su_allow_toast">На %1$s бе разрешен Superuser достъп.</string>
<string name="su_deny_toast">На %1$s бе отказан Superuser достъп.</string>
<string name="no_apps_found">Няма намерени приложения.</string>
<string name="su_snack_grant">На %1$s е предоставен Superuser достъп.</string>
<string name="su_snack_deny">На %1$s е отказан Superuser достъп.</string>
<string name="su_snack_notif_on">Известията за %1$s са включени.</string>
<string name="su_snack_notif_off">Известията за %1$s са изключени.</string>
<string name="su_snack_log_on">Записването в дневника за %1$s е включено.</string>
<string name="su_snack_log_off">Записването в дневника за %1$s е изключено.</string>
<string name="su_snack_revoke">Настройките за достъп на %1$s са анулирани.</string>
<string name="su_revoke_title">Анулиране?</string>
<string name="su_revoke_msg">Потвърждавате ли анулирането на настройките за достъп на %1$s?</string>
<string name="toast">Toast</string>
<string name="none">Без</string>
<string name="auth_fail">Неуспешна заверка.</string>
<!--Superuser logs-->
<string name="target_uid">Целеви UID: %1$d</string>
<string name="command">Команда: %1$s</string>
</resources>

View File

@@ -1,224 +0,0 @@
<resources>
<!--Welcome Activity-->
<string name="modules">Mòduls</string>
<string name="downloads">Baixada</string>
<string name="superuser">Superusuari</string>
<string name="log">Registre</string>
<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_message">Aquesta versió de Magisk Manager no suporta una versió inferior a la 18.0.\n\nPots actualitzar Magisk manualment o pots instalar una versió anterior de la app.</string>
<!--Status Fragment-->
<string name="magisk_version_error">Magisk no està instal·lat</string>
<string name="checking_for_updates">Cercant actualitzacions</string>
<string name="invalid_update_channel">Canal d\'actualització invàlid</string>
<string name="safetyNet_check_text">Comprova l\'estat de SafetyNet</string>
<string name="checking_safetyNet_status">Comprovant l\'estat de SafetyNet…</string>
<string name="safetyNet_check_success">La comprovació ha sigut exitosa</string>
<string name="safetyNet_api_error">Error en la API de SafetyNet</string>
<string name="safetyNet_res_invalid">La resposta és invàlida</string>
<string name="magisk_up_to_date">Magisk està actualitzat</string>
<string name="manager_up_to_date">Magisk Manager està actualitzat</string>
<string name="advanced_settings_title">Configuració avançada</string>
<string name="keep_force_encryption">Mantenir el xifrat forçat</string>
<string name="keep_dm_verity">Mantenir AVB 2.0/dm-verity</string>
<string name="current_installed">Instal·lada: %1$s</string>
<string name="latest_version">Última: %1$s</string>
<string name="uninstall">Desinstal·lar</string>
<string name="uninstall_magisk_title">Desinstal·lar Magisk</string>
<string name="uninstall_magisk_msg">Tots els mòduls seran desactivats / eliminats. L\'accés Arrel s\'eliminarà i, possiblement, xifrarà totes les dades si no estan ja xifrades.</string>
<string name="update">Actualització</string>
<string name="core_only_enabled">(Mode únicament nucli activat)</string>
<!--Module Fragment-->
<string name="no_info_provided">(No hi ha informació)</string>
<string name="no_modules_found">No s\han trobat mòduls</string>
<string name="update_file_created">El mòdul s\actualitzarà en el següent reinici</string>
<string name="remove_file_created">El mòdul s\eliminarà en el següent reinici</string>
<string name="remove_file_deleted"> El mòdul no s\eliminarà en el següent reinici </string>
<string name="disable_file_created"> El mòdul es desactivarà en el següent reinici </string>
<string name="disable_file_removed"> El mòdul s\activarà en el següent reinici </string>
<string name="author">Creat per %1$s</string>
<string name="reboot_recovery">Reiniciar en Mode Recuperació</string>
<string name="reboot_bootloader">Reiniciar en Mode Bootloader</string>
<string name="reboot_download">Reiniciar en Mode Download</string>
<!--Repo Fragment-->
<string name="update_available">Actualització Disponible</string>
<string name="installed">Instal·lat</string>
<string name="not_installed">No Instal·lat</string>
<string name="updated_on">Actualitzat el: %1$s</string>
<string name="sorting_order">Ordre de Classificació</string>
<string name="sort_by_name">Ordenar per nom</string>
<string name="sort_by_update">Ordenar segons l\última actualització</string>
<!--Log Fragment-->
<string name="menuSaveLog">Guardar registre</string>
<string name="menuReload">Recarregar</string>
<string name="menuClearLog">Netejar registre ara</string>
<string name="logs_cleared">Registre netejat correctament</string>
<string name="log_is_empty">El registre està buit</string>
<!--About Activity-->
<string name="app_changelog">Registre de canvis</string>
<string name="translators" />
<string name="app_translators">JoanVC100, QuitusAnbu27</string>
<!-- System Components, Notifications -->
<string name="update_channel">Actualització de Magisk</string>
<string name="progress_channel">Notificacions de progrés</string>
<string name="download_complete">Baixada completada</string>
<string name="download_file_error">Error en baixar l\'arxiu</string>
<string name="magisk_update_title">Actualització de Magisk disponible!</string>
<string name="manager_update_title">Actualització de Magisk Manager disponible!</string>
<!--Toasts, Dialogs-->
<string name="close">Tancar</string>
<string name="repo_install_title">Instal·lar %1$s</string>
<string name="repo_install_msg">Vols instal·lar %1$s ara?</string>
<string name="download">Baixar</string>
<string name="reboot">Reiniciar</string>
<string name="settings_reboot_toast">Reinicia per aplicar els canvis</string>
<string name="release_notes">Notes de llançament</string>
<string name="repo_cache_cleared">Memòria cau del repositori netejada</string>
<string name="internal_storage">El zip està emmagatzemat en:\n[Internal Storage]%1$s</string>
<string name="manager_download_install">Prem per descarregar i instal·lar.</string>
<string name="dtbo_patched_title">S\'ha arranjat DTBO</string>
<string name="dtbo_patched_reboot">Magisk Manager ha arranjat dtbo.img. Si us plau, reinicia el telèfon.</string>
<string name="flashing">Arranjament</string>
<string name="hide_manager_title">Amagant Magisk Manager…</string>
<string name="hide_manager_fail_toast">L\'amagament de Magisk Manager ha fallat.</string>
<string name="open_link_failed_toast">No s\'ha trobat una aplicació per obrir l\'enllaç.</string>
<string name="download_zip_only">Descarrega només el ZIP</string>
<string name="patch_boot_file">Arranja l\'imatge d\'arrencada</string>
<string name="direct_install">Instal·lació directa (Recomanat)</string>
<string name="install_inactive_slot">Instal·lar a la ranura inactiva (Després d\'una OTA)</string>
<string name="warning">Avís</string>
<string name="install_inactive_slot_msg">El teu dispositiu serà FORÇAT a arrancar en la ranura inactiva després de reiniciar!\nUtilitza aquesta opció només quan s\'hagi fet la OTA.\nContinuar?</string>
<string name="select_method">Selecciona mètode</string>
<string name="boot_file_patch_msg">Seleccioneu l\'arxiu de bolcat de l\'arrencada en format .img o img.tar.</string>
<string name="complete_uninstall">Desinstal·lació completa</string>
<string name="restore_img">Restaura imatges</string>
<string name="restore_img_msg">Restaurant…</string>
<string name="restore_done">Restauració feta!</string>
<string name="restore_fail">La còpia de seguretat de Stock no existeix!</string>
<string name="proprietary_title">Descarrega codi propietari</string>
<string name="proprietary_notice">Magisk Manager és codi lliure i no conté codi de l\'API de SafetyNet, ja que és codi propietari de Google.\n\nPot permetre que Magisk Manager descarregui una extensió que conté el GoogleApiClient per poder fer la comprobació de SafetyNet?</string>
<string name="setup_done">Instal·lació realitzada.</string>
<string name="setup_fail">Instal·lació fallida.</string>
<string name="env_fix_title">Es requereix instal·lació addicional</string>
<string name="env_fix_msg">El teu dispositiu necessita instal·lació addicional per Magisk per funcionar correctament. Es descarregarà el ZIP d\'instal·lació de Magisk , vol procedir a l\'instalació ara?</string>
<string name="setup_title">Instal·lació addicional</string>
<string name="setup_msg">S\'està executant la configuració de l\'entorn…</string>
<string name="downloading_toast">Descarregant %1$s</string>
<string name="no_rw_storage">Aquesta funció no funcionara si no es té permís per escriure a l\'emmagatzematge.</string>
<string name="dl_one_module">Descarrega només un mòdul a la vegada.</string>
<!--Settings Activity -->
<string name="settings_general_category">General</string>
<string name="settings_dark_theme_title">Tema obscur</string>
<string name="settings_dark_theme_summary">Habilitar el tema obscur</string>
<string name="settings_clear_cache_title">Netejar memòria cau del repositori</string>
<string name="settings_clear_cache_summary">Neteja linformació en memòria cau per als repositoris en línia, força a laplicació a actualitzar-se en línia.</string>
<string name="settings_hide_manager_title">Amagar Magisk Manager</string>
<string name="settings_hide_manager_summary">Re-empaquetar Magisk Manager amb un nom de paquet a latzar</string>
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
<string name="settings_restore_manager_summary">Restaura Magisk Manager amb el nom de paquet original</string>
<string name="language">Idioma</string>
<string name="system_default">(Idioma del sistema)</string>
<string name="settings_update">Configuració dActualització</string>
<string name="settings_check_update_title">Comprovar Actualitzacions</string>
<string name="settings_check_update_summary">Comprovar periòdicament en segon pla si existeixen actualitzacions</string>
<string name="settings_update_channel_title">Canal dActualitzacions</string>
<string name="settings_update_stable">Estable</string>
<string name="settings_update_beta">Beta</string>
<string name="settings_update_custom">Personalitzat</string>
<string name="settings_update_custom_msg">Inserta una URL personalitzada</string>
<string name="settings_boot_format_title">Arranja la imatge darrancada segons el tipus de format</string>
<string name="settings_boot_format_summary">Seleccionar el format de sortida per arranjar la imatge darrancada.\nTriï .img per flashejar mitcançant fastboot/download; triï .img.tar per flashejar amb ODIN.</string>
<string name="settings_core_only_title">Mode únicament nucli de Magisk</string>
<string name="settings_core_only_summary">Habilitar només les funcions principals, no es carregaran tots els mòduls. MagiskSU y MagiskHide seguirán habilitats</string>
<string name="settings_magiskhide_summary">Amagar Magisk de varies deteccions</string>
<string name="settings_hosts_title">Systemless Hosts</string>
<string name="settings_hosts_summary">Suport per aplicacions tipus Adblock fora de la partició del sistema</string>
<string name="settings_hosts_toast">Agregat el mòdul Systemless Hosts</string>
<string name="settings_su_app_adb">Aplicacions y ADB</string>
<string name="settings_su_app">Només aplicacions</string>
<string name="settings_su_adb">Només ADB</string>
<string name="settings_su_disable">Deshabilitat</string>
<string name="settings_su_request_10">10 segons</string>
<string name="settings_su_request_15">15 segons</string>
<string name="settings_su_request_20">20 segons</string>
<string name="settings_su_request_30">30 segons</string>
<string name="settings_su_request_45">45 segons</string>
<string name="settings_su_request_60">60 segons</string>
<string name="superuser_access">Accés de superusuari</string>
<string name="auto_response">Resposta automàtica</string>
<string name="request_timeout">Temps de petició</string>
<string name="superuser_notification">Notificació de superusuari</string>
<string name="request_timeout_summary">%1$d segons</string>
<string name="settings_su_reauth_title">Re-autenticació</string>
<string name="settings_su_reauth_summary">Demanar permisos de superusuari novament si una aplicació es actualitzada o reinstal·lada</string>
<string name="settings_su_fingerprint_title">Autenticació per Empremta Dactilar</string>
<string name="settings_su_fingerprint_summary">Utilitza el sensor dEmpremta Dactilar per permetre les sol·licituds de superusuari</string>
<string name="auth_fingerprint">Autenticar Emprempta Digital</string>
<string name="multiuser_mode">Mode Multiusuari</string>
<string name="settings_owner_only">Només Administrador del Dispositiu</string>
<string name="settings_owner_manage">Administrador del Dispositiu</string>
<string name="settings_user_independent">Usuari Independent</string>
<string name="owner_only_summary">Només l\administrador té accés d\'arrel</string>
<string name="owner_manage_summary"> Només l\administrador pot supervisar lacces d\'arrel y rebre sol·licituds daltres usuaris</string>
<string name="user_indepenent_summary">Tots els usuaris tenen separades les seves pròpies regles d\'arrel </string>
<string name="mount_namespace_mode">Muntar Namespace </string>
<string name="settings_ns_global">Namespace Global</string>
<string name="settings_ns_requester">Heretar Namespace</string>
<string name="settings_ns_isolate">Aïllar Namespace</string>
<string name="global_summary">Totes les sessions d\'arrel utilitzen el suport Namespace Global</string>
<string name="requester_summary">Les sessions d\'arrel heretaran les peticiones Namespace</string>
<string name="isolate_summary">Totes les sessions d\'arrel tindran la seva pròpia Namespace</string>
<string name="android_o_not_support">No es compatible amb Android 8.0+</string>
<string name="disable_fingerprint">No s\han establert empremtes dactilars o no existeix el suport del dispositiu</string>
<!--Superuser-->
<string name="su_request_title">Petició de superusuari</string>
<string name="deny_with_str">Denegar%1$s</string>
<string name="deny">Denegar</string>
<string name="prompt">Preguntar</string>
<string name="grant">Permetre</string>
<string name="su_warning">Permet accés total al teu dispositiu.\nDenega si no n\'està segur!</string>
<string name="forever">Sempre</string>
<string name="once">Un cop </string>
<string name="tenmin">10 mins</string>
<string name="twentymin">20 mins</string>
<string name="thirtymin">30 mins</string>
<string name="sixtymin">60 mins</string>
<string name="su_allow_toast">Permesos els drets de superusuari de %1$s</string>
<string name="su_deny_toast">Denegats els drets de superusuari de %1$s</string>
<string name="no_apps_found">No shan trobat aplicacions</string>
<string name="su_snack_grant">Drets de superusuari de %1$s permesos</string>
<string name="su_snack_deny"> Drets de superusuari de %1$s denegats</string>
<string name="su_snack_notif_on">Notificacions de %1$s habilitades</string>
<string name="su_snack_notif_off">Notificacions de %1$s deshabilitades</string>
<string name="su_snack_log_on">Registres de %1$s habilitats</string>
<string name="su_snack_log_off">Registres de %1$s deshabilitats</string>
<string name="su_snack_revoke">Anul·lats drets de %1$s</string>
<string name="su_revoke_title">¿Revocar?</string>
<string name="su_revoke_msg">Confirmi per revocar drets de %1$s</string>
<string name="toast">Avís</string>
<string name="none">Cap</string>
<string name="auth_fail">Autenticació fallida</string>
<!--Superuser logs-->
<string name="target_uid">UID de l\objectiu: %1$d</string>
<string name="command">Ordre: %1$s</string>
<!-- MagiskHide -->
<string name="show_system_app">Ensenya apps del sistema</string>
</resources>

View File

@@ -1,130 +0,0 @@
<resources>
<!--Universal-->
<!--Welcome Activity-->
<string name="modules">Moduly</string>
<string name="downloads">Stahování</string>
<string name="superuser">Superuser</string>
<string name="log">Log</string>
<string name="settings">Nastavení</string>
<string name="install">Instalovat</string>
<!--Status Fragment-->
<string name="magisk_version_error">Magisk není nainstalován</string>
<string name="checking_for_updates">Kontrola aktualizací…</string>
<string name="safetyNet_check_text">Kliknutím zahájíte SafetyNet kontrolu</string>
<string name="checking_safetyNet_status">Kontrola stavu SafetyNet…</string>
<!--Install Fragment-->
<string name="advanced_settings_title">Pokročilá Nastavení</string>
<string name="keep_force_encryption">Udržet "force encryption"</string>
<string name="keep_dm_verity">Udržet AVB 2.0/dm-verity</string>
<string name="current_installed">Nainstalovaná: %1$s</string>
<string name="latest_version">Poslední: %1$s</string>
<string name="uninstall">Odinstalovat</string>
<string name="uninstall_magisk_title">Odinstalovat Magisk</string>
<!--Module Fragment-->
<string name="no_info_provided">(Žádné info)</string>
<string name="no_modules_found">Žádný modul nenalezen</string>
<string name="update_file_created">Modul bude aktualizován během příštího restartu</string>
<string name="remove_file_created">Modul bude smazán během příštího restartu</string>
<string name="remove_file_deleted">Modul nebude smazán během příštího restartu</string>
<string name="disable_file_created">Modul bude zakázán během příštího restartu</string>
<string name="disable_file_removed">Modul bude povolen během příštího restartu</string>
<string name="author">Vytvořeno %1$s</string>
<!--Repo Fragment-->
<string name="update_available">Dostupná Aktualizace</string>
<string name="installed">Nainstalováno</string>
<string name="not_installed">Nenainstalováno</string>
<!--Log Fragment-->
<string name="menuSaveLog">Uložit log</string>
<string name="menuReload">Aktualizovat</string>
<string name="menuClearLog">Smazat Log</string>
<string name="logs_cleared">Log byl smazán</string>
<string name="log_is_empty">Log je prázdný</string>
<!--About Activity-->
<string name="app_changelog">Seznam změn</string>
<string name="translators" />
<string name="app_translators">Překladatelé aplikace</string>
<!--Toasts, Dialogs-->
<string name="close">Zavřít</string>
<string name="repo_install_title">Instalovat %1$s</string>
<string name="repo_install_msg">Chcete nainstalovat %1$s ?</string>
<string name="download">Stáhnout</string>
<string name="reboot">Restart</string>
<string name="magisk_update_title">K dispozici je aktualizace Magisk!</string>
<string name="settings_reboot_toast">Restartovat pro použití nastavení</string>
<string name="release_notes">Poznámky k vydání</string>
<string name="repo_cache_cleared">Mezipaměť smazána</string>
<string name="internal_storage">Zip je uchován v:\n[Interním Úložišti]%1$s</string>
<string name="download_file_error">Chyba při Stahování souboru</string>
<string name="downloading_toast">Stahování %1$s</string>
<string name="no_rw_storage">Tato funkce nebude fungovat bez povolení k zápisu na externí úložiště.</string>
<!--Settings Activity -->
<string name="settings_general_category">Obecné</string>
<string name="settings_dark_theme_title">Tmavý Vzhled</string>
<string name="settings_dark_theme_summary">Povolit tmavý vzhled</string>
<string name="settings_clear_cache_title">Smazat Uchovanou Mezipaměť</string>
<string name="settings_clear_cache_summary">Smaže informace online použití v Mezipaměti, donutí aplikaci obnovit informace online</string>
<string name="settings_magiskhide_summary">Skryje root (MagiskSU) před různými aplikacemi</string>
<string name="settings_hosts_title">Nesystémová "hosts" data</string>
<string name="settings_hosts_summary">Podpora nesystémových dat "hosts" pro Adblock aplikace</string>
<string name="settings_su_app_adb">Aplikace i ADB</string>
<string name="settings_su_app">Pouze aplikace</string>
<string name="settings_su_adb">Pouze ADB</string>
<string name="settings_su_disable">Zakázáno</string>
<string name="settings_su_request_10">10 sekund</string>
<string name="settings_su_request_15">15 sekund</string>
<string name="settings_su_request_20">20 sekund</string>
<string name="settings_su_request_30">30 sekund</string>
<string name="settings_su_request_45">45 sekund</string>
<string name="settings_su_request_60">60 sekund</string>
<string name="superuser_access">Přístup Superuser</string>
<string name="auto_response">Automatická Reakce</string>
<string name="request_timeout">Časový limit Požadavku</string>
<string name="superuser_notification">Oznámení Superuser</string>
<string name="request_timeout_summary">%1$d sekund</string>
<!--Superuser-->
<string name="su_request_title">Požadavek Superuser</string>
<string name="deny_with_str">Zamítnout%1$s</string>
<string name="deny">Zamítnout</string>
<string name="prompt">Dotaz</string>
<string name="grant">Povolit</string>
<string name="su_warning">Povolí plný přístup k vašemu zařízení.\nZamítněte pokud si nejste jisti!</string>
<string name="forever">Navždy</string>
<string name="once">Jednou</string>
<string name="tenmin">10 min</string>
<string name="twentymin">20 min</string>
<string name="thirtymin">30 min</string>
<string name="sixtymin">60 min</string>
<string name="su_allow_toast">Pro %1$s bylo oprávnění Superuser povoleno</string>
<string name="su_deny_toast">Pro %1$s bylo oprávnění Superuser zamítnuto</string>
<string name="no_apps_found">Zatím zde není žádná aplikace</string>
<string name="su_snack_grant">Superuser oprávnění pro %1$s je povoleno</string>
<string name="su_snack_deny">Superuser oprávnění pro %1$s je zamítnuto</string>
<string name="su_snack_notif_on">Oznámení pro %1$s je povoleno</string>
<string name="su_snack_notif_off">Oznámení pro %1$s je zakázáno</string>
<string name="su_snack_log_on">Logování %1$s je povoleno</string>
<string name="su_snack_log_off">Logování %1$s je zakázáno</string>
<string name="su_snack_revoke">Záznamy oprávnění %1$s jsou smazány</string>
<string name="su_revoke_title">Smazat?</string>
<string name="su_revoke_msg">Smazat záznam ohledně oprávnění pro %1$s?</string>
<string name="toast">Toast</string>
<string name="none">Žádné</string>
<!--Superuser logs-->
<string name="target_uid">Cílové UID: %1$d</string>
<string name="command">Příkaz: %1$s</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More