Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
65b0ea79
Commit
65b0ea79
authored
Sep 12, 2021
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MagiskHide is no more
parent
fc6b02f6
Show whitespace changes
Inline
Side-by-side
Showing
77 changed files
with
433 additions
and
285 deletions
+433
-285
Config.kt
app/src/main/java/com/topjohnwu/magisk/core/Config.kt
+0
-4
Const.kt
app/src/main/java/com/topjohnwu/magisk/core/Const.kt
+5
-3
Info.kt
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
+6
-9
Receiver.kt
app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt
+1
-1
MainActivity.kt
app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt
+2
-3
AppProcessInfo.kt
.../main/java/com/topjohnwu/magisk/ui/deny/AppProcessInfo.kt
+15
-15
DenyListFragment.kt
...ain/java/com/topjohnwu/magisk/ui/deny/DenyListFragment.kt
+18
-18
DenyListRvItem.kt
.../main/java/com/topjohnwu/magisk/ui/deny/DenyListRvItem.kt
+29
-30
DenyListViewModel.kt
...in/java/com/topjohnwu/magisk/ui/deny/DenyListViewModel.kt
+9
-9
SettingsItems.kt
...in/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
+6
-6
SettingsViewModel.kt
...ava/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
+4
-1
Shortcuts.kt
app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt
+1
-13
TappableHeadlineItem.kt
...in/java/com/topjohnwu/magisk/view/TappableHeadlineItem.kt
+1
-1
app_list_filter.xml
app/src/main/res/layout/app_list_filter.xml
+7
-7
fragment_deny_md2.xml
app/src/main/res/layout/fragment_deny_md2.xml
+6
-6
item_hide_md2.xml
app/src/main/res/layout/item_hide_md2.xml
+3
-3
item_hide_process_md2.xml
app/src/main/res/layout/item_hide_process_md2.xml
+4
-4
item_tappable_headline.xml
app/src/main/res/layout/item_tappable_headline.xml
+1
-1
menu_bottom_nav.xml
app/src/main/res/menu/menu_bottom_nav.xml
+2
-2
main.xml
app/src/main/res/navigation/main.xml
+6
-6
strings.xml
app/src/main/res/values-ar/strings.xml
+0
-1
strings.xml
app/src/main/res/values-az/strings.xml
+0
-1
strings.xml
app/src/main/res/values-be/strings.xml
+0
-1
strings.xml
app/src/main/res/values-bg/strings.xml
+0
-1
strings.xml
app/src/main/res/values-ca/strings.xml
+0
-1
strings.xml
app/src/main/res/values-cs/strings.xml
+0
-1
strings.xml
app/src/main/res/values-de/strings.xml
+0
-1
strings.xml
app/src/main/res/values-el/strings.xml
+7
-8
strings.xml
app/src/main/res/values-es/strings.xml
+0
-1
strings.xml
app/src/main/res/values-et/strings.xml
+0
-1
strings.xml
app/src/main/res/values-fa/strings.xml
+0
-1
strings.xml
app/src/main/res/values-fr/strings.xml
+0
-1
strings.xml
app/src/main/res/values-hi/strings.xml
+0
-1
strings.xml
app/src/main/res/values-hr/strings.xml
+0
-1
strings.xml
app/src/main/res/values-in/strings.xml
+0
-1
strings.xml
app/src/main/res/values-it/strings.xml
+0
-1
strings.xml
app/src/main/res/values-iw/strings.xml
+1
-2
strings.xml
app/src/main/res/values-ja/strings.xml
+0
-1
strings.xml
app/src/main/res/values-ka/strings.xml
+0
-1
strings.xml
app/src/main/res/values-ko/strings.xml
+0
-1
strings.xml
app/src/main/res/values-lt/strings.xml
+0
-1
strings.xml
app/src/main/res/values-mk/strings.xml
+0
-1
strings.xml
app/src/main/res/values-nb/strings.xml
+0
-1
strings.xml
app/src/main/res/values-nl/strings.xml
+0
-1
strings.xml
app/src/main/res/values-pa/strings.xml
+0
-1
strings.xml
app/src/main/res/values-pl/strings.xml
+0
-1
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+0
-1
strings.xml
app/src/main/res/values-pt-rPT/strings.xml
+0
-1
strings.xml
app/src/main/res/values-ro/strings.xml
+0
-1
strings.xml
app/src/main/res/values-ru/strings.xml
+0
-1
strings.xml
app/src/main/res/values-sk/strings.xml
+0
-1
strings.xml
app/src/main/res/values-sq/strings.xml
+0
-1
strings.xml
app/src/main/res/values-sr/strings.xml
+0
-1
strings.xml
app/src/main/res/values-sv/strings.xml
+1
-2
strings.xml
app/src/main/res/values-ta/strings.xml
+0
-1
strings.xml
app/src/main/res/values-th/strings.xml
+0
-1
strings.xml
app/src/main/res/values-tr/strings.xml
+0
-1
strings.xml
app/src/main/res/values-uk/strings.xml
+0
-1
strings.xml
app/src/main/res/values-vi/strings.xml
+0
-1
strings.xml
app/src/main/res/values-zh-rCN/strings.xml
+0
-1
strings.xml
app/src/main/res/values-zh-rTW/strings.xml
+0
-1
resources.xml
app/src/main/res/values/resources.xml
+0
-1
strings.xml
app/src/main/res/values/strings.xml
+2
-1
Android.mk
native/jni/Android.mk
+3
-3
applets.cpp
native/jni/core/applets.cpp
+1
-1
bootstages.cpp
native/jni/core/bootstages.cpp
+4
-4
daemon.cpp
native/jni/core/daemon.cpp
+4
-4
db.cpp
native/jni/core/db.cpp
+13
-8
magisk.cpp
native/jni/core/magisk.cpp
+4
-1
cli.cpp
native/jni/deny/cli.cpp
+154
-0
deny.hpp
native/jni/deny/deny.hpp
+43
-0
revert.cpp
native/jni/deny/revert.cpp
+6
-6
utils.cpp
native/jni/deny/utils.cpp
+47
-47
daemon.hpp
native/jni/include/daemon.hpp
+6
-5
db.hpp
native/jni/include/db.hpp
+2
-2
magisk.hpp
native/jni/include/magisk.hpp
+1
-2
entry.cpp
native/jni/zygisk/entry.cpp
+8
-8
No files found.
app/src/main/java/com/topjohnwu/magisk/core/Config.kt
View file @
65b0ea79
...
...
@@ -59,9 +59,6 @@ object Config : PreferenceModel, DBConfig {
const
val
BOOT_ID
=
"boot_id"
const
val
ASKED_HOME
=
"asked_home"
const
val
DOH
=
"doh"
// system state
const
val
MAGISKHIDE
=
"magiskhide"
}
object
Value
{
...
...
@@ -133,7 +130,6 @@ object Config : PreferenceModel, DBConfig {
var
suTapjack
by
preference
(
Key
.
SU_TAPJACK
,
true
)
var
checkUpdate
by
preference
(
Key
.
CHECK_UPDATES
,
true
)
var
doh
by
preference
(
Key
.
DOH
,
false
)
var
magiskHide
by
preference
(
Key
.
MAGISKHIDE
,
true
)
var
showSystemApp
by
preference
(
Key
.
SHOW_SYSTEM_APP
,
false
)
var
customChannelUrl
by
preference
(
Key
.
CUSTOM_CHANNEL
,
""
)
...
...
app/src/main/java/com/topjohnwu/magisk/core/Const.kt
View file @
65b0ea79
...
...
@@ -27,6 +27,7 @@ object Const {
// Misc
val
USER_ID
=
Process
.
myUid
()
/
100000
val
APP_IS_CANARY
get
()
=
Version
.
isCanary
(
BuildConfig
.
VERSION_CODE
)
object
Version
{
const
val
MIN_VERSION
=
"v20.4"
...
...
@@ -34,7 +35,9 @@ object Const {
fun
atLeast_21_0
()
=
Info
.
env
.
magiskVersionCode
>=
21000
||
isCanary
()
fun
atLeast_21_2
()
=
Info
.
env
.
magiskVersionCode
>=
21200
||
isCanary
()
fun
isCanary
()
=
Info
.
env
.
magiskVersionCode
%
100
!=
0
fun
isCanary
()
=
isCanary
(
Info
.
env
.
magiskVersionCode
)
fun
isCanary
(
ver
:
Int
)
=
ver
>
0
&&
ver
%
100
!=
0
}
object
ID
{
...
...
@@ -49,7 +52,7 @@ object Const {
const
val
PATREON_URL
=
"https://www.patreon.com/topjohnwu"
const
val
SOURCE_CODE_URL
=
"https://github.com/topjohnwu/Magisk"
val
CHANGELOG_URL
=
if
(
BuildConfig
.
VERSION_CODE
%
100
!=
0
)
Info
.
remote
.
magisk
.
note
val
CHANGELOG_URL
=
if
(
APP_IS_CANARY
)
Info
.
remote
.
magisk
.
note
else
"https://topjohnwu.github.io/Magisk/releases/${BuildConfig.VERSION_CODE}.md"
const
val
GITHUB_RAW_URL
=
"https://raw.githubusercontent.com/"
...
...
@@ -76,7 +79,6 @@ object Const {
object
Nav
{
const
val
HOME
=
"home"
const
val
SETTINGS
=
"settings"
const
val
HIDE
=
"hide"
const
val
MODULES
=
"modules"
const
val
SUPERUSER
=
"superuser"
}
...
...
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
View file @
65b0ea79
...
...
@@ -51,25 +51,22 @@ object Info {
private
fun
loadState
()
=
Env
(
fastCmd
(
"magisk -v"
).
split
(
":"
.
toRegex
())[
0
],
runCatching
{
fastCmd
(
"magisk -V"
).
toInt
()
}.
getOrDefault
(-
1
),
Shell
.
su
(
"magiskhide status"
).
exec
().
isSuccess
runCatching
{
fastCmd
(
"magisk -V"
).
toInt
()
}.
getOrDefault
(-
1
)
)
class
Env
(
val
magiskVersionString
:
String
=
""
,
code
:
Int
=
-
1
,
hide
:
Boolean
=
false
code
:
Int
=
-
1
)
{
val
magiskHide
get
()
=
Config
.
magiskHide
val
magiskVersionCode
=
when
{
code
<
Const
.
Version
.
MIN_VERCODE
->
-
1
else
->
if
(
Shell
.
rootAccess
())
code
else
-
1
}
val
isUnsupported
=
code
>
0
&&
code
<
Const
.
Version
.
MIN_VERCODE
val
isActive
=
magiskVersionCode
>=
0
init
{
Config
.
magiskHide
=
hid
e
}
var
denyListEnforced
=
if
(
Const
.
Version
.
isCanary
(
code
))
Shell
.
su
(
"magisk --denylist status"
).
exec
().
isSuccess
els
e
false
}
}
app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt
View file @
65b0ea79
...
...
@@ -42,7 +42,7 @@ open class Receiver : BaseReceiver() {
getUid
(
intent
)
?.
let
{
rmPolicy
(
it
)
}
}
Intent
.
ACTION_PACKAGE_FULLY_REMOVED
->
{
getPkg
(
intent
)
?.
let
{
Shell
.
su
(
"magisk
hide
rm $it"
).
submit
()
}
getPkg
(
intent
)
?.
let
{
Shell
.
su
(
"magisk
--denylist
rm $it"
).
submit
()
}
}
Intent
.
ACTION_LOCALE_CHANGED
->
Shortcuts
.
setupDynamic
(
context
)
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt
View file @
65b0ea79
...
...
@@ -60,7 +60,7 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
R
.
id
.
homeFragment
,
R
.
id
.
modulesFragment
,
R
.
id
.
superuserFragment
,
R
.
id
.
hide
Fragment
,
R
.
id
.
deny
Fragment
,
R
.
id
.
logFragment
->
true
else
->
false
}
...
...
@@ -170,7 +170,6 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
private
fun
getScreen
(
name
:
String
?):
NavDirections
?
{
return
when
(
name
)
{
Const
.
Nav
.
SUPERUSER
->
MainDirections
.
actionSuperuserFragment
()
Const
.
Nav
.
HIDE
->
MainDirections
.
actionHideFragment
()
Const
.
Nav
.
MODULES
->
MainDirections
.
actionModuleFragment
()
Const
.
Nav
.
SETTINGS
->
HomeFragmentDirections
.
actionHomeFragmentToSettingsFragment
()
else
->
null
...
...
@@ -183,7 +182,7 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
R
.
id
.
modulesFragment
->
MainDirections
.
actionModuleFragment
()
R
.
id
.
superuserFragment
->
MainDirections
.
actionSuperuserFragment
()
R
.
id
.
logFragment
->
MainDirections
.
actionLogFragment
()
R
.
id
.
hideFragment
->
MainDirections
.
actionHide
Fragment
()
R
.
id
.
denyFragment
->
MainDirections
.
actionDenylist
Fragment
()
else
->
null
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/
hide/Hide
Info.kt
→
app/src/main/java/com/topjohnwu/magisk/ui/
deny/AppProcess
Info.kt
View file @
65b0ea79
package
com.topjohnwu.magisk.ui.
hide
package
com.topjohnwu.magisk.ui.
deny
import
android.annotation.SuppressLint
import
android.content.pm.ApplicationInfo
...
...
@@ -13,7 +13,7 @@ import com.topjohnwu.magisk.ktx.getLabel
import
com.topjohnwu.magisk.ktx.isIsolated
import
com.topjohnwu.magisk.ktx.useAppZygote
class
Cmdline
Hidden
Item
(
line
:
String
)
{
class
Cmdline
List
Item
(
line
:
String
)
{
val
packageName
:
String
val
process
:
String
...
...
@@ -27,19 +27,19 @@ class CmdlineHiddenItem(line: String) {
const
val
ISOLATED_MAGIC
=
"isolated"
@SuppressLint
(
"InlinedApi"
)
class
HideAppInfo
(
info
:
ApplicationInfo
,
pm
:
PackageManager
,
hideList
:
List
<
CmdlineHidden
Item
>)
:
ApplicationInfo
(
info
),
Comparable
<
HideApp
Info
>
{
class
AppProcessInfo
(
info
:
ApplicationInfo
,
pm
:
PackageManager
,
denyList
:
List
<
CmdlineList
Item
>)
:
ApplicationInfo
(
info
),
Comparable
<
AppProcess
Info
>
{
val
label
=
info
.
getLabel
(
pm
)
val
iconImage
:
Drawable
=
info
.
loadIcon
(
pm
)
val
processes
=
fetchProcesses
(
pm
,
hide
List
)
val
processes
=
fetchProcesses
(
pm
,
deny
List
)
override
fun
compareTo
(
other
:
HideApp
Info
)
=
comparator
.
compare
(
this
,
other
)
override
fun
compareTo
(
other
:
AppProcess
Info
)
=
comparator
.
compare
(
this
,
other
)
private
fun
fetchProcesses
(
pm
:
PackageManager
,
hideList
:
List
<
CmdlineHidden
Item
>
):
List
<
Hide
ProcessInfo
>
{
denylist
:
List
<
CmdlineList
Item
>
):
List
<
ProcessInfo
>
{
// Fetch full PackageInfo
val
baseFlag
=
MATCH_DISABLED_COMPONENTS
or
MATCH_UNINSTALLED_PACKAGES
val
packageInfo
=
try
{
...
...
@@ -58,9 +58,9 @@ class HideAppInfo(info: ApplicationInfo, pm: PackageManager, hideList: List<Cmdl
}
}
val
hidden
=
hideL
ist
.
filter
{
it
.
packageName
==
packageName
||
it
.
packageName
==
ISOLATED_MAGIC
}
fun
createProcess
(
name
:
String
,
pkg
:
String
=
packageName
):
Hide
ProcessInfo
{
return
HideProcessInfo
(
name
,
pkg
,
hidden
.
any
{
it
.
process
==
name
&&
it
.
packageName
==
pkg
})
val
enabledList
=
denyl
ist
.
filter
{
it
.
packageName
==
packageName
||
it
.
packageName
==
ISOLATED_MAGIC
}
fun
createProcess
(
name
:
String
,
pkg
:
String
=
packageName
):
ProcessInfo
{
return
ProcessInfo
(
name
,
pkg
,
enabledList
.
any
{
it
.
process
==
name
&&
it
.
packageName
==
pkg
})
}
var
haveAppZygote
=
false
...
...
@@ -90,17 +90,17 @@ class HideAppInfo(info: ApplicationInfo, pm: PackageManager, hideList: List<Cmdl
}
companion
object
{
private
val
comparator
=
compareBy
<
HideApp
Info
>(
{
it
.
label
.
toLowerC
ase
(
currentLocale
)
},
private
val
comparator
=
compareBy
<
AppProcess
Info
>(
{
it
.
label
.
lowerc
ase
(
currentLocale
)
},
{
it
.
packageName
}
)
}
}
data class
Hide
ProcessInfo
(
data class
ProcessInfo
(
val
name
:
String
,
val
packageName
:
String
,
var
is
Hidden
:
Boolean
var
is
Enabled
:
Boolean
)
{
val
isIsolated
get
()
=
packageName
==
ISOLATED_MAGIC
val
isAppZygote
get
()
=
name
.
endsWith
(
"_zygote"
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/
hide/Hide
Fragment.kt
→
app/src/main/java/com/topjohnwu/magisk/ui/
deny/DenyList
Fragment.kt
View file @
65b0ea79
package
com.topjohnwu.magisk.ui.
hide
package
com.topjohnwu.magisk.ui.
deny
import
android.content.Context
import
android.os.Bundle
...
...
@@ -11,7 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import
androidx.recyclerview.widget.RecyclerView
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.databinding.Fragment
Hide
Md2Binding
import
com.topjohnwu.magisk.databinding.Fragment
Deny
Md2Binding
import
com.topjohnwu.magisk.di.viewModel
import
com.topjohnwu.magisk.ktx.addSimpleItemDecoration
import
com.topjohnwu.magisk.ktx.addVerticalPadding
...
...
@@ -19,34 +19,34 @@ import com.topjohnwu.magisk.ktx.fixEdgeEffect
import
com.topjohnwu.magisk.ktx.hideKeyboard
import
com.topjohnwu.magisk.utils.MotionRevealHelper
class
HideFragment
:
BaseUIFragment
<
HideViewModel
,
FragmentHide
Md2Binding
>()
{
class
DenyListFragment
:
BaseUIFragment
<
DenyListViewModel
,
FragmentDeny
Md2Binding
>()
{
override
val
layoutRes
=
R
.
layout
.
fragment_
hide
_md2
override
val
viewModel
by
viewModel
<
Hide
ViewModel
>()
override
val
layoutRes
=
R
.
layout
.
fragment_
deny
_md2
override
val
viewModel
by
viewModel
<
DenyList
ViewModel
>()
private
var
isFilterVisible
get
()
=
binding
.
hide
Filter
.
isVisible
get
()
=
binding
.
process
Filter
.
isVisible
set
(
value
)
{
if
(!
value
)
hideKeyboard
()
MotionRevealHelper
.
withViews
(
binding
.
hideFilter
,
binding
.
hideF
ilterToggle
,
value
)
MotionRevealHelper
.
withViews
(
binding
.
processFilter
,
binding
.
f
ilterToggle
,
value
)
}
override
fun
onAttach
(
context
:
Context
)
{
super
.
onAttach
(
context
)
activity
.
setTitle
(
R
.
string
.
magiskhide
)
activity
.
setTitle
(
R
.
string
.
denylist
)
setHasOptionsMenu
(
true
)
}
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
binding
.
hideF
ilterToggle
.
setOnClickListener
{
binding
.
f
ilterToggle
.
setOnClickListener
{
isFilterVisible
=
true
}
binding
.
hideFilterInclude
.
hideF
ilterDone
.
setOnClickListener
{
binding
.
appFilterInclude
.
f
ilterDone
.
setOnClickListener
{
isFilterVisible
=
false
}
binding
.
hideConten
t
.
addOnScrollListener
(
object
:
RecyclerView
.
OnScrollListener
()
{
binding
.
appLis
t
.
addOnScrollListener
(
object
:
RecyclerView
.
OnScrollListener
()
{
override
fun
onScrollStateChanged
(
recyclerView
:
RecyclerView
,
newState
:
Int
)
{
if
(
newState
!=
RecyclerView
.
SCROLL_STATE_IDLE
)
hideKeyboard
()
}
...
...
@@ -55,23 +55,23 @@ class HideFragment : BaseUIFragment<HideViewModel, FragmentHideMd2Binding>() {
val
resource
=
requireContext
().
resources
val
l_50
=
resource
.
getDimensionPixelSize
(
R
.
dimen
.
l_50
)
val
l1
=
resource
.
getDimensionPixelSize
(
R
.
dimen
.
l1
)
binding
.
hideConten
t
.
addVerticalPadding
(
binding
.
appLis
t
.
addVerticalPadding
(
l_50
,
l1
+
resource
.
getDimensionPixelSize
(
R
.
dimen
.
internal_action_bar_size
)
)
binding
.
hideConten
t
.
addSimpleItemDecoration
(
binding
.
appLis
t
.
addSimpleItemDecoration
(
left
=
l1
,
top
=
l_50
,
right
=
l1
,
bottom
=
l_50
,
)
binding
.
hideConten
t
.
fixEdgeEffect
()
binding
.
appLis
t
.
fixEdgeEffect
()
val
lama
=
binding
.
hideConten
t
.
layoutManager
?:
return
val
lama
=
binding
.
appLis
t
.
layoutManager
?:
return
lama
.
isAutoMeasureEnabled
=
false
}
override
fun
onPreBind
(
binding
:
Fragment
Hide
Md2Binding
)
=
Unit
override
fun
onPreBind
(
binding
:
Fragment
Deny
Md2Binding
)
=
Unit
override
fun
onBackPressed
():
Boolean
{
if
(
isFilterVisible
)
{
...
...
@@ -89,10 +89,10 @@ class HideFragment : BaseUIFragment<HideViewModel, FragmentHideMd2Binding>() {
override
fun
onOptionsItemSelected
(
item
:
MenuItem
):
Boolean
{
when
(
item
.
itemId
)
{
R
.
id
.
action_focus_up
->
binding
.
hideConten
t
R
.
id
.
action_focus_up
->
binding
.
appLis
t
.
takeIf
{
(
it
.
layoutManager
as
?
LinearLayoutManager
)
?.
findFirstVisibleItemPosition
()
?:
0
>
10
}
?.
also
{
it
.
scrollToPosition
(
10
)
}
.
let
{
binding
.
hideConten
t
}
.
let
{
binding
.
appLis
t
}
.
also
{
it
.
post
{
it
.
smoothScrollToPosition
(
0
)
}
}
}
return
super
.
onOptionsItemSelected
(
item
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/
hide/HideRvItems
.kt
→
app/src/main/java/com/topjohnwu/magisk/ui/
deny/DenyListRvItem
.kt
View file @
65b0ea79
package
com.topjohnwu.magisk.ui.
hide
package
com.topjohnwu.magisk.ui.
deny
import
android.view.View
import
android.view.ViewGroup
...
...
@@ -13,13 +13,13 @@ import com.topjohnwu.magisk.ktx.startAnimations
import
com.topjohnwu.superuser.Shell
import
kotlin.math.roundToInt
class
Hide
RvItem
(
val
info
:
HideApp
Info
)
:
ObservableDiffRvItem
<
HideRvItem
>(),
ComparableRv
<
Hide
RvItem
>
{
class
DenyList
RvItem
(
val
info
:
AppProcess
Info
)
:
ObservableDiffRvItem
<
DenyListRvItem
>(),
ComparableRv
<
DenyList
RvItem
>
{
override
val
layoutRes
get
()
=
R
.
layout
.
item_hide_md2
val
processes
=
info
.
processes
.
map
{
Hide
ProcessRvItem
(
it
)
}
val
processes
=
info
.
processes
.
map
{
ProcessRvItem
(
it
)
}
@get
:
Bindable
var
isExpanded
=
false
...
...
@@ -31,25 +31,24 @@ class HideRvItem(
@get
:
Bindable
val
checkedPercent
get
()
=
(
itemsChecked
.
toFloat
()
/
processes
.
size
*
100
).
roundToInt
()
private
var
state
:
Boolean
?
=
false
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
hiddenS
tate
)
private
var
_
state
:
Boolean
?
=
false
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
s
tate
)
@get
:
Bindable
var
hiddenS
tate
:
Boolean
?
get
()
=
state
set
(
value
)
=
set
(
value
,
state
,
{
state
=
it
},
BR
.
hiddenS
tate
)
{
var
s
tate
:
Boolean
?
get
()
=
_
state
set
(
value
)
=
set
(
value
,
_state
,
{
_state
=
it
},
BR
.
s
tate
)
{
if
(
value
==
true
)
{
processes
.
filterNot
{
it
.
is
Hidden
}
.
filterNot
{
it
.
is
Enabled
}
.
filter
{
isExpanded
||
it
.
defaultSelection
}
}
else
{
processes
.
filter
{
it
.
isHidden
}
processes
.
filter
{
it
.
isEnabled
}
}.
forEach
{
it
.
toggle
()
}
}
init
{
processes
.
forEach
{
it
.
addOnPropertyChangedCallback
(
BR
.
hidden
)
{
recalculateChecked
()
}
}
processes
.
forEach
{
it
.
addOnPropertyChangedCallback
(
BR
.
enabled
)
{
recalculateChecked
()
}
}
addOnPropertyChangedCallback
(
BR
.
expanded
)
{
recalculateChecked
()
}
recalculateChecked
()
}
...
...
@@ -60,8 +59,8 @@ class HideRvItem(
}
private
fun
recalculateChecked
()
{
itemsChecked
=
processes
.
count
{
it
.
is
Hidden
}
state
=
if
(
isExpanded
)
{
itemsChecked
=
processes
.
count
{
it
.
is
Enabled
}
_
state
=
if
(
isExpanded
)
{
when
(
itemsChecked
)
{
0
->
false
processes
.
size
->
true
...
...
@@ -69,7 +68,7 @@ class HideRvItem(
}
}
else
{
val
defaultProcesses
=
processes
.
filter
{
it
.
defaultSelection
}
when
(
defaultProcesses
.
count
{
it
.
is
Hidden
})
{
when
(
defaultProcesses
.
count
{
it
.
is
Enabled
})
{
0
->
false
defaultProcesses
.
size
->
true
else
->
null
...
...
@@ -77,10 +76,10 @@ class HideRvItem(
}
}
override
fun
compareTo
(
other
:
Hide
RvItem
)
=
comparator
.
compare
(
this
,
other
)
override
fun
compareTo
(
other
:
DenyList
RvItem
)
=
comparator
.
compare
(
this
,
other
)
companion
object
{
private
val
comparator
=
compareBy
<
Hide
RvItem
>(
private
val
comparator
=
compareBy
<
DenyList
RvItem
>(
{
it
.
itemsChecked
==
0
},
{
it
.
info
}
)
...
...
@@ -88,34 +87,34 @@ class HideRvItem(
}
class
Hide
ProcessRvItem
(
val
process
:
Hide
ProcessInfo
)
:
ObservableDiffRvItem
<
Hide
ProcessRvItem
>()
{
class
ProcessRvItem
(
val
process
:
ProcessInfo
)
:
ObservableDiffRvItem
<
ProcessRvItem
>()
{
override
val
layoutRes
get
()
=
R
.
layout
.
item_hide_process_md2
val
displayName
=
if
(
process
.
isIsolated
)
"(isolated) ${process.name}"
else
process
.
name
@get
:
Bindable
var
is
Hidden
get
()
=
process
.
is
Hidden
set
(
value
)
=
set
(
value
,
process
.
is
Hidden
,
{
process
.
isHidden
=
it
},
BR
.
hidden
)
{
var
is
Enabled
get
()
=
process
.
is
Enabled
set
(
value
)
=
set
(
value
,
process
.
is
Enabled
,
{
process
.
isEnabled
=
it
},
BR
.
enabled
)
{
val
arg
=
if
(
it
)
"add"
else
"rm"
val
(
name
,
pkg
)
=
process
Shell
.
su
(
"magisk
hide
$arg $pkg \'$name\'"
).
submit
()
Shell
.
su
(
"magisk
--denylist
$arg $pkg \'$name\'"
).
submit
()
}
fun
toggle
()
{
is
Hidden
=
!
isHidden
is
Enabled
=
!
isEnabled
}
val
defaultSelection
get
()
=
process
.
isIsolated
||
process
.
isAppZygote
||
process
.
name
==
process
.
packageName
override
fun
contentSameAs
(
other
:
Hide
ProcessRvItem
)
=
process
.
is
Hidden
==
other
.
process
.
isHidden
override
fun
contentSameAs
(
other
:
ProcessRvItem
)
=
process
.
is
Enabled
==
other
.
process
.
isEnabled
override
fun
itemSameAs
(
other
:
Hide
ProcessRvItem
)
=
override
fun
itemSameAs
(
other
:
ProcessRvItem
)
=
process
.
name
==
other
.
process
.
name
&&
process
.
packageName
==
other
.
process
.
packageName
}
app/src/main/java/com/topjohnwu/magisk/ui/
hide/Hide
ViewModel.kt
→
app/src/main/java/com/topjohnwu/magisk/ui/
deny/DenyList
ViewModel.kt
View file @
65b0ea79
package
com.topjohnwu.magisk.ui.
hide
package
com.topjohnwu.magisk.ui.
deny
import
android.annotation.SuppressLint
import
android.content.pm.ApplicationInfo
...
...
@@ -20,7 +20,7 @@ import kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
class
Hide
ViewModel
:
BaseViewModel
(),
Queryable
{
class
DenyList
ViewModel
:
BaseViewModel
(),
Queryable
{
override
val
queryDelay
=
1000L
...
...
@@ -43,11 +43,11 @@ class HideViewModel : BaseViewModel(), Queryable {
submitQuery
()
}
val
items
=
filterableListOf
<
Hide
RvItem
>()
val
itemBinding
=
itemBindingOf
<
Hide
RvItem
>
{
val
items
=
filterableListOf
<
DenyList
RvItem
>()
val
itemBinding
=
itemBindingOf
<
DenyList
RvItem
>
{
it
.
bindExtra
(
BR
.
viewModel
,
this
)
}
val
itemInternalBinding
=
itemBindingOf
<
Hide
ProcessRvItem
>
{
val
itemInternalBinding
=
itemBindingOf
<
ProcessRvItem
>
{
it
.
bindExtra
(
BR
.
viewModel
,
this
)
}
...
...
@@ -60,14 +60,14 @@ class HideViewModel : BaseViewModel(), Queryable {
state
=
State
.
LOADING
val
(
apps
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
pm
=
AppContext
.
packageManager
val
hideList
=
Shell
.
su
(
"magisk
hide ls"
).
exec
().
out
.
map
{
CmdlineHidden
Item
(
it
)
}
val
hideList
=
Shell
.
su
(
"magisk
--denylist ls"
).
exec
().
out
.
map
{
CmdlineList
Item
(
it
)
}
val
apps
=
pm
.
getInstalledApplications
(
MATCH_UNINSTALLED_PACKAGES
)
.
asSequence
()
.
filterNot
{
blacklist
.
contains
(
it
.
packageName
)
}
.
map
{
HideApp
Info
(
it
,
pm
,
hideList
)
}
.
map
{
AppProcess
Info
(
it
,
pm
,
hideList
)
}
.
filter
{
it
.
processes
.
isNotEmpty
()
}
.
filter
{
info
->
info
.
enabled
||
info
.
processes
.
any
{
it
.
is
Hidden
}
}
.
map
{
Hide
RvItem
(
it
)
}
.
filter
{
info
->
info
.
enabled
||
info
.
processes
.
any
{
it
.
is
Enabled
}
}
.
map
{
DenyList
RvItem
(
it
)
}
.
toList
()
.
sorted
()
apps
to
items
.
calculateDiff
(
apps
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
View file @
65b0ea79
...
...
@@ -252,14 +252,14 @@ object Magisk : BaseSettingsItem.Section() {
override
val
title
=
R
.
string
.
magisk
.
asText
()
}
object
MagiskHide
:
BaseSettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
magiskhide
.
asText
()
override
val
description
=
R
.
string
.
settings_
magiskhide
_summary
.
asText
()
override
var
value
=
Config
.
magiskHide
object
DenyList
:
BaseSettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
denylist
.
asText
()
override
val
description
=
R
.
string
.
settings_
denylist
_summary
.
asText
()
override
var
value
=
Info
.
env
.
denyListEnforced
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
val
cmd
=
if
(
it
)
"enable"
else
"disable"
Shell
.
su
(
"magisk
hide
$cmd"
).
submit
{
cb
->
if
(
cb
.
isSuccess
)
Config
.
magiskHide
=
it
Shell
.
su
(
"magisk
--denylist
$cmd"
).
submit
{
cb
->
if
(
cb
.
isSuccess
)
Info
.
env
.
denyListEnforced
=
it
else
field
=
!
it
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
View file @
65b0ea79
...
...
@@ -70,8 +70,11 @@ class SettingsViewModel(
if
(
Info
.
env
.
isActive
)
{
list
.
addAll
(
listOf
(
Magisk
,
MagiskHide
,
SystemlessHosts
SystemlessHosts
))
if
(
Const
.
Version
.
isCanary
())
{
list
.
add
(
DenyList
)
}
}
// Superuser
...
...
app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt
View file @
65b0ea79
...
...
@@ -64,18 +64,6 @@ object Shortcuts {
.
build
()
)
}
if
(
Info
.
env
.
magiskHide
)
{
shortCuts
.
add
(
ShortcutInfo
.
Builder
(
context
,
Const
.
Nav
.
HIDE
)
.
setShortLabel
(
context
.
getString
(
R
.
string
.
magiskhide
))
.
setIntent
(
Intent
(
intent
).
putExtra
(
Const
.
Key
.
OPEN_SECTION
,
Const
.
Nav
.
HIDE
)
)
.
setIcon
(
context
.
getIcon
(
R
.
drawable
.
sc_magiskhide
))
.
setRank
(
1
)
.
build
()
)
}
if
(
Info
.
env
.
isActive
)
{
shortCuts
.
add
(
ShortcutInfo
.
Builder
(
context
,
Const
.
Nav
.
MODULES
)
...
...
@@ -84,7 +72,7 @@ object Shortcuts {
Intent
(
intent
).
putExtra
(
Const
.
Key
.
OPEN_SECTION
,
Const
.
Nav
.
MODULES
)
)
.
setIcon
(
context
.
getIcon
(
R
.
drawable
.
sc_extension
))
.
setRank
(
2
)
.
setRank
(
1
)
.
build
()
)
}
...
...
app/src/main/java/com/topjohnwu/magisk/view/TappableHeadlineItem.kt
View file @
65b0ea79
...
...
@@ -21,7 +21,7 @@ sealed class TappableHeadlineItem : DiffRvItem<TappableHeadlineItem>() {
// --- objects
object
Hide
:
TappableHeadlineItem
()
{
override
val
title
=
R
.
string
.
magiskhide
override
val
title
=
R
.
string
.
denylist
override
val
icon
=
R
.
drawable
.
ic_hide_md2
}
...
...
app/src/main/res/layout/
include_hide
_filter.xml
→
app/src/main/res/layout/
app_list
_filter.xml
View file @
65b0ea79
...
...
@@ -9,7 +9,7 @@
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
ViewModel"
/>
type=
"com.topjohnwu.magisk.ui.
deny.DenyList
ViewModel"
/>
</data>
...
...
@@ -27,7 +27,7 @@
tools:paddingBottom=
"64dp"
>
<TextView
android:id=
"@+id/
hide_filter_title_filter
"
android:id=
"@+id/
filter_title
"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/hide_filters"
...
...
@@ -45,7 +45,7 @@
app:chipSpacing=
"2dp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/
hide_filter_title_filter
"
>
app:layout_constraintTop_toBottomOf=
"@+id/
filter_title
"
>
<com.google.android.material.chip.Chip
android:id=
"@+id/hide_filter_system_chip"
...
...
@@ -83,7 +83,7 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:checkable=
"false"
android:nextFocusRight=
"@id/
hide_
filter_done"
android:nextFocusRight=
"@id/filter_done"
android:nextFocusDown=
"@id/hide_filter_search_field"
android:text=
"@{viewModel.query}"
android:textAppearance=
"@style/AppearanceFoundation.Caption"
...
...
@@ -113,7 +113,7 @@
android:layout_marginBottom=
"@dimen/l_50"
app:cardCornerRadius=
"18dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toStartOf=
"@+id/
hide_
filter_done"
app:layout_constraintEnd_toStartOf=
"@+id/filter_done"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/hide_filter_title_search"
>
...
...
@@ -136,7 +136,7 @@
android:hint=
"@string/hide_filter_hint"
android:inputType=
"textUri"
android:minHeight=
"36dp"
android:nextFocusRight=
"@id/
hide_
filter_done"
android:nextFocusRight=
"@id/filter_done"
android:paddingStart=
"0dp"
android:paddingEnd=
"@dimen/l1"
android:singleLine=
"true"
...
...
@@ -148,7 +148,7 @@
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id=
"@+id/
hide_
filter_done"
android:id=
"@+id/filter_done"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:nextFocusLeft=
"@id/hide_filter_system_chip"
...
...
app/src/main/res/layout/fragment_
hide
_md2.xml
→
app/src/main/res/layout/fragment_
deny
_md2.xml
View file @
65b0ea79
...
...
@@ -7,7 +7,7 @@
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
ViewModel"
/>
type=
"com.topjohnwu.magisk.ui.
deny.DenyList
ViewModel"
/>
</data>
...
...
@@ -16,7 +16,7 @@
android:layout_height=
"match_parent"
>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/
hide_conten
t"
android:id=
"@+id/
app_lis
t"
invisibleUnless=
"@{viewModel.loaded || !viewModel.items.empty}"
itemBinding=
"@{viewModel.itemBinding}"
items=
"@{viewModel.items}"
...
...
@@ -31,7 +31,7 @@
tools:paddingTop=
"40dp"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id=
"@+id/
hide_
filter_toggle"
android:id=
"@+id/filter_toggle"
invisibleUnless=
"@{viewModel.loaded || !viewModel.items.empty}"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
...
...
@@ -46,7 +46,7 @@
tools:layout_marginBottom=
"64dp"
/>
<com.google.android.material.circularreveal.cardview.CircularRevealCardView
android:id=
"@+id/
hide
_filter"
android:id=
"@+id/
process
_filter"
style=
"@style/WidgetFoundation.Card"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
...
...
@@ -56,8 +56,8 @@
app:cardCornerRadius=
"0dp"
>
<include
android:id=
"@+id/
hide
_filter_include"
layout=
"@layout/
include_hide
_filter"
android:id=
"@+id/
app
_filter_include"
layout=
"@layout/
app_list
_filter"
viewModel=
"@{viewModel}"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
/>
...
...
app/src/main/res/layout/item_hide_md2.xml
View file @
65b0ea79
...
...
@@ -9,11 +9,11 @@
<variable
name=
"item"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
RvItem"
/>
type=
"com.topjohnwu.magisk.ui.
deny.DenyList
RvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
ViewModel"
/>
type=
"com.topjohnwu.magisk.ui.
deny.DenyList
ViewModel"
/>
</data>
...
...
@@ -80,7 +80,7 @@
<com.topjohnwu.widget.IndeterminateCheckBox
android:id=
"@+id/hide_expand_icon"
state=
"@={item.
hiddenS
tate}"
state=
"@={item.
s
tate}"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"@dimen/l1"
...
...
app/src/main/res/layout/item_hide_process_md2.xml
View file @
65b0ea79
...
...
@@ -7,11 +7,11 @@
<variable
name=
"item"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
ProcessRvItem"
/>
type=
"com.topjohnwu.magisk.ui.
deny.
ProcessRvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.
hide.Hide
ViewModel"
/>
type=
"com.topjohnwu.magisk.ui.
deny.DenyList
ViewModel"
/>
</data>
...
...
@@ -19,7 +19,7 @@
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:alpha=
"@{item.
hidden
? 1f : .7f}"
>
android:alpha=
"@{item.
enabled
? 1f : .7f}"
>
<TextView
android:layout_width=
"0dp"
...
...
@@ -40,7 +40,7 @@
<com.google.android.material.switchmaterial.SwitchMaterial
android:id=
"@+id/hide_process_checkbox"
android:checked=
"@={item.
hidden
}"
android:checked=
"@={item.
enabled
}"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"@dimen/l_50"
...
...
app/src/main/res/layout/item_tappable_headline.xml
View file @
65b0ea79
...
...
@@ -48,7 +48,7 @@
app:layout_constraintEnd_toStartOf=
"@+id/headline_icon_pointer"
app:layout_constraintStart_toEndOf=
"@+id/tappable_icon"
app:layout_constraintTop_toTopOf=
"parent"
tools:text=
"@string/
magiskhide
"
/>
tools:text=
"@string/
denylist
"
/>
<ImageView
android:id=
"@+id/headline_icon_pointer"
...
...
app/src/main/res/menu/menu_bottom_nav.xml
View file @
65b0ea79
...
...
@@ -15,9 +15,9 @@
tools:showAsAction=
"always"
/>
<item
android:id=
"@+id/
hide
Fragment"
android:id=
"@+id/
deny
Fragment"
android:icon=
"@drawable/ic_hide_md2"
android:title=
"@string/
magiskhide
"
android:title=
"@string/
denylist
"
tools:showAsAction=
"always"
/>
<item
...
...
app/src/main/res/navigation/main.xml
View file @
65b0ea79
...
...
@@ -6,10 +6,10 @@
app:startDestination=
"@id/homeFragment"
>
<fragment
android:id=
"@+id/
hide
Fragment"
android:name=
"com.topjohnwu.magisk.ui.
hide.Hide
Fragment"
android:label=
"
Hide
Fragment"
tools:layout=
"@layout/fragment_
hide
_md2"
/>
android:id=
"@+id/
deny
Fragment"
android:name=
"com.topjohnwu.magisk.ui.
deny.DenyList
Fragment"
android:label=
"
DenyList
Fragment"
tools:layout=
"@layout/fragment_
deny
_md2"
/>
<fragment
android:id=
"@+id/homeFragment"
...
...
@@ -165,8 +165,8 @@
app:popUpTo=
"@id/homeFragment"
/>
<action
android:id=
"@+id/action_
hide
Fragment"
app:destination=
"@id/
hide
Fragment"
android:id=
"@+id/action_
denylist
Fragment"
app:destination=
"@id/
deny
Fragment"
app:enterAnim=
"@anim/fragment_enter"
app:exitAnim=
"@anim/fragment_exit"
app:popEnterAnim=
"@anim/fragment_enter_pop"
...
...
app/src/main/res/values-ar/strings.xml
View file @
65b0ea79
...
...
@@ -136,7 +136,6 @@
<string
name=
"settings_update_beta"
>
تجريبي
</string>
<string
name=
"settings_update_custom"
>
مخصص
</string>
<string
name=
"settings_update_custom_msg"
>
أدخل الرابط لمصدرك المخصص
</string>
<string
name=
"settings_magiskhide_summary"
>
إخفاء مـاجـيسك من معظم طرق الاكتشاف
</string>
<string
name=
"settings_hosts_title"
>
موانع الاعلانات
</string>
<string
name=
"settings_hosts_summary"
>
حجب الاعلانات دون تعديل النظام
</string>
<string
name=
"settings_hosts_toast"
>
تم تمكين خاصية حجب الاعلانات
</string>
...
...
app/src/main/res/values-az/strings.xml
View file @
65b0ea79
...
...
@@ -82,7 +82,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Özəl
</string>
<string
name=
"settings_update_custom_msg"
>
Özəl URL daxil edin
</string>
<string
name=
"settings_magiskhide_summary"
>
Magisk\'i fərqli növdə aşkarlamalardan gizləyin.
</string>
<string
name=
"settings_hosts_title"
>
Sistemsiz host\'lar
</string>
<string
name=
"settings_hosts_summary"
>
Adblock tətbiqləri üçün Sistemsiz host dəstəyi.
</string>
<string
name=
"settings_hosts_toast"
>
Sistemsiz host əlavəsi quraşdırıldı
</string>
...
...
app/src/main/res/values-be/strings.xml
View file @
65b0ea79
...
...
@@ -136,7 +136,6 @@
<string
name=
"settings_update_beta"
>
Бэта
</string>
<string
name=
"settings_update_custom"
>
Адвольны канал
</string>
<string
name=
"settings_update_custom_msg"
>
Устаўце URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Хаваць Magisk ад выяўлення
</string>
<string
name=
"settings_hosts_title"
>
Пазасістэмны файл hosts
</string>
<string
name=
"settings_hosts_summary"
>
Падтрымка пазасістэмнага файла hosts для праграм, якія блакуюць рэкламу
</string>
<string
name=
"settings_hosts_toast"
>
Дададзены модуль пазасістэмнага файла hosts
</string>
...
...
app/src/main/res/values-bg/strings.xml
View file @
65b0ea79
...
...
@@ -78,7 +78,6 @@
<string
name=
"settings_update_beta"
>
Бета
</string>
<string
name=
"settings_update_custom"
>
Потребителски
</string>
<string
name=
"settings_update_custom_msg"
>
Въведете потребителски URL
</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>
...
...
app/src/main/res/values-ca/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Canal personalitzat
</string>
<string
name=
"settings_update_custom_msg"
>
Inserta un URL personalitzada
</string>
<string
name=
"settings_magiskhide_summary"
>
Amagar Magisk de diverses 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>
...
...
app/src/main/res/values-cs/strings.xml
View file @
65b0ea79
...
...
@@ -145,7 +145,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Vlastní
</string>
<string
name=
"settings_update_custom_msg"
>
Vložte vlastní URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Skryjete Magisk před různými detekcemi.
</string>
<string
name=
"settings_hosts_title"
>
Nesystémový hostitel
</string>
<string
name=
"settings_hosts_summary"
>
Přidáte modul pro podporu nesystémových hostitelů v aplikaci AdBlock.
</string>
<string
name=
"settings_hosts_toast"
>
Přidán systémový modul hostitelů
</string>
...
...
app/src/main/res/values-de/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Benutzerdefiniert
</string>
<string
name=
"settings_update_custom_msg"
>
Eine benutzerdefinierte URL eingeben
</string>
<string
name=
"settings_magiskhide_summary"
>
Versteckt Magisk vor diversen Entdeckungsmethoden
</string>
<string
name=
"settings_hosts_title"
>
Systemlose Hosts-Datei
</string>
<string
name=
"settings_hosts_summary"
>
Systemlose Unterstützung für Werbeblocker
</string>
<string
name=
"settings_hosts_toast"
>
Systemloses Hosts-Modul hinzugefügt
</string>
...
...
app/src/main/res/values-el/strings.xml
View file @
65b0ea79
...
...
@@ -145,7 +145,6 @@
<string
name=
"settings_update_beta"
>
Δοκιμαστικό
</string>
<string
name=
"settings_update_custom"
>
Προσαρμοσμένο
</string>
<string
name=
"settings_update_custom_msg"
>
Εισαγωγή ενός custom URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Κρύβει το Magisk από διάφορες ανιχνεύσεις
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
Υποστήριξη Systemless hosts για εφαρμογές Adblock
</string>
<string
name=
"settings_hosts_toast"
>
Προσθήκη αρθρώματος systemless hosts
</string>
...
...
app/src/main/res/values-es/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Personalizado
</string>
<string
name=
"settings_update_custom_msg"
>
Insertar una URL personalizada
</string>
<string
name=
"settings_magiskhide_summary"
>
Ocultar Magisk de varias detecciones
</string>
<string
name=
"settings_hosts_title"
>
Systemless Hosts
</string>
<string
name=
"settings_hosts_summary"
>
Soporte para bloqueadores de publicidad fuera de la partición system
</string>
<string
name=
"settings_hosts_toast"
>
Módulo systemless hosts agregado
</string>
...
...
app/src/main/res/values-et/strings.xml
View file @
65b0ea79
...
...
@@ -137,7 +137,6 @@
<string
name=
"settings_update_beta"
>
Beeta
</string>
<string
name=
"settings_update_custom"
>
Kohandatud
</string>
<string
name=
"settings_update_custom_msg"
>
Sisesta kohandatud URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Peida Magisk erinevate tuvastuste eest
</string>
<string
name=
"settings_hosts_title"
>
Süsteemivaba hosts
</string>
<string
name=
"settings_hosts_summary"
>
Süsteemivaba hosts-tugi reklaamiblokeerijatest rakendustele
</string>
<string
name=
"settings_hosts_toast"
>
Süsteemivaba hostsi moodul lisatud
</string>
...
...
app/src/main/res/values-fa/strings.xml
View file @
65b0ea79
...
...
@@ -134,7 +134,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Custom Channel
</string>
<string
name=
"settings_update_custom_msg"
>
اضافه کردن یک URL سفارشی
</string>
<string
name=
"settings_magiskhide_summary"
>
پنهان کردن Magisk از اشکال مختلف
</string>
<string
name=
"settings_hosts_title"
>
نصب بدون حذف یا تغییر در فایل ها
</string>
<string
name=
"settings_hosts_summary"
>
نصب بدون حذف یا تغییر در فایل ها رای ساپورت از برنامه های Adblock
</string>
<string
name=
"settings_hosts_toast"
>
ماژول نصب بدون حذف یا تغییر در فایل ها اضافه شد
</string>
...
...
app/src/main/res/values-fr/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Bêta
</string>
<string
name=
"settings_update_custom"
>
Canal personnalisé
</string>
<string
name=
"settings_update_custom_msg"
>
Saisissez une URL personnalisée
</string>
<string
name=
"settings_magiskhide_summary"
>
Rendre Magisk invisible face à diverses formes de détection.
</string>
<string
name=
"settings_hosts_title"
>
Fichier d’hôtes hors partition système
</string>
<string
name=
"settings_hosts_summary"
>
Utilisation d’un fichier d’hôtes hors de la partition système pour les applications de blocage de publicité.
</string>
<string
name=
"settings_hosts_toast"
>
Ajout d’un module pour fichier hosts hors système
</string>
...
...
app/src/main/res/values-hi/strings.xml
View file @
65b0ea79
...
...
@@ -139,7 +139,6 @@
<string
name=
"settings_update_beta"
>
बीटा
</string>
<string
name=
"settings_update_custom"
>
कस्टम चैनल
</string>
<string
name=
"settings_update_custom_msg"
>
एक कस्टम URL डालें
</string>
<string
name=
"settings_magiskhide_summary"
>
विभिन्न रूप की खोजों से बचने के लिए मैजिस्क को छिपाएं
</string>
<string
name=
"settings_hosts_title"
>
सिस्टमलेस होस्ट
</string>
<string
name=
"settings_hosts_summary"
>
Adblock ऐप्स के लिए सिस्टमलेस होस्ट सपोर्ट
</string>
<string
name=
"settings_hosts_toast"
>
सिस्टमलेस होस्ट मॉड्यूल जोड़ा गया
</string>
...
...
app/src/main/res/values-hr/strings.xml
View file @
65b0ea79
...
...
@@ -137,7 +137,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Vlastiti kanal
</string>
<string
name=
"settings_update_custom_msg"
>
Umetnite prilagođeni URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Sakrij Magisk od različitih oblika otkrivanja
</string>
<string
name=
"settings_hosts_title"
>
Hostovi bez sistema
</string>
<string
name=
"settings_hosts_summary"
>
Podrška za hostove bez sistema za Adblock aplikacije
</string>
<string
name=
"settings_hosts_toast"
>
Dodan je modul hosta bez sistema
</string>
...
...
app/src/main/res/values-in/strings.xml
View file @
65b0ea79
...
...
@@ -140,7 +140,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Kanal khusus
</string>
<string
name=
"settings_update_custom_msg"
>
Masukkan URL khusus
</string>
<string
name=
"settings_magiskhide_summary"
>
Sembunyikan Magisk dari berbagai bentuk pendeteksian
</string>
<string
name=
"settings_hosts_title"
>
Host systemless
</string>
<string
name=
"settings_hosts_summary"
>
Dukungan host secara systemless untuk aplikasi pemblokir iklan
</string>
<string
name=
"settings_hosts_toast"
>
Menambahkan modul host systemless
</string>
...
...
app/src/main/res/values-it/strings.xml
View file @
65b0ea79
...
...
@@ -141,7 +141,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Canale personalizzato
</string>
<string
name=
"settings_update_custom_msg"
>
Inserisci un URL personalizzato
</string>
<string
name=
"settings_magiskhide_summary"
>
Nasconde Magisk da numerosi sistemi di rilevazione
</string>
<string
name=
"settings_hosts_title"
>
File hosts systemless
</string>
<string
name=
"settings_hosts_summary"
>
Supporto al file hosts systemless per le app che bloccano le pubblicità
</string>
<string
name=
"settings_hosts_toast"
>
Aggiunto modulo per il supporto al file hosts systemless
</string>
...
...
app/src/main/res/values-iw/strings.xml
View file @
65b0ea79
...
...
@@ -144,7 +144,6 @@
<string
name=
"settings_update_beta"
>
בטא
</string>
<string
name=
"settings_update_custom"
>
ערוץ מותאם אישית
</string>
<string
name=
"settings_update_custom_msg"
>
הזן כתובת מותאמת אישית
</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>
...
...
app/src/main/res/values-ja/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
ベータ版
</string>
<string
name=
"settings_update_custom"
>
カスタム
</string>
<string
name=
"settings_update_custom_msg"
>
カスタム URL を入力
</string>
<string
name=
"settings_magiskhide_summary"
>
さまざまな検出方法から Magisk を隠します
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
広告ブロックアプリのための Systemless hosts サポートを有効化します
</string>
<string
name=
"settings_hosts_toast"
>
Systemless hosts モジュールを追加しました
</string>
...
...
app/src/main/res/values-ka/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
ბეტა
</string>
<string
name=
"settings_update_custom"
>
პერსონალიზირებული
</string>
<string
name=
"settings_update_custom_msg"
>
სხვა URL-ის ჩასმა
</string>
<string
name=
"settings_magiskhide_summary"
>
Magisk-ის დამალვა დაცვის ხერხებისგან
</string>
<string
name=
"settings_hosts_title"
>
გარესისტემური ჰოსტები
</string>
<string
name=
"settings_hosts_summary"
>
გარესისტემური ჰოსტები Adblock-ებისთვის
</string>
<string
name=
"settings_hosts_toast"
>
გარესისტემური ჰოსტების მოდული დამატებულია
</string>
...
...
app/src/main/res/values-ko/strings.xml
View file @
65b0ea79
...
...
@@ -137,7 +137,6 @@
<string
name=
"settings_update_beta"
>
베타
</string>
<string
name=
"settings_update_custom"
>
사용자 지정
</string>
<string
name=
"settings_update_custom_msg"
>
사용자 지정 URL 입력
</string>
<string
name=
"settings_magiskhide_summary"
>
다양한 감지로부터 Magisk를 숨깁니다.
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
광고 차단 앱에서 사용하는 systemless hosts를 지원합니다.
</string>
<string
name=
"settings_hosts_toast"
>
Systemless hosts 모듈 추가됨
</string>
...
...
app/src/main/res/values-lt/strings.xml
View file @
65b0ea79
...
...
@@ -74,7 +74,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Pasirinktiniai
</string>
<string
name=
"settings_update_custom_msg"
>
Įvesti pasirinktinį URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Paslėpti Magisk nuo įvairių susekimų
</string>
<string
name=
"settings_hosts_title"
>
Sistemos padejėjai
</string>
<string
name=
"settings_hosts_summary"
>
Įgalinti sistemos padejėjus Adblock programėlėms
</string>
...
...
app/src/main/res/values-mk/strings.xml
View file @
65b0ea79
...
...
@@ -86,7 +86,6 @@
<string
name=
"settings_update_beta"
>
Бета
</string>
<string
name=
"settings_update_custom"
>
Прилагодено
</string>
<string
name=
"settings_update_custom_msg"
>
Внеси прилагоден URL линк
</string>
<string
name=
"settings_magiskhide_summary"
>
Сокриј го Magisk од различни форми на откривање.
</string>
<string
name=
"settings_hosts_title"
>
Несистемски хостови
</string>
<string
name=
"settings_hosts_summary"
>
Поддршка за несистемски хостови за Adblock апликации.
</string>
<string
name=
"settings_hosts_toast"
>
Додаден е модул за несистемски хостови
</string>
...
...
app/src/main/res/values-nb/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Egendefinert kanal
</string>
<string
name=
"settings_update_custom_msg"
>
Sett inn en egendefinert nettadresse
</string>
<string
name=
"settings_magiskhide_summary"
>
Skjul Magisk fra å bli oppdaget
</string>
<string
name=
"settings_hosts_title"
>
Systemløs vertsfil
</string>
<string
name=
"settings_hosts_summary"
>
Systemløs vertsfilstøtte for reklameblokkeringsprogrammer
</string>
<string
name=
"settings_hosts_toast"
>
La til modul for systemløs vertsfil
</string>
...
...
app/src/main/res/values-nl/strings.xml
View file @
65b0ea79
...
...
@@ -136,7 +136,6 @@
<string
name=
"settings_update_beta"
>
Bèta
</string>
<string
name=
"settings_update_custom"
>
Aangepast
</string>
<string
name=
"settings_update_custom_msg"
>
Voer een aangepaste url in
</string>
<string
name=
"settings_magiskhide_summary"
>
Maak Magisk onzichtbaar voor detectiesystemen.
</string>
<string
name=
"settings_hosts_title"
>
Systeemloze hosts
</string>
<string
name=
"settings_hosts_summary"
>
Systeemloze hosts-ondersteuning voor advertentieblokkeringsapps.
</string>
<string
name=
"settings_hosts_toast"
>
De systeemloze hosts-module is toegevoegd
</string>
...
...
app/src/main/res/values-pa/strings.xml
View file @
65b0ea79
...
...
@@ -139,7 +139,6 @@
<string
name=
"settings_update_beta"
>
ਬੀਟਾ
</string>
<string
name=
"settings_update_custom"
>
ਕਸਟਮ ਚੈਨਲ
</string>
<string
name=
"settings_update_custom_msg"
>
ਇੱਕ ਕਸਟਮ URL ਦਾਖਲ ਕਰੋ
</string>
<string
name=
"settings_magiskhide_summary"
>
ਵੱਖ ਵੱਖ ਕਿਸਮਾਂ ਦੀਆਂ ਖੋਜਾਂ ਤੋਂ ਬਚਣ ਲਈ ਮੈਜਿਸਕ ਨੂੰ ਓਹਲੇ ਕਰੋ
</string>
<string
name=
"settings_hosts_title"
>
Systemless ਹੋਸਟ
</string>
<string
name=
"settings_hosts_summary"
>
Adblock ਐਪਸ ਲਈ Systemless ਹੋਸਟ ਦੀ ਸਹਿਯੋਗ
</string>
<string
name=
"settings_hosts_toast"
>
Systemless ਹੋਸਟ ਮੋਡੀਊਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ
</string>
...
...
app/src/main/res/values-pl/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Własny kanał
</string>
<string
name=
"settings_update_custom_msg"
>
Wprowadź adres URL własnego kanału
</string>
<string
name=
"settings_magiskhide_summary"
>
Ukryj Magisk przed różnymi formami detekcji
</string>
<string
name=
"settings_hosts_title"
>
Hosty Systemless
</string>
<string
name=
"settings_hosts_summary"
>
Wsparcie hostów Systemless dla aplikacji typu Adblock
</string>
<string
name=
"settings_hosts_toast"
>
Dodano moduł hostów Systemless
</string>
...
...
app/src/main/res/values-pt-rBR/strings.xml
View file @
65b0ea79
...
...
@@ -145,7 +145,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Canal personalizado
</string>
<string
name=
"settings_update_custom_msg"
>
Insira um URL personalizado
</string>
<string
name=
"settings_magiskhide_summary"
>
Esconda o Magisk de várias formas de detecção
</string>
<string
name=
"settings_hosts_title"
>
Hosts sem sistema
</string>
<string
name=
"settings_hosts_summary"
>
Suporte de hosts sem sistema para aplicativos Adblock
</string>
<string
name=
"settings_hosts_toast"
>
Adicionado módulo de hosts sem sistema
</string>
...
...
app/src/main/res/values-pt-rPT/strings.xml
View file @
65b0ea79
...
...
@@ -56,7 +56,6 @@
<string
name=
"system_default"
>
(Padrão do Sistema)
</string>
<string
name=
"settings_update_stable"
>
Estável
</string>
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_magiskhide_summary"
>
Oculta Magisk de várias deteções
</string>
<string
name=
"settings_hosts_title"
>
Ativar systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
Suporte de systemless para aplicações Adblock
</string>
...
...
app/src/main/res/values-ro/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Canal personalizat
</string>
<string
name=
"settings_update_custom_msg"
>
Inserează un URL personalizat
</string>
<string
name=
"settings_magiskhide_summary"
>
Ascunde Magisk de diferite forme de detectare
</string>
<string
name=
"settings_hosts_title"
>
Fișier hosts în afara partiției system
</string>
<string
name=
"settings_hosts_summary"
>
Suport pentru fișierul hosts în afara partiției system, în cazul aplicațiilor adblock
</string>
<string
name=
"settings_hosts_toast"
>
Modulul pentru fișierul hosts în afara partiției system, adăugat
</string>
...
...
app/src/main/res/values-ru/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta канал
</string>
<string
name=
"settings_update_custom"
>
Сторонний канал
</string>
<string
name=
"settings_update_custom_msg"
>
Укажите ссылку
</string>
<string
name=
"settings_magiskhide_summary"
>
Скрывать Magisk от различных обнаружений
</string>
<string
name=
"settings_hosts_title"
>
Внесистемный hosts файл
</string>
<string
name=
"settings_hosts_summary"
>
Поддержка внесистемного hosts файла для приложений, блокирующих рекламу
</string>
<string
name=
"settings_hosts_toast"
>
Добавлен модуль внесистемного hosts файла
</string>
...
...
app/src/main/res/values-sk/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Vlastný kanál
</string>
<string
name=
"settings_update_custom_msg"
>
Zadajte vlastnú URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Skryje Magisk pred rôznymi formami detekcie
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
Podpora pre Adblock aplikácie so systemless hosts
</string>
<string
name=
"settings_hosts_toast"
>
Pridaný modul systemless hosts
</string>
...
...
app/src/main/res/values-sq/strings.xml
View file @
65b0ea79
...
...
@@ -140,7 +140,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Kanali i personalizuar
</string>
<string
name=
"settings_update_custom_msg"
>
Vendos një URL të personalizuar
</string>
<string
name=
"settings_magiskhide_summary"
>
Fshih Magisk nga forma të ndryshme të zbulimit
</string>
<string
name=
"settings_hosts_title"
>
Pritës pa sistem
</string>
<string
name=
"settings_hosts_summary"
>
Mbështetja e hostëve pa sistem për aplikacionet Adblock
</string>
<string
name=
"settings_hosts_toast"
>
Moduli i pritur i sistemit pa sistem
</string>
...
...
app/src/main/res/values-sr/strings.xml
View file @
65b0ea79
...
...
@@ -63,7 +63,6 @@
<string
name=
"settings_update_beta"
>
Бета
</string>
<string
name=
"settings_update_custom"
>
По наруџби
</string>
<string
name=
"settings_update_custom_msg"
>
Унеси наруџбени УРЛ
</string>
<string
name=
"settings_magiskhide_summary"
>
Сакриј Магиск од разних детекција
</string>
<string
name=
"settings_hosts_title"
>
Без-системски домаћини (hosts)
</string>
<string
name=
"settings_hosts_summary"
>
Подршка без-системских домаћина за апликације за блокирање реклама
</string>
...
...
app/src/main/res/values-sv/strings.xml
View file @
65b0ea79
...
...
@@ -145,7 +145,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Anpassad kanal
</string>
<string
name=
"settings_update_custom_msg"
>
Lägg till en anpassad URL
</string>
<string
name=
"settings_magiskhide_summary"
>
Dölj Magisk från att bli upptäckt
</string>
<string
name=
"settings_hosts_title"
>
Systemfri hosts
</string>
<string
name=
"settings_hosts_summary"
>
Stöd för Adblock-appar med systemfri hosts-fil
</string>
<string
name=
"settings_hosts_toast"
>
Lagt till modul för systemfri hosts-fil
</string>
...
...
app/src/main/res/values-ta/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
தற்காலிகமானது
</string>
<string
name=
"settings_update_custom"
>
தனிப்பயன் வழி
</string>
<string
name=
"settings_update_custom_msg"
>
தனிப்பயன் URL ஐ உள்ளிடவும்
</string>
<string
name=
"settings_magiskhide_summary"
>
பல்வேறு வகையான கண்டறிதலில் இருந்து மேகிஸ்கை மறைக்கவும்
</string>
<string
name=
"settings_hosts_title"
>
கணினி இல்லாத ஹோஸ்ட்கள்
</string>
<string
name=
"settings_hosts_summary"
>
கணினி இல்லாத ஹோஸ்ட்கள் Adblock பயன்பாடுகளுக்கு ஆதரவளிக்கின்றன
</string>
<string
name=
"settings_hosts_toast"
>
கணினி இல்லாத ஹோஸ்ட்கள் தொகுதி சேர்க்கப்பட்டது
</string>
...
...
app/src/main/res/values-th/strings.xml
View file @
65b0ea79
...
...
@@ -79,7 +79,6 @@
<string
name=
"settings_update_beta"
>
เบต้า
</string>
<string
name=
"settings_update_custom"
>
กำหนดเอง
</string>
<string
name=
"settings_update_custom_msg"
>
ใส่ URL
</string>
<string
name=
"settings_magiskhide_summary"
>
ซ่อน Magisk จากการตรวจสอบในหลากหลายรูปแบบ
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
การรองรับ Systemless hosts เพื่อแอพ Adblock ต่างๆ
</string>
<string
name=
"settings_hosts_toast"
>
ทำการเพิ่มโมดูล systemless hosts แล้ว
</string>
...
...
app/src/main/res/values-tr/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Özel Kanal
</string>
<string
name=
"settings_update_custom_msg"
>
Özel URL ekleyin
</string>
<string
name=
"settings_magiskhide_summary"
>
Magisk\'i çeşitli algılamalardan gizle
</string>
<string
name=
"settings_hosts_title"
>
Sistemsiz hosts
</string>
<string
name=
"settings_hosts_summary"
>
Reklam engelleme uygulamaları için sistemsiz hosts desteği
</string>
<string
name=
"settings_hosts_toast"
>
Sistemsiz hosts modülü eklendi
</string>
...
...
app/src/main/res/values-uk/strings.xml
View file @
65b0ea79
...
...
@@ -140,7 +140,6 @@
<string
name=
"settings_update_beta"
>
Бета реліз
</string>
<string
name=
"settings_update_custom"
>
Власний
</string>
<string
name=
"settings_update_custom_msg"
>
Вставте власний URL
</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>
...
...
app/src/main/res/values-vi/strings.xml
View file @
65b0ea79
...
...
@@ -77,7 +77,6 @@
<string
name=
"settings_update_beta"
>
Dùng thử
</string>
<string
name=
"settings_update_custom"
>
Tuỳ chỉnh
</string>
<string
name=
"settings_update_custom_msg"
>
Chèn URL tuỳ chỉnh
</string>
<string
name=
"settings_magiskhide_summary"
>
Ẩn Magisk khỏi nhiều phương thức phát hiện
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
Systemless hosts hỗ trợ các ứng dụng chặn quảng cáo
</string>
<string
name=
"settings_hosts_toast"
>
Mô-đun được thêm vào systemless hosts
</string>
...
...
app/src/main/res/values-zh-rCN/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
测试版
</string>
<string
name=
"settings_update_custom"
>
自定义通道
</string>
<string
name=
"settings_update_custom_msg"
>
自定义通道网址
</string>
<string
name=
"settings_magiskhide_summary"
>
隐藏 Magisk 避免被检测
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
为广告屏蔽应用提供 Systemless hosts 支持
</string>
<string
name=
"settings_hosts_toast"
>
已添加 systemless hosts 模块
</string>
...
...
app/src/main/res/values-zh-rTW/strings.xml
View file @
65b0ea79
...
...
@@ -146,7 +146,6 @@
<string
name=
"settings_update_beta"
>
測試版
</string>
<string
name=
"settings_update_custom"
>
自訂頻道
</string>
<string
name=
"settings_update_custom_msg"
>
輸入一個自訂的網址
</string>
<string
name=
"settings_magiskhide_summary"
>
隱藏 Magisk 以避免被偵測
</string>
<string
name=
"settings_hosts_title"
>
主機(Hosts)模組化
</string>
<string
name=
"settings_hosts_summary"
>
為廣告阻擋程式提供主機模組
</string>
<string
name=
"settings_hosts_toast"
>
已安裝主機模組
</string>
...
...
app/src/main/res/values/resources.xml
View file @
65b0ea79
...
...
@@ -3,7 +3,6 @@
<!-- Static strings -->
<string
name=
"magisk"
translatable=
"false"
>
Magisk
</string>
<string
name=
"magiskhide"
translatable=
"false"
>
MagiskHide
</string>
<string
name=
"empty"
translatable=
"false"
/>
<string
name=
"topjohnwu"
translatable=
"false"
>
\@topjohnwu
</string>
...
...
app/src/main/res/values/strings.xml
View file @
65b0ea79
...
...
@@ -10,6 +10,7 @@
<string
name=
"section_home"
>
Home
</string>
<string
name=
"section_theme"
>
Themes
</string>
<string
name=
"safetynet"
>
SafetyNet
</string>
<string
name=
"denylist"
>
DenyList
</string>
<!--Home-->
<string
name=
"no_connection"
>
No connection available
</string>
...
...
@@ -146,7 +147,7 @@
<string
name=
"settings_update_beta"
>
Beta
</string>
<string
name=
"settings_update_custom"
>
Custom Channel
</string>
<string
name=
"settings_update_custom_msg"
>
Insert a custom URL
</string>
<string
name=
"settings_
magiskhide_summary"
>
Hide Magisk from various forms of detection
</string>
<string
name=
"settings_
denylist_summary"
>
Processes on the denylist will have all Magisk modifications reverted
</string>
<string
name=
"settings_hosts_title"
>
Systemless hosts
</string>
<string
name=
"settings_hosts_summary"
>
Systemless hosts support for Adblock apps
</string>
<string
name=
"settings_hosts_toast"
>
Added systemless hosts module
</string>
...
...
native/jni/Android.mk
View file @
65b0ea79
...
...
@@ -22,9 +22,9 @@ LOCAL_SRC_FILES := \
core/module.cpp \
core/logging.cpp \
core/thread.cpp \
magiskhide/magiskhide
.cpp \
magiskhide/hide_
utils.cpp \
magiskhide/hide_policy
.cpp \
deny/cli
.cpp \
deny/
utils.cpp \
deny/revert
.cpp \
resetprop/persist_properties.cpp \
resetprop/resetprop.cpp \
su/su.cpp \
...
...
native/jni/core/applets.cpp
View file @
65b0ea79
...
...
@@ -10,7 +10,7 @@ using namespace std;
using
main_fun
=
int
(
*
)(
int
,
char
*
[]);
static
main_fun
applet_main
[]
=
{
su_client_main
,
resetprop_main
,
magiskhide_main
,
nullptr
};
static
main_fun
applet_main
[]
=
{
su_client_main
,
resetprop_main
,
nullptr
};
static
int
call_applet
(
int
argc
,
char
*
argv
[])
{
// Applets
...
...
native/jni/core/bootstages.cpp
View file @
65b0ea79
...
...
@@ -296,12 +296,12 @@ void post_fs_data(int client) {
if
(
getprop
(
"persist.sys.safemode"
,
true
)
==
"1"
||
check_key_combo
())
{
safe_mode
=
true
;
// Disable all modules and
magiskhide
so next boot will be clean
// Disable all modules and
denylist
so next boot will be clean
disable_modules
();
disable_
hide
();
disable_
deny
();
}
else
{
exec_common_scripts
(
"post-fs-data"
);
check_en
able_hide
();
check_en
force_denylist
();
handle_modules
();
}
...
...
@@ -350,7 +350,7 @@ void boot_complete(int client) {
if
(
access
(
SECURE_DIR
,
F_OK
)
!=
0
)
xmkdir
(
SECURE_DIR
,
0700
);
check_en
able_hide
();
check_en
force_denylist
();
if
(
!
check_manager
())
{
if
(
access
(
MANAGERAPK
,
F_OK
)
==
0
)
{
...
...
native/jni/core/daemon.cpp
View file @
65b0ea79
...
...
@@ -44,8 +44,8 @@ static bool check_zygote(pid_t pid) {
static
void
handle_request_async
(
int
client
,
int
code
,
ucred
cred
)
{
switch
(
code
)
{
case
MAGISKHIDE
:
magiskhide
_handler
(
client
,
&
cred
);
case
DENYLIST
:
denylist
_handler
(
client
,
&
cred
);
break
;
case
SUPERUSER
:
su_daemon_handler
(
client
,
&
cred
);
...
...
@@ -92,7 +92,7 @@ static void handle_request_sync(int client, int code) {
setup_logfile
(
true
);
break
;
case
STOP_DAEMON
:
magiskhide
_handler
(
-
1
,
nullptr
);
denylist
_handler
(
-
1
,
nullptr
);
write_int
(
client
,
0
);
// Terminate the daemon!
exit
(
0
);
...
...
@@ -124,7 +124,7 @@ static void handle_request(int client) {
case
BOOT_COMPLETE
:
case
SQLITE_CMD
:
case
GET_PATH
:
case
MAGISKHIDE
:
case
DENYLIST
:
case
STOP_DAEMON
:
if
(
!
is_root
)
{
write_int
(
client
,
ROOT_REQUIRED
);
...
...
native/jni/core/db.cpp
View file @
65b0ea79
...
...
@@ -7,7 +7,7 @@
#include <socket.hpp>
#include <utils.hpp>
#define DB_VERSION 1
0
#define DB_VERSION 1
1
using
namespace
std
;
...
...
@@ -112,7 +112,7 @@ db_settings::db_settings() {
data
[
ROOT_ACCESS
]
=
ROOT_ACCESS_APPS_AND_ADB
;
data
[
SU_MULTIUSER_MODE
]
=
MULTIUSER_MODE_OWNER_ONLY
;
data
[
SU_MNT_NS
]
=
NAMESPACE_MODE_REQUESTER
;
data
[
HIDE
_CONFIG
]
=
false
;
data
[
DENYLIST
_CONFIG
]
=
false
;
}
int
db_settings
::
get_idx
(
string_view
key
)
const
{
...
...
@@ -174,12 +174,6 @@ static char *open_and_init_db(sqlite3 *&db) {
"(key TEXT, value TEXT, PRIMARY KEY(key))"
,
nullptr
,
nullptr
,
&
err
);
err_ret
(
err
);
ver
=
4
;
upgrade
=
true
;
}
if
(
ver
<
5
)
{
sqlite3_exec
(
db
,
"UPDATE policies SET uid=uid%100000"
,
nullptr
,
nullptr
,
&
err
);
err_ret
(
err
);
/* Directly jump to version 6 */
ver
=
6
;
upgrade
=
true
;
...
...
@@ -229,6 +223,17 @@ static char *open_and_init_db(sqlite3 *&db) {
ver
=
10
;
upgrade
=
true
;
}
if
(
ver
<
11
)
{
sqlite3_exec
(
db
,
"DROP TABLE IF EXISTS hidelist;"
"CREATE TABLE IF NOT EXISTS denylist "
"(package_name TEXT, process TEXT, PRIMARY KEY(package_name, process));"
"DELETE FROM settings WHERE key='magiskhide';"
,
nullptr
,
nullptr
,
&
err
);
err_ret
(
err
);
ver
=
11
;
upgrade
=
true
;
}
if
(
upgrade
)
{
// Set version
...
...
native/jni/core/magisk.cpp
View file @
65b0ea79
...
...
@@ -38,6 +38,7 @@ Advanced Options (Internal APIs):
--clone SRC DEST clone SRC to DEST
--sqlite SQL exec SQL commands to Magisk database
--path print Magisk tmpfs mount path
--denylist ARGS denylist config CLI
Available applets:
)EOF"
);
...
...
@@ -101,7 +102,9 @@ int magisk_main(int argc, char *argv[]) {
int
fd
=
connect_daemon
(
true
);
write_int
(
fd
,
BOOT_COMPLETE
);
return
read_int
(
fd
);
}
else
if
(
argc
>=
3
&&
argv
[
1
]
==
"--sqlite"
sv
)
{
}
else
if
(
argv
[
1
]
==
"--denylist"
sv
)
{
return
denylist_cli
(
argc
-
1
,
argv
+
1
);
}
else
if
(
argc
>=
3
&&
argv
[
1
]
==
"--sqlite"
sv
)
{
int
fd
=
connect_daemon
();
write_int
(
fd
,
SQLITE_CMD
);
write_string
(
fd
,
argv
[
2
]);
...
...
native/jni/
magiskhide/magiskhide
.cpp
→
native/jni/
deny/cli
.cpp
View file @
65b0ea79
...
...
@@ -3,30 +3,31 @@
#include <utils.hpp>
#include "
magiskhide
.hpp"
#include "
deny
.hpp"
using
namespace
std
;
[[
noreturn
]]
static
void
usage
(
char
*
arg0
)
{
[[
noreturn
]]
static
void
usage
()
{
fprintf
(
stderr
,
"MagiskHide - Hide Config CLI
\n\n
"
"Usage: %s [action [arguments...] ]
\n\n
"
"Actions:
\n
"
" status Return the status of magiskhide
\n
"
" enable Start magiskhide
\n
"
" disable Stop magiskhide
\n
"
" add PKG [PROC] Add a new target to the hide list
\n
"
" rm PKG [PROC] Remove target(s) from the hide list
\n
"
" ls Print the current hide list
\n
"
" exec CMDs... Execute commands in isolated mount
\n
"
" namespace and do all hide unmounts
\n
"
,
arg0
);
R"EOF("DenyList Config CLI
Usage: magisk --denylist [action [arguments...] ]
Actions:
status Return the enforcement status
enable Enable denylist enforcement
disable Disable denylist enforcement
add PKG [PROC] Add a new target to the denylist
rm PKG [PROC] Remove target(s) from the denylist
ls Print the current denylist
exec CMDs... Execute commands in isolated mount
namespace and do all unmounts
)EOF"
);
exit
(
1
);
}
void
magiskhide
_handler
(
int
client
,
ucred
*
cred
)
{
void
denylist
_handler
(
int
client
,
ucred
*
cred
)
{
if
(
client
<
0
)
{
hide
_unmount
();
revert
_unmount
();
return
;
}
...
...
@@ -34,23 +35,23 @@ void magiskhide_handler(int client, ucred *cred) {
int
res
=
DAEMON_ERROR
;
switch
(
req
)
{
case
DISABLE_
HIDE
:
case
DISABLE_
DENY
:
case
ADD_LIST
:
case
RM_LIST
:
case
LS_LIST
:
if
(
!
hide_enabl
ed
())
{
write_int
(
client
,
HIDE_NOT_ENABL
ED
);
if
(
!
deny_enforc
ed
())
{
write_int
(
client
,
DENY_NOT_ENFORC
ED
);
close
(
client
);
return
;
}
}
switch
(
req
)
{
case
EN
ABLE_HIDE
:
case
EN
FORCE_DENY
:
res
=
enable_hide
();
break
;
case
DISABLE_
HIDE
:
res
=
disable_
hide
();
case
DISABLE_
DENY
:
res
=
disable_
deny
();
break
;
case
ADD_LIST
:
res
=
add_list
(
client
);
...
...
@@ -61,8 +62,8 @@ void magiskhide_handler(int client, ucred *cred) {
case
LS_LIST
:
ls_list
(
client
);
return
;
case
HIDE
_STATUS
:
res
=
hide_enabled
()
?
HIDE_IS_ENABLED
:
HIDE_NOT_ENABL
ED
;
case
DENY
_STATUS
:
res
=
deny_enforced
()
?
DENY_IS_ENFORCED
:
DENY_NOT_ENFORC
ED
;
break
;
}
...
...
@@ -70,41 +71,36 @@ void magiskhide_handler(int client, ucred *cred) {
close
(
client
);
}
int
magiskhide_main
(
int
argc
,
char
*
argv
[]
)
{
int
denylist_cli
(
int
argc
,
char
**
argv
)
{
if
(
argc
<
2
)
usage
(
argv
[
0
]);
// CLI backwards compatibility
const
char
*
opt
=
argv
[
1
];
if
(
opt
[
0
]
==
'-'
&&
opt
[
1
]
==
'-'
)
opt
+=
2
;
usage
();
int
req
;
if
(
opt
==
"enable"
sv
)
req
=
EN
ABLE_HIDE
;
else
if
(
opt
==
"disable"
sv
)
req
=
DISABLE_
HIDE
;
else
if
(
opt
==
"add"
sv
)
if
(
argv
[
1
]
==
"enable"
sv
)
req
=
EN
FORCE_DENY
;
else
if
(
argv
[
1
]
==
"disable"
sv
)
req
=
DISABLE_
DENY
;
else
if
(
argv
[
1
]
==
"add"
sv
)
req
=
ADD_LIST
;
else
if
(
opt
==
"rm"
sv
)
else
if
(
argv
[
1
]
==
"rm"
sv
)
req
=
RM_LIST
;
else
if
(
opt
==
"ls"
sv
)
else
if
(
argv
[
1
]
==
"ls"
sv
)
req
=
LS_LIST
;
else
if
(
opt
==
"status"
sv
)
req
=
HIDE
_STATUS
;
else
if
(
opt
==
"exec"
sv
&&
argc
>
2
)
{
else
if
(
argv
[
1
]
==
"status"
sv
)
req
=
DENY
_STATUS
;
else
if
(
argv
[
1
]
==
"exec"
sv
&&
argc
>
2
)
{
xunshare
(
CLONE_NEWNS
);
xmount
(
nullptr
,
"/"
,
nullptr
,
MS_PRIVATE
|
MS_REC
,
nullptr
);
hide
_unmount
();
revert
_unmount
();
execvp
(
argv
[
2
],
argv
+
2
);
exit
(
1
);
}
else
{
usage
(
argv
[
0
]
);
usage
();
}
// Send request
int
fd
=
connect_daemon
();
write_int
(
fd
,
MAGISKHIDE
);
write_int
(
fd
,
DENYLIST
);
write_int
(
fd
,
req
);
if
(
req
==
ADD_LIST
||
req
==
RM_LIST
)
{
write_string
(
fd
,
argv
[
2
]);
...
...
@@ -116,22 +112,22 @@ int magiskhide_main(int argc, char *argv[]) {
switch
(
code
)
{
case
DAEMON_SUCCESS
:
break
;
case
HIDE_NOT_ENABL
ED
:
fprintf
(
stderr
,
"
MagiskHide is not enabl
ed
\n
"
);
case
DENY_NOT_ENFORC
ED
:
fprintf
(
stderr
,
"
Denylist is not enforc
ed
\n
"
);
goto
return_code
;
case
HIDE_IS_ENABL
ED
:
fprintf
(
stderr
,
"
MagiskHide is enabl
ed
\n
"
);
case
DENY_IS_ENFORC
ED
:
fprintf
(
stderr
,
"
Denylist is enforc
ed
\n
"
);
goto
return_code
;
case
HIDE
_ITEM_EXIST
:
fprintf
(
stderr
,
"Target already exists in
hide
list
\n
"
);
case
DENYLIST
_ITEM_EXIST
:
fprintf
(
stderr
,
"Target already exists in
deny
list
\n
"
);
goto
return_code
;
case
HIDE
_ITEM_NOT_EXIST
:
fprintf
(
stderr
,
"Target does not exist in
hide
list
\n
"
);
case
DENYLIST
_ITEM_NOT_EXIST
:
fprintf
(
stderr
,
"Target does not exist in
deny
list
\n
"
);
goto
return_code
;
case
HIDE
_NO_NS
:
fprintf
(
stderr
,
"
Your kernel doesn'
t support mount namespace
\n
"
);
case
DENY
_NO_NS
:
fprintf
(
stderr
,
"
The kernel does no
t support mount namespace
\n
"
);
goto
return_code
;
case
HIDE
_INVALID_PKG
:
case
DENYLIST
_INVALID_PKG
:
fprintf
(
stderr
,
"Invalid package / process name
\n
"
);
goto
return_code
;
case
ROOT_REQUIRED
:
...
...
@@ -154,5 +150,5 @@ int magiskhide_main(int argc, char *argv[]) {
}
return_code
:
return
req
==
HIDE_STATUS
?
(
code
==
HIDE_IS_ENABL
ED
?
0
:
1
)
:
code
!=
DAEMON_SUCCESS
;
return
req
==
DENY_STATUS
?
(
code
==
DENY_IS_ENFORC
ED
?
0
:
1
)
:
code
!=
DAEMON_SUCCESS
;
}
native/jni/
magiskhide/magiskhide
.hpp
→
native/jni/
deny/deny
.hpp
View file @
65b0ea79
...
...
@@ -11,33 +11,33 @@
// CLI entries
int
enable_hide
();
int
disable_
hide
();
int
disable_
deny
();
int
add_list
(
int
client
);
int
rm_list
(
int
client
);
void
ls_list
(
int
client
);
// Utility functions
bool
hide_enabl
ed
();
bool
is_
hide
_target
(
int
uid
,
std
::
string_view
process
);
bool
deny_enforc
ed
();
bool
is_
deny
_target
(
int
uid
,
std
::
string_view
process
);
//
Hide policies
void
hide
_daemon
(
int
pid
,
int
client
);
void
hide
_unmount
(
int
pid
=
-
1
);
//
Revert
void
revert
_daemon
(
int
pid
,
int
client
);
void
revert
_unmount
(
int
pid
=
-
1
);
enum
{
EN
ABLE_HIDE
,
DISABLE_
HIDE
,
enum
:
int
{
EN
FORCE_DENY
,
DISABLE_
DENY
,
ADD_LIST
,
RM_LIST
,
LS_LIST
,
HIDE
_STATUS
,
DENY
_STATUS
,
};
enum
{
HIDE_IS_ENABLED
=
DAEMON_LAST
,
HIDE_NOT_ENABL
ED
,
HIDE
_ITEM_EXIST
,
HIDE
_ITEM_NOT_EXIST
,
HIDE_NO_NS
,
HIDE_INVALID_PKG
enum
:
int
{
DENY_IS_ENFORCED
=
DAEMON_LAST
+
1
,
DENY_NOT_ENFORC
ED
,
DENYLIST
_ITEM_EXIST
,
DENYLIST
_ITEM_NOT_EXIST
,
DENYLIST_INVALID_PKG
,
DENY_NO_NS
,
};
native/jni/
magiskhide/hide_policy
.cpp
→
native/jni/
deny/revert
.cpp
View file @
65b0ea79
...
...
@@ -5,18 +5,18 @@
#include <selinux.hpp>
#include <resetprop.hpp>
#include "
magiskhide
.hpp"
#include "
deny
.hpp"
using
namespace
std
;
static
void
lazy_unmount
(
const
char
*
mountpoint
)
{
if
(
umount2
(
mountpoint
,
MNT_DETACH
)
!=
-
1
)
LOGD
(
"
hide
: Unmounted (%s)
\n
"
,
mountpoint
);
LOGD
(
"
denylist
: Unmounted (%s)
\n
"
,
mountpoint
);
}
void
hide
_daemon
(
int
pid
,
int
client
)
{
void
revert
_daemon
(
int
pid
,
int
client
)
{
if
(
fork_dont_care
()
==
0
)
{
hide
_unmount
(
pid
);
revert
_unmount
(
pid
);
write_int
(
client
,
0
);
_exit
(
0
);
}
...
...
@@ -24,11 +24,11 @@ void hide_daemon(int pid, int client) {
#define TMPFS_MNT(dir) (mentry->mnt_type == "tmpfs"sv && str_starts(mentry->mnt_dir, "/" #dir))
void
hide
_unmount
(
int
pid
)
{
void
revert
_unmount
(
int
pid
)
{
if
(
pid
>
0
)
{
if
(
switch_mnt_ns
(
pid
))
return
;
LOGD
(
"
hide
: handling PID=[%d]
\n
"
,
pid
);
LOGD
(
"
denylist
: handling PID=[%d]
\n
"
,
pid
);
}
vector
<
string
>
targets
;
...
...
native/jni/
magiskhide/hide_
utils.cpp
→
native/jni/
deny/
utils.cpp
View file @
65b0ea79
...
...
@@ -9,17 +9,17 @@
#include <utils.hpp>
#include <db.hpp>
#include "
magiskhide
.hpp"
#include "
deny
.hpp"
using
namespace
std
;
static
set
<
pair
<
string
,
string
>>
*
hide
_set
;
/* set of <pkg, process> pair */
static
set
<
pair
<
string
,
string
>>
*
deny
_set
;
/* set of <pkg, process> pair */
static
map
<
int
,
vector
<
string_view
>>
*
uid_proc_map
;
/* uid -> list of process */
// Locks the variables above
static
pthread_mutex_t
hide_
data_lock
=
PTHREAD_MUTEX_INITIALIZER
;
static
pthread_mutex_t
data_lock
=
PTHREAD_MUTEX_INITIALIZER
;
static
atomic
<
bool
>
hide_state
=
false
;
static
atomic
<
bool
>
enforcement_status
=
false
;
static
void
rebuild_uid_map
()
{
uid_proc_map
->
clear
();
...
...
@@ -34,7 +34,7 @@ static void rebuild_uid_map() {
data_path
+=
'/'
;
size_t
user_len
=
data_path
.
length
();
struct
stat
st
;
for
(
const
auto
&
hide
:
*
hide
_set
)
{
for
(
const
auto
&
hide
:
*
deny
_set
)
{
if
(
hide
.
first
==
ISOLATED_MAGIC
)
{
if
(
!
first_iter
)
continue
;
// Setup isolated processes
...
...
@@ -72,7 +72,7 @@ static bool proc_name_match(int pid, const char *name) {
if
(
auto
fp
=
open_file
(
buf
,
"re"
))
{
fgets
(
buf
,
sizeof
(
buf
),
fp
.
get
());
if
(
str_op
(
buf
,
name
))
{
LOGD
(
"
hide
: kill PID=[%d] (%s)
\n
"
,
pid
,
buf
);
LOGD
(
"
denylist
: kill PID=[%d] (%s)
\n
"
,
pid
,
buf
);
return
true
;
}
}
...
...
@@ -129,8 +129,8 @@ static bool validate(const char *pkg, const char *proc) {
}
static
void
add_hide_set
(
const
char
*
pkg
,
const
char
*
proc
)
{
LOGI
(
"
hide_
list add: [%s/%s]
\n
"
,
pkg
,
proc
);
hide
_set
->
emplace
(
pkg
,
proc
);
LOGI
(
"
deny
list add: [%s/%s]
\n
"
,
pkg
,
proc
);
deny
_set
->
emplace
(
pkg
,
proc
);
if
(
strcmp
(
pkg
,
ISOLATED_MAGIC
)
==
0
)
{
// Kill all matching isolated processes
kill_process
<&
str_starts
>
(
proc
,
true
);
...
...
@@ -144,14 +144,14 @@ static int add_list(const char *pkg, const char *proc) {
proc
=
pkg
;
if
(
!
validate
(
pkg
,
proc
))
return
HIDE
_INVALID_PKG
;
return
DENYLIST
_INVALID_PKG
;
{
// Critical region
mutex_guard
lock
(
hide_
data_lock
);
for
(
const
auto
&
hide
:
*
hide
_set
)
mutex_guard
lock
(
data_lock
);
for
(
const
auto
&
hide
:
*
deny
_set
)
if
(
hide
.
first
==
pkg
&&
hide
.
second
==
proc
)
return
HIDE
_ITEM_EXIST
;
return
DENYLIST
_ITEM_EXIST
;
add_hide_set
(
pkg
,
proc
);
rebuild_uid_map
();
}
...
...
@@ -159,7 +159,7 @@ static int add_list(const char *pkg, const char *proc) {
// Add to database
char
sql
[
4096
];
snprintf
(
sql
,
sizeof
(
sql
),
"INSERT INTO
hide
list (package_name, process) VALUES('%s', '%s')"
,
pkg
,
proc
);
"INSERT INTO
deny
list (package_name, process) VALUES('%s', '%s')"
,
pkg
,
proc
);
char
*
err
=
db_exec
(
sql
);
db_err_cmd
(
err
,
return
DAEMON_ERROR
);
return
DAEMON_SUCCESS
;
...
...
@@ -175,27 +175,27 @@ static int rm_list(const char *pkg, const char *proc) {
bool
remove
=
false
;
{
// Critical region
mutex_guard
lock
(
hide_
data_lock
);
for
(
auto
it
=
hide_set
->
begin
();
it
!=
hide
_set
->
end
();)
{
mutex_guard
lock
(
data_lock
);
for
(
auto
it
=
deny_set
->
begin
();
it
!=
deny
_set
->
end
();)
{
if
(
it
->
first
==
pkg
&&
(
proc
[
0
]
==
'\0'
||
it
->
second
==
proc
))
{
remove
=
true
;
LOGI
(
"
hide_
list rm: [%s/%s]
\n
"
,
it
->
first
.
data
(),
it
->
second
.
data
());
it
=
hide
_set
->
erase
(
it
);
LOGI
(
"
deny
list rm: [%s/%s]
\n
"
,
it
->
first
.
data
(),
it
->
second
.
data
());
it
=
deny
_set
->
erase
(
it
);
}
else
{
++
it
;
}
}
if
(
!
remove
)
return
HIDE
_ITEM_NOT_EXIST
;
return
DENYLIST
_ITEM_NOT_EXIST
;
rebuild_uid_map
();
}
char
sql
[
4096
];
if
(
proc
[
0
]
==
'\0'
)
snprintf
(
sql
,
sizeof
(
sql
),
"DELETE FROM
hide
list WHERE package_name='%s'"
,
pkg
);
snprintf
(
sql
,
sizeof
(
sql
),
"DELETE FROM
deny
list WHERE package_name='%s'"
,
pkg
);
else
snprintf
(
sql
,
sizeof
(
sql
),
"DELETE FROM
hide
list WHERE package_name='%s' AND process='%s'"
,
pkg
,
proc
);
"DELETE FROM
deny
list WHERE package_name='%s' AND process='%s'"
,
pkg
,
proc
);
char
*
err
=
db_exec
(
sql
);
db_err_cmd
(
err
,
return
DAEMON_ERROR
);
return
DAEMON_SUCCESS
;
...
...
@@ -215,9 +215,9 @@ static bool str_ends_safe(string_view s, string_view ss) {
}
static
bool
init_list
()
{
LOGD
(
"
hide
: initialize
\n
"
);
LOGD
(
"
denylist
: initialize
\n
"
);
char
*
err
=
db_exec
(
"SELECT * FROM
hide
list"
,
[](
db_row
&
row
)
->
bool
{
char
*
err
=
db_exec
(
"SELECT * FROM
deny
list"
,
[](
db_row
&
row
)
->
bool
{
add_hide_set
(
row
[
"package_name"
].
data
(),
row
[
"process"
].
data
());
return
true
;
});
...
...
@@ -236,8 +236,8 @@ static bool init_list() {
void
ls_list
(
int
client
)
{
write_int
(
client
,
DAEMON_SUCCESS
);
{
mutex_guard
lock
(
hide_
data_lock
);
for
(
const
auto
&
hide
:
*
hide
_set
)
{
mutex_guard
lock
(
data_lock
);
for
(
const
auto
&
hide
:
*
deny
_set
)
{
write_int
(
client
,
hide
.
first
.
size
()
+
hide
.
second
.
size
()
+
1
);
xwrite
(
client
,
hide
.
first
.
data
(),
hide
.
first
.
size
());
xwrite
(
client
,
"|"
,
1
);
...
...
@@ -251,65 +251,65 @@ void ls_list(int client) {
static
void
update_hide_config
()
{
char
sql
[
64
];
sprintf
(
sql
,
"REPLACE INTO settings (key,value) VALUES('%s',%d)"
,
DB_SETTING_KEYS
[
HIDE_CONFIG
],
hide_state
.
load
());
DB_SETTING_KEYS
[
DENYLIST_CONFIG
],
enforcement_status
.
load
());
char
*
err
=
db_exec
(
sql
);
db_err
(
err
);
}
int
enable_hide
()
{
if
(
hide_state
)
return
HIDE_IS_ENABL
ED
;
if
(
enforcement_status
)
return
DENY_IS_ENFORC
ED
;
if
(
access
(
"/proc/self/ns/mnt"
,
F_OK
)
!=
0
)
return
HIDE
_NO_NS
;
return
DENY
_NO_NS
;
if
(
procfp
==
nullptr
&&
(
procfp
=
opendir
(
"/proc"
))
==
nullptr
)
return
DAEMON_ERROR
;
LOGI
(
"* En
able MagiskHide
\n
"
);
LOGI
(
"* En
force DenyList
\n
"
);
mutex_guard
lock
(
hide_
data_lock
);
default_new
(
hide
_set
);
mutex_guard
lock
(
data_lock
);
default_new
(
deny
_set
);
default_new
(
uid_proc_map
);
// Initialize the hide list
if
(
!
init_list
())
return
DAEMON_ERROR
;
hide_state
=
true
;
enforcement_status
=
true
;
update_hide_config
();
rebuild_uid_map
();
return
DAEMON_SUCCESS
;
}
int
disable_
hide
()
{
mutex_guard
lock
(
hide_
data_lock
);
int
disable_
deny
()
{
mutex_guard
lock
(
data_lock
);
if
(
hide_state
)
{
LOGI
(
"* Disable
MagiskHide
\n
"
);
if
(
enforcement_status
)
{
LOGI
(
"* Disable
DenyList
\n
"
);
delete
uid_proc_map
;
delete
hide
_set
;
delete
deny
_set
;
uid_proc_map
=
nullptr
;
hide
_set
=
nullptr
;
deny
_set
=
nullptr
;
}
hide_state
=
false
;
enforcement_status
=
false
;
update_hide_config
();
return
DAEMON_SUCCESS
;
}
void
check_en
able_hide
()
{
if
(
!
hide_state
)
{
void
check_en
force_denylist
()
{
if
(
!
enforcement_status
)
{
db_settings
dbs
;
get_db_settings
(
dbs
,
HIDE
_CONFIG
);
if
(
dbs
[
HIDE
_CONFIG
])
get_db_settings
(
dbs
,
DENYLIST
_CONFIG
);
if
(
dbs
[
DENYLIST
_CONFIG
])
enable_hide
();
}
}
bool
is_
hide
_target
(
int
uid
,
string_view
process
)
{
mutex_guard
lock
(
hide_
data_lock
);
bool
is_
deny
_target
(
int
uid
,
string_view
process
)
{
mutex_guard
lock
(
data_lock
);
if
(
uid
%
100000
>=
90000
)
{
// Isolated processes
...
...
@@ -334,6 +334,6 @@ bool is_hide_target(int uid, string_view process) {
return
false
;
}
bool
hide_enabl
ed
()
{
return
hide_state
;
bool
deny_enforc
ed
()
{
return
enforcement_status
;
}
native/jni/include/daemon.hpp
View file @
65b0ea79
...
...
@@ -24,7 +24,7 @@ enum : int {
POST_FS_DATA
,
LATE_START
,
BOOT_COMPLETE
,
MAGISKHIDE
,
DENYLIST
,
SQLITE_CMD
,
REMOVE_MODULES
,
ZYGISK_REQUEST
,
...
...
@@ -58,10 +58,11 @@ void android_logging();
void
post_fs_data
(
int
client
);
void
late_start
(
int
client
);
void
boot_complete
(
int
client
);
void
magiskhide
_handler
(
int
client
,
ucred
*
cred
);
void
denylist
_handler
(
int
client
,
ucred
*
cred
);
void
su_daemon_handler
(
int
client
,
ucred
*
credential
);
void
zygisk_handler
(
int
client
,
ucred
*
cred
);
// MagiskHide
void
check_enable_hide
();
int
disable_hide
();
// Denylist
void
check_enforce_denylist
();
int
disable_deny
();
int
denylist_cli
(
int
argc
,
char
**
argv
);
native/jni/include/db.hpp
View file @
65b0ea79
...
...
@@ -38,7 +38,7 @@ constexpr const char *DB_SETTING_KEYS[] = {
"root_access"
,
"multiuser_mode"
,
"mnt_ns"
,
"
magiskhide
"
"
denylist
"
};
// Settings key indices
...
...
@@ -46,7 +46,7 @@ enum {
ROOT_ACCESS
=
0
,
SU_MULTIUSER_MODE
,
SU_MNT_NS
,
HIDE
_CONFIG
DENYLIST
_CONFIG
};
// Values for root_access
...
...
native/jni/include/magisk.hpp
View file @
65b0ea79
...
...
@@ -27,7 +27,7 @@ extern std::string MAGISKTMP;
#define SHELLPTS INTLROOT "/pts"
#define ROOTMNT ROOTOVL "/.mount_list"
constexpr
const
char
*
applet_names
[]
=
{
"su"
,
"resetprop"
,
"magiskhide"
,
nullptr
};
constexpr
const
char
*
applet_names
[]
=
{
"su"
,
"resetprop"
,
nullptr
};
constexpr
const
char
*
init_applet
[]
=
{
"magiskpolicy"
,
"supolicy"
,
nullptr
};
#define POST_FS_DATA_WAIT_TIME 40
...
...
@@ -38,7 +38,6 @@ extern int SDK_INT;
// Multi-call entrypoints
int
magisk_main
(
int
argc
,
char
*
argv
[]);
int
magiskhide_main
(
int
argc
,
char
*
argv
[]);
int
magiskpolicy_main
(
int
argc
,
char
*
argv
[]);
int
su_client_main
(
int
argc
,
char
*
argv
[]);
int
resetprop_main
(
int
argc
,
char
*
argv
[]);
...
...
native/jni/zygisk/entry.cpp
View file @
65b0ea79
...
...
@@ -10,7 +10,7 @@
#include <magisk.hpp>
#include "inject.hpp"
#include "../
magiskhide/magiskhide
.hpp"
#include "../
deny/deny
.hpp"
using
namespace
std
;
...
...
@@ -255,22 +255,22 @@ static void setup_files(int client, ucred *cred) {
}
static
void
check_denylist
(
int
client
)
{
if
(
!
hide_enabl
ed
())
{
write_int
(
client
,
HIDE_NOT_ENABL
ED
);
if
(
!
deny_enforc
ed
())
{
write_int
(
client
,
DENY_NOT_ENFORC
ED
);
return
;
}
write_int
(
client
,
0
);
int
uid
=
read_int
(
client
);
string
process
=
read_string
(
client
);
write_int
(
client
,
is_
hide
_target
(
uid
,
process
));
write_int
(
client
,
is_
deny
_target
(
uid
,
process
));
}
static
void
do_unmount
(
int
client
,
ucred
*
cred
)
{
if
(
deny_enforced
())
{
LOGD
(
"zygisk: cleanup mount namespace for pid=[%d]
\n
"
,
cred
->
pid
);
if
(
hide_enabled
())
{
hide_daemon
(
cred
->
pid
,
client
);
revert_daemon
(
cred
->
pid
,
client
);
}
else
{
write_int
(
client
,
HIDE_NOT_ENABL
ED
);
write_int
(
client
,
DENY_NOT_ENFORC
ED
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment