mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-02-21 09:18:30 +00:00
MagiskHide is no more
This commit is contained in:
parent
fc6b02f607
commit
65b0ea792e
@ -59,9 +59,6 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
const val BOOT_ID = "boot_id"
|
const val BOOT_ID = "boot_id"
|
||||||
const val ASKED_HOME = "asked_home"
|
const val ASKED_HOME = "asked_home"
|
||||||
const val DOH = "doh"
|
const val DOH = "doh"
|
||||||
|
|
||||||
// system state
|
|
||||||
const val MAGISKHIDE = "magiskhide"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Value {
|
object Value {
|
||||||
@ -133,7 +130,6 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
var suTapjack by preference(Key.SU_TAPJACK, true)
|
var suTapjack by preference(Key.SU_TAPJACK, true)
|
||||||
var checkUpdate by preference(Key.CHECK_UPDATES, true)
|
var checkUpdate by preference(Key.CHECK_UPDATES, true)
|
||||||
var doh by preference(Key.DOH, false)
|
var doh by preference(Key.DOH, false)
|
||||||
var magiskHide by preference(Key.MAGISKHIDE, true)
|
|
||||||
var showSystemApp by preference(Key.SHOW_SYSTEM_APP, false)
|
var showSystemApp by preference(Key.SHOW_SYSTEM_APP, false)
|
||||||
|
|
||||||
var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "")
|
var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "")
|
||||||
|
@ -27,6 +27,7 @@ object Const {
|
|||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
val USER_ID = Process.myUid() / 100000
|
val USER_ID = Process.myUid() / 100000
|
||||||
|
val APP_IS_CANARY get() = Version.isCanary(BuildConfig.VERSION_CODE)
|
||||||
|
|
||||||
object Version {
|
object Version {
|
||||||
const val MIN_VERSION = "v20.4"
|
const val MIN_VERSION = "v20.4"
|
||||||
@ -34,7 +35,9 @@ object Const {
|
|||||||
|
|
||||||
fun atLeast_21_0() = Info.env.magiskVersionCode >= 21000 || isCanary()
|
fun atLeast_21_0() = Info.env.magiskVersionCode >= 21000 || isCanary()
|
||||||
fun atLeast_21_2() = Info.env.magiskVersionCode >= 21200 || 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 {
|
object ID {
|
||||||
@ -49,7 +52,7 @@ object Const {
|
|||||||
const val PATREON_URL = "https://www.patreon.com/topjohnwu"
|
const val PATREON_URL = "https://www.patreon.com/topjohnwu"
|
||||||
const val SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk"
|
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"
|
else "https://topjohnwu.github.io/Magisk/releases/${BuildConfig.VERSION_CODE}.md"
|
||||||
|
|
||||||
const val GITHUB_RAW_URL = "https://raw.githubusercontent.com/"
|
const val GITHUB_RAW_URL = "https://raw.githubusercontent.com/"
|
||||||
@ -76,7 +79,6 @@ object Const {
|
|||||||
object Nav {
|
object Nav {
|
||||||
const val HOME = "home"
|
const val HOME = "home"
|
||||||
const val SETTINGS = "settings"
|
const val SETTINGS = "settings"
|
||||||
const val HIDE = "hide"
|
|
||||||
const val MODULES = "modules"
|
const val MODULES = "modules"
|
||||||
const val SUPERUSER = "superuser"
|
const val SUPERUSER = "superuser"
|
||||||
}
|
}
|
||||||
|
@ -51,25 +51,22 @@ object Info {
|
|||||||
|
|
||||||
private fun loadState() = Env(
|
private fun loadState() = Env(
|
||||||
fastCmd("magisk -v").split(":".toRegex())[0],
|
fastCmd("magisk -v").split(":".toRegex())[0],
|
||||||
runCatching { fastCmd("magisk -V").toInt() }.getOrDefault(-1),
|
runCatching { fastCmd("magisk -V").toInt() }.getOrDefault(-1)
|
||||||
Shell.su("magiskhide status").exec().isSuccess
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class Env(
|
class Env(
|
||||||
val magiskVersionString: String = "",
|
val magiskVersionString: String = "",
|
||||||
code: Int = -1,
|
code: Int = -1
|
||||||
hide: Boolean = false
|
|
||||||
) {
|
) {
|
||||||
val magiskHide get() = Config.magiskHide
|
|
||||||
val magiskVersionCode = when {
|
val magiskVersionCode = when {
|
||||||
code < Const.Version.MIN_VERCODE -> -1
|
code < Const.Version.MIN_VERCODE -> -1
|
||||||
else -> if (Shell.rootAccess()) code else -1
|
else -> if (Shell.rootAccess()) code else -1
|
||||||
}
|
}
|
||||||
val isUnsupported = code > 0 && code < Const.Version.MIN_VERCODE
|
val isUnsupported = code > 0 && code < Const.Version.MIN_VERCODE
|
||||||
val isActive = magiskVersionCode >= 0
|
val isActive = magiskVersionCode >= 0
|
||||||
|
var denyListEnforced = if (Const.Version.isCanary(code))
|
||||||
init {
|
Shell.su("magisk --denylist status").exec().isSuccess
|
||||||
Config.magiskHide = hide
|
else
|
||||||
}
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ open class Receiver : BaseReceiver() {
|
|||||||
getUid(intent)?.let { rmPolicy(it) }
|
getUid(intent)?.let { rmPolicy(it) }
|
||||||
}
|
}
|
||||||
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
||||||
getPkg(intent)?.let { Shell.su("magiskhide rm $it").submit() }
|
getPkg(intent)?.let { Shell.su("magisk --denylist rm $it").submit() }
|
||||||
}
|
}
|
||||||
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setupDynamic(context)
|
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setupDynamic(context)
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
|
|||||||
R.id.homeFragment,
|
R.id.homeFragment,
|
||||||
R.id.modulesFragment,
|
R.id.modulesFragment,
|
||||||
R.id.superuserFragment,
|
R.id.superuserFragment,
|
||||||
R.id.hideFragment,
|
R.id.denyFragment,
|
||||||
R.id.logFragment -> true
|
R.id.logFragment -> true
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
@ -170,7 +170,6 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
|
|||||||
private fun getScreen(name: String?): NavDirections? {
|
private fun getScreen(name: String?): NavDirections? {
|
||||||
return when (name) {
|
return when (name) {
|
||||||
Const.Nav.SUPERUSER -> MainDirections.actionSuperuserFragment()
|
Const.Nav.SUPERUSER -> MainDirections.actionSuperuserFragment()
|
||||||
Const.Nav.HIDE -> MainDirections.actionHideFragment()
|
|
||||||
Const.Nav.MODULES -> MainDirections.actionModuleFragment()
|
Const.Nav.MODULES -> MainDirections.actionModuleFragment()
|
||||||
Const.Nav.SETTINGS -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment()
|
Const.Nav.SETTINGS -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment()
|
||||||
else -> null
|
else -> null
|
||||||
@ -183,7 +182,7 @@ open class MainActivity : BaseUIActivity<MainViewModel, ActivityMainMd2Binding>(
|
|||||||
R.id.modulesFragment -> MainDirections.actionModuleFragment()
|
R.id.modulesFragment -> MainDirections.actionModuleFragment()
|
||||||
R.id.superuserFragment -> MainDirections.actionSuperuserFragment()
|
R.id.superuserFragment -> MainDirections.actionSuperuserFragment()
|
||||||
R.id.logFragment -> MainDirections.actionLogFragment()
|
R.id.logFragment -> MainDirections.actionLogFragment()
|
||||||
R.id.hideFragment -> MainDirections.actionHideFragment()
|
R.id.denyFragment -> MainDirections.actionDenylistFragment()
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.topjohnwu.magisk.ui.hide
|
package com.topjohnwu.magisk.ui.deny
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.pm.ApplicationInfo
|
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.isIsolated
|
||||||
import com.topjohnwu.magisk.ktx.useAppZygote
|
import com.topjohnwu.magisk.ktx.useAppZygote
|
||||||
|
|
||||||
class CmdlineHiddenItem(line: String) {
|
class CmdlineListItem(line: String) {
|
||||||
val packageName: String
|
val packageName: String
|
||||||
val process: String
|
val process: String
|
||||||
|
|
||||||
@ -27,19 +27,19 @@ class CmdlineHiddenItem(line: String) {
|
|||||||
const val ISOLATED_MAGIC = "isolated"
|
const val ISOLATED_MAGIC = "isolated"
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
class HideAppInfo(info: ApplicationInfo, pm: PackageManager, hideList: List<CmdlineHiddenItem>)
|
class AppProcessInfo(info: ApplicationInfo, pm: PackageManager, denyList: List<CmdlineListItem>)
|
||||||
: ApplicationInfo(info), Comparable<HideAppInfo> {
|
: ApplicationInfo(info), Comparable<AppProcessInfo> {
|
||||||
|
|
||||||
val label = info.getLabel(pm)
|
val label = info.getLabel(pm)
|
||||||
val iconImage: Drawable = info.loadIcon(pm)
|
val iconImage: Drawable = info.loadIcon(pm)
|
||||||
val processes = fetchProcesses(pm, hideList)
|
val processes = fetchProcesses(pm, denyList)
|
||||||
|
|
||||||
override fun compareTo(other: HideAppInfo) = comparator.compare(this, other)
|
override fun compareTo(other: AppProcessInfo) = comparator.compare(this, other)
|
||||||
|
|
||||||
private fun fetchProcesses(
|
private fun fetchProcesses(
|
||||||
pm: PackageManager,
|
pm: PackageManager,
|
||||||
hideList: List<CmdlineHiddenItem>
|
denylist: List<CmdlineListItem>
|
||||||
): List<HideProcessInfo> {
|
): List<ProcessInfo> {
|
||||||
// Fetch full PackageInfo
|
// Fetch full PackageInfo
|
||||||
val baseFlag = MATCH_DISABLED_COMPONENTS or MATCH_UNINSTALLED_PACKAGES
|
val baseFlag = MATCH_DISABLED_COMPONENTS or MATCH_UNINSTALLED_PACKAGES
|
||||||
val packageInfo = try {
|
val packageInfo = try {
|
||||||
@ -58,9 +58,9 @@ class HideAppInfo(info: ApplicationInfo, pm: PackageManager, hideList: List<Cmdl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val hidden = hideList.filter { it.packageName == packageName || it.packageName == ISOLATED_MAGIC }
|
val enabledList = denylist.filter { it.packageName == packageName || it.packageName == ISOLATED_MAGIC }
|
||||||
fun createProcess(name: String, pkg: String = packageName): HideProcessInfo {
|
fun createProcess(name: String, pkg: String = packageName): ProcessInfo {
|
||||||
return HideProcessInfo(name, pkg, hidden.any { it.process == name && it.packageName == pkg })
|
return ProcessInfo(name, pkg, enabledList.any { it.process == name && it.packageName == pkg })
|
||||||
}
|
}
|
||||||
|
|
||||||
var haveAppZygote = false
|
var haveAppZygote = false
|
||||||
@ -90,17 +90,17 @@ class HideAppInfo(info: ApplicationInfo, pm: PackageManager, hideList: List<Cmdl
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val comparator = compareBy<HideAppInfo>(
|
private val comparator = compareBy<AppProcessInfo>(
|
||||||
{ it.label.toLowerCase(currentLocale) },
|
{ it.label.lowercase(currentLocale) },
|
||||||
{ it.packageName }
|
{ it.packageName }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class HideProcessInfo(
|
data class ProcessInfo(
|
||||||
val name: String,
|
val name: String,
|
||||||
val packageName: String,
|
val packageName: String,
|
||||||
var isHidden: Boolean
|
var isEnabled: Boolean
|
||||||
) {
|
) {
|
||||||
val isIsolated get() = packageName == ISOLATED_MAGIC
|
val isIsolated get() = packageName == ISOLATED_MAGIC
|
||||||
val isAppZygote get() = name.endsWith("_zygote")
|
val isAppZygote get() = name.endsWith("_zygote")
|
@ -1,4 +1,4 @@
|
|||||||
package com.topjohnwu.magisk.ui.hide
|
package com.topjohnwu.magisk.ui.deny
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@ -11,7 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.arch.BaseUIFragment
|
import com.topjohnwu.magisk.arch.BaseUIFragment
|
||||||
import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding
|
import com.topjohnwu.magisk.databinding.FragmentDenyMd2Binding
|
||||||
import com.topjohnwu.magisk.di.viewModel
|
import com.topjohnwu.magisk.di.viewModel
|
||||||
import com.topjohnwu.magisk.ktx.addSimpleItemDecoration
|
import com.topjohnwu.magisk.ktx.addSimpleItemDecoration
|
||||||
import com.topjohnwu.magisk.ktx.addVerticalPadding
|
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.ktx.hideKeyboard
|
||||||
import com.topjohnwu.magisk.utils.MotionRevealHelper
|
import com.topjohnwu.magisk.utils.MotionRevealHelper
|
||||||
|
|
||||||
class HideFragment : BaseUIFragment<HideViewModel, FragmentHideMd2Binding>() {
|
class DenyListFragment : BaseUIFragment<DenyListViewModel, FragmentDenyMd2Binding>() {
|
||||||
|
|
||||||
override val layoutRes = R.layout.fragment_hide_md2
|
override val layoutRes = R.layout.fragment_deny_md2
|
||||||
override val viewModel by viewModel<HideViewModel>()
|
override val viewModel by viewModel<DenyListViewModel>()
|
||||||
|
|
||||||
private var isFilterVisible
|
private var isFilterVisible
|
||||||
get() = binding.hideFilter.isVisible
|
get() = binding.processFilter.isVisible
|
||||||
set(value) {
|
set(value) {
|
||||||
if (!value) hideKeyboard()
|
if (!value) hideKeyboard()
|
||||||
MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, value)
|
MotionRevealHelper.withViews(binding.processFilter, binding.filterToggle, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onAttach(context: Context) {
|
override fun onAttach(context: Context) {
|
||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
activity.setTitle(R.string.magiskhide)
|
activity.setTitle(R.string.denylist)
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
binding.hideFilterToggle.setOnClickListener {
|
binding.filterToggle.setOnClickListener {
|
||||||
isFilterVisible = true
|
isFilterVisible = true
|
||||||
}
|
}
|
||||||
binding.hideFilterInclude.hideFilterDone.setOnClickListener {
|
binding.appFilterInclude.filterDone.setOnClickListener {
|
||||||
isFilterVisible = false
|
isFilterVisible = false
|
||||||
}
|
}
|
||||||
binding.hideContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
binding.appList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||||
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
||||||
if (newState != RecyclerView.SCROLL_STATE_IDLE) hideKeyboard()
|
if (newState != RecyclerView.SCROLL_STATE_IDLE) hideKeyboard()
|
||||||
}
|
}
|
||||||
@ -55,23 +55,23 @@ class HideFragment : BaseUIFragment<HideViewModel, FragmentHideMd2Binding>() {
|
|||||||
val resource = requireContext().resources
|
val resource = requireContext().resources
|
||||||
val l_50 = resource.getDimensionPixelSize(R.dimen.l_50)
|
val l_50 = resource.getDimensionPixelSize(R.dimen.l_50)
|
||||||
val l1 = resource.getDimensionPixelSize(R.dimen.l1)
|
val l1 = resource.getDimensionPixelSize(R.dimen.l1)
|
||||||
binding.hideContent.addVerticalPadding(
|
binding.appList.addVerticalPadding(
|
||||||
l_50,
|
l_50,
|
||||||
l1 + resource.getDimensionPixelSize(R.dimen.internal_action_bar_size)
|
l1 + resource.getDimensionPixelSize(R.dimen.internal_action_bar_size)
|
||||||
)
|
)
|
||||||
binding.hideContent.addSimpleItemDecoration(
|
binding.appList.addSimpleItemDecoration(
|
||||||
left = l1,
|
left = l1,
|
||||||
top = l_50,
|
top = l_50,
|
||||||
right = l1,
|
right = l1,
|
||||||
bottom = l_50,
|
bottom = l_50,
|
||||||
)
|
)
|
||||||
binding.hideContent.fixEdgeEffect()
|
binding.appList.fixEdgeEffect()
|
||||||
|
|
||||||
val lama = binding.hideContent.layoutManager ?: return
|
val lama = binding.appList.layoutManager ?: return
|
||||||
lama.isAutoMeasureEnabled = false
|
lama.isAutoMeasureEnabled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPreBind(binding: FragmentHideMd2Binding) = Unit
|
override fun onPreBind(binding: FragmentDenyMd2Binding) = Unit
|
||||||
|
|
||||||
override fun onBackPressed(): Boolean {
|
override fun onBackPressed(): Boolean {
|
||||||
if (isFilterVisible) {
|
if (isFilterVisible) {
|
||||||
@ -89,10 +89,10 @@ class HideFragment : BaseUIFragment<HideViewModel, FragmentHideMd2Binding>() {
|
|||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_focus_up -> binding.hideContent
|
R.id.action_focus_up -> binding.appList
|
||||||
.takeIf { (it.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() ?: 0 > 10 }
|
.takeIf { (it.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() ?: 0 > 10 }
|
||||||
?.also { it.scrollToPosition(10) }
|
?.also { it.scrollToPosition(10) }
|
||||||
.let { binding.hideContent }
|
.let { binding.appList }
|
||||||
.also { it.post { it.smoothScrollToPosition(0) } }
|
.also { it.post { it.smoothScrollToPosition(0) } }
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
@ -1,4 +1,4 @@
|
|||||||
package com.topjohnwu.magisk.ui.hide
|
package com.topjohnwu.magisk.ui.deny
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@ -13,13 +13,13 @@ import com.topjohnwu.magisk.ktx.startAnimations
|
|||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
class HideRvItem(
|
class DenyListRvItem(
|
||||||
val info: HideAppInfo
|
val info: AppProcessInfo
|
||||||
) : ObservableDiffRvItem<HideRvItem>(), ComparableRv<HideRvItem> {
|
) : ObservableDiffRvItem<DenyListRvItem>(), ComparableRv<DenyListRvItem> {
|
||||||
|
|
||||||
override val layoutRes get() = R.layout.item_hide_md2
|
override val layoutRes get() = R.layout.item_hide_md2
|
||||||
|
|
||||||
val processes = info.processes.map { HideProcessRvItem(it) }
|
val processes = info.processes.map { ProcessRvItem(it) }
|
||||||
|
|
||||||
@get:Bindable
|
@get:Bindable
|
||||||
var isExpanded = false
|
var isExpanded = false
|
||||||
@ -31,25 +31,24 @@ class HideRvItem(
|
|||||||
@get:Bindable
|
@get:Bindable
|
||||||
val checkedPercent get() = (itemsChecked.toFloat() / processes.size * 100).roundToInt()
|
val checkedPercent get() = (itemsChecked.toFloat() / processes.size * 100).roundToInt()
|
||||||
|
|
||||||
private var state: Boolean? = false
|
private var _state: Boolean? = false
|
||||||
set(value) = set(value, field, { field = it }, BR.hiddenState)
|
set(value) = set(value, field, { field = it }, BR.state)
|
||||||
|
|
||||||
@get:Bindable
|
@get:Bindable
|
||||||
var hiddenState: Boolean?
|
var state: Boolean?
|
||||||
get() = state
|
get() = _state
|
||||||
set(value) = set(value, state, { state = it }, BR.hiddenState) {
|
set(value) = set(value, _state, { _state = it }, BR.state) {
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
processes
|
processes
|
||||||
.filterNot { it.isHidden }
|
.filterNot { it.isEnabled }
|
||||||
.filter { isExpanded || it.defaultSelection }
|
.filter { isExpanded || it.defaultSelection }
|
||||||
} else {
|
} else {
|
||||||
processes
|
processes.filter { it.isEnabled }
|
||||||
.filter { it.isHidden }
|
|
||||||
}.forEach { it.toggle() }
|
}.forEach { it.toggle() }
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
processes.forEach { it.addOnPropertyChangedCallback(BR.hidden) { recalculateChecked() } }
|
processes.forEach { it.addOnPropertyChangedCallback(BR.enabled) { recalculateChecked() } }
|
||||||
addOnPropertyChangedCallback(BR.expanded) { recalculateChecked() }
|
addOnPropertyChangedCallback(BR.expanded) { recalculateChecked() }
|
||||||
recalculateChecked()
|
recalculateChecked()
|
||||||
}
|
}
|
||||||
@ -60,8 +59,8 @@ class HideRvItem(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun recalculateChecked() {
|
private fun recalculateChecked() {
|
||||||
itemsChecked = processes.count { it.isHidden }
|
itemsChecked = processes.count { it.isEnabled }
|
||||||
state = if (isExpanded) {
|
_state = if (isExpanded) {
|
||||||
when (itemsChecked) {
|
when (itemsChecked) {
|
||||||
0 -> false
|
0 -> false
|
||||||
processes.size -> true
|
processes.size -> true
|
||||||
@ -69,7 +68,7 @@ class HideRvItem(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val defaultProcesses = processes.filter { it.defaultSelection }
|
val defaultProcesses = processes.filter { it.defaultSelection }
|
||||||
when (defaultProcesses.count { it.isHidden }) {
|
when (defaultProcesses.count { it.isEnabled }) {
|
||||||
0 -> false
|
0 -> false
|
||||||
defaultProcesses.size -> true
|
defaultProcesses.size -> true
|
||||||
else -> null
|
else -> null
|
||||||
@ -77,10 +76,10 @@ class HideRvItem(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun compareTo(other: HideRvItem) = comparator.compare(this, other)
|
override fun compareTo(other: DenyListRvItem) = comparator.compare(this, other)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val comparator = compareBy<HideRvItem>(
|
private val comparator = compareBy<DenyListRvItem>(
|
||||||
{ it.itemsChecked == 0 },
|
{ it.itemsChecked == 0 },
|
||||||
{ it.info }
|
{ it.info }
|
||||||
)
|
)
|
||||||
@ -88,34 +87,34 @@ class HideRvItem(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class HideProcessRvItem(
|
class ProcessRvItem(
|
||||||
val process: HideProcessInfo
|
val process: ProcessInfo
|
||||||
) : ObservableDiffRvItem<HideProcessRvItem>() {
|
) : ObservableDiffRvItem<ProcessRvItem>() {
|
||||||
|
|
||||||
override val layoutRes get() = R.layout.item_hide_process_md2
|
override val layoutRes get() = R.layout.item_hide_process_md2
|
||||||
|
|
||||||
val displayName = if (process.isIsolated) "(isolated) ${process.name}" else process.name
|
val displayName = if (process.isIsolated) "(isolated) ${process.name}" else process.name
|
||||||
|
|
||||||
@get:Bindable
|
@get:Bindable
|
||||||
var isHidden
|
var isEnabled
|
||||||
get() = process.isHidden
|
get() = process.isEnabled
|
||||||
set(value) = set(value, process.isHidden, { process.isHidden = it }, BR.hidden) {
|
set(value) = set(value, process.isEnabled, { process.isEnabled = it }, BR.enabled) {
|
||||||
val arg = if (it) "add" else "rm"
|
val arg = if (it) "add" else "rm"
|
||||||
val (name, pkg) = process
|
val (name, pkg) = process
|
||||||
Shell.su("magiskhide $arg $pkg \'$name\'").submit()
|
Shell.su("magisk --denylist $arg $pkg \'$name\'").submit()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun toggle() {
|
fun toggle() {
|
||||||
isHidden = !isHidden
|
isEnabled = !isEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
val defaultSelection get() =
|
val defaultSelection get() =
|
||||||
process.isIsolated || process.isAppZygote || process.name == process.packageName
|
process.isIsolated || process.isAppZygote || process.name == process.packageName
|
||||||
|
|
||||||
override fun contentSameAs(other: HideProcessRvItem) =
|
override fun contentSameAs(other: ProcessRvItem) =
|
||||||
process.isHidden == other.process.isHidden
|
process.isEnabled == other.process.isEnabled
|
||||||
|
|
||||||
override fun itemSameAs(other: HideProcessRvItem) =
|
override fun itemSameAs(other: ProcessRvItem) =
|
||||||
process.name == other.process.name && process.packageName == other.process.packageName
|
process.name == other.process.name && process.packageName == other.process.packageName
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.topjohnwu.magisk.ui.hide
|
package com.topjohnwu.magisk.ui.deny
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
@ -20,7 +20,7 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
class HideViewModel : BaseViewModel(), Queryable {
|
class DenyListViewModel : BaseViewModel(), Queryable {
|
||||||
|
|
||||||
override val queryDelay = 1000L
|
override val queryDelay = 1000L
|
||||||
|
|
||||||
@ -43,11 +43,11 @@ class HideViewModel : BaseViewModel(), Queryable {
|
|||||||
submitQuery()
|
submitQuery()
|
||||||
}
|
}
|
||||||
|
|
||||||
val items = filterableListOf<HideRvItem>()
|
val items = filterableListOf<DenyListRvItem>()
|
||||||
val itemBinding = itemBindingOf<HideRvItem> {
|
val itemBinding = itemBindingOf<DenyListRvItem> {
|
||||||
it.bindExtra(BR.viewModel, this)
|
it.bindExtra(BR.viewModel, this)
|
||||||
}
|
}
|
||||||
val itemInternalBinding = itemBindingOf<HideProcessRvItem> {
|
val itemInternalBinding = itemBindingOf<ProcessRvItem> {
|
||||||
it.bindExtra(BR.viewModel, this)
|
it.bindExtra(BR.viewModel, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,14 +60,14 @@ class HideViewModel : BaseViewModel(), Queryable {
|
|||||||
state = State.LOADING
|
state = State.LOADING
|
||||||
val (apps, diff) = withContext(Dispatchers.Default) {
|
val (apps, diff) = withContext(Dispatchers.Default) {
|
||||||
val pm = AppContext.packageManager
|
val pm = AppContext.packageManager
|
||||||
val hideList = Shell.su("magiskhide ls").exec().out.map { CmdlineHiddenItem(it) }
|
val hideList = Shell.su("magisk --denylist ls").exec().out.map { CmdlineListItem(it) }
|
||||||
val apps = pm.getInstalledApplications(MATCH_UNINSTALLED_PACKAGES)
|
val apps = pm.getInstalledApplications(MATCH_UNINSTALLED_PACKAGES)
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.filterNot { blacklist.contains(it.packageName) }
|
.filterNot { blacklist.contains(it.packageName) }
|
||||||
.map { HideAppInfo(it, pm, hideList) }
|
.map { AppProcessInfo(it, pm, hideList) }
|
||||||
.filter { it.processes.isNotEmpty() }
|
.filter { it.processes.isNotEmpty() }
|
||||||
.filter { info -> info.enabled || info.processes.any { it.isHidden } }
|
.filter { info -> info.enabled || info.processes.any { it.isEnabled } }
|
||||||
.map { HideRvItem(it) }
|
.map { DenyListRvItem(it) }
|
||||||
.toList()
|
.toList()
|
||||||
.sorted()
|
.sorted()
|
||||||
apps to items.calculateDiff(apps)
|
apps to items.calculateDiff(apps)
|
@ -252,14 +252,14 @@ object Magisk : BaseSettingsItem.Section() {
|
|||||||
override val title = R.string.magisk.asText()
|
override val title = R.string.magisk.asText()
|
||||||
}
|
}
|
||||||
|
|
||||||
object MagiskHide : BaseSettingsItem.Toggle() {
|
object DenyList : BaseSettingsItem.Toggle() {
|
||||||
override val title = R.string.magiskhide.asText()
|
override val title = R.string.denylist.asText()
|
||||||
override val description = R.string.settings_magiskhide_summary.asText()
|
override val description = R.string.settings_denylist_summary.asText()
|
||||||
override var value = Config.magiskHide
|
override var value = Info.env.denyListEnforced
|
||||||
set(value) = setV(value, field, { field = it }) {
|
set(value) = setV(value, field, { field = it }) {
|
||||||
val cmd = if (it) "enable" else "disable"
|
val cmd = if (it) "enable" else "disable"
|
||||||
Shell.su("magiskhide $cmd").submit { cb ->
|
Shell.su("magisk --denylist $cmd").submit { cb ->
|
||||||
if (cb.isSuccess) Config.magiskHide = it
|
if (cb.isSuccess) Info.env.denyListEnforced = it
|
||||||
else field = !it
|
else field = !it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,11 @@ class SettingsViewModel(
|
|||||||
if (Info.env.isActive) {
|
if (Info.env.isActive) {
|
||||||
list.addAll(listOf(
|
list.addAll(listOf(
|
||||||
Magisk,
|
Magisk,
|
||||||
MagiskHide, SystemlessHosts
|
SystemlessHosts
|
||||||
))
|
))
|
||||||
|
if (Const.Version.isCanary()) {
|
||||||
|
list.add(DenyList)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Superuser
|
// Superuser
|
||||||
|
@ -64,18 +64,6 @@ object Shortcuts {
|
|||||||
.build()
|
.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) {
|
if (Info.env.isActive) {
|
||||||
shortCuts.add(
|
shortCuts.add(
|
||||||
ShortcutInfo.Builder(context, Const.Nav.MODULES)
|
ShortcutInfo.Builder(context, Const.Nav.MODULES)
|
||||||
@ -84,7 +72,7 @@ object Shortcuts {
|
|||||||
Intent(intent).putExtra(Const.Key.OPEN_SECTION, Const.Nav.MODULES)
|
Intent(intent).putExtra(Const.Key.OPEN_SECTION, Const.Nav.MODULES)
|
||||||
)
|
)
|
||||||
.setIcon(context.getIcon(R.drawable.sc_extension))
|
.setIcon(context.getIcon(R.drawable.sc_extension))
|
||||||
.setRank(2)
|
.setRank(1)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ sealed class TappableHeadlineItem : DiffRvItem<TappableHeadlineItem>() {
|
|||||||
// --- objects
|
// --- objects
|
||||||
|
|
||||||
object Hide : TappableHeadlineItem() {
|
object Hide : TappableHeadlineItem() {
|
||||||
override val title = R.string.magiskhide
|
override val title = R.string.denylist
|
||||||
override val icon = R.drawable.ic_hide_md2
|
override val icon = R.drawable.ic_hide_md2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="viewModel"
|
name="viewModel"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideViewModel" />
|
type="com.topjohnwu.magisk.ui.deny.DenyListViewModel" />
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
@ -27,7 +27,7 @@
|
|||||||
tools:paddingBottom="64dp">
|
tools:paddingBottom="64dp">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/hide_filter_title_filter"
|
android:id="@+id/filter_title"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/hide_filters"
|
android:text="@string/hide_filters"
|
||||||
@ -45,7 +45,7 @@
|
|||||||
app:chipSpacing="2dp"
|
app:chipSpacing="2dp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="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
|
<com.google.android.material.chip.Chip
|
||||||
android:id="@+id/hide_filter_system_chip"
|
android:id="@+id/hide_filter_system_chip"
|
||||||
@ -83,7 +83,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:checkable="false"
|
android:checkable="false"
|
||||||
android:nextFocusRight="@id/hide_filter_done"
|
android:nextFocusRight="@id/filter_done"
|
||||||
android:nextFocusDown="@id/hide_filter_search_field"
|
android:nextFocusDown="@id/hide_filter_search_field"
|
||||||
android:text="@{viewModel.query}"
|
android:text="@{viewModel.query}"
|
||||||
android:textAppearance="@style/AppearanceFoundation.Caption"
|
android:textAppearance="@style/AppearanceFoundation.Caption"
|
||||||
@ -113,7 +113,7 @@
|
|||||||
android:layout_marginBottom="@dimen/l_50"
|
android:layout_marginBottom="@dimen/l_50"
|
||||||
app:cardCornerRadius="18dp"
|
app:cardCornerRadius="18dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
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_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/hide_filter_title_search">
|
app:layout_constraintTop_toBottomOf="@+id/hide_filter_title_search">
|
||||||
|
|
||||||
@ -136,7 +136,7 @@
|
|||||||
android:hint="@string/hide_filter_hint"
|
android:hint="@string/hide_filter_hint"
|
||||||
android:inputType="textUri"
|
android:inputType="textUri"
|
||||||
android:minHeight="36dp"
|
android:minHeight="36dp"
|
||||||
android:nextFocusRight="@id/hide_filter_done"
|
android:nextFocusRight="@id/filter_done"
|
||||||
android:paddingStart="0dp"
|
android:paddingStart="0dp"
|
||||||
android:paddingEnd="@dimen/l1"
|
android:paddingEnd="@dimen/l1"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
@ -148,7 +148,7 @@
|
|||||||
</com.google.android.material.card.MaterialCardView>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
android:id="@+id/hide_filter_done"
|
android:id="@+id/filter_done"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:nextFocusLeft="@id/hide_filter_system_chip"
|
android:nextFocusLeft="@id/hide_filter_system_chip"
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="viewModel"
|
name="viewModel"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideViewModel" />
|
type="com.topjohnwu.magisk.ui.deny.DenyListViewModel" />
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
@ -16,7 +16,7 @@
|
|||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/hide_content"
|
android:id="@+id/app_list"
|
||||||
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
||||||
itemBinding="@{viewModel.itemBinding}"
|
itemBinding="@{viewModel.itemBinding}"
|
||||||
items="@{viewModel.items}"
|
items="@{viewModel.items}"
|
||||||
@ -31,7 +31,7 @@
|
|||||||
tools:paddingTop="40dp" />
|
tools:paddingTop="40dp" />
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
android:id="@+id/hide_filter_toggle"
|
android:id="@+id/filter_toggle"
|
||||||
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -46,7 +46,7 @@
|
|||||||
tools:layout_marginBottom="64dp" />
|
tools:layout_marginBottom="64dp" />
|
||||||
|
|
||||||
<com.google.android.material.circularreveal.cardview.CircularRevealCardView
|
<com.google.android.material.circularreveal.cardview.CircularRevealCardView
|
||||||
android:id="@+id/hide_filter"
|
android:id="@+id/process_filter"
|
||||||
style="@style/WidgetFoundation.Card"
|
style="@style/WidgetFoundation.Card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -56,8 +56,8 @@
|
|||||||
app:cardCornerRadius="0dp">
|
app:cardCornerRadius="0dp">
|
||||||
|
|
||||||
<include
|
<include
|
||||||
android:id="@+id/hide_filter_include"
|
android:id="@+id/app_filter_include"
|
||||||
layout="@layout/include_hide_filter"
|
layout="@layout/app_list_filter"
|
||||||
viewModel="@{viewModel}"
|
viewModel="@{viewModel}"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content" />
|
@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="item"
|
name="item"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideRvItem" />
|
type="com.topjohnwu.magisk.ui.deny.DenyListRvItem" />
|
||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="viewModel"
|
name="viewModel"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideViewModel" />
|
type="com.topjohnwu.magisk.ui.deny.DenyListViewModel" />
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
@ -80,7 +80,7 @@
|
|||||||
|
|
||||||
<com.topjohnwu.widget.IndeterminateCheckBox
|
<com.topjohnwu.widget.IndeterminateCheckBox
|
||||||
android:id="@+id/hide_expand_icon"
|
android:id="@+id/hide_expand_icon"
|
||||||
state="@={item.hiddenState}"
|
state="@={item.state}"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="@dimen/l1"
|
android:layout_marginEnd="@dimen/l1"
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="item"
|
name="item"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideProcessRvItem" />
|
type="com.topjohnwu.magisk.ui.deny.ProcessRvItem" />
|
||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="viewModel"
|
name="viewModel"
|
||||||
type="com.topjohnwu.magisk.ui.hide.HideViewModel" />
|
type="com.topjohnwu.magisk.ui.deny.DenyListViewModel" />
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
@ -19,7 +19,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:alpha="@{item.hidden ? 1f : .7f}">
|
android:alpha="@{item.enabled ? 1f : .7f}">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/hide_process_checkbox"
|
android:id="@+id/hide_process_checkbox"
|
||||||
android:checked="@={item.hidden}"
|
android:checked="@={item.enabled}"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="@dimen/l_50"
|
android:layout_marginEnd="@dimen/l_50"
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
app:layout_constraintEnd_toStartOf="@+id/headline_icon_pointer"
|
app:layout_constraintEnd_toStartOf="@+id/headline_icon_pointer"
|
||||||
app:layout_constraintStart_toEndOf="@+id/tappable_icon"
|
app:layout_constraintStart_toEndOf="@+id/tappable_icon"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="@string/magiskhide" />
|
tools:text="@string/denylist" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/headline_icon_pointer"
|
android:id="@+id/headline_icon_pointer"
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
tools:showAsAction="always" />
|
tools:showAsAction="always" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/hideFragment"
|
android:id="@+id/denyFragment"
|
||||||
android:icon="@drawable/ic_hide_md2"
|
android:icon="@drawable/ic_hide_md2"
|
||||||
android:title="@string/magiskhide"
|
android:title="@string/denylist"
|
||||||
tools:showAsAction="always" />
|
tools:showAsAction="always" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
app:startDestination="@id/homeFragment">
|
app:startDestination="@id/homeFragment">
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/hideFragment"
|
android:id="@+id/denyFragment"
|
||||||
android:name="com.topjohnwu.magisk.ui.hide.HideFragment"
|
android:name="com.topjohnwu.magisk.ui.deny.DenyListFragment"
|
||||||
android:label="HideFragment"
|
android:label="DenyListFragment"
|
||||||
tools:layout="@layout/fragment_hide_md2" />
|
tools:layout="@layout/fragment_deny_md2" />
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/homeFragment"
|
android:id="@+id/homeFragment"
|
||||||
@ -165,8 +165,8 @@
|
|||||||
app:popUpTo="@id/homeFragment" />
|
app:popUpTo="@id/homeFragment" />
|
||||||
|
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_hideFragment"
|
android:id="@+id/action_denylistFragment"
|
||||||
app:destination="@id/hideFragment"
|
app:destination="@id/denyFragment"
|
||||||
app:enterAnim="@anim/fragment_enter"
|
app:enterAnim="@anim/fragment_enter"
|
||||||
app:exitAnim="@anim/fragment_exit"
|
app:exitAnim="@anim/fragment_exit"
|
||||||
app:popEnterAnim="@anim/fragment_enter_pop"
|
app:popEnterAnim="@anim/fragment_enter_pop"
|
||||||
|
@ -136,7 +136,6 @@
|
|||||||
<string name="settings_update_beta">تجريبي</string>
|
<string name="settings_update_beta">تجريبي</string>
|
||||||
<string name="settings_update_custom">مخصص</string>
|
<string name="settings_update_custom">مخصص</string>
|
||||||
<string name="settings_update_custom_msg">أدخل الرابط لمصدرك المخصص</string>
|
<string name="settings_update_custom_msg">أدخل الرابط لمصدرك المخصص</string>
|
||||||
<string name="settings_magiskhide_summary">إخفاء مـاجـيسك من معظم طرق الاكتشاف</string>
|
|
||||||
<string name="settings_hosts_title">موانع الاعلانات</string>
|
<string name="settings_hosts_title">موانع الاعلانات</string>
|
||||||
<string name="settings_hosts_summary">حجب الاعلانات دون تعديل النظام</string>
|
<string name="settings_hosts_summary">حجب الاعلانات دون تعديل النظام</string>
|
||||||
<string name="settings_hosts_toast">تم تمكين خاصية حجب الاعلانات</string>
|
<string name="settings_hosts_toast">تم تمكين خاصية حجب الاعلانات</string>
|
||||||
|
@ -82,7 +82,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Özəl</string>
|
<string name="settings_update_custom">Özəl</string>
|
||||||
<string name="settings_update_custom_msg">Özəl URL daxil edin</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_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_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>
|
<string name="settings_hosts_toast">Sistemsiz host əlavəsi quraşdırıldı</string>
|
||||||
|
@ -136,7 +136,6 @@
|
|||||||
<string name="settings_update_beta">Бэта</string>
|
<string name="settings_update_beta">Бэта</string>
|
||||||
<string name="settings_update_custom">Адвольны канал</string>
|
<string name="settings_update_custom">Адвольны канал</string>
|
||||||
<string name="settings_update_custom_msg">Устаўце URL</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_title">Пазасістэмны файл hosts</string>
|
||||||
<string name="settings_hosts_summary">Падтрымка пазасістэмнага файла hosts для праграм, якія блакуюць рэкламу</string>
|
<string name="settings_hosts_summary">Падтрымка пазасістэмнага файла hosts для праграм, якія блакуюць рэкламу</string>
|
||||||
<string name="settings_hosts_toast">Дададзены модуль пазасістэмнага файла hosts</string>
|
<string name="settings_hosts_toast">Дададзены модуль пазасістэмнага файла hosts</string>
|
||||||
|
@ -78,7 +78,6 @@
|
|||||||
<string name="settings_update_beta">Бета</string>
|
<string name="settings_update_beta">Бета</string>
|
||||||
<string name="settings_update_custom">Потребителски</string>
|
<string name="settings_update_custom">Потребителски</string>
|
||||||
<string name="settings_update_custom_msg">Въведете потребителски URL</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_title">Несистемни хостове</string>
|
||||||
<string name="settings_hosts_summary">Поддръжка на несистемни хостове за използване на приложения, блокиращи реклами.</string>
|
<string name="settings_hosts_summary">Поддръжка на несистемни хостове за използване на приложения, блокиращи реклами.</string>
|
||||||
<string name="settings_hosts_toast">Бе добавен модул с несистемни хостове.</string>
|
<string name="settings_hosts_toast">Бе добавен модул с несистемни хостове.</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Canal personalitzat</string>
|
<string name="settings_update_custom">Canal personalitzat</string>
|
||||||
<string name="settings_update_custom_msg">Inserta un URL personalitzada</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_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_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_hosts_toast">Agregat el mòdul Systemless Hosts</string>
|
||||||
|
@ -145,7 +145,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Vlastní</string>
|
<string name="settings_update_custom">Vlastní</string>
|
||||||
<string name="settings_update_custom_msg">Vložte vlastní URL</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_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_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>
|
<string name="settings_hosts_toast">Přidán systémový modul hostitelů</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Benutzerdefiniert</string>
|
<string name="settings_update_custom">Benutzerdefiniert</string>
|
||||||
<string name="settings_update_custom_msg">Eine benutzerdefinierte URL eingeben</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_title">Systemlose Hosts-Datei</string>
|
||||||
<string name="settings_hosts_summary">Systemlose Unterstützung für Werbeblocker</string>
|
<string name="settings_hosts_summary">Systemlose Unterstützung für Werbeblocker</string>
|
||||||
<string name="settings_hosts_toast">Systemloses Hosts-Modul hinzugefügt</string>
|
<string name="settings_hosts_toast">Systemloses Hosts-Modul hinzugefügt</string>
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
<string name="reboot_delay_toast">Επανεκκίνηση σε 5 δευτερόλεπτα…</string>
|
<string name="reboot_delay_toast">Επανεκκίνηση σε 5 δευτερόλεπτα…</string>
|
||||||
<string name="flash_screen_title">Εγκατάσταση</string>
|
<string name="flash_screen_title">Εγκατάσταση</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Αίτημα υπερχρήστη</string>
|
<string name="su_request_title">Αίτημα υπερχρήστη</string>
|
||||||
<string name="touch_filtered_warning">Επειδή μια εφαρμογή αποκρύπτει ένα αίτημα υπερχρήστη, το Magisk δεν μπορεί να επαληθεύσει την απάντησή σας</string>
|
<string name="touch_filtered_warning">Επειδή μια εφαρμογή αποκρύπτει ένα αίτημα υπερχρήστη, το Magisk δεν μπορεί να επαληθεύσει την απάντησή σας</string>
|
||||||
<string name="deny">Άρνηση</string>
|
<string name="deny">Άρνηση</string>
|
||||||
@ -76,7 +76,7 @@
|
|||||||
<string name="toast">Αναδυόμενο παράθυρο</string>
|
<string name="toast">Αναδυόμενο παράθυρο</string>
|
||||||
<string name="none">Κανένα</string>
|
<string name="none">Κανένα</string>
|
||||||
|
|
||||||
<string name="superuser_toggle_notification">Ειδοποιήσεις</string>
|
<string name="superuser_toggle_notification">Ειδοποιήσεις</string>
|
||||||
<string name="superuser_toggle_revoke">Ανακάλεσε</string>
|
<string name="superuser_toggle_revoke">Ανακάλεσε</string>
|
||||||
<string name="superuser_policy_none">Καμία εφαρμογή δεν έχει ζητήσει άδεια υπερχρήστη.</string>
|
<string name="superuser_policy_none">Καμία εφαρμογή δεν έχει ζητήσει άδεια υπερχρήστη.</string>
|
||||||
<!--Logs-->
|
<!--Logs-->
|
||||||
@ -145,7 +145,6 @@
|
|||||||
<string name="settings_update_beta">Δοκιμαστικό</string>
|
<string name="settings_update_beta">Δοκιμαστικό</string>
|
||||||
<string name="settings_update_custom">Προσαρμοσμένο</string>
|
<string name="settings_update_custom">Προσαρμοσμένο</string>
|
||||||
<string name="settings_update_custom_msg">Εισαγωγή ενός custom URL</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">Υποστήριξη Systemless hosts για εφαρμογές Adblock</string>
|
<string name="settings_hosts_summary">Υποστήριξη Systemless hosts για εφαρμογές Adblock</string>
|
||||||
<string name="settings_hosts_toast">Προσθήκη αρθρώματος systemless hosts</string>
|
<string name="settings_hosts_toast">Προσθήκη αρθρώματος systemless hosts</string>
|
||||||
@ -184,7 +183,7 @@
|
|||||||
<string name="settings_user_independent">Ανεξάρτητη από τον χρήστη</string>
|
<string name="settings_user_independent">Ανεξάρτητη από τον χρήστη</string>
|
||||||
<string name="owner_only_summary">Μόνο ο ιδιοκτήτης έχει πρόσβαση root</string>
|
<string name="owner_only_summary">Μόνο ο ιδιοκτήτης έχει πρόσβαση root</string>
|
||||||
<string name="owner_manage_summary">Μόνο ο ιδιοκτήτης μπορεί να διαχειριστεί την πρόσβαση root και να δεχτεί προτροπές αίτημάτων</string>
|
<string name="owner_manage_summary">Μόνο ο ιδιοκτήτης μπορεί να διαχειριστεί την πρόσβαση root και να δεχτεί προτροπές αίτημάτων</string>
|
||||||
<string name="user_indepenent_summary">Κάθε χρήστης έχει τους δικούς του ξεχωριστούς κανόνες root</string>
|
<string name="user_indepenent_summary">Κάθε χρήστης έχει τους δικούς του ξεχωριστούς κανόνες root</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Λειτουργία προσάρτησης χώρου ονομάτων</string>
|
<string name="mount_namespace_mode">Λειτουργία προσάρτησης χώρου ονομάτων</string>
|
||||||
<string name="settings_ns_global">Καθολικός Χώρος Ονομάτων</string>
|
<string name="settings_ns_global">Καθολικός Χώρος Ονομάτων</string>
|
||||||
@ -199,7 +198,7 @@
|
|||||||
<string name="progress_channel">Ειδοποιήσεις προόδου</string>
|
<string name="progress_channel">Ειδοποιήσεις προόδου</string>
|
||||||
<string name="download_complete">Η λήψη ολοκληρώθηκε</string>
|
<string name="download_complete">Η λήψη ολοκληρώθηκε</string>
|
||||||
<string name="download_file_error">Σφάλμα στη λήψη του αρχείου</string>
|
<string name="download_file_error">Σφάλμα στη λήψη του αρχείου</string>
|
||||||
<string name="magisk_update_title">Νέα Ενημέρωση Magisk Διαθέσιμη!</string>
|
<string name="magisk_update_title">Νέα Ενημέρωση Magisk Διαθέσιμη!</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="yes">Ναι</string>
|
<string name="yes">Ναι</string>
|
||||||
@ -232,7 +231,7 @@
|
|||||||
<string name="external_rw_permission_denied">Παραχωρήστε άδεια αποθήκευσης για να ενεργοποιήσετε αυτήν τη λειτουργία</string>
|
<string name="external_rw_permission_denied">Παραχωρήστε άδεια αποθήκευσης για να ενεργοποιήσετε αυτήν τη λειτουργία</string>
|
||||||
<string name="add_shortcut_title">Προσθέστε συντόμευση στην αρχική οθόνη</string>
|
<string name="add_shortcut_title">Προσθέστε συντόμευση στην αρχική οθόνη</string>
|
||||||
<string name="add_shortcut_msg">Μετά την απόκρυψη αυτής της εφαρμογής, το όνομα και το εικονίδιο της ενδέχεται να είναι δύσκολο να αναγνωριστούν. Θέλετε να προσθέσετε μια όμορφη συντόμευση στην αρχική οθόνη;</string>
|
<string name="add_shortcut_msg">Μετά την απόκρυψη αυτής της εφαρμογής, το όνομα και το εικονίδιο της ενδέχεται να είναι δύσκολο να αναγνωριστούν. Θέλετε να προσθέσετε μια όμορφη συντόμευση στην αρχική οθόνη;</string>
|
||||||
|
|
||||||
<string name="app_not_found">Δεν βρέθηκε εφαρμογή που να χειρίζεται αυτήν την ενέργεια</string>
|
<string name="app_not_found">Δεν βρέθηκε εφαρμογή που να χειρίζεται αυτήν την ενέργεια</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Personalizado</string>
|
<string name="settings_update_custom">Personalizado</string>
|
||||||
<string name="settings_update_custom_msg">Insertar una URL personalizada</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_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_summary">Soporte para bloqueadores de publicidad fuera de la partición system</string>
|
||||||
<string name="settings_hosts_toast">Módulo systemless hosts agregado</string>
|
<string name="settings_hosts_toast">Módulo systemless hosts agregado</string>
|
||||||
|
@ -137,7 +137,6 @@
|
|||||||
<string name="settings_update_beta">Beeta</string>
|
<string name="settings_update_beta">Beeta</string>
|
||||||
<string name="settings_update_custom">Kohandatud</string>
|
<string name="settings_update_custom">Kohandatud</string>
|
||||||
<string name="settings_update_custom_msg">Sisesta kohandatud URL</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_title">Süsteemivaba hosts</string>
|
||||||
<string name="settings_hosts_summary">Süsteemivaba hosts-tugi reklaamiblokeerijatest rakendustele</string>
|
<string name="settings_hosts_summary">Süsteemivaba hosts-tugi reklaamiblokeerijatest rakendustele</string>
|
||||||
<string name="settings_hosts_toast">Süsteemivaba hostsi moodul lisatud</string>
|
<string name="settings_hosts_toast">Süsteemivaba hostsi moodul lisatud</string>
|
||||||
|
@ -134,7 +134,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Custom Channel</string>
|
<string name="settings_update_custom">Custom Channel</string>
|
||||||
<string name="settings_update_custom_msg">اضافه کردن یک URL سفارشی</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_title">نصب بدون حذف یا تغییر در فایل ها</string>
|
||||||
<string name="settings_hosts_summary">نصب بدون حذف یا تغییر در فایل ها رای ساپورت از برنامه های Adblock</string>
|
<string name="settings_hosts_summary">نصب بدون حذف یا تغییر در فایل ها رای ساپورت از برنامه های Adblock</string>
|
||||||
<string name="settings_hosts_toast">ماژول نصب بدون حذف یا تغییر در فایل ها اضافه شد</string>
|
<string name="settings_hosts_toast">ماژول نصب بدون حذف یا تغییر در فایل ها اضافه شد</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Bêta</string>
|
<string name="settings_update_beta">Bêta</string>
|
||||||
<string name="settings_update_custom">Canal personnalisé</string>
|
<string name="settings_update_custom">Canal personnalisé</string>
|
||||||
<string name="settings_update_custom_msg">Saisissez une URL personnalisée</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_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_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>
|
<string name="settings_hosts_toast">Ajout d’un module pour fichier hosts hors système</string>
|
||||||
|
@ -139,7 +139,6 @@
|
|||||||
<string name="settings_update_beta">बीटा</string>
|
<string name="settings_update_beta">बीटा</string>
|
||||||
<string name="settings_update_custom">कस्टम चैनल</string>
|
<string name="settings_update_custom">कस्टम चैनल</string>
|
||||||
<string name="settings_update_custom_msg">एक कस्टम URL डालें</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_title">सिस्टमलेस होस्ट</string>
|
||||||
<string name="settings_hosts_summary">Adblock ऐप्स के लिए सिस्टमलेस होस्ट सपोर्ट</string>
|
<string name="settings_hosts_summary">Adblock ऐप्स के लिए सिस्टमलेस होस्ट सपोर्ट</string>
|
||||||
<string name="settings_hosts_toast">सिस्टमलेस होस्ट मॉड्यूल जोड़ा गया</string>
|
<string name="settings_hosts_toast">सिस्टमलेस होस्ट मॉड्यूल जोड़ा गया</string>
|
||||||
|
@ -137,7 +137,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Vlastiti kanal</string>
|
<string name="settings_update_custom">Vlastiti kanal</string>
|
||||||
<string name="settings_update_custom_msg">Umetnite prilagođeni URL</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_title">Hostovi bez sistema</string>
|
||||||
<string name="settings_hosts_summary">Podrška za hostove bez sistema za Adblock aplikacije</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>
|
<string name="settings_hosts_toast">Dodan je modul hosta bez sistema</string>
|
||||||
|
@ -140,7 +140,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Kanal khusus</string>
|
<string name="settings_update_custom">Kanal khusus</string>
|
||||||
<string name="settings_update_custom_msg">Masukkan URL 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_title">Host systemless</string>
|
||||||
<string name="settings_hosts_summary">Dukungan host secara systemless untuk aplikasi pemblokir iklan</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>
|
<string name="settings_hosts_toast">Menambahkan modul host systemless</string>
|
||||||
|
@ -141,7 +141,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Canale personalizzato</string>
|
<string name="settings_update_custom">Canale personalizzato</string>
|
||||||
<string name="settings_update_custom_msg">Inserisci un URL 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_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_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>
|
<string name="settings_hosts_toast">Aggiunto modulo per il supporto al file hosts systemless</string>
|
||||||
|
@ -144,7 +144,6 @@
|
|||||||
<string name="settings_update_beta">בטא</string>
|
<string name="settings_update_beta">בטא</string>
|
||||||
<string name="settings_update_custom">ערוץ מותאם אישית</string>
|
<string name="settings_update_custom">ערוץ מותאם אישית</string>
|
||||||
<string name="settings_update_custom_msg">הזן כתובת מותאמת אישית</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_title">מארחים חסרי מערכת</string>
|
||||||
<string name="settings_hosts_summary">מארחים חסרי מערכת תומכים ביישומים חוסמי פרסומות</string>
|
<string name="settings_hosts_summary">מארחים חסרי מערכת תומכים ביישומים חוסמי פרסומות</string>
|
||||||
<string name="settings_hosts_toast">הוסף מודול מארחים חסרי מערכת</string>
|
<string name="settings_hosts_toast">הוסף מודול מארחים חסרי מערכת</string>
|
||||||
@ -190,7 +189,7 @@
|
|||||||
<string name="global_summary">כלל חיבורי השורש משתמשים במרחב שם הגלובלי</string>
|
<string name="global_summary">כלל חיבורי השורש משתמשים במרחב שם הגלובלי</string>
|
||||||
<string name="requester_summary">חיבורי השורש יירשו את מרחב השם של המבקש</string>
|
<string name="requester_summary">חיבורי השורש יירשו את מרחב השם של המבקש</string>
|
||||||
<string name="isolate_summary">לכל חיבור שורש יהיה מרחב שם מבודד</string>
|
<string name="isolate_summary">לכל חיבור שורש יהיה מרחב שם מבודד</string>
|
||||||
|
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="update_channel">עדכוני Magisk</string>
|
<string name="update_channel">עדכוני Magisk</string>
|
||||||
<string name="progress_channel">התראות התקדמות</string>
|
<string name="progress_channel">התראות התקדמות</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">ベータ版</string>
|
<string name="settings_update_beta">ベータ版</string>
|
||||||
<string name="settings_update_custom">カスタム</string>
|
<string name="settings_update_custom">カスタム</string>
|
||||||
<string name="settings_update_custom_msg">カスタム URL を入力</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">広告ブロックアプリのための Systemless hosts サポートを有効化します</string>
|
<string name="settings_hosts_summary">広告ブロックアプリのための Systemless hosts サポートを有効化します</string>
|
||||||
<string name="settings_hosts_toast">Systemless hosts モジュールを追加しました</string>
|
<string name="settings_hosts_toast">Systemless hosts モジュールを追加しました</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">ბეტა</string>
|
<string name="settings_update_beta">ბეტა</string>
|
||||||
<string name="settings_update_custom">პერსონალიზირებული</string>
|
<string name="settings_update_custom">პერსონალიზირებული</string>
|
||||||
<string name="settings_update_custom_msg">სხვა URL-ის ჩასმა</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_title">გარესისტემური ჰოსტები</string>
|
||||||
<string name="settings_hosts_summary">გარესისტემური ჰოსტები Adblock-ებისთვის</string>
|
<string name="settings_hosts_summary">გარესისტემური ჰოსტები Adblock-ებისთვის</string>
|
||||||
<string name="settings_hosts_toast">გარესისტემური ჰოსტების მოდული დამატებულია</string>
|
<string name="settings_hosts_toast">გარესისტემური ჰოსტების მოდული დამატებულია</string>
|
||||||
|
@ -137,7 +137,6 @@
|
|||||||
<string name="settings_update_beta">베타</string>
|
<string name="settings_update_beta">베타</string>
|
||||||
<string name="settings_update_custom">사용자 지정</string>
|
<string name="settings_update_custom">사용자 지정</string>
|
||||||
<string name="settings_update_custom_msg">사용자 지정 URL 입력</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">광고 차단 앱에서 사용하는 systemless hosts를 지원합니다.</string>
|
<string name="settings_hosts_summary">광고 차단 앱에서 사용하는 systemless hosts를 지원합니다.</string>
|
||||||
<string name="settings_hosts_toast">Systemless hosts 모듈 추가됨</string>
|
<string name="settings_hosts_toast">Systemless hosts 모듈 추가됨</string>
|
||||||
|
@ -74,7 +74,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Pasirinktiniai</string>
|
<string name="settings_update_custom">Pasirinktiniai</string>
|
||||||
<string name="settings_update_custom_msg">Įvesti pasirinktinį URL</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_title">Sistemos padejėjai</string>
|
||||||
<string name="settings_hosts_summary">Įgalinti sistemos padejėjus Adblock programėlėms</string>
|
<string name="settings_hosts_summary">Įgalinti sistemos padejėjus Adblock programėlėms</string>
|
||||||
|
|
||||||
|
@ -86,7 +86,6 @@
|
|||||||
<string name="settings_update_beta">Бета</string>
|
<string name="settings_update_beta">Бета</string>
|
||||||
<string name="settings_update_custom">Прилагодено</string>
|
<string name="settings_update_custom">Прилагодено</string>
|
||||||
<string name="settings_update_custom_msg">Внеси прилагоден URL линк</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_title">Несистемски хостови</string>
|
||||||
<string name="settings_hosts_summary">Поддршка за несистемски хостови за Adblock апликации.</string>
|
<string name="settings_hosts_summary">Поддршка за несистемски хостови за Adblock апликации.</string>
|
||||||
<string name="settings_hosts_toast">Додаден е модул за несистемски хостови</string>
|
<string name="settings_hosts_toast">Додаден е модул за несистемски хостови</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Egendefinert kanal</string>
|
<string name="settings_update_custom">Egendefinert kanal</string>
|
||||||
<string name="settings_update_custom_msg">Sett inn en egendefinert nettadresse</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_title">Systemløs vertsfil</string>
|
||||||
<string name="settings_hosts_summary">Systemløs vertsfilstøtte for reklameblokkeringsprogrammer</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>
|
<string name="settings_hosts_toast">La til modul for systemløs vertsfil</string>
|
||||||
|
@ -136,7 +136,6 @@
|
|||||||
<string name="settings_update_beta">Bèta</string>
|
<string name="settings_update_beta">Bèta</string>
|
||||||
<string name="settings_update_custom">Aangepast</string>
|
<string name="settings_update_custom">Aangepast</string>
|
||||||
<string name="settings_update_custom_msg">Voer een aangepaste url in</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_title">Systeemloze hosts</string>
|
||||||
<string name="settings_hosts_summary">Systeemloze hosts-ondersteuning voor advertentieblokkeringsapps.</string>
|
<string name="settings_hosts_summary">Systeemloze hosts-ondersteuning voor advertentieblokkeringsapps.</string>
|
||||||
<string name="settings_hosts_toast">De systeemloze hosts-module is toegevoegd</string>
|
<string name="settings_hosts_toast">De systeemloze hosts-module is toegevoegd</string>
|
||||||
|
@ -139,7 +139,6 @@
|
|||||||
<string name="settings_update_beta">ਬੀਟਾ</string>
|
<string name="settings_update_beta">ਬੀਟਾ</string>
|
||||||
<string name="settings_update_custom">ਕਸਟਮ ਚੈਨਲ</string>
|
<string name="settings_update_custom">ਕਸਟਮ ਚੈਨਲ</string>
|
||||||
<string name="settings_update_custom_msg">ਇੱਕ ਕਸਟਮ URL ਦਾਖਲ ਕਰੋ</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_title">Systemless ਹੋਸਟ</string>
|
||||||
<string name="settings_hosts_summary">Adblock ਐਪਸ ਲਈ Systemless ਹੋਸਟ ਦੀ ਸਹਿਯੋਗ</string>
|
<string name="settings_hosts_summary">Adblock ਐਪਸ ਲਈ Systemless ਹੋਸਟ ਦੀ ਸਹਿਯੋਗ</string>
|
||||||
<string name="settings_hosts_toast">Systemless ਹੋਸਟ ਮੋਡੀਊਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ</string>
|
<string name="settings_hosts_toast">Systemless ਹੋਸਟ ਮੋਡੀਊਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Własny kanał</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_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_title">Hosty Systemless</string>
|
||||||
<string name="settings_hosts_summary">Wsparcie hostów Systemless dla aplikacji typu Adblock</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>
|
<string name="settings_hosts_toast">Dodano moduł hostów Systemless</string>
|
||||||
|
@ -145,7 +145,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Canal personalizado</string>
|
<string name="settings_update_custom">Canal personalizado</string>
|
||||||
<string name="settings_update_custom_msg">Insira um URL 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_title">Hosts sem sistema</string>
|
||||||
<string name="settings_hosts_summary">Suporte de hosts sem sistema para aplicativos Adblock</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>
|
<string name="settings_hosts_toast">Adicionado módulo de hosts sem sistema</string>
|
||||||
|
@ -56,7 +56,6 @@
|
|||||||
<string name="system_default">(Padrão do Sistema)</string>
|
<string name="system_default">(Padrão do Sistema)</string>
|
||||||
<string name="settings_update_stable">Estável</string>
|
<string name="settings_update_stable">Estável</string>
|
||||||
<string name="settings_update_beta">Beta</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_title">Ativar systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">Suporte de systemless para aplicações Adblock</string>
|
<string name="settings_hosts_summary">Suporte de systemless para aplicações Adblock</string>
|
||||||
|
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Canal personalizat</string>
|
<string name="settings_update_custom">Canal personalizat</string>
|
||||||
<string name="settings_update_custom_msg">Inserează un URL 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_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_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>
|
<string name="settings_hosts_toast">Modulul pentru fișierul hosts în afara partiției system, adăugat</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta канал</string>
|
<string name="settings_update_beta">Beta канал</string>
|
||||||
<string name="settings_update_custom">Сторонний канал</string>
|
<string name="settings_update_custom">Сторонний канал</string>
|
||||||
<string name="settings_update_custom_msg">Укажите ссылку</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_title">Внесистемный hosts файл</string>
|
||||||
<string name="settings_hosts_summary">Поддержка внесистемного hosts файла для приложений, блокирующих рекламу</string>
|
<string name="settings_hosts_summary">Поддержка внесистемного hosts файла для приложений, блокирующих рекламу</string>
|
||||||
<string name="settings_hosts_toast">Добавлен модуль внесистемного hosts файла</string>
|
<string name="settings_hosts_toast">Добавлен модуль внесистемного hosts файла</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Vlastný kanál</string>
|
<string name="settings_update_custom">Vlastný kanál</string>
|
||||||
<string name="settings_update_custom_msg">Zadajte vlastnú URL</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">Podpora pre Adblock aplikácie so 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>
|
<string name="settings_hosts_toast">Pridaný modul systemless hosts</string>
|
||||||
|
@ -140,7 +140,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Kanali i personalizuar</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_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_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_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>
|
<string name="settings_hosts_toast">Moduli i pritur i sistemit pa sistem</string>
|
||||||
|
@ -63,7 +63,6 @@
|
|||||||
<string name="settings_update_beta">Бета</string>
|
<string name="settings_update_beta">Бета</string>
|
||||||
<string name="settings_update_custom">По наруџби</string>
|
<string name="settings_update_custom">По наруџби</string>
|
||||||
<string name="settings_update_custom_msg">Унеси наруџбени УРЛ</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_title">Без-системски домаћини (hosts)</string>
|
||||||
<string name="settings_hosts_summary">Подршка без-системских домаћина за апликације за блокирање реклама</string>
|
<string name="settings_hosts_summary">Подршка без-системских домаћина за апликације за блокирање реклама</string>
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<string name="section_home">Hem</string>
|
<string name="section_home">Hem</string>
|
||||||
<string name="section_theme">Tema</string>
|
<string name="section_theme">Tema</string>
|
||||||
<string name="safetynet">SafetyNet</string>
|
<string name="safetynet">SafetyNet</string>
|
||||||
|
|
||||||
<!--Home-->
|
<!--Home-->
|
||||||
<string name="no_connection">Ingen anslutning tillgänglig</string>
|
<string name="no_connection">Ingen anslutning tillgänglig</string>
|
||||||
<string name="app_changelog">Ändringslogg</string>
|
<string name="app_changelog">Ändringslogg</string>
|
||||||
@ -145,7 +145,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Anpassad kanal</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_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_title">Systemfri hosts</string>
|
||||||
<string name="settings_hosts_summary">Stöd för Adblock-appar med systemfri hosts-fil</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>
|
<string name="settings_hosts_toast">Lagt till modul för systemfri hosts-fil</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">தற்காலிகமானது</string>
|
<string name="settings_update_beta">தற்காலிகமானது</string>
|
||||||
<string name="settings_update_custom">தனிப்பயன் வழி</string>
|
<string name="settings_update_custom">தனிப்பயன் வழி</string>
|
||||||
<string name="settings_update_custom_msg">தனிப்பயன் URL ஐ உள்ளிடவும்</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_title">கணினி இல்லாத ஹோஸ்ட்கள்</string>
|
||||||
<string name="settings_hosts_summary">கணினி இல்லாத ஹோஸ்ட்கள் Adblock பயன்பாடுகளுக்கு ஆதரவளிக்கின்றன</string>
|
<string name="settings_hosts_summary">கணினி இல்லாத ஹோஸ்ட்கள் Adblock பயன்பாடுகளுக்கு ஆதரவளிக்கின்றன</string>
|
||||||
<string name="settings_hosts_toast">கணினி இல்லாத ஹோஸ்ட்கள் தொகுதி சேர்க்கப்பட்டது</string>
|
<string name="settings_hosts_toast">கணினி இல்லாத ஹோஸ்ட்கள் தொகுதி சேர்க்கப்பட்டது</string>
|
||||||
|
@ -79,7 +79,6 @@
|
|||||||
<string name="settings_update_beta">เบต้า</string>
|
<string name="settings_update_beta">เบต้า</string>
|
||||||
<string name="settings_update_custom">กำหนดเอง</string>
|
<string name="settings_update_custom">กำหนดเอง</string>
|
||||||
<string name="settings_update_custom_msg">ใส่ URL</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">การรองรับ Systemless hosts เพื่อแอพ Adblock ต่างๆ</string>
|
<string name="settings_hosts_summary">การรองรับ Systemless hosts เพื่อแอพ Adblock ต่างๆ</string>
|
||||||
<string name="settings_hosts_toast">ทำการเพิ่มโมดูล systemless hosts แล้ว</string>
|
<string name="settings_hosts_toast">ทำการเพิ่มโมดูล systemless hosts แล้ว</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Özel Kanal</string>
|
<string name="settings_update_custom">Özel Kanal</string>
|
||||||
<string name="settings_update_custom_msg">Özel URL ekleyin</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_title">Sistemsiz hosts</string>
|
||||||
<string name="settings_hosts_summary">Reklam engelleme uygulamaları için sistemsiz hosts desteği</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>
|
<string name="settings_hosts_toast">Sistemsiz hosts modülü eklendi</string>
|
||||||
|
@ -140,7 +140,6 @@
|
|||||||
<string name="settings_update_beta">Бета реліз</string>
|
<string name="settings_update_beta">Бета реліз</string>
|
||||||
<string name="settings_update_custom">Власний</string>
|
<string name="settings_update_custom">Власний</string>
|
||||||
<string name="settings_update_custom_msg">Вставте власний URL</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_title">Позасистемні хости</string>
|
||||||
<string name="settings_hosts_summary">Підтримка позасистемних хостів для застосунків блокування реклами</string>
|
<string name="settings_hosts_summary">Підтримка позасистемних хостів для застосунків блокування реклами</string>
|
||||||
<string name="settings_hosts_toast">Додано модуль позасистемних хостів</string>
|
<string name="settings_hosts_toast">Додано модуль позасистемних хостів</string>
|
||||||
|
@ -77,7 +77,6 @@
|
|||||||
<string name="settings_update_beta">Dùng thử</string>
|
<string name="settings_update_beta">Dùng thử</string>
|
||||||
<string name="settings_update_custom">Tuỳ chỉnh</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_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_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_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>
|
<string name="settings_hosts_toast">Mô-đun được thêm vào systemless hosts</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">测试版</string>
|
<string name="settings_update_beta">测试版</string>
|
||||||
<string name="settings_update_custom">自定义通道</string>
|
<string name="settings_update_custom">自定义通道</string>
|
||||||
<string name="settings_update_custom_msg">自定义通道网址</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">为广告屏蔽应用提供 Systemless hosts 支持</string>
|
<string name="settings_hosts_summary">为广告屏蔽应用提供 Systemless hosts 支持</string>
|
||||||
<string name="settings_hosts_toast">已添加 systemless hosts 模块</string>
|
<string name="settings_hosts_toast">已添加 systemless hosts 模块</string>
|
||||||
|
@ -146,7 +146,6 @@
|
|||||||
<string name="settings_update_beta">測試版</string>
|
<string name="settings_update_beta">測試版</string>
|
||||||
<string name="settings_update_custom">自訂頻道</string>
|
<string name="settings_update_custom">自訂頻道</string>
|
||||||
<string name="settings_update_custom_msg">輸入一個自訂的網址</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_title">主機(Hosts)模組化</string>
|
||||||
<string name="settings_hosts_summary">為廣告阻擋程式提供主機模組</string>
|
<string name="settings_hosts_summary">為廣告阻擋程式提供主機模組</string>
|
||||||
<string name="settings_hosts_toast">已安裝主機模組</string>
|
<string name="settings_hosts_toast">已安裝主機模組</string>
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
<!-- Static strings -->
|
<!-- Static strings -->
|
||||||
<string name="magisk" translatable="false">Magisk</string>
|
<string name="magisk" translatable="false">Magisk</string>
|
||||||
<string name="magiskhide" translatable="false">MagiskHide</string>
|
|
||||||
<string name="empty" translatable="false"/>
|
<string name="empty" translatable="false"/>
|
||||||
|
|
||||||
<string name="topjohnwu" translatable="false">\@topjohnwu</string>
|
<string name="topjohnwu" translatable="false">\@topjohnwu</string>
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
<string name="section_home">Home</string>
|
<string name="section_home">Home</string>
|
||||||
<string name="section_theme">Themes</string>
|
<string name="section_theme">Themes</string>
|
||||||
<string name="safetynet">SafetyNet</string>
|
<string name="safetynet">SafetyNet</string>
|
||||||
|
<string name="denylist">DenyList</string>
|
||||||
|
|
||||||
<!--Home-->
|
<!--Home-->
|
||||||
<string name="no_connection">No connection available</string>
|
<string name="no_connection">No connection available</string>
|
||||||
@ -146,7 +147,7 @@
|
|||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Custom Channel</string>
|
<string name="settings_update_custom">Custom Channel</string>
|
||||||
<string name="settings_update_custom_msg">Insert a custom URL</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_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">Systemless hosts support for Adblock apps</string>
|
<string name="settings_hosts_summary">Systemless hosts support for Adblock apps</string>
|
||||||
<string name="settings_hosts_toast">Added systemless hosts module</string>
|
<string name="settings_hosts_toast">Added systemless hosts module</string>
|
||||||
|
@ -22,9 +22,9 @@ LOCAL_SRC_FILES := \
|
|||||||
core/module.cpp \
|
core/module.cpp \
|
||||||
core/logging.cpp \
|
core/logging.cpp \
|
||||||
core/thread.cpp \
|
core/thread.cpp \
|
||||||
magiskhide/magiskhide.cpp \
|
deny/cli.cpp \
|
||||||
magiskhide/hide_utils.cpp \
|
deny/utils.cpp \
|
||||||
magiskhide/hide_policy.cpp \
|
deny/revert.cpp \
|
||||||
resetprop/persist_properties.cpp \
|
resetprop/persist_properties.cpp \
|
||||||
resetprop/resetprop.cpp \
|
resetprop/resetprop.cpp \
|
||||||
su/su.cpp \
|
su/su.cpp \
|
||||||
|
@ -10,7 +10,7 @@ using namespace std;
|
|||||||
|
|
||||||
using main_fun = int (*)(int, char *[]);
|
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[]) {
|
static int call_applet(int argc, char *argv[]) {
|
||||||
// Applets
|
// Applets
|
||||||
|
@ -296,12 +296,12 @@ void post_fs_data(int client) {
|
|||||||
|
|
||||||
if (getprop("persist.sys.safemode", true) == "1" || check_key_combo()) {
|
if (getprop("persist.sys.safemode", true) == "1" || check_key_combo()) {
|
||||||
safe_mode = true;
|
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_modules();
|
||||||
disable_hide();
|
disable_deny();
|
||||||
} else {
|
} else {
|
||||||
exec_common_scripts("post-fs-data");
|
exec_common_scripts("post-fs-data");
|
||||||
check_enable_hide();
|
check_enforce_denylist();
|
||||||
handle_modules();
|
handle_modules();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,7 +350,7 @@ void boot_complete(int client) {
|
|||||||
if (access(SECURE_DIR, F_OK) != 0)
|
if (access(SECURE_DIR, F_OK) != 0)
|
||||||
xmkdir(SECURE_DIR, 0700);
|
xmkdir(SECURE_DIR, 0700);
|
||||||
|
|
||||||
check_enable_hide();
|
check_enforce_denylist();
|
||||||
|
|
||||||
if (!check_manager()) {
|
if (!check_manager()) {
|
||||||
if (access(MANAGERAPK, F_OK) == 0) {
|
if (access(MANAGERAPK, F_OK) == 0) {
|
||||||
|
@ -44,8 +44,8 @@ static bool check_zygote(pid_t pid) {
|
|||||||
|
|
||||||
static void handle_request_async(int client, int code, ucred cred) {
|
static void handle_request_async(int client, int code, ucred cred) {
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case MAGISKHIDE:
|
case DENYLIST:
|
||||||
magiskhide_handler(client, &cred);
|
denylist_handler(client, &cred);
|
||||||
break;
|
break;
|
||||||
case SUPERUSER:
|
case SUPERUSER:
|
||||||
su_daemon_handler(client, &cred);
|
su_daemon_handler(client, &cred);
|
||||||
@ -92,7 +92,7 @@ static void handle_request_sync(int client, int code) {
|
|||||||
setup_logfile(true);
|
setup_logfile(true);
|
||||||
break;
|
break;
|
||||||
case STOP_DAEMON:
|
case STOP_DAEMON:
|
||||||
magiskhide_handler(-1, nullptr);
|
denylist_handler(-1, nullptr);
|
||||||
write_int(client, 0);
|
write_int(client, 0);
|
||||||
// Terminate the daemon!
|
// Terminate the daemon!
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -124,7 +124,7 @@ static void handle_request(int client) {
|
|||||||
case BOOT_COMPLETE:
|
case BOOT_COMPLETE:
|
||||||
case SQLITE_CMD:
|
case SQLITE_CMD:
|
||||||
case GET_PATH:
|
case GET_PATH:
|
||||||
case MAGISKHIDE:
|
case DENYLIST:
|
||||||
case STOP_DAEMON:
|
case STOP_DAEMON:
|
||||||
if (!is_root) {
|
if (!is_root) {
|
||||||
write_int(client, ROOT_REQUIRED);
|
write_int(client, ROOT_REQUIRED);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <socket.hpp>
|
#include <socket.hpp>
|
||||||
#include <utils.hpp>
|
#include <utils.hpp>
|
||||||
|
|
||||||
#define DB_VERSION 10
|
#define DB_VERSION 11
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ db_settings::db_settings() {
|
|||||||
data[ROOT_ACCESS] = ROOT_ACCESS_APPS_AND_ADB;
|
data[ROOT_ACCESS] = ROOT_ACCESS_APPS_AND_ADB;
|
||||||
data[SU_MULTIUSER_MODE] = MULTIUSER_MODE_OWNER_ONLY;
|
data[SU_MULTIUSER_MODE] = MULTIUSER_MODE_OWNER_ONLY;
|
||||||
data[SU_MNT_NS] = NAMESPACE_MODE_REQUESTER;
|
data[SU_MNT_NS] = NAMESPACE_MODE_REQUESTER;
|
||||||
data[HIDE_CONFIG] = false;
|
data[DENYLIST_CONFIG] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int db_settings::get_idx(string_view key) const {
|
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))",
|
"(key TEXT, value TEXT, PRIMARY KEY(key))",
|
||||||
nullptr, nullptr, &err);
|
nullptr, nullptr, &err);
|
||||||
err_ret(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 */
|
/* Directly jump to version 6 */
|
||||||
ver = 6;
|
ver = 6;
|
||||||
upgrade = true;
|
upgrade = true;
|
||||||
@ -229,6 +223,17 @@ static char *open_and_init_db(sqlite3 *&db) {
|
|||||||
ver = 10;
|
ver = 10;
|
||||||
upgrade = true;
|
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) {
|
if (upgrade) {
|
||||||
// Set version
|
// Set version
|
||||||
|
@ -38,6 +38,7 @@ Advanced Options (Internal APIs):
|
|||||||
--clone SRC DEST clone SRC to DEST
|
--clone SRC DEST clone SRC to DEST
|
||||||
--sqlite SQL exec SQL commands to Magisk database
|
--sqlite SQL exec SQL commands to Magisk database
|
||||||
--path print Magisk tmpfs mount path
|
--path print Magisk tmpfs mount path
|
||||||
|
--denylist ARGS denylist config CLI
|
||||||
|
|
||||||
Available applets:
|
Available applets:
|
||||||
)EOF");
|
)EOF");
|
||||||
@ -101,7 +102,9 @@ int magisk_main(int argc, char *argv[]) {
|
|||||||
int fd = connect_daemon(true);
|
int fd = connect_daemon(true);
|
||||||
write_int(fd, BOOT_COMPLETE);
|
write_int(fd, BOOT_COMPLETE);
|
||||||
return read_int(fd);
|
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();
|
int fd = connect_daemon();
|
||||||
write_int(fd, SQLITE_CMD);
|
write_int(fd, SQLITE_CMD);
|
||||||
write_string(fd, argv[2]);
|
write_string(fd, argv[2]);
|
||||||
|
154
native/jni/deny/cli.cpp
Normal file
154
native/jni/deny/cli.cpp
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
|
||||||
|
#include <utils.hpp>
|
||||||
|
|
||||||
|
#include "deny.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
[[noreturn]] static void usage() {
|
||||||
|
fprintf(stderr,
|
||||||
|
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 denylist_handler(int client, ucred *cred) {
|
||||||
|
if (client < 0) {
|
||||||
|
revert_unmount();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int req = read_int(client);
|
||||||
|
int res = DAEMON_ERROR;
|
||||||
|
|
||||||
|
switch (req) {
|
||||||
|
case DISABLE_DENY:
|
||||||
|
case ADD_LIST:
|
||||||
|
case RM_LIST:
|
||||||
|
case LS_LIST:
|
||||||
|
if (!deny_enforced()) {
|
||||||
|
write_int(client, DENY_NOT_ENFORCED);
|
||||||
|
close(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (req) {
|
||||||
|
case ENFORCE_DENY:
|
||||||
|
res = enable_hide();
|
||||||
|
break;
|
||||||
|
case DISABLE_DENY:
|
||||||
|
res = disable_deny();
|
||||||
|
break;
|
||||||
|
case ADD_LIST:
|
||||||
|
res = add_list(client);
|
||||||
|
break;
|
||||||
|
case RM_LIST:
|
||||||
|
res = rm_list(client);
|
||||||
|
break;
|
||||||
|
case LS_LIST:
|
||||||
|
ls_list(client);
|
||||||
|
return;
|
||||||
|
case DENY_STATUS:
|
||||||
|
res = deny_enforced() ? DENY_IS_ENFORCED : DENY_NOT_ENFORCED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
write_int(client, res);
|
||||||
|
close(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
int denylist_cli(int argc, char **argv) {
|
||||||
|
if (argc < 2)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
int req;
|
||||||
|
if (argv[1] == "enable"sv)
|
||||||
|
req = ENFORCE_DENY;
|
||||||
|
else if (argv[1] == "disable"sv)
|
||||||
|
req = DISABLE_DENY;
|
||||||
|
else if (argv[1] == "add"sv)
|
||||||
|
req = ADD_LIST;
|
||||||
|
else if (argv[1] == "rm"sv)
|
||||||
|
req = RM_LIST;
|
||||||
|
else if (argv[1] == "ls"sv)
|
||||||
|
req = LS_LIST;
|
||||||
|
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);
|
||||||
|
revert_unmount();
|
||||||
|
execvp(argv[2], argv + 2);
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request
|
||||||
|
int fd = connect_daemon();
|
||||||
|
write_int(fd, DENYLIST);
|
||||||
|
write_int(fd, req);
|
||||||
|
if (req == ADD_LIST || req == RM_LIST) {
|
||||||
|
write_string(fd, argv[2]);
|
||||||
|
write_string(fd, argv[3] ? argv[3] : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get response
|
||||||
|
int code = read_int(fd);
|
||||||
|
switch (code) {
|
||||||
|
case DAEMON_SUCCESS:
|
||||||
|
break;
|
||||||
|
case DENY_NOT_ENFORCED:
|
||||||
|
fprintf(stderr, "Denylist is not enforced\n");
|
||||||
|
goto return_code;
|
||||||
|
case DENY_IS_ENFORCED:
|
||||||
|
fprintf(stderr, "Denylist is enforced\n");
|
||||||
|
goto return_code;
|
||||||
|
case DENYLIST_ITEM_EXIST:
|
||||||
|
fprintf(stderr, "Target already exists in denylist\n");
|
||||||
|
goto return_code;
|
||||||
|
case DENYLIST_ITEM_NOT_EXIST:
|
||||||
|
fprintf(stderr, "Target does not exist in denylist\n");
|
||||||
|
goto return_code;
|
||||||
|
case DENY_NO_NS:
|
||||||
|
fprintf(stderr, "The kernel does not support mount namespace\n");
|
||||||
|
goto return_code;
|
||||||
|
case DENYLIST_INVALID_PKG:
|
||||||
|
fprintf(stderr, "Invalid package / process name\n");
|
||||||
|
goto return_code;
|
||||||
|
case ROOT_REQUIRED:
|
||||||
|
fprintf(stderr, "Root is required for this operation\n");
|
||||||
|
goto return_code;
|
||||||
|
case DAEMON_ERROR:
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Daemon error\n");
|
||||||
|
return DAEMON_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req == LS_LIST) {
|
||||||
|
string res;
|
||||||
|
for (;;) {
|
||||||
|
read_string(fd, res);
|
||||||
|
if (res.empty())
|
||||||
|
break;
|
||||||
|
printf("%s\n", res.data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return_code:
|
||||||
|
return req == DENY_STATUS ? (code == DENY_IS_ENFORCED ? 0 : 1) : code != DAEMON_SUCCESS;
|
||||||
|
}
|
43
native/jni/deny/deny.hpp
Normal file
43
native/jni/deny/deny.hpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <string_view>
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include <daemon.hpp>
|
||||||
|
|
||||||
|
#define ISOLATED_MAGIC "isolated"
|
||||||
|
|
||||||
|
// CLI entries
|
||||||
|
int enable_hide();
|
||||||
|
int disable_deny();
|
||||||
|
int add_list(int client);
|
||||||
|
int rm_list(int client);
|
||||||
|
void ls_list(int client);
|
||||||
|
|
||||||
|
// Utility functions
|
||||||
|
bool deny_enforced();
|
||||||
|
bool is_deny_target(int uid, std::string_view process);
|
||||||
|
|
||||||
|
// Revert
|
||||||
|
void revert_daemon(int pid, int client);
|
||||||
|
void revert_unmount(int pid = -1);
|
||||||
|
|
||||||
|
enum : int {
|
||||||
|
ENFORCE_DENY,
|
||||||
|
DISABLE_DENY,
|
||||||
|
ADD_LIST,
|
||||||
|
RM_LIST,
|
||||||
|
LS_LIST,
|
||||||
|
DENY_STATUS,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum : int {
|
||||||
|
DENY_IS_ENFORCED = DAEMON_LAST + 1,
|
||||||
|
DENY_NOT_ENFORCED,
|
||||||
|
DENYLIST_ITEM_EXIST,
|
||||||
|
DENYLIST_ITEM_NOT_EXIST,
|
||||||
|
DENYLIST_INVALID_PKG,
|
||||||
|
DENY_NO_NS,
|
||||||
|
};
|
@ -5,18 +5,18 @@
|
|||||||
#include <selinux.hpp>
|
#include <selinux.hpp>
|
||||||
#include <resetprop.hpp>
|
#include <resetprop.hpp>
|
||||||
|
|
||||||
#include "magiskhide.hpp"
|
#include "deny.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void lazy_unmount(const char* mountpoint) {
|
static void lazy_unmount(const char* mountpoint) {
|
||||||
if (umount2(mountpoint, MNT_DETACH) != -1)
|
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) {
|
if (fork_dont_care() == 0) {
|
||||||
hide_unmount(pid);
|
revert_unmount(pid);
|
||||||
write_int(client, 0);
|
write_int(client, 0);
|
||||||
_exit(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))
|
#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 (pid > 0) {
|
||||||
if (switch_mnt_ns(pid))
|
if (switch_mnt_ns(pid))
|
||||||
return;
|
return;
|
||||||
LOGD("hide: handling PID=[%d]\n", pid);
|
LOGD("denylist: handling PID=[%d]\n", pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<string> targets;
|
vector<string> targets;
|
@ -9,17 +9,17 @@
|
|||||||
#include <utils.hpp>
|
#include <utils.hpp>
|
||||||
#include <db.hpp>
|
#include <db.hpp>
|
||||||
|
|
||||||
#include "magiskhide.hpp"
|
#include "deny.hpp"
|
||||||
|
|
||||||
using namespace std;
|
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 */
|
static map<int, vector<string_view>> *uid_proc_map; /* uid -> list of process */
|
||||||
|
|
||||||
// Locks the variables above
|
// 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() {
|
static void rebuild_uid_map() {
|
||||||
uid_proc_map->clear();
|
uid_proc_map->clear();
|
||||||
@ -34,7 +34,7 @@ static void rebuild_uid_map() {
|
|||||||
data_path += '/';
|
data_path += '/';
|
||||||
size_t user_len = data_path.length();
|
size_t user_len = data_path.length();
|
||||||
struct stat st;
|
struct stat st;
|
||||||
for (const auto &hide : *hide_set) {
|
for (const auto &hide : *deny_set) {
|
||||||
if (hide.first == ISOLATED_MAGIC) {
|
if (hide.first == ISOLATED_MAGIC) {
|
||||||
if (!first_iter) continue;
|
if (!first_iter) continue;
|
||||||
// Setup isolated processes
|
// Setup isolated processes
|
||||||
@ -72,7 +72,7 @@ static bool proc_name_match(int pid, const char *name) {
|
|||||||
if (auto fp = open_file(buf, "re")) {
|
if (auto fp = open_file(buf, "re")) {
|
||||||
fgets(buf, sizeof(buf), fp.get());
|
fgets(buf, sizeof(buf), fp.get());
|
||||||
if (str_op(buf, name)) {
|
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;
|
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) {
|
static void add_hide_set(const char *pkg, const char *proc) {
|
||||||
LOGI("hide_list add: [%s/%s]\n", pkg, proc);
|
LOGI("denylist add: [%s/%s]\n", pkg, proc);
|
||||||
hide_set->emplace(pkg, proc);
|
deny_set->emplace(pkg, proc);
|
||||||
if (strcmp(pkg, ISOLATED_MAGIC) == 0) {
|
if (strcmp(pkg, ISOLATED_MAGIC) == 0) {
|
||||||
// Kill all matching isolated processes
|
// Kill all matching isolated processes
|
||||||
kill_process<&str_starts>(proc, true);
|
kill_process<&str_starts>(proc, true);
|
||||||
@ -144,14 +144,14 @@ static int add_list(const char *pkg, const char *proc) {
|
|||||||
proc = pkg;
|
proc = pkg;
|
||||||
|
|
||||||
if (!validate(pkg, proc))
|
if (!validate(pkg, proc))
|
||||||
return HIDE_INVALID_PKG;
|
return DENYLIST_INVALID_PKG;
|
||||||
|
|
||||||
{
|
{
|
||||||
// Critical region
|
// Critical region
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
for (const auto &hide : *hide_set)
|
for (const auto &hide : *deny_set)
|
||||||
if (hide.first == pkg && hide.second == proc)
|
if (hide.first == pkg && hide.second == proc)
|
||||||
return HIDE_ITEM_EXIST;
|
return DENYLIST_ITEM_EXIST;
|
||||||
add_hide_set(pkg, proc);
|
add_hide_set(pkg, proc);
|
||||||
rebuild_uid_map();
|
rebuild_uid_map();
|
||||||
}
|
}
|
||||||
@ -159,7 +159,7 @@ static int add_list(const char *pkg, const char *proc) {
|
|||||||
// Add to database
|
// Add to database
|
||||||
char sql[4096];
|
char sql[4096];
|
||||||
snprintf(sql, sizeof(sql),
|
snprintf(sql, sizeof(sql),
|
||||||
"INSERT INTO hidelist (package_name, process) VALUES('%s', '%s')", pkg, proc);
|
"INSERT INTO denylist (package_name, process) VALUES('%s', '%s')", pkg, proc);
|
||||||
char *err = db_exec(sql);
|
char *err = db_exec(sql);
|
||||||
db_err_cmd(err, return DAEMON_ERROR);
|
db_err_cmd(err, return DAEMON_ERROR);
|
||||||
return DAEMON_SUCCESS;
|
return DAEMON_SUCCESS;
|
||||||
@ -175,27 +175,27 @@ static int rm_list(const char *pkg, const char *proc) {
|
|||||||
bool remove = false;
|
bool remove = false;
|
||||||
{
|
{
|
||||||
// Critical region
|
// Critical region
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
for (auto it = hide_set->begin(); it != hide_set->end();) {
|
for (auto it = deny_set->begin(); it != deny_set->end();) {
|
||||||
if (it->first == pkg && (proc[0] == '\0' || it->second == proc)) {
|
if (it->first == pkg && (proc[0] == '\0' || it->second == proc)) {
|
||||||
remove = true;
|
remove = true;
|
||||||
LOGI("hide_list rm: [%s/%s]\n", it->first.data(), it->second.data());
|
LOGI("denylist rm: [%s/%s]\n", it->first.data(), it->second.data());
|
||||||
it = hide_set->erase(it);
|
it = deny_set->erase(it);
|
||||||
} else {
|
} else {
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!remove)
|
if (!remove)
|
||||||
return HIDE_ITEM_NOT_EXIST;
|
return DENYLIST_ITEM_NOT_EXIST;
|
||||||
rebuild_uid_map();
|
rebuild_uid_map();
|
||||||
}
|
}
|
||||||
|
|
||||||
char sql[4096];
|
char sql[4096];
|
||||||
if (proc[0] == '\0')
|
if (proc[0] == '\0')
|
||||||
snprintf(sql, sizeof(sql), "DELETE FROM hidelist WHERE package_name='%s'", pkg);
|
snprintf(sql, sizeof(sql), "DELETE FROM denylist WHERE package_name='%s'", pkg);
|
||||||
else
|
else
|
||||||
snprintf(sql, sizeof(sql),
|
snprintf(sql, sizeof(sql),
|
||||||
"DELETE FROM hidelist WHERE package_name='%s' AND process='%s'", pkg, proc);
|
"DELETE FROM denylist WHERE package_name='%s' AND process='%s'", pkg, proc);
|
||||||
char *err = db_exec(sql);
|
char *err = db_exec(sql);
|
||||||
db_err_cmd(err, return DAEMON_ERROR);
|
db_err_cmd(err, return DAEMON_ERROR);
|
||||||
return DAEMON_SUCCESS;
|
return DAEMON_SUCCESS;
|
||||||
@ -215,9 +215,9 @@ static bool str_ends_safe(string_view s, string_view ss) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool init_list() {
|
static bool init_list() {
|
||||||
LOGD("hide: initialize\n");
|
LOGD("denylist: initialize\n");
|
||||||
|
|
||||||
char *err = db_exec("SELECT * FROM hidelist", [](db_row &row) -> bool {
|
char *err = db_exec("SELECT * FROM denylist", [](db_row &row) -> bool {
|
||||||
add_hide_set(row["package_name"].data(), row["process"].data());
|
add_hide_set(row["package_name"].data(), row["process"].data());
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@ -236,8 +236,8 @@ static bool init_list() {
|
|||||||
void ls_list(int client) {
|
void ls_list(int client) {
|
||||||
write_int(client, DAEMON_SUCCESS);
|
write_int(client, DAEMON_SUCCESS);
|
||||||
{
|
{
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
for (const auto &hide : *hide_set) {
|
for (const auto &hide : *deny_set) {
|
||||||
write_int(client, hide.first.size() + hide.second.size() + 1);
|
write_int(client, hide.first.size() + hide.second.size() + 1);
|
||||||
xwrite(client, hide.first.data(), hide.first.size());
|
xwrite(client, hide.first.data(), hide.first.size());
|
||||||
xwrite(client, "|", 1);
|
xwrite(client, "|", 1);
|
||||||
@ -251,65 +251,65 @@ void ls_list(int client) {
|
|||||||
static void update_hide_config() {
|
static void update_hide_config() {
|
||||||
char sql[64];
|
char sql[64];
|
||||||
sprintf(sql, "REPLACE INTO settings (key,value) VALUES('%s',%d)",
|
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);
|
char *err = db_exec(sql);
|
||||||
db_err(err);
|
db_err(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int enable_hide() {
|
int enable_hide() {
|
||||||
if (hide_state)
|
if (enforcement_status)
|
||||||
return HIDE_IS_ENABLED;
|
return DENY_IS_ENFORCED;
|
||||||
|
|
||||||
if (access("/proc/self/ns/mnt", F_OK) != 0)
|
if (access("/proc/self/ns/mnt", F_OK) != 0)
|
||||||
return HIDE_NO_NS;
|
return DENY_NO_NS;
|
||||||
|
|
||||||
if (procfp == nullptr && (procfp = opendir("/proc")) == nullptr)
|
if (procfp == nullptr && (procfp = opendir("/proc")) == nullptr)
|
||||||
return DAEMON_ERROR;
|
return DAEMON_ERROR;
|
||||||
|
|
||||||
LOGI("* Enable MagiskHide\n");
|
LOGI("* Enforce DenyList\n");
|
||||||
|
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
default_new(hide_set);
|
default_new(deny_set);
|
||||||
default_new(uid_proc_map);
|
default_new(uid_proc_map);
|
||||||
|
|
||||||
// Initialize the hide list
|
// Initialize the hide list
|
||||||
if (!init_list())
|
if (!init_list())
|
||||||
return DAEMON_ERROR;
|
return DAEMON_ERROR;
|
||||||
|
|
||||||
hide_state = true;
|
enforcement_status = true;
|
||||||
update_hide_config();
|
update_hide_config();
|
||||||
|
|
||||||
rebuild_uid_map();
|
rebuild_uid_map();
|
||||||
return DAEMON_SUCCESS;
|
return DAEMON_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int disable_hide() {
|
int disable_deny() {
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
|
|
||||||
if (hide_state) {
|
if (enforcement_status) {
|
||||||
LOGI("* Disable MagiskHide\n");
|
LOGI("* Disable DenyList\n");
|
||||||
delete uid_proc_map;
|
delete uid_proc_map;
|
||||||
delete hide_set;
|
delete deny_set;
|
||||||
uid_proc_map = nullptr;
|
uid_proc_map = nullptr;
|
||||||
hide_set = nullptr;
|
deny_set = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
hide_state = false;
|
enforcement_status = false;
|
||||||
update_hide_config();
|
update_hide_config();
|
||||||
return DAEMON_SUCCESS;
|
return DAEMON_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_enable_hide() {
|
void check_enforce_denylist() {
|
||||||
if (!hide_state) {
|
if (!enforcement_status) {
|
||||||
db_settings dbs;
|
db_settings dbs;
|
||||||
get_db_settings(dbs, HIDE_CONFIG);
|
get_db_settings(dbs, DENYLIST_CONFIG);
|
||||||
if (dbs[HIDE_CONFIG])
|
if (dbs[DENYLIST_CONFIG])
|
||||||
enable_hide();
|
enable_hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_hide_target(int uid, string_view process) {
|
bool is_deny_target(int uid, string_view process) {
|
||||||
mutex_guard lock(hide_data_lock);
|
mutex_guard lock(data_lock);
|
||||||
|
|
||||||
if (uid % 100000 >= 90000) {
|
if (uid % 100000 >= 90000) {
|
||||||
// Isolated processes
|
// Isolated processes
|
||||||
@ -334,6 +334,6 @@ bool is_hide_target(int uid, string_view process) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hide_enabled() {
|
bool deny_enforced() {
|
||||||
return hide_state;
|
return enforcement_status;
|
||||||
}
|
}
|
@ -24,7 +24,7 @@ enum : int {
|
|||||||
POST_FS_DATA,
|
POST_FS_DATA,
|
||||||
LATE_START,
|
LATE_START,
|
||||||
BOOT_COMPLETE,
|
BOOT_COMPLETE,
|
||||||
MAGISKHIDE,
|
DENYLIST,
|
||||||
SQLITE_CMD,
|
SQLITE_CMD,
|
||||||
REMOVE_MODULES,
|
REMOVE_MODULES,
|
||||||
ZYGISK_REQUEST,
|
ZYGISK_REQUEST,
|
||||||
@ -58,10 +58,11 @@ void android_logging();
|
|||||||
void post_fs_data(int client);
|
void post_fs_data(int client);
|
||||||
void late_start(int client);
|
void late_start(int client);
|
||||||
void boot_complete(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 su_daemon_handler(int client, ucred *credential);
|
||||||
void zygisk_handler(int client, ucred *cred);
|
void zygisk_handler(int client, ucred *cred);
|
||||||
|
|
||||||
// MagiskHide
|
// Denylist
|
||||||
void check_enable_hide();
|
void check_enforce_denylist();
|
||||||
int disable_hide();
|
int disable_deny();
|
||||||
|
int denylist_cli(int argc, char **argv);
|
||||||
|
@ -38,7 +38,7 @@ constexpr const char *DB_SETTING_KEYS[] = {
|
|||||||
"root_access",
|
"root_access",
|
||||||
"multiuser_mode",
|
"multiuser_mode",
|
||||||
"mnt_ns",
|
"mnt_ns",
|
||||||
"magiskhide"
|
"denylist"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Settings key indices
|
// Settings key indices
|
||||||
@ -46,7 +46,7 @@ enum {
|
|||||||
ROOT_ACCESS = 0,
|
ROOT_ACCESS = 0,
|
||||||
SU_MULTIUSER_MODE,
|
SU_MULTIUSER_MODE,
|
||||||
SU_MNT_NS,
|
SU_MNT_NS,
|
||||||
HIDE_CONFIG
|
DENYLIST_CONFIG
|
||||||
};
|
};
|
||||||
|
|
||||||
// Values for root_access
|
// Values for root_access
|
||||||
|
@ -27,7 +27,7 @@ extern std::string MAGISKTMP;
|
|||||||
#define SHELLPTS INTLROOT "/pts"
|
#define SHELLPTS INTLROOT "/pts"
|
||||||
#define ROOTMNT ROOTOVL "/.mount_list"
|
#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 };
|
constexpr const char *init_applet[] = { "magiskpolicy", "supolicy", nullptr };
|
||||||
|
|
||||||
#define POST_FS_DATA_WAIT_TIME 40
|
#define POST_FS_DATA_WAIT_TIME 40
|
||||||
@ -38,7 +38,6 @@ extern int SDK_INT;
|
|||||||
|
|
||||||
// Multi-call entrypoints
|
// Multi-call entrypoints
|
||||||
int magisk_main(int argc, char *argv[]);
|
int magisk_main(int argc, char *argv[]);
|
||||||
int magiskhide_main(int argc, char *argv[]);
|
|
||||||
int magiskpolicy_main(int argc, char *argv[]);
|
int magiskpolicy_main(int argc, char *argv[]);
|
||||||
int su_client_main(int argc, char *argv[]);
|
int su_client_main(int argc, char *argv[]);
|
||||||
int resetprop_main(int argc, char *argv[]);
|
int resetprop_main(int argc, char *argv[]);
|
||||||
|
@ -1,158 +0,0 @@
|
|||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/mount.h>
|
|
||||||
|
|
||||||
#include <utils.hpp>
|
|
||||||
|
|
||||||
#include "magiskhide.hpp"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
[[noreturn]] static void usage(char *arg0) {
|
|
||||||
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);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void magiskhide_handler(int client, ucred *cred) {
|
|
||||||
if (client < 0) {
|
|
||||||
hide_unmount();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int req = read_int(client);
|
|
||||||
int res = DAEMON_ERROR;
|
|
||||||
|
|
||||||
switch (req) {
|
|
||||||
case DISABLE_HIDE:
|
|
||||||
case ADD_LIST:
|
|
||||||
case RM_LIST:
|
|
||||||
case LS_LIST:
|
|
||||||
if (!hide_enabled()) {
|
|
||||||
write_int(client, HIDE_NOT_ENABLED);
|
|
||||||
close(client);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (req) {
|
|
||||||
case ENABLE_HIDE:
|
|
||||||
res = enable_hide();
|
|
||||||
break;
|
|
||||||
case DISABLE_HIDE:
|
|
||||||
res = disable_hide();
|
|
||||||
break;
|
|
||||||
case ADD_LIST:
|
|
||||||
res = add_list(client);
|
|
||||||
break;
|
|
||||||
case RM_LIST:
|
|
||||||
res = rm_list(client);
|
|
||||||
break;
|
|
||||||
case LS_LIST:
|
|
||||||
ls_list(client);
|
|
||||||
return;
|
|
||||||
case HIDE_STATUS:
|
|
||||||
res = hide_enabled() ? HIDE_IS_ENABLED : HIDE_NOT_ENABLED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
write_int(client, res);
|
|
||||||
close(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
int magiskhide_main(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;
|
|
||||||
|
|
||||||
int req;
|
|
||||||
if (opt == "enable"sv)
|
|
||||||
req = ENABLE_HIDE;
|
|
||||||
else if (opt == "disable"sv)
|
|
||||||
req = DISABLE_HIDE;
|
|
||||||
else if (opt == "add"sv)
|
|
||||||
req = ADD_LIST;
|
|
||||||
else if (opt == "rm"sv)
|
|
||||||
req = RM_LIST;
|
|
||||||
else if (opt == "ls"sv)
|
|
||||||
req = LS_LIST;
|
|
||||||
else if (opt == "status"sv)
|
|
||||||
req = HIDE_STATUS;
|
|
||||||
else if (opt == "exec"sv && argc > 2) {
|
|
||||||
xunshare(CLONE_NEWNS);
|
|
||||||
xmount(nullptr, "/", nullptr, MS_PRIVATE | MS_REC, nullptr);
|
|
||||||
hide_unmount();
|
|
||||||
execvp(argv[2], argv + 2);
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
usage(argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send request
|
|
||||||
int fd = connect_daemon();
|
|
||||||
write_int(fd, MAGISKHIDE);
|
|
||||||
write_int(fd, req);
|
|
||||||
if (req == ADD_LIST || req == RM_LIST) {
|
|
||||||
write_string(fd, argv[2]);
|
|
||||||
write_string(fd, argv[3] ? argv[3] : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get response
|
|
||||||
int code = read_int(fd);
|
|
||||||
switch (code) {
|
|
||||||
case DAEMON_SUCCESS:
|
|
||||||
break;
|
|
||||||
case HIDE_NOT_ENABLED:
|
|
||||||
fprintf(stderr, "MagiskHide is not enabled\n");
|
|
||||||
goto return_code;
|
|
||||||
case HIDE_IS_ENABLED:
|
|
||||||
fprintf(stderr, "MagiskHide is enabled\n");
|
|
||||||
goto return_code;
|
|
||||||
case HIDE_ITEM_EXIST:
|
|
||||||
fprintf(stderr, "Target already exists in hide list\n");
|
|
||||||
goto return_code;
|
|
||||||
case HIDE_ITEM_NOT_EXIST:
|
|
||||||
fprintf(stderr, "Target does not exist in hide list\n");
|
|
||||||
goto return_code;
|
|
||||||
case HIDE_NO_NS:
|
|
||||||
fprintf(stderr, "Your kernel doesn't support mount namespace\n");
|
|
||||||
goto return_code;
|
|
||||||
case HIDE_INVALID_PKG:
|
|
||||||
fprintf(stderr, "Invalid package / process name\n");
|
|
||||||
goto return_code;
|
|
||||||
case ROOT_REQUIRED:
|
|
||||||
fprintf(stderr, "Root is required for this operation\n");
|
|
||||||
goto return_code;
|
|
||||||
case DAEMON_ERROR:
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Daemon error\n");
|
|
||||||
return DAEMON_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req == LS_LIST) {
|
|
||||||
string res;
|
|
||||||
for (;;) {
|
|
||||||
read_string(fd, res);
|
|
||||||
if (res.empty())
|
|
||||||
break;
|
|
||||||
printf("%s\n", res.data());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return_code:
|
|
||||||
return req == HIDE_STATUS ? (code == HIDE_IS_ENABLED ? 0 : 1) : code != DAEMON_SUCCESS;
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <string_view>
|
|
||||||
#include <functional>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <daemon.hpp>
|
|
||||||
|
|
||||||
#define ISOLATED_MAGIC "isolated"
|
|
||||||
|
|
||||||
// CLI entries
|
|
||||||
int enable_hide();
|
|
||||||
int disable_hide();
|
|
||||||
int add_list(int client);
|
|
||||||
int rm_list(int client);
|
|
||||||
void ls_list(int client);
|
|
||||||
|
|
||||||
// Utility functions
|
|
||||||
bool hide_enabled();
|
|
||||||
bool is_hide_target(int uid, std::string_view process);
|
|
||||||
|
|
||||||
// Hide policies
|
|
||||||
void hide_daemon(int pid, int client);
|
|
||||||
void hide_unmount(int pid = -1);
|
|
||||||
|
|
||||||
enum {
|
|
||||||
ENABLE_HIDE,
|
|
||||||
DISABLE_HIDE,
|
|
||||||
ADD_LIST,
|
|
||||||
RM_LIST,
|
|
||||||
LS_LIST,
|
|
||||||
HIDE_STATUS,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
HIDE_IS_ENABLED = DAEMON_LAST,
|
|
||||||
HIDE_NOT_ENABLED,
|
|
||||||
HIDE_ITEM_EXIST,
|
|
||||||
HIDE_ITEM_NOT_EXIST,
|
|
||||||
HIDE_NO_NS,
|
|
||||||
HIDE_INVALID_PKG
|
|
||||||
};
|
|
@ -10,7 +10,7 @@
|
|||||||
#include <magisk.hpp>
|
#include <magisk.hpp>
|
||||||
|
|
||||||
#include "inject.hpp"
|
#include "inject.hpp"
|
||||||
#include "../magiskhide/magiskhide.hpp"
|
#include "../deny/deny.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -255,22 +255,22 @@ static void setup_files(int client, ucred *cred) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void check_denylist(int client) {
|
static void check_denylist(int client) {
|
||||||
if (!hide_enabled()) {
|
if (!deny_enforced()) {
|
||||||
write_int(client, HIDE_NOT_ENABLED);
|
write_int(client, DENY_NOT_ENFORCED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
write_int(client, 0);
|
write_int(client, 0);
|
||||||
int uid = read_int(client);
|
int uid = read_int(client);
|
||||||
string process = read_string(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) {
|
static void do_unmount(int client, ucred *cred) {
|
||||||
LOGD("zygisk: cleanup mount namespace for pid=[%d]\n", cred->pid);
|
if (deny_enforced()) {
|
||||||
if (hide_enabled()) {
|
LOGD("zygisk: cleanup mount namespace for pid=[%d]\n", cred->pid);
|
||||||
hide_daemon(cred->pid, client);
|
revert_daemon(cred->pid, client);
|
||||||
} else {
|
} else {
|
||||||
write_int(client, HIDE_NOT_ENABLED);
|
write_int(client, DENY_NOT_ENFORCED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user