mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-20 08:57:33 +00:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2c092ffdef | ||
![]() |
66406227d6 | ||
![]() |
a11d25bb44 | ||
![]() |
2e58d902b7 | ||
![]() |
237794b05c | ||
![]() |
563a587882 | ||
![]() |
24505cd111 | ||
![]() |
0c681cdab4 | ||
![]() |
13ef3058c6 | ||
![]() |
50b159b43d | ||
![]() |
8c6c328730 | ||
![]() |
c9812ddf08 | ||
![]() |
2ef0449c2c | ||
![]() |
5edc750c47 | ||
![]() |
2f0e396d7f | ||
![]() |
000a163beb | ||
![]() |
80dd37ee31 | ||
![]() |
e0b5645064 | ||
![]() |
e51aacb0b7 | ||
![]() |
2d6af94aa0 |
@@ -19,7 +19,7 @@ Some highlight features:
|
||||
[Github](https://github.com/topjohnwu/Magisk/) is the only source where you can get official Magisk information and downloads.
|
||||
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v24.1)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v24.1)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v24.2)
|
||||
[](https://raw.githubusercontent.com/topjohnwu/magisk-files/canary/app-debug.apk)
|
||||
|
||||
## Useful Links
|
||||
|
@@ -86,7 +86,7 @@ dependencies {
|
||||
implementation("${bindingAdapter}:${vBAdapt}")
|
||||
implementation("${bindingAdapter}-recyclerview:${vBAdapt}")
|
||||
|
||||
val vLibsu = "4.0.0"
|
||||
val vLibsu = "4.0.2"
|
||||
implementation("com.github.topjohnwu.libsu:core:${vLibsu}")
|
||||
implementation("com.github.topjohnwu.libsu:io:${vLibsu}")
|
||||
implementation("com.github.topjohnwu.libsu:service:${vLibsu}")
|
||||
|
@@ -14,6 +14,7 @@ import com.topjohnwu.magisk.core.Provider
|
||||
import com.topjohnwu.magisk.core.utils.AXML
|
||||
import com.topjohnwu.magisk.core.utils.Keygen
|
||||
import com.topjohnwu.magisk.di.ServiceLocator
|
||||
import com.topjohnwu.magisk.ktx.await
|
||||
import com.topjohnwu.magisk.ktx.writeTo
|
||||
import com.topjohnwu.magisk.signing.JarMap
|
||||
import com.topjohnwu.magisk.signing.SignApk
|
||||
@@ -25,6 +26,7 @@ import kotlinx.coroutines.Runnable
|
||||
import kotlinx.coroutines.withContext
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.OutputStream
|
||||
import java.security.SecureRandom
|
||||
@@ -115,18 +117,23 @@ object HideAPK {
|
||||
}
|
||||
|
||||
// Generate a new random package name and signature
|
||||
val repack = File(activity.cacheDir, "patched.apk")
|
||||
val pkg = genPackageName()
|
||||
Config.keyStoreRaw = ""
|
||||
|
||||
if (!patch(activity, stub, FileOutputStream(repack), pkg, label))
|
||||
return false
|
||||
|
||||
// Install and auto launch app
|
||||
val session = APKInstall.startSession(activity, pkg, onFailure) {
|
||||
launchApp(activity, pkg)
|
||||
}
|
||||
|
||||
val cmd = "adb_pm_install $repack ${activity.applicationInfo.uid}"
|
||||
if (Shell.su(cmd).exec().isSuccess) return true
|
||||
|
||||
try {
|
||||
val success = session.openStream(activity).use {
|
||||
patch(activity, stub, it, pkg, label)
|
||||
}
|
||||
if (!success) return false
|
||||
session.install(activity, repack)
|
||||
} catch (e: IOException) {
|
||||
Timber.e(e)
|
||||
return false
|
||||
@@ -170,6 +177,8 @@ object HideAPK {
|
||||
launchApp(activity, APPLICATION_ID)
|
||||
dialog.dismiss()
|
||||
}
|
||||
val cmd = "adb_pm_install $apk ${activity.applicationInfo.uid}"
|
||||
if (Shell.su(cmd).await().isSuccess) return
|
||||
val success = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
session.install(activity, apk)
|
||||
|
@@ -5,6 +5,8 @@ import android.view.View
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.arch.BaseFragment
|
||||
import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding
|
||||
import com.topjohnwu.magisk.databinding.RvItem
|
||||
import com.topjohnwu.magisk.databinding.adapterOf
|
||||
import com.topjohnwu.magisk.di.viewModel
|
||||
import rikka.recyclerview.addEdgeSpacing
|
||||
import rikka.recyclerview.addInvalidateItemDecorationsObserver
|
||||
@@ -26,6 +28,7 @@ class ModuleFragment : BaseFragment<FragmentModuleMd2Binding>() {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
binding.moduleList.apply {
|
||||
adapter = adapterOf<RvItem>()
|
||||
addEdgeSpacing(top = R.dimen.l_50, bottom = R.dimen.l1)
|
||||
addItemSpacing(R.dimen.l1, R.dimen.l_50, R.dimen.l1)
|
||||
fixEdgeEffect()
|
||||
|
@@ -8,7 +8,6 @@ import com.topjohnwu.magisk.core.Info
|
||||
import com.topjohnwu.magisk.core.model.module.LocalModule
|
||||
import com.topjohnwu.magisk.core.model.module.OnlineModule
|
||||
import com.topjohnwu.magisk.databinding.RvItem
|
||||
import com.topjohnwu.magisk.databinding.adapterOf
|
||||
import com.topjohnwu.magisk.databinding.diffListOf
|
||||
import com.topjohnwu.magisk.databinding.itemBindingOf
|
||||
import com.topjohnwu.magisk.events.SelectModuleEvent
|
||||
@@ -26,7 +25,6 @@ class ModuleViewModel : BaseViewModel() {
|
||||
|
||||
private val itemsInstalled = diffListOf<LocalModuleRvItem>()
|
||||
|
||||
val adapter = adapterOf<RvItem>()
|
||||
val items = MergeObservableList<RvItem>()
|
||||
val itemBinding = itemBindingOf<RvItem> {
|
||||
it.bindExtra(BR.viewModel, this)
|
||||
|
@@ -4,7 +4,9 @@ import android.os.Bundle
|
||||
import android.view.View
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.arch.BaseFragment
|
||||
import com.topjohnwu.magisk.databinding.AnyDiffRvItem
|
||||
import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding
|
||||
import com.topjohnwu.magisk.databinding.adapterOf
|
||||
import com.topjohnwu.magisk.di.viewModel
|
||||
import rikka.recyclerview.addEdgeSpacing
|
||||
import rikka.recyclerview.addItemSpacing
|
||||
@@ -24,6 +26,7 @@ class SuperuserFragment : BaseFragment<FragmentSuperuserMd2Binding>() {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
binding.superuserList.apply {
|
||||
adapter = adapterOf<AnyDiffRvItem>()
|
||||
addEdgeSpacing(top = R.dimen.l_50, bottom = R.dimen.l1)
|
||||
addItemSpacing(R.dimen.l1, R.dimen.l_50, R.dimen.l1)
|
||||
fixEdgeEffect()
|
||||
|
@@ -10,7 +10,6 @@ import com.topjohnwu.magisk.core.model.su.SuPolicy
|
||||
import com.topjohnwu.magisk.core.utils.BiometricHelper
|
||||
import com.topjohnwu.magisk.core.utils.currentLocale
|
||||
import com.topjohnwu.magisk.databinding.AnyDiffRvItem
|
||||
import com.topjohnwu.magisk.databinding.adapterOf
|
||||
import com.topjohnwu.magisk.databinding.diffListOf
|
||||
import com.topjohnwu.magisk.databinding.itemBindingOf
|
||||
import com.topjohnwu.magisk.events.SnackbarEvent
|
||||
@@ -33,7 +32,6 @@ class SuperuserViewModel(
|
||||
private val itemsPolicies = diffListOf<PolicyRvItem>()
|
||||
private val itemsHelpers = ObservableArrayList<TextItem>()
|
||||
|
||||
val adapter = adapterOf<AnyDiffRvItem>()
|
||||
val items = MergeObservableList<AnyDiffRvItem>()
|
||||
.insertList(itemsHelpers)
|
||||
.insertList(itemsPolicies)
|
||||
|
@@ -19,7 +19,6 @@
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/module_list"
|
||||
adapter="@{viewModel.adapter}"
|
||||
gone="@{viewModel.loading}"
|
||||
itemBinding="@{viewModel.itemBinding}"
|
||||
items="@{viewModel.items}"
|
||||
|
@@ -19,7 +19,6 @@
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/superuser_list"
|
||||
adapter="@{viewModel.adapter}"
|
||||
goneUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
||||
itemBinding="@{viewModel.itemBinding}"
|
||||
items="@{viewModel.items}"
|
||||
|
@@ -112,7 +112,6 @@
|
||||
<string name="suspend_text_zygisk">Module suspendu car %1$s n’est pas actif</string>
|
||||
<string name="zygisk_module_unloaded">Module Zygisk non chargé en raison d’une incompatibilité</string>
|
||||
|
||||
|
||||
<!--Settings -->
|
||||
<string name="settings_dark_mode_title">Mode du thème</string>
|
||||
<string name="settings_dark_mode_message">Choisissez le mode qui correspond le mieux à votre style !</string>
|
||||
@@ -191,9 +190,12 @@
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Mises à jour de Magisk</string>
|
||||
<string name="progress_channel">Notifications de progression</string>
|
||||
<string name="updated_channel">Mise à jour Terminée</string>
|
||||
<string name="download_complete">Téléchargement terminé</string>
|
||||
<string name="download_file_error">Erreur lors du téléchargement du fichier</string>
|
||||
<string name="magisk_update_title">Une mise à jour de Magisk est disponible !</string>
|
||||
<string name="updated_title">Magisk Mis à jour</string>
|
||||
<string name="updated_text">Appuyer pour ouvrir l’application</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">Oui</string>
|
||||
@@ -226,6 +228,7 @@
|
||||
<string name="unsupport_nonroot_stub_msg">Cette application ne peut continuer à fonctionner en étant masquée car l’accès en tant que super‑utilisateur a été perdu. Merci de restaurer l’APK originel.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">Permettre l’accès au stockage pour activer cette fonctionnalité</string>
|
||||
<string name="install_unknown_denied">Autoriser "installation d’applications inconnues" pour activer cette fonctionnalité</string>
|
||||
<string name="add_shortcut_title">Ajouter un raccourci à l’écran d’accueil</string>
|
||||
<string name="add_shortcut_msg">Après avoir masqué Magisk, son nom et son icône peuvent devenir difficiles à reconnaître. Voulez‑vous ajouter un joli raccourci vers l’écran d’accueil ?</string>
|
||||
<string name="app_not_found">Aucune application n’a été trouvée pour gérer cette action</string>
|
||||
|
@@ -8,6 +8,7 @@
|
||||
<string name="install">설치</string>
|
||||
<string name="section_home">홈</string>
|
||||
<string name="section_theme">테마</string>
|
||||
<string name="denylist">거부목록</string>
|
||||
|
||||
<!--Home-->
|
||||
<string name="no_connection">사용 가능한 연결 없음</string>
|
||||
@@ -32,6 +33,7 @@
|
||||
<!--Install-->
|
||||
<string name="keep_force_encryption">강제 암호화 유지</string>
|
||||
<string name="keep_dm_verity">AVB 2.0/dm-verity 유지</string>
|
||||
<string name="patch_vbmeta">부트 이미지에 vbmeta 패치</string>
|
||||
<string name="recovery_mode">리커버리 모드</string>
|
||||
<string name="install_options_title">옵션</string>
|
||||
<string name="install_method_title">설치 방법</string>
|
||||
@@ -79,7 +81,7 @@
|
||||
|
||||
<!--Logs-->
|
||||
<string name="log_data_none">로그가 없습니다. SU 권한을 필요로 하는 앱을 사용하십시오.</string>
|
||||
<string name="log_data_magisk_none">로그가 없습니다.</string>
|
||||
<string name="log_data_magisk_none">Magisk 로그가 없습니다.</string>
|
||||
<string name="menuSaveLog">로그 저장</string>
|
||||
<string name="menuClearLog">지금 로그 삭제</string>
|
||||
<string name="logs_cleared">로그 삭제 완료.</string>
|
||||
@@ -106,6 +108,9 @@
|
||||
<string name="module_state_restore">복구</string>
|
||||
<string name="module_action_install_external">저장소에서 설치</string>
|
||||
<string name="update_available">업데이트 가능</string>
|
||||
<string name="suspend_text_riru">%1$s 가 활성화 되어있기 때문에 모듈이 중단되었습니다</string>
|
||||
<string name="suspend_text_zygisk">%1$s 가 비활성화 되어있기 때문에 모듈이 중단되었습니다</string>
|
||||
<string name="zygisk_module_unloaded">호환성 문제로 인해 Zygisk 모듈이 로드되지 않았습니다.</string>
|
||||
|
||||
<!--Settings-->
|
||||
<string name="settings_dark_mode_title">테마 선택</string>
|
||||
@@ -130,6 +135,8 @@
|
||||
<string name="settings_update_custom_msg">사용자 지정 URL 입력</string>
|
||||
<string name="settings_zygisk_summary">zygote 데몬에서 Magisk 부분 실행</string>
|
||||
<string name="settings_denylist_title">DenyList 적용</string>
|
||||
<string name="settings_denylist_summary">DenyList의 프로세스는 Magisk의 모든 수정사항을 되돌립니다</string>
|
||||
<string name="settings_denylist_error">이 기능을 사용하려면 %1$s 활성화가 필요합니다</string>
|
||||
<string name="settings_denylist_config_title">DenyList 구성</string>
|
||||
<string name="settings_denylist_config_summary">denylist에 포함할 프로세스를 선택합니다.</string>
|
||||
<string name="settings_hosts_title">Systemless hosts</string>
|
||||
@@ -175,7 +182,7 @@
|
||||
<string name="mount_namespace_mode">이름공간 마운트 모드</string>
|
||||
<string name="settings_ns_global">전역 이름공간</string>
|
||||
<string name="settings_ns_requester">이름공간 상속</string>
|
||||
<string name="settings_ns_isolate">이름공간 고립</string>
|
||||
<string name="settings_ns_isolate">격리된 이름공간</string>
|
||||
<string name="global_summary">모든 루트 세션이 전역 마운트 이름공간을 사용합니다.</string>
|
||||
<string name="requester_summary">루트 세션은 요청자의 이름공간을 상속합니다.</string>
|
||||
<string name="isolate_summary">각각의 루트 세션은 자신만의 독립된 이름공간을 사용합니다.</string>
|
||||
@@ -183,19 +190,23 @@
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Magisk 업데이트</string>
|
||||
<string name="progress_channel">진행 상황</string>
|
||||
<string name="updated_channel">업데이트 완료</string>
|
||||
<string name="download_complete">다운로드 완료</string>
|
||||
<string name="download_file_error">파일 다운로드 오류</string>
|
||||
<string name="magisk_update_title">새 버전의 Magisk를 사용할 수 있습니다!</string>
|
||||
<string name="updated_title">업데이트 된 Magisk</string>
|
||||
<string name="updated_text">터치하여 앱 열기</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">예</string>
|
||||
<string name="no">아니오</string>
|
||||
<string name="repo_install_title">%1$s %2$s(%3$d) 설치</string>
|
||||
<string name="download">다운로드</string>
|
||||
<string name="reboot">다시 시작</string>
|
||||
<string name="release_notes">릴리즈 노트</string>
|
||||
<string name="flashing">플래싱 중…</string>
|
||||
<string name="done">완료!</string>
|
||||
<string name="failure">실패</string>
|
||||
<string name="failure">실패!</string>
|
||||
<string name="hide_app_title">Magisk 앱 숨기는 중…</string>
|
||||
<string name="open_link_failed_toast">링크를 열 수 있는 앱이 없습니다.</string>
|
||||
<string name="complete_uninstall">완전히 제거</string>
|
||||
@@ -209,10 +220,19 @@
|
||||
<string name="setup_msg">환경 설정 진행 중…</string>
|
||||
<string name="authenticate">인증</string>
|
||||
<string name="unsupport_magisk_title">지원되지 않는 Magisk 버전</string>
|
||||
<string name="unsupport_magisk_msg">이 버전의 앱은 %1$s 미만의 Magisk 버전을 지원하지 않습니다.\n\n해당앱은 Magisk가 설치되지 않은것처럼 동작할것입니다. 가능한 빨리 Magisk 를 업데이트 하세요.</string>
|
||||
<string name="unsupport_general_title">비정상적인 상태</string>
|
||||
<string name="unsupport_system_app_msg">해당 앱을 시스템 앱으로 실행하는 것은 지원하지 않습니다. 앱을 일반사용자 앱으로 실행해 주세요.</string>
|
||||
<string name="unsupport_other_su_msg">Magisk 로 부터 설치되지 않은 \"su\" 바이너리가 감지되었습니다. 다른 루팅 솔루션을 제거하거나, Magisk 를 다시 설치해주세요.</string>
|
||||
<string name="unsupport_external_storage_msg">Magisk 가 외부 저장소에 설치되어 있습니다. Magisk 를 내부 저장소에 설치 해주세요.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">숨겨진 Magisk 앱은 루팅이 풀려 더이상 동작하지 않습니다. 원본 APK 를 복원하거나 재설치 해주세요.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">해당 기능을 사용하려면 저장소 권한을 허용해 주십시오.</string>
|
||||
<string name="install_unknown_denied">이 기능을 활성화 하려면 "알수 없는 앱 설치"를 허용해주세요.</string>
|
||||
<string name="add_shortcut_title">홈 화면에 바로가기 추가</string>
|
||||
<string name="add_shortcut_msg">앱을 숨긴 후 아이콘과 이름을 알아보기 힘들 경우를 위해 알아보기 쉬운 바로가기를 홈 화면에 추가합니다.</string>
|
||||
<string name="app_not_found">해당 작업을 처리할 어플리케이션이 없습니다.</string>
|
||||
<string name="reboot_apply_change">변경 사항을 적용하려면 재부팅하세요.</string>
|
||||
<string name="restore_app_confirmation">정말로 실행하시겠습니까? 숨겨진 앱이 원본 앱으로 복원됩니다.</string>
|
||||
|
||||
</resources>
|
||||
|
@@ -12,69 +12,73 @@
|
||||
|
||||
<!--Home-->
|
||||
<string name="no_connection">Nenhuma conexão disponível</string>
|
||||
<string name="hide">Ocultar</string>
|
||||
<string name="app_changelog">Registro de alterações</string>
|
||||
<string name="loading">Carregando…</string>
|
||||
<string name="home_support_title">Contribua com o Projeto</string>
|
||||
<string name="home_notice_content">Baixe o Magisk SOMENTE pela página oficial do Github. Arquivos de fontes desconhecidas podem ser maliciosos.</string>
|
||||
<string name="home_item_source">Origem</string>
|
||||
<string name="home_support_content">Magisk é, e sempre será, gratuito e de código aberto. No entanto, você pode nos agradecer enviando uma pequena doação.</string>
|
||||
<string name="update">Atualizar</string>
|
||||
<string name="not_available">N/A</string>
|
||||
<string name="hide">Ocultar</string>
|
||||
<string name="home_package">Pacote</string>
|
||||
<string name="home_app_title">App</string>
|
||||
<string name="home_notice_content">Baixe o Magisk SOMENTE pela página oficial do Github. Arquivos de fontes desconhecidas podem ser maliciosos e danificar seu aparelho.</string>
|
||||
<string name="home_support_title">Contribua com o Projeto</string>
|
||||
<string name="home_item_source">Fonte</string>
|
||||
<string name="home_support_content">Magisk é, e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.</string>
|
||||
<string name="home_installed_version">Instalado</string>
|
||||
<string name="home_latest_version">Recente</string>
|
||||
<string name="invalid_update_channel">Canal de atualização inválido</string>
|
||||
<string name="uninstall_magisk_title">Desinstalar Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos!\nA raiz será removida!\nSeus dados potencialmente criptografados, se ainda não estiverem!</string>
|
||||
<string name="update">Atualização</string>
|
||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos!\nA raiz será removida!\nSeus dados não criptografados devido uso do Magisk, serão re-criptografados!</string>
|
||||
|
||||
<!--Install-->
|
||||
<string name="keep_force_encryption">Manter a criptografia forçada</string>
|
||||
<string name="keep_dm_verity">Manter o AVB 2.0/dm-verity</string>
|
||||
<string name="keep_force_encryption">Manter criptografia forçada</string>
|
||||
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
||||
<string name="patch_vbmeta">Corrigir vbmeta na imagem de boot</string>
|
||||
<string name="recovery_mode">Modo de recuperação</string>
|
||||
<string name="install_options_title">Opções</string>
|
||||
<string name="install_method_title">Método</string>
|
||||
<string name="install_next">Próximo</string>
|
||||
<string name="install_start">Vamos lá</string>
|
||||
<string name="manager_download_install">Pressione para baixar e instalar</string>
|
||||
<string name="manager_download_install">Toque para baixar e instalar</string>
|
||||
<string name="direct_install">Instalação direta (recomendada)</string>
|
||||
<string name="install_inactive_slot">Instalar no slot inativo (após o OTA)</string>
|
||||
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nContinuar?</string>
|
||||
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nDeseja continuar?</string>
|
||||
<string name="setup_title">Configuração adicional</string>
|
||||
<string name="select_patch_file">Selecione e corrija um arquivo</string>
|
||||
<string name="patch_file_msg">Selecione uma imagem raw (*.img) ou um arquivo tar ODIN (*.tar)</string>
|
||||
<string name="patch_file_msg">Selecione um arquivo imagem (*.img) ou um arquivo tar (*.tar)</string>
|
||||
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
||||
<string name="flash_screen_title">Instalação</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Solicitação de Superusuário</string>
|
||||
<string name="touch_filtered_warning">Devido um app estar obscurecendo a solicitação de superusuário, o Magisk não pode conferir suas resposta</string>
|
||||
<string name="deny">Negar</string>
|
||||
<string name="prompt">Perguntar</string>
|
||||
<string name="grant">Conceder</string>
|
||||
<string name="su_warning">Concede acesso total ao seu dispositivo.\nNegar se você não tiver certeza!</string>
|
||||
<string name="grant">Permitir</string>
|
||||
<string name="su_warning">Permite acesso total ao seu aparelho.\nNão permita se você não tiver certeza do que está fazendo!</string>
|
||||
<string name="forever">Sempre</string>
|
||||
<string name="once">Uma vez</string>
|
||||
<string name="tenmin">10 mins</string>
|
||||
<string name="twentymin">20 mins</string>
|
||||
<string name="thirtymin">30 mins</string>
|
||||
<string name="sixtymin">60 mins</string>
|
||||
<string name="su_allow_toast">%1$s foi concedido Acesso superusuário</string>
|
||||
<string name="su_deny_toast">%1$s foi negado Acesso superusuário</string>
|
||||
<string name="su_snack_grant">Acesso de superusuário de %1$s foram concedidos</string>
|
||||
<string name="su_snack_deny">Os Acesso de superusuário de %1$s foram negados</string>
|
||||
<string name="su_snack_notif_on">As notificações de %1$s foram habilitadas</string>
|
||||
<string name="su_allow_toast">%1$s foi permitido o acesso Superusuário</string>
|
||||
<string name="su_deny_toast">%1$s foi negado o acesso Superusuário</string>
|
||||
<string name="su_snack_grant">Os acessos de Superusuário de %1$s foram permitidos</string>
|
||||
<string name="su_snack_deny">Os acessos de Superusuário de %1$s foram negados</string>
|
||||
<string name="su_snack_notif_on">As notificações de %1$s foram ativadas</string>
|
||||
<string name="su_snack_notif_off">As notificações de %1$s foram desativadas</string>
|
||||
<string name="su_snack_log_on">O registro de %1$s foi ativado</string>
|
||||
<string name="su_snack_log_off">O registro de %1$s foi desativado</string>
|
||||
<string name="su_snack_log_on">Os registros de %1$s foram ativados</string>
|
||||
<string name="su_snack_log_off">Os registros de %1$s foram desativados</string>
|
||||
<string name="su_revoke_title">Revogar?</string>
|
||||
<string name="su_revoke_msg">Confirmar revogar Acesso de %1$s?</string>
|
||||
<string name="toast">Pop-up no estilo Toast</string>
|
||||
<string name="su_revoke_msg">Confirmar a revogação do acesso de %1$s?</string>
|
||||
<string name="toast">Notificação (Pop-up)</string>
|
||||
<string name="none">Nenhum</string>
|
||||
|
||||
<string name="superuser_toggle_notification">Notificações</string>
|
||||
<string name="superuser_toggle_revoke">Revogar</string>
|
||||
<string name="superuser_policy_none">Nenhum aplicativo solicitou permissão de superusuário ainda.</string>
|
||||
<string name="superuser_policy_none">Nenhum app solicitou permissão de Superusuário ainda.</string>
|
||||
|
||||
<!--Logs-->
|
||||
<string name="log_data_none">Você não tem registros, tente usar mais os aplicativos habilitados para SU.</string>
|
||||
<string name="log_data_none">Não há registros. Tente usar os apps permitidos para Superusuário.</string>
|
||||
<string name="log_data_magisk_none">Os Registro de atividade do Magisk estão vazios, isso é estranho.</string>
|
||||
<string name="menuSaveLog">Salvar Registro</string>
|
||||
<string name="menuClearLog">Limpar Registro agora</string>
|
||||
@@ -82,62 +86,60 @@
|
||||
<string name="pid">PID: %1$d</string>
|
||||
<string name="target_uid">Alvo UID: %1$d</string>
|
||||
|
||||
<!--SafetyNet-->
|
||||
|
||||
<!-- MagiskHide -->
|
||||
<string name="show_system_app">Mostrar aplicativos do sistema</string>
|
||||
<string name="hide_filter_hint">Filtrar por nome</string>
|
||||
<!--MagiskHide-->
|
||||
<string name="show_system_app">Mostrar apps do Sistema</string>
|
||||
<string name="show_os_app">Mostrar apps do Sistema</string>
|
||||
<string name="hide_filter_hint">Filtrar pelo nome</string>
|
||||
<string name="hide_search">Pesquisa</string>
|
||||
|
||||
<!--Module Fragment-->
|
||||
<!--Module-->
|
||||
<string name="no_info_provided">(Nenhuma informação fornecida)</string>
|
||||
<string name="reboot_recovery">Reiniciar para Recovery</string>
|
||||
<string name="reboot_bootloader">Reiniciar para Bootloader</string>
|
||||
<string name="reboot_download">Reiniciar para Download</string>
|
||||
<string name="reboot_edl">Reiniciar para EDL</string>
|
||||
<string name="reboot_userspace">Reinício rápido</string>
|
||||
<string name="reboot_recovery">Reiniciar em modo Recovery</string>
|
||||
<string name="reboot_bootloader">Reiniciar em modo Bootloader</string>
|
||||
<string name="reboot_download">Reiniciar em modo Download</string>
|
||||
<string name="reboot_edl">Reiniciar em modo EDL</string>
|
||||
<string name="module_version_author">%1$s por %2$s</string>
|
||||
<string name="module_state_remove">Remover</string>
|
||||
<string name="module_state_restore">Restaurar</string>
|
||||
<string name="module_action_install_external">Instale a partir do armazenamento</string>
|
||||
<string name="module_action_install_external">Instalar a partir do armazenamento</string>
|
||||
<string name="update_available">Atualização disponível</string>
|
||||
<string name="home_installed_version">Instalado</string>
|
||||
<string name="suspend_text_riru">Módulo suspenso porque %1$s está ativo</string>
|
||||
<string name="suspend_text_zygisk">Módulo suspenso porque %1$s não está ativo</string>
|
||||
<string name="zygisk_module_unloaded">Modulo Zygisk não carregado devido a incompatibilidade</string>
|
||||
|
||||
|
||||
<!--Settings -->
|
||||
<!--Settings-->
|
||||
<string name="settings_dark_mode_title">Modo de tema</string>
|
||||
<string name="settings_dark_mode_message">Selecione o modo mais adequado ao seu estilo!</string>
|
||||
<string name="settings_dark_mode_light">Sempre Claro</string>
|
||||
<string name="settings_dark_mode_system">Baseado no Sistema</string>
|
||||
<string name="settings_dark_mode_dark">Sempre Escuro</string>
|
||||
<string name="settings_download_path_title">Caminho de Download</string>
|
||||
<string name="settings_download_path_title">Caminho para Baixar</string>
|
||||
<string name="settings_download_path_message">Os arquivos serão salvos em %1$s</string>
|
||||
<string name="settings_hide_app_title">Ocultar o app do Magisk</string>
|
||||
<string name="settings_hide_app_summary">Instala um app proxy com ID de pacote aleatório e nome de app personalizado</string>
|
||||
<string name="settings_restore_app_title">Restaura o app do Magisk</string>
|
||||
<string name="settings_restore_app_summary">Desocultar o app e restaurá-lo ao APK original</string>
|
||||
<string name="settings_hide_app_summary">Instala o app ooulto com ID aleatório e nome personalizado</string>
|
||||
<string name="settings_restore_app_title">Restaurar o app do Magisk</string>
|
||||
<string name="settings_restore_app_summary">Desoculta o app do Magisk e restaura o APK original</string>
|
||||
<string name="language">Idioma</string>
|
||||
<string name="system_default">(Padrão do sistema)</string>
|
||||
<string name="settings_check_update_title">Verificar atualizações</string>
|
||||
<string name="settings_check_update_summary">Verifique periodicamente se há atualizações em segundo plano</string>
|
||||
<string name="settings_check_update_summary">Verificar periodicamente em segundo plano se há atualizações</string>
|
||||
<string name="settings_update_channel_title">Canal de Atualização</string>
|
||||
<string name="settings_update_stable">Estável</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
<string name="settings_update_custom">Canal personalizado</string>
|
||||
<string name="settings_update_custom_msg">Insira um URL personalizado</string>
|
||||
<string name="settings_zygisk_summary">Roda partes do Magisk no Zygote</string>
|
||||
<string name="settings_zygisk_summary">Executa partes do Magisk no Zygote</string>
|
||||
<string name="settings_denylist_title">Aplicar lista de negação</string>
|
||||
<string name="settings_denylist_summary">Os processos na lista de negação terão todas as modificações do Magisk revertidas</string>
|
||||
<string name="settings_denylist_summary">Os processos na lista de negação terão revertidas todas as modificações do Magisk</string>
|
||||
<string name="settings_denylist_error">Isso requer %1$s para ser ativado</string>
|
||||
<string name="settings_denylist_config_title">Configurar lista de negação</string>
|
||||
<string name="settings_denylist_config_summary">Selecione os processos a serem incluídos na lista de negação</string>
|
||||
<string name="settings_hosts_title">Hosts systemless</string>
|
||||
<string name="settings_hosts_summary">Suporte de hosts systemless para aplicativos Adblock</string>
|
||||
<string name="settings_hosts_toast">Adicionado módulo de hosts systemless</string>
|
||||
<string name="settings_hosts_title">Ativar /etc/hosts systemless</string>
|
||||
<string name="settings_hosts_summary">Suporte de /etc/hosts fora do sistema para aplicativos Adblock</string>
|
||||
<string name="settings_hosts_toast">Adicionado módulo do /etc/hosts systemless</string>
|
||||
<string name="settings_app_name_hint">Novo nome</string>
|
||||
<string name="settings_app_name_helper">O aplicativo será reinstalado para esse nome</string>
|
||||
<string name="settings_app_name_helper">O app do Magisk será reinstalado com este nome</string>
|
||||
<string name="settings_app_name_error">Formato inválido</string>
|
||||
<string name="settings_su_app_adb">Aplicativos e ADB</string>
|
||||
<string name="settings_su_app">Apenas aplicativos</string>
|
||||
@@ -152,11 +154,11 @@
|
||||
<string name="superuser_access">Acesso de Superusuário</string>
|
||||
<string name="auto_response">Resposta automática</string>
|
||||
<string name="request_timeout">Tempo limite da solicitação</string>
|
||||
<string name="superuser_notification">Notificação de superusuário</string>
|
||||
<string name="superuser_notification">Notificação de Superusuário</string>
|
||||
<string name="settings_su_reauth_title">Autenticar novamente após a atualização</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após a atualização de um aplicativo</string>
|
||||
<string name="settings_su_tapjack_title">Ativar proteção contra Tapjacking</string>
|
||||
<string name="settings_su_tapjack_summary">A caixa de diálogo do superusuário não responderá à entrada enquanto estiver obscurecida por qualquer outra janela ou sobreposição</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de Superusuário após atualizar aplicativo</string>
|
||||
<string name="settings_su_tapjack_title">Ativar proteção contra atividades sobrepostas</string>
|
||||
<string name="settings_su_tapjack_summary">A caixa de diálogo do Superusuário não responderá à entrada enquanto estiver obscurecida por qualquer outra janela ou sobreposição</string>
|
||||
<string name="settings_su_biometric_title">Ativar autenticação biométrica</string>
|
||||
<string name="settings_su_biometric_summary">Use a autenticação biométrica para permitir solicitações de superusuário</string>
|
||||
<string name="no_biometric">Dispositivo não suportado ou nenhuma configuração biométrica está ativada</string>
|
||||
@@ -164,57 +166,67 @@
|
||||
<string name="setting_add_shortcut_summary">Adicione um atalho na tela inicial, caso o nome e o ícone sejam difíceis de reconhecer logo após ocultar o aplicativo</string>
|
||||
<string name="settings_doh_title">DNS sobre HTTPS</string>
|
||||
<string name="settings_doh_description">Solução alternativa para envenenamento de DNS em alguns países</string>
|
||||
|
||||
<string name="multiuser_mode">Modo multiusuário</string>
|
||||
<string name="settings_owner_only">Somente proprietário do dispositivo</string>
|
||||
<string name="settings_owner_manage">Gerenciado pelo proprietário do dispositivo</string>
|
||||
<string name="settings_user_independent">Independente do usuário</string>
|
||||
<string name="owner_only_summary">Somente o proprietário tem acesso root</string>
|
||||
<string name="owner_manage_summary">Somente o proprietário pode gerenciar o acesso root e receber prompts de solicitação</string>
|
||||
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras para root separadas</string>
|
||||
|
||||
<string name="mount_namespace_mode">Montar modo de Namespace</string>
|
||||
<string name="owner_only_summary">Somente o proprietário tem acesso ao Superusuário</string>
|
||||
<string name="owner_manage_summary">Somente o proprietário pode gerenciar o acesso do Superusuário e receber pedidos de solicitação</string>
|
||||
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras de root separadas</string>
|
||||
<string name="mount_namespace_mode">Ativar Modo Namespace</string>
|
||||
<string name="settings_ns_global">Namespace global</string>
|
||||
<string name="settings_ns_requester">Herdar Namespace</string>
|
||||
<string name="settings_ns_isolate">Namespace isolado</string>
|
||||
<string name="global_summary">Todas as sessões root usam o namespace de montagem global</string>
|
||||
<string name="requester_summary">As sessões root herdarão o namespace do solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão root terá seu próprio namespace isolado</string>
|
||||
<string name="isolate_summary">Cada sessão do Superusuário terá seu próprio namespace isolado</string>
|
||||
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Atualizações do Magisk</string>
|
||||
<string name="progress_channel">Notificações de progresso</string>
|
||||
<string name="updated_channel">Atualização concluída</string>
|
||||
<string name="download_complete">Download concluído</string>
|
||||
<string name="download_file_error">Erro ao baixar o arquivo</string>
|
||||
<string name="magisk_update_title">Atualização do Magisk disponível!</string>
|
||||
<string name="download_file_error">Erro ao baixar arquivo</string>
|
||||
<string name="magisk_update_title">Nova atualização do Magisk disponível!</string>
|
||||
<string name="updated_title">Magisk Atualizado</string>
|
||||
<string name="updated_text">Toque para abrir o app</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">Sim</string>
|
||||
<string name="no">Não</string>
|
||||
<string name="repo_install_title">Instalar %1$s %2$s(%3$d)</string>
|
||||
<string name="download">Download</string>
|
||||
<string name="reboot">Reinicializar</string>
|
||||
<string name="release_notes">Notas de versão</string>
|
||||
<string name="flashing">Flashando…</string>
|
||||
<string name="download">Baixar</string>
|
||||
<string name="reboot">Reiniciar</string>
|
||||
<string name="release_notes">Notas da atualização</string>
|
||||
<string name="flashing">Fazendo Flash…</string>
|
||||
<string name="done">Concluído!</string>
|
||||
<string name="failure">Falha</string>
|
||||
<string name="hide_app_title">Ocultando o app do Magisk…</string>
|
||||
<string name="open_link_failed_toast">Nenhum aplicativo encontrado para abrir o link</string>
|
||||
<string name="open_link_failed_toast">Nenhum app encontrado para abrir o link</string>
|
||||
<string name="complete_uninstall">Desinstalação completa</string>
|
||||
<string name="restore_img">Restaurar imagens</string>
|
||||
|
||||
<string name="restore_img_msg">Restaurando…</string>
|
||||
<string name="restore_done">Restauração concluída!</string>
|
||||
<string name="restore_fail">O backup stock não existe!</string>
|
||||
<string name="restore_fail">O backup original não foi encontrado!</string>
|
||||
<string name="setup_fail">Falha na instalação</string>
|
||||
<string name="env_fix_title">Requer configuração adicional</string>
|
||||
<string name="env_fix_msg">Seu dispositivo requer configuração adicional para o Magisk funcionar corretamente. Você quer continuar e reiniciar?</string>
|
||||
<string name="env_fix_title">Configuração adicional exigida</string>
|
||||
<string name="env_fix_msg">Seu dispositivo exige uma configuração adicional para o Magisk funcionar corretamente. Deseja continuar e reiniciar?</string>
|
||||
<string name="setup_msg">Executando a configuração do ambiente…</string>
|
||||
<string name="authenticate">Autenticar</string>
|
||||
<string name="unsupport_magisk_title">Versão Magisk não suportada</string>
|
||||
<string name="unsupport_magisk_msg">Essa versão do app não suporta versão do Magisk inferior a %1$s.\n\nO App irá se comportar como se nenhum Magisk estivesse sido instalado, por favor atualize o Magisk assim que possivel.</string>
|
||||
<string name="unsupport_magisk_title">Versão do Magisk não suportada</string>
|
||||
<string name="unsupport_magisk_msg">Essa versão do app não suporta versão do Magisk inferior a %1$s.\n\nO app irá se comportar como se nenhum Magisk estivesse sido instalado. Por favor, atualize o Magisk assim que possível.</string>
|
||||
<string name="unsupport_general_title">Estado Anormal</string>
|
||||
<string name="unsupport_system_app_msg">Não há suporte para executar este app como um app do sistema. Por favor, reverta o app para um app do usuário.</string>
|
||||
<string name="unsupport_other_su_msg">Não foi possível detectar o binário \"su\" do Magisk. Por favor, remova qualquer outro root concorrente e/ou reinstale o Magisk.</string>
|
||||
<string name="unsupport_external_storage_msg">O app do Magisk está instalado no armazenamento externo, Por favor, mova o app para o armazenamento interno.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">O app oculto do Magisk não pode continuar a funcionar porque o Superusuário foi perdido. Por favor, restaure o APK original.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">Autorize a permissão de armazenamento para ativar esta funcionalidade</string>
|
||||
<string name="install_unknown_denied">Permita a "instalação apps desconhecidos" para ativar esta funcionalidade</string>
|
||||
<string name="add_shortcut_title">Adicionar atalho à tela inicial</string>
|
||||
<string name="add_shortcut_msg">Depois de ocultar o app, o seu nome e ícone ficarão difíceis de reconhecer. Você quer adicionar um atalho bonitinho na tela inicial?</string>
|
||||
<string name="app_not_found">Nenhum aplicativo encontrado para realizar esta ação</string>
|
||||
<string name="add_shortcut_msg">Depois de ocultar o app do Magisk, o seu nome e ícone ficarão difíceis de reconhecer. Deseja adicionar um atalho na tela inicial?</string>
|
||||
<string name="app_not_found">Nenhum app encontrado para realizar esta ação</string>
|
||||
<string name="reboot_apply_change">Reinicie para aplicar as mudanças</string>
|
||||
<string name="restore_app_confirmation">Isso irá restaurar o app oculto do Magisk de volta para o app original. Deseja realmente fazer isso?</string>
|
||||
|
||||
</resources>
|
||||
|
@@ -1,61 +1,149 @@
|
||||
<resources>
|
||||
<!--Universal-->
|
||||
|
||||
<!--Welcome Activity-->
|
||||
<!--Sections-->
|
||||
<string name="modules">Módulos</string>
|
||||
<string name="superuser">root</string>
|
||||
<string name="logs">Registo</string>
|
||||
<string name="settings">Definições</string>
|
||||
<string name="superuser">Superusuário</string>
|
||||
<string name="logs">Registros</string>
|
||||
<string name="settings">Configurações</string>
|
||||
<string name="install">Instalar</string>
|
||||
<string name="section_home">Início</string>
|
||||
<string name="section_theme">Temas</string>
|
||||
<string name="denylist">Lista de Negação</string>
|
||||
|
||||
<!--Status Fragment-->
|
||||
|
||||
<!--Install Fragment-->
|
||||
<string name="keep_force_encryption">Manter encriptação forçada</string>
|
||||
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
||||
<string name="uninstall_magisk_title">Desinstalar Magisk</string>
|
||||
<!--Home-->
|
||||
<string name="no_connection">Nenhuma conexão disponível</string>
|
||||
<string name="app_changelog">Registro de alterações</string>
|
||||
<string name="loading">Carregando…</string>
|
||||
<string name="update">Atualizar</string>
|
||||
|
||||
<!--Module Fragment-->
|
||||
<string name="no_info_provided">(Nenhuma informação fornecida)</string>
|
||||
|
||||
<!--Repo Fragment-->
|
||||
<string name="update_available">Atualização disponível</string>
|
||||
<string name="not_available">N/A</string>
|
||||
<string name="hide">Ocultar</string>
|
||||
<string name="home_package">Pacote</string>
|
||||
<string name="home_app_title">App</string>
|
||||
<string name="home_notice_content">Baixe o Magisk SOMENTE pela página oficial do Github. Arquivos de fontes desconhecidas podem ser maliciosos e danificar seu aparelho.</string>
|
||||
<string name="home_support_title">Contribua com o Projeto</string>
|
||||
<string name="home_item_source">Fonte</string>
|
||||
<string name="home_support_content">Magisk é, e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.</string>
|
||||
<string name="home_installed_version">Instalado</string>
|
||||
<string name="home_latest_version">Recente</string>
|
||||
<string name="invalid_update_channel">Canal de atualização inválido</string>
|
||||
<string name="uninstall_magisk_title">Desinstalar Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos!\nA raiz será removida!\nSeus dados não criptografados devido uso do Magisk, serão re-criptografados!</string>
|
||||
|
||||
<!--Log Fragment-->
|
||||
<string name="menuSaveLog">Gravar registo</string>
|
||||
<string name="menuClearLog">Limpar registo agora</string>
|
||||
<string name="logs_cleared">Registo limpo com sucesso</string>
|
||||
<!--Install-->
|
||||
<string name="keep_force_encryption">Manter criptografia forçada</string>
|
||||
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
||||
<string name="patch_vbmeta">Corrigir vbmeta na imagem de boot</string>
|
||||
<string name="recovery_mode">Modo de recuperação</string>
|
||||
<string name="install_options_title">Opções</string>
|
||||
<string name="install_method_title">Método</string>
|
||||
<string name="install_next">Próximo</string>
|
||||
<string name="install_start">Vamos lá</string>
|
||||
<string name="manager_download_install">Toque para baixar e instalar</string>
|
||||
<string name="direct_install">Instalação direta (recomendada)</string>
|
||||
<string name="install_inactive_slot">Instalar no slot inativo (após o OTA)</string>
|
||||
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nDeseja continuar?</string>
|
||||
<string name="setup_title">Configuração adicional</string>
|
||||
<string name="select_patch_file">Selecione e corrija um arquivo</string>
|
||||
<string name="patch_file_msg">Selecione um arquivo imagem (*.img) ou um arquivo tar (*.tar)</string>
|
||||
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
||||
<string name="flash_screen_title">Instalação</string>
|
||||
|
||||
<!--About Activity-->
|
||||
<string name="app_changelog">Lista de alterações da aplicação</string>
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Solicitação de Superusuário</string>
|
||||
<string name="touch_filtered_warning">Devido um app estar obscurecendo a solicitação de superusuário, o Magisk não pode conferir suas resposta</string>
|
||||
<string name="deny">Negar</string>
|
||||
<string name="prompt">Perguntar</string>
|
||||
<string name="grant">Permitir</string>
|
||||
<string name="su_warning">Permite acesso total ao seu aparelho.\nNão permita se você não tiver certeza do que está fazendo!</string>
|
||||
<string name="forever">Sempre</string>
|
||||
<string name="once">Uma vez</string>
|
||||
<string name="tenmin">10 mins</string>
|
||||
<string name="twentymin">20 mins</string>
|
||||
<string name="thirtymin">30 mins</string>
|
||||
<string name="sixtymin">60 mins</string>
|
||||
<string name="su_allow_toast">%1$s foi permitido o acesso Superusuário</string>
|
||||
<string name="su_deny_toast">%1$s foi negado o acesso Superusuário</string>
|
||||
<string name="su_snack_grant">Os acessos de Superusuário de %1$s foram permitidos</string>
|
||||
<string name="su_snack_deny">Os acessos de Superusuário de %1$s foram negados</string>
|
||||
<string name="su_snack_notif_on">As notificações de %1$s foram ativadas</string>
|
||||
<string name="su_snack_notif_off">As notificações de %1$s foram desativadas</string>
|
||||
<string name="su_snack_log_on">Os registros de %1$s foram ativados</string>
|
||||
<string name="su_snack_log_off">Os registros de %1$s foram desativados</string>
|
||||
<string name="su_revoke_title">Revogar?</string>
|
||||
<string name="su_revoke_msg">Confirmar a revogação do acesso de %1$s?</string>
|
||||
<string name="toast">Notificação (Pop-up)</string>
|
||||
<string name="none">Nenhum</string>
|
||||
<string name="superuser_toggle_notification">Notificações</string>
|
||||
<string name="superuser_toggle_revoke">Revogar</string>
|
||||
<string name="superuser_policy_none">Nenhum app solicitou permissão de Superusuário ainda.</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="repo_install_title">Instalar %1$s %2$s(%3$d)</string>
|
||||
<string name="download">Transferir</string>
|
||||
<string name="reboot">Reiniciar</string>
|
||||
<string name="magisk_update_title">Nova atualização do Magisk disponível!</string>
|
||||
<string name="release_notes">Notas da atualização</string>
|
||||
<string name="manager_download_install">Pressione para transferir e instalar</string>
|
||||
<string name="update_channel">Atualizações do Magisk</string>
|
||||
<string name="flashing">A instalar</string>
|
||||
<string name="direct_install">Instalar Diretamente (Recomendado)</string>
|
||||
<string name="complete_uninstall">Desinstalação Completa</string>
|
||||
<string name="restore_done">Restauração feita!</string>
|
||||
<string name="download_file_error">Erro ao transferir ficheiro</string>
|
||||
<!--Logs-->
|
||||
<string name="log_data_none">Não há registros. Tente usar os apps permitidos para Superusuário.</string>
|
||||
<string name="log_data_magisk_none">Os Registro de atividade do Magisk estão vazios, isso é estranho.</string>
|
||||
<string name="menuSaveLog">Salvar Registro</string>
|
||||
<string name="menuClearLog">Limpar Registro agora</string>
|
||||
<string name="logs_cleared">Registro limpo com sucesso.</string>
|
||||
<string name="pid">PID: %1$d</string>
|
||||
<string name="target_uid">Alvo UID: %1$d</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="language">Língua</string>
|
||||
<string name="system_default">(Padrão do Sistema)</string>
|
||||
<!--MagiskHide-->
|
||||
<string name="show_system_app">Mostrar apps do Sistema</string>
|
||||
<string name="show_os_app">Mostrar apps do Sistema</string>
|
||||
<string name="hide_filter_hint">Filtrar pelo nome</string>
|
||||
<string name="hide_search">Pesquisa</string>
|
||||
|
||||
<!--Module-->
|
||||
<string name="no_info_provided">(Nenhuma informação fornecida)</string>
|
||||
<string name="reboot_userspace">Reinício rápido</string>
|
||||
<string name="reboot_recovery">Reiniciar em modo Recovery</string>
|
||||
<string name="reboot_bootloader">Reiniciar em modo Bootloader</string>
|
||||
<string name="reboot_download">Reiniciar em modo Download</string>
|
||||
<string name="reboot_edl">Reiniciar em modo EDL</string>
|
||||
<string name="module_version_author">%1$s por %2$s</string>
|
||||
<string name="module_state_remove">Remover</string>
|
||||
<string name="module_state_restore">Restaurar</string>
|
||||
<string name="module_action_install_external">Instalar a partir do armazenamento</string>
|
||||
<string name="update_available">Atualização disponível</string>
|
||||
<string name="suspend_text_riru">Módulo suspenso porque %1$s está ativo</string>
|
||||
<string name="suspend_text_zygisk">Módulo suspenso porque %1$s não está ativo</string>
|
||||
<string name="zygisk_module_unloaded">Modulo Zygisk não carregado devido a incompatibilidade</string>
|
||||
|
||||
<!--Settings-->
|
||||
<string name="settings_dark_mode_title">Modo de tema</string>
|
||||
<string name="settings_dark_mode_message">Selecione o modo mais adequado ao seu estilo!</string>
|
||||
<string name="settings_dark_mode_light">Sempre Claro</string>
|
||||
<string name="settings_dark_mode_system">Baseado no Sistema</string>
|
||||
<string name="settings_dark_mode_dark">Sempre Escuro</string>
|
||||
<string name="settings_download_path_title">Caminho para Baixar</string>
|
||||
<string name="settings_download_path_message">Os arquivos serão salvos em %1$s</string>
|
||||
<string name="settings_hide_app_title">Ocultar o app do Magisk</string>
|
||||
<string name="settings_hide_app_summary">Instala o app ooulto com ID aleatório e nome personalizado</string>
|
||||
<string name="settings_restore_app_title">Restaurar o app do Magisk</string>
|
||||
<string name="settings_restore_app_summary">Desoculta o app do Magisk e restaura o APK original</string>
|
||||
<string name="language">Idioma</string>
|
||||
<string name="system_default">(Padrão do sistema)</string>
|
||||
<string name="settings_check_update_title">Verificar atualizações</string>
|
||||
<string name="settings_check_update_summary">Verificar periodicamente em segundo plano se há atualizações</string>
|
||||
<string name="settings_update_channel_title">Canal de Atualização</string>
|
||||
<string name="settings_update_stable">Estável</string>
|
||||
<string name="settings_update_beta">Beta</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_su_app_adb">Aplicações e ADB</string>
|
||||
<string name="settings_su_app">Somente Aplicações</string>
|
||||
<string name="settings_su_adb">Somente ADB</string>
|
||||
<string name="settings_update_custom">Canal personalizado</string>
|
||||
<string name="settings_update_custom_msg">Insira um URL personalizado</string>
|
||||
<string name="settings_zygisk_summary">Executa partes do Magisk no Zygote</string>
|
||||
<string name="settings_denylist_title">Aplicar lista de negação</string>
|
||||
<string name="settings_denylist_summary">Os processos na lista de negação terão revertidas todas as modificações do Magisk</string>
|
||||
<string name="settings_denylist_error">Isso requer %1$s para ser ativado</string>
|
||||
<string name="settings_denylist_config_title">Configurar lista de negação</string>
|
||||
<string name="settings_denylist_config_summary">Selecione os processos a serem incluídos na lista de negação</string>
|
||||
<string name="settings_hosts_title">Ativar /etc/hosts systemless</string>
|
||||
<string name="settings_hosts_summary">Suporte de /etc/hosts fora do sistema para aplicativos Adblock</string>
|
||||
<string name="settings_hosts_toast">Adicionado módulo do /etc/hosts systemless</string>
|
||||
<string name="settings_app_name_hint">Novo nome</string>
|
||||
<string name="settings_app_name_helper">O app do Magisk será reinstalado com este nome</string>
|
||||
<string name="settings_app_name_error">Formato inválido</string>
|
||||
<string name="settings_su_app_adb">Aplicativos e ADB</string>
|
||||
<string name="settings_su_app">Apenas aplicativos</string>
|
||||
<string name="settings_su_adb">Apenas ADB</string>
|
||||
<string name="settings_su_disable">Desativado</string>
|
||||
<string name="settings_su_request_10">10 segundos</string>
|
||||
<string name="settings_su_request_15">15 segundos</string>
|
||||
@@ -63,56 +151,82 @@
|
||||
<string name="settings_su_request_30">30 segundos</string>
|
||||
<string name="settings_su_request_45">45 segundos</string>
|
||||
<string name="settings_su_request_60">60 segundos</string>
|
||||
<string name="superuser_access">Acesso de root</string>
|
||||
<string name="auto_response">Resposta Automática</string>
|
||||
<string name="request_timeout">Tempo limite de solicitação</string>
|
||||
<string name="superuser_notification">Notificação de root</string>
|
||||
<string name="settings_su_reauth_title">Autenticar novamente após atualizar</string>
|
||||
<string name="settings_su_reauth_summary">Autenticar novamente permissões de root após atualizar aplicações</string>
|
||||
<string name="superuser_access">Acesso de Superusuário</string>
|
||||
<string name="auto_response">Resposta automática</string>
|
||||
<string name="request_timeout">Tempo limite da solicitação</string>
|
||||
<string name="superuser_notification">Notificação de Superusuário</string>
|
||||
<string name="settings_su_reauth_title">Autenticar novamente após a atualização</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de Superusuário após atualizar aplicativo</string>
|
||||
<string name="settings_su_tapjack_title">Ativar proteção contra atividades sobrepostas</string>
|
||||
<string name="settings_su_tapjack_summary">A caixa de diálogo do Superusuário não responderá à entrada enquanto estiver obscurecida por qualquer outra janela ou sobreposição</string>
|
||||
<string name="settings_su_biometric_title">Ativar autenticação biométrica</string>
|
||||
<string name="settings_su_biometric_summary">Use a autenticação biométrica para permitir solicitações de superusuário</string>
|
||||
<string name="no_biometric">Dispositivo não suportado ou nenhuma configuração biométrica está ativada</string>
|
||||
<string name="settings_customization">Personalizações</string>
|
||||
<string name="setting_add_shortcut_summary">Adicione um atalho na tela inicial, caso o nome e o ícone sejam difíceis de reconhecer logo após ocultar o aplicativo</string>
|
||||
<string name="settings_doh_title">DNS sobre HTTPS</string>
|
||||
<string name="settings_doh_description">Solução alternativa para envenenamento de DNS em alguns países</string>
|
||||
<string name="multiuser_mode">Modo multiusuário</string>
|
||||
<string name="settings_owner_only">Somente proprietário do dispositivo</string>
|
||||
<string name="settings_owner_manage">Gerenciado pelo proprietário do dispositivo</string>
|
||||
<string name="settings_user_independent">Independente do usuário</string>
|
||||
<string name="owner_only_summary">Somente o proprietário tem acesso ao Superusuário</string>
|
||||
<string name="owner_manage_summary">Somente o proprietário pode gerenciar o acesso do Superusuário e receber pedidos de solicitação</string>
|
||||
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras de root separadas</string>
|
||||
<string name="mount_namespace_mode">Ativar Modo Namespace</string>
|
||||
<string name="settings_ns_global">Namespace global</string>
|
||||
<string name="settings_ns_requester">Herdar Namespace</string>
|
||||
<string name="settings_ns_isolate">Namespace isolado</string>
|
||||
<string name="global_summary">Todas as sessões root usam o namespace de montagem global</string>
|
||||
<string name="requester_summary">As sessões root herdarão o namespace do solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão do Superusuário terá seu próprio namespace isolado</string>
|
||||
|
||||
<string name="multiuser_mode">Modo Multi-Utilizador</string>
|
||||
<string name="settings_owner_only">Apenas Proprietário de Dispositivo</string>
|
||||
<string name="settings_owner_manage">Gerido Proprietário do Dispositivo</string>
|
||||
<string name="settings_user_independent">Independente de Utilizadores</string>
|
||||
<string name="owner_only_summary">Apenas o proprietário tem acesso a root</string>
|
||||
<string name="owner_manage_summary">Apenas o proprietário pode gerir acesso root e receber pedidos</string>
|
||||
<string name="user_indepenent_summary">Cada utilizador tem suas próprias regras de root separadas</string>
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Atualizações do Magisk</string>
|
||||
<string name="progress_channel">Notificações de progresso</string>
|
||||
<string name="updated_channel">Atualização concluída</string>
|
||||
<string name="download_complete">Download concluído</string>
|
||||
<string name="download_file_error">Erro ao baixar arquivo</string>
|
||||
<string name="magisk_update_title">Nova atualização do Magisk disponível!</string>
|
||||
<string name="updated_title">Magisk Atualizado</string>
|
||||
<string name="updated_text">Toque para abrir o app</string>
|
||||
|
||||
<string name="mount_namespace_mode">Cada sessão root terá sua própria identificação isolada</string>
|
||||
<string name="settings_ns_global">Identificação Global</string>
|
||||
<string name="settings_ns_requester">Herdar Identificação</string>
|
||||
<string name="settings_ns_isolate">Identificação Isolada</string>
|
||||
<string name="global_summary">Todas as sessões root usam a identificação de montagem global</string>
|
||||
<string name="requester_summary">As sessões de root herdarão a identificação do seu solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão root terá sua própria identificação isolada</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Pedido de root</string>
|
||||
<string name="deny">Negar</string>
|
||||
<string name="prompt">Perguntar</string>
|
||||
<string name="grant">Permitir</string>
|
||||
<string name="su_warning">Concede acesso total ao seu dispositivo.
|
||||
\nNegue se não tiver certeza!</string>
|
||||
<string name="forever">Sempre</string>
|
||||
<string name="once">Uma vez</string>
|
||||
<string name="tenmin">10 minutos</string>
|
||||
<string name="twentymin">20 minutos</string>
|
||||
<string name="thirtymin">30 minutos</string>
|
||||
<string name="sixtymin">60 minutos</string>
|
||||
<string name="su_allow_toast">%1$s foi permitido o acesso de root</string>
|
||||
<string name="su_deny_toast">%1$s foi negado o acesso de root</string>
|
||||
<string name="su_snack_grant">Acesso de root a %1$s foi permitido</string>
|
||||
<string name="su_snack_deny">Acesso de root a %1$s foi negado</string>
|
||||
<string name="su_snack_notif_on">Notificações de %1$s está ativado</string>
|
||||
<string name="su_snack_notif_off">Notificações da %1$s está desativado</string>
|
||||
<string name="su_snack_log_on">Registo de %1$s está ativado</string>
|
||||
<string name="su_snack_log_off">Registo de %1$s está desativado</string>
|
||||
<string name="su_revoke_title">Revogar?</string>
|
||||
<string name="su_revoke_msg">Revogar os diretos do %1$s, Confirmar?</string>
|
||||
<string name="toast">Notificação(pop-up)</string>
|
||||
<string name="none">Nenhum</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Alvo UID: %1$d</string>
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">Sim</string>
|
||||
<string name="no">Não</string>
|
||||
<string name="repo_install_title">Instalar %1$s %2$s(%3$d)</string>
|
||||
<string name="download">Baixar</string>
|
||||
<string name="reboot">Reiniciar</string>
|
||||
<string name="release_notes">Notas da atualização</string>
|
||||
<string name="flashing">Fazendo Flash…</string>
|
||||
<string name="done">Concluído!</string>
|
||||
<string name="failure">Falha</string>
|
||||
<string name="hide_app_title">Ocultando o app do Magisk…</string>
|
||||
<string name="open_link_failed_toast">Nenhum app encontrado para abrir o link</string>
|
||||
<string name="complete_uninstall">Desinstalação completa</string>
|
||||
<string name="restore_img">Restaurar imagens</string>
|
||||
<string name="restore_img_msg">Restaurando…</string>
|
||||
<string name="restore_done">Restauração concluída!</string>
|
||||
<string name="restore_fail">O backup original não foi encontrado!</string>
|
||||
<string name="setup_fail">Falha na instalação</string>
|
||||
<string name="env_fix_title">Configuração adicional exigida</string>
|
||||
<string name="env_fix_msg">Seu dispositivo exige uma configuração adicional para o Magisk funcionar corretamente. Deseja continuar e reiniciar?</string>
|
||||
<string name="setup_msg">Executando a configuração do ambiente…</string>
|
||||
<string name="authenticate">Autenticar</string>
|
||||
<string name="unsupport_magisk_title">Versão do Magisk não suportada</string>
|
||||
<string name="unsupport_magisk_msg">Essa versão do app não suporta versão do Magisk inferior a %1$s.\n\nO app irá se comportar como se nenhum Magisk estivesse sido instalado. Por favor, atualize o Magisk assim que possível.</string>
|
||||
<string name="unsupport_general_title">Estado Anormal</string>
|
||||
<string name="unsupport_system_app_msg">Não há suporte para executar este app como um app do sistema. Por favor, reverta o app para um app do usuário.</string>
|
||||
<string name="unsupport_other_su_msg">Não foi possível detectar o binário \"su\" do Magisk. Por favor, remova qualquer outro root concorrente e/ou reinstale o Magisk.</string>
|
||||
<string name="unsupport_external_storage_msg">O app do Magisk está instalado no armazenamento externo, Por favor, mova o app para o armazenamento interno.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">O app oculto do Magisk não pode continuar a funcionar porque o Superusuário foi perdido. Por favor, restaure o APK original.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">Autorize a permissão de armazenamento para ativar esta funcionalidade</string>
|
||||
<string name="install_unknown_denied">Permita a "instalação apps desconhecidos" para ativar esta funcionalidade</string>
|
||||
<string name="add_shortcut_title">Adicionar atalho à tela inicial</string>
|
||||
<string name="add_shortcut_msg">Depois de ocultar o app do Magisk, o seu nome e ícone ficarão difíceis de reconhecer. Deseja adicionar um atalho na tela inicial?</string>
|
||||
<string name="app_not_found">Nenhum app encontrado para realizar esta ação</string>
|
||||
<string name="reboot_apply_change">Reinicie para aplicar as mudanças</string>
|
||||
<string name="restore_app_confirmation">Isso irá restaurar o app oculto do Magisk de volta para o app original. Deseja realmente fazer isso?</string>
|
||||
|
||||
</resources>
|
||||
|
@@ -23,16 +23,17 @@
|
||||
<string name="home_notice_content">Descarcă Magisk NUMAI de pe pagina oficială GitHub. Fișierele din surse necunoscute pot fi rău intenționate!</string>
|
||||
<string name="home_support_title">Sprijină-ne</string>
|
||||
<string name="home_item_source">Sursă</string>
|
||||
<string name="home_support_content">Magisk este și va fi întotdeauna gratuit și open-source. Cu toate acestea, ne poți arăta că îți pasă trimițând o mică donație.</string>
|
||||
<string name="home_support_content">Magisk este și va fi întotdeauna gratuit și open-source. Cu toate acestea, ne poți arăta că îți pasă făcând o donație.</string>
|
||||
<string name="home_installed_version">Versiune instalată</string>
|
||||
<string name="home_latest_version">Ultima versiune</string>
|
||||
<string name="invalid_update_channel">Canal de actualizare nevalid</string>
|
||||
<string name="uninstall_magisk_title">Dezinstalează Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Toate modulele vor fi dezactivate/eliminate!\nRootul va fi eliminat!\nPotențial ți se vor cripta datele dacă nu sunt criptate deja!</string>
|
||||
<string name="uninstall_magisk_msg">Toate modulele vor fi dezactivate/eliminate!\nRootul va fi eliminat!\nOrice spațiu de stocare intern necriptat prin folosirea Magisk va fi recriptat!</string>
|
||||
|
||||
<!--Install-->
|
||||
<string name="keep_force_encryption">Păstrează criptarea forțată</string>
|
||||
<string name="keep_dm_verity">Păstrează AVB 2.0/dm-verity</string>
|
||||
<string name="patch_vbmeta">Patchuiește vbmeta în imaginea de boot</string>
|
||||
<string name="recovery_mode">Mod de recuperare</string>
|
||||
<string name="install_options_title">Opțiuni</string>
|
||||
<string name="install_method_title">Metodă</string>
|
||||
@@ -70,16 +71,16 @@
|
||||
<string name="su_snack_log_on">Jurnalizarea pentru %1$s a fost activată</string>
|
||||
<string name="su_snack_log_off">Jurnalizarea pentru %1$s a fost dezactivată</string>
|
||||
<string name="su_revoke_title">Revoci?</string>
|
||||
<string name="su_revoke_msg">Confirmi revocarea drepturilor pentru %1$s?</string>
|
||||
<string name="su_revoke_msg">Confirmă revocarea drepturilor de superutilizator pentru %1$s</string>
|
||||
<string name="toast">Mesaj</string>
|
||||
<string name="none">Niciuna</string>
|
||||
|
||||
<string name="superuser_toggle_notification">Notificări</string>
|
||||
<string name="superuser_toggle_revoke">Revocă</string>
|
||||
<string name="superuser_policy_none">Nicio aplicație nu a cerut încă permisiuni de superutilizator.</string>
|
||||
<string name="superuser_policy_none">Nicio aplicație nu a cerut încă permisiunea de superutilizator.</string>
|
||||
|
||||
<!--Logs-->
|
||||
<string name="log_data_none">Nu există jurnale, încearcă să folosești ceva mai mult aplicațiile cu acces de superutilizator</string>
|
||||
<string name="log_data_none">Nu există jurnale, încearcă să folosești ceva mai mult aplicațiile care folosesc root</string>
|
||||
<string name="log_data_magisk_none">Jurnalele Magisk sunt goale, asta-i ciudat</string>
|
||||
<string name="menuSaveLog">Salvează jurnalul</string>
|
||||
<string name="menuClearLog">Golește jurnalul acum</string>
|
||||
@@ -107,6 +108,9 @@
|
||||
<string name="module_state_restore">Restaurează</string>
|
||||
<string name="module_action_install_external">Instalează din spațiul de stocare</string>
|
||||
<string name="update_available">Actualizare disponibilă</string>
|
||||
<string name="suspend_text_riru">Modul suspendat deoarece %1$s este activat</string>
|
||||
<string name="suspend_text_zygisk">Modul suspendat deoarece %1$s nu este activat</string>
|
||||
<string name="zygisk_module_unloaded">Modulul Zygisk nu a fost încărcat din cauza incompatibilității</string>
|
||||
|
||||
<!--Settings-->
|
||||
<string name="settings_dark_mode_title">Mod pentru temă</string>
|
||||
@@ -119,7 +123,7 @@
|
||||
<string name="settings_hide_app_title">Ascunde aplicația Magisk</string>
|
||||
<string name="settings_hide_app_summary">Instalează o aplicație proxy cu ID aleatoriu pentru pachet și etichetă personalizată pentru aplicație</string>
|
||||
<string name="settings_restore_app_title">Restaurează aplicația Magisk</string>
|
||||
<string name="settings_restore_app_summary">Dezvăluie aplicația și restaureaz-o înapoi în APK-ul original</string>
|
||||
<string name="settings_restore_app_summary">Dezvăluie aplicația și restaurează APK-ul original</string>
|
||||
<string name="language">Limbă</string>
|
||||
<string name="system_default">(Implicită a sistemului)</string>
|
||||
<string name="settings_check_update_title">Caută actualizări</string>
|
||||
@@ -127,8 +131,8 @@
|
||||
<string name="settings_update_channel_title">Canal de actualizare</string>
|
||||
<string name="settings_update_stable">Stabil</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
<string name="settings_update_custom">Canal personalizat</string>
|
||||
<string name="settings_update_custom_msg">Inserează un URL personalizat</string>
|
||||
<string name="settings_update_custom">Personalizat</string>
|
||||
<string name="settings_update_custom_msg">Inserează un URL pentru canal personalizat</string>
|
||||
<string name="settings_zygisk_summary">Rulează părți ale Magisk în daemonul zygote</string>
|
||||
<string name="settings_denylist_title">Impune lista de refuzări</string>
|
||||
<string name="settings_denylist_summary">Procesele din lista de refuzări vor avea toate modificările Magisk anulate</string>
|
||||
@@ -136,7 +140,7 @@
|
||||
<string name="settings_denylist_config_title">Configurează lista de refuzări</string>
|
||||
<string name="settings_denylist_config_summary">Selectează procesele care vor fi incluse în lista de refuzări</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 care blochează reclame</string>
|
||||
<string name="settings_hosts_toast">Modulul pentru fișierul hosts în afara partiției system, adăugat</string>
|
||||
<string name="settings_app_name_hint">Nume nou</string>
|
||||
<string name="settings_app_name_helper">Aplicația va fi reîmpachetată cu acest nume</string>
|
||||
@@ -156,10 +160,10 @@
|
||||
<string name="request_timeout">Expirare pentru cerere</string>
|
||||
<string name="superuser_notification">Notificare de superutilizator</string>
|
||||
<string name="settings_su_reauth_title">Reautentificare după actualizare</string>
|
||||
<string name="settings_su_reauth_summary">Reautentifică permisiunile pentru superutilizator după o actualizare a aplicației</string>
|
||||
<string name="settings_su_tapjack_title">Activează protecția față de tapjacking</string>
|
||||
<string name="settings_su_tapjack_summary">Caseta de dialog pentru solicitarea drepturilor de superutilizator nu va răspunde la input cât timp este ascunsă de orice altă fereastră sau suprapunere</string>
|
||||
<string name="settings_su_biometric_title">Activează autentificarea biometrică</string>
|
||||
<string name="settings_su_reauth_summary">Cere din nou permisiunile de superutilizator după actualizarea aplicațiilor</string>
|
||||
<string name="settings_su_tapjack_title">Protecție față de tapjacking</string>
|
||||
<string name="settings_su_tapjack_summary">Caseta de dialog pentru solicitarea permisiunilor de superutilizator nu va răspunde la input cât timp este ascunsă de orice altă fereastră sau suprapunere</string>
|
||||
<string name="settings_su_biometric_title">Autentificare biometrică</string>
|
||||
<string name="settings_su_biometric_summary">Folosește autentificarea biometrică pentru a permite cereri de superutilizator</string>
|
||||
<string name="no_biometric">Dispozitiv nesuportat sau nu sunt activate setări biometrice</string>
|
||||
<string name="settings_customization">Personalizare</string>
|
||||
@@ -186,9 +190,12 @@
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Actualizări Magisk</string>
|
||||
<string name="progress_channel">Notificări de progres</string>
|
||||
<string name="updated_channel">Actualizare finalizată</string>
|
||||
<string name="download_complete">Descărcare finalizată</string>
|
||||
<string name="download_file_error">Eroare la descărcarea fișierului</string>
|
||||
<string name="magisk_update_title">Actualizare Magisk disponibilă!</string>
|
||||
<string name="updated_title">Magisk actualizat</string>
|
||||
<string name="updated_text">Atinge pentru a deschide aplicația</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">Da</string>
|
||||
@@ -213,17 +220,19 @@
|
||||
<string name="setup_msg">Rulează configurarea mediului…</string>
|
||||
<string name="authenticate">Autentificare</string>
|
||||
<string name="unsupport_magisk_title">Versiune Magisk nesuportată</string>
|
||||
<string name="unsupport_magisk_msg">Această versiune a aplicației nu suportă versiunea Magisk mai mică de %1$s.\n\nAplicația se va comporta ca și cum Magisk nu este instalat, te rugăm să actualizezi Magisk cât mai curând posibil.</string>
|
||||
<string name="unsupport_magisk_msg">Această versiune a aplicației nu suportă versiunile Magisk mai mici de %1$s.\n\nAplicația se va comporta ca și cum Magisk nu este instalat, te rugăm să actualizezi Magisk cât mai curând posibil.</string>
|
||||
<string name="unsupport_general_title">Stare anormală</string>
|
||||
<string name="unsupport_system_app_msg">Rularea acestei aplicații ca aplicație de sistem nu este suportată. Te rugăm să readuci aplicația într-o aplicație de utilizator.</string>
|
||||
<string name="unsupport_other_su_msg">Este detectată o comandă „su” care nu aparține Magisk. Te rugăm să elimini cealaltă aplicație su nesuportată.</string>
|
||||
<string name="unsupport_other_su_msg">A fost detectat un binar „su” care nu provine de la Magisk. Te rugăm să elimini orice soluție root concurentă și/sau să reinstalezi Magisk.</string>
|
||||
<string name="unsupport_external_storage_msg">Magisk este instalat în spațiul de stocare extern. Te rugăm să muți aplicația în spațiul de stocare intern.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">Aplicația nu poate continua să funcționeze în starea ascunsă, deoarece rootul a fost pierdut. Te rugăm să o restaurezi înapoi în APK-ul original.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">Aplicația Magisk ascunsă nu poate continua să funcționeze deoarece rootul a fost pierdut. Te rugăm să restaurezi APK-ul original.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">Acordă permisiunea de stocare pentru a activa această funcționalitate</string>
|
||||
<string name="install_unknown_denied">Permite „instalarea de aplicații necunoscute” pentru a activa această funcționalitate</string>
|
||||
<string name="add_shortcut_title">Adaugă comandă rapidă pe ecranul de pornire</string>
|
||||
<string name="add_shortcut_msg">După ascunderea acestei aplicații, numele și pictograma acesteia ar putea deveni dificil de recunoscut. Vrei să adaugi o comandă rapidă frumoasă pe ecranul de pornire?</string>
|
||||
<string name="app_not_found">Nu s-a găsit nicio aplicație care să gestioneze această acțiune</string>
|
||||
<string name="reboot_apply_change">Repornește pentru a aplica modificările</string>
|
||||
<string name="reboot_apply_change">Repornește pentru a aplica modificările</string>
|
||||
<string name="restore_app_confirmation">Acest lucru va restaura aplicația ascunsă în aplicația originală. Sigur vrei să faci asta?</string>
|
||||
|
||||
</resources>
|
||||
|
@@ -190,9 +190,12 @@
|
||||
<!--Notifications-->
|
||||
<string name="update_channel">Обновление Magisk</string>
|
||||
<string name="progress_channel">Уведомления о прогрессе</string>
|
||||
<string name="updated_channel">Обновление завершено</string>
|
||||
<string name="download_complete">Загрузка завершена</string>
|
||||
<string name="download_file_error">Ошибка загрузки файла</string>
|
||||
<string name="magisk_update_title">Доступно обновление Magisk!</string>
|
||||
<string name="updated_title">Magisk обновлён</string>
|
||||
<string name="updated_text">Нажмите, чтобы открыть</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="yes">Да</string>
|
||||
@@ -224,7 +227,8 @@
|
||||
<string name="unsupport_external_storage_msg">Приложение установлено во внешнее хранилище. Пожалуйста, переустановите его во внутреннее хранилище.</string>
|
||||
<string name="unsupport_nonroot_stub_msg">Пересобранное для скрытия приложение Magisk не может дальше работать, поскольку Root-права недоступны. Пожалуйста, восстановите приложение к исходному состоянию.</string>
|
||||
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
|
||||
<string name="external_rw_permission_denied">Пожалуйста, предоставьте доступ к хранилищу</string>
|
||||
<string name="external_rw_permission_denied">Предоставьте разрешение на доступ к хранилищу</string>
|
||||
<string name="install_unknown_denied">Предоставьте разрешение на "Установку из неизвестных источников"</string>
|
||||
<string name="add_shortcut_title">Добавление ярлыка</string>
|
||||
<string name="add_shortcut_msg">После скрытия приложения Magisk его название и иконка могут быть неудобны для восприятия. Хотите создать ярлык на рабочем столе?</string>
|
||||
<string name="app_not_found">Приложение для обработки этого действия не найдено</string>
|
||||
|
@@ -1,5 +1,29 @@
|
||||
# Magisk Changelog
|
||||
|
||||
### v24.3
|
||||
|
||||
- [General] Stop using `getrandom` syscall
|
||||
- [Zygisk] Update API to v3, adding new fields to `AppSpecializeArgs`
|
||||
- [App] Improve app repackaging installation workflow
|
||||
|
||||
### v24.2
|
||||
|
||||
- [MagiskSU] Fix buffer overflow
|
||||
- [MagiskSU] Fix owner managed multiuser superuser settings
|
||||
- [MagiskSU] Fix command logging when using `su -c <cmd>`
|
||||
- [MagiskSU] Prevent su request indefinite blocking
|
||||
- [MagiskBoot] Support `lz4_legacy` archive with multiple magic
|
||||
- [MagiskBoot] Fix `lz4_lg` compression
|
||||
- [DenyList] Allow targeting processes running as system UID
|
||||
- [Zygisk] Workaround Samsung's "early zygote"
|
||||
- [Zygisk] Improved Zygisk loading mechanism
|
||||
- [Zygisk] Fix application UID tracking
|
||||
- [Zygisk] Fix improper `umask` being set in zygote
|
||||
- [App] Fix BusyBox execution test
|
||||
- [App] Improve stub loading mechanism
|
||||
- [App] Major app upgrade flow improvements
|
||||
- [General] Improve commandline error handling and messaging
|
||||
|
||||
### v24.1
|
||||
|
||||
- [App] Stability improvements
|
||||
|
@@ -17,3 +17,5 @@ Maintenance release fixing various issues.
|
||||
- [App] Improve stub loading mechanism
|
||||
- [App] Major app upgrade flow improvements
|
||||
- [General] Improve commandline error handling and messaging
|
||||
|
||||
### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html)
|
||||
|
9
docs/releases/24300.md
Normal file
9
docs/releases/24300.md
Normal file
@@ -0,0 +1,9 @@
|
||||
## 2022.3.10 Magisk v24.3
|
||||
|
||||
For those coming from v24.1, check the full changelog for changes introduced in v24.2.
|
||||
|
||||
- [General] Stop using `getrandom` syscall
|
||||
- [Zygisk] Update API to v3, adding new fields to `AppSpecializeArgs`
|
||||
- [App] Improve app repackaging installation workflow
|
||||
|
||||
### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html)
|
@@ -1,5 +1,6 @@
|
||||
# Release Notes
|
||||
|
||||
- [v24.3](24300.md)
|
||||
- [v24.2](24200.md)
|
||||
- [v24.1](24100.md)
|
||||
- [v24.0](24000.md)
|
||||
|
@@ -27,7 +27,7 @@ android.injected.testOnly=false
|
||||
android.nonTransitiveRClass=true
|
||||
|
||||
# Magisk
|
||||
magisk.stubVersion=26
|
||||
magisk.versionCode=24200
|
||||
magisk.stubVersion=27
|
||||
magisk.versionCode=24300
|
||||
magisk.ndkVersion=23b
|
||||
magisk.fullNdkVersion=23.1.7779620
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
@@ -144,9 +144,9 @@ static char *open_and_init_db(sqlite3 *&db) {
|
||||
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, nullptr);
|
||||
if (ret)
|
||||
return strdup(sqlite3_errmsg(db));
|
||||
int ver;
|
||||
int ver = 0;
|
||||
bool upgrade = false;
|
||||
char *err;
|
||||
char *err = nullptr;
|
||||
sqlite3_exec(db, "PRAGMA user_version", ver_cb, &ver, &err);
|
||||
err_ret(err);
|
||||
if (ver > DB_VERSION) {
|
||||
@@ -250,7 +250,7 @@ static char *open_and_init_db(sqlite3 *&db) {
|
||||
}
|
||||
|
||||
char *db_exec(const char *sql) {
|
||||
char *err;
|
||||
char *err = nullptr;
|
||||
if (mDB == nullptr) {
|
||||
err = open_and_init_db(mDB);
|
||||
db_err_cmd(err,
|
||||
@@ -276,7 +276,7 @@ static int sqlite_db_row_callback(void *cb, int col_num, char **data, char **col
|
||||
}
|
||||
|
||||
char *db_exec(const char *sql, const db_row_cb &fn) {
|
||||
char *err;
|
||||
char *err = nullptr;
|
||||
if (mDB == nullptr) {
|
||||
err = open_and_init_db(mDB);
|
||||
db_err_cmd(err,
|
||||
@@ -294,7 +294,7 @@ char *db_exec(const char *sql, const db_row_cb &fn) {
|
||||
}
|
||||
|
||||
int get_db_settings(db_settings &cfg, int key) {
|
||||
char *err;
|
||||
char *err = nullptr;
|
||||
auto settings_cb = [&](db_row &row) -> bool {
|
||||
cfg[row["key"]] = parse_int(row["value"]);
|
||||
DBLOGV("query %s=[%s]\n", row["key"].data(), row["value"].data());
|
||||
@@ -312,7 +312,7 @@ int get_db_settings(db_settings &cfg, int key) {
|
||||
}
|
||||
|
||||
int get_db_strings(db_strings &str, int key) {
|
||||
char *err;
|
||||
char *err = nullptr;
|
||||
auto string_cb = [&](db_row &row) -> bool {
|
||||
str[row["key"]] = row["value"];
|
||||
DBLOGV("query %s=[%s]\n", row["key"].data(), row["value"].data());
|
||||
|
@@ -35,21 +35,17 @@ int fork_no_orphan() {
|
||||
|
||||
int gen_rand_str(char *buf, int len, bool varlen) {
|
||||
constexpr char ALPHANUM[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
static mt19937 gen([]{
|
||||
mt19937::result_type seed;
|
||||
if (syscall(__NR_getrandom, &seed, sizeof(seed), 0) < 0) {
|
||||
// This can happen if device is running a too low Linux version
|
||||
if (access("/dev/urandom", F_OK) != 0)
|
||||
mknod("/dev/urandom", 0600 | S_IFCHR, makedev(1, 9));
|
||||
int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
xxread(fd, &seed, sizeof(seed));
|
||||
close(fd);
|
||||
}
|
||||
static std::mt19937 gen([]{
|
||||
if (access("/dev/urandom", F_OK) != 0)
|
||||
mknod("/dev/urandom", 0600 | S_IFCHR, makedev(1, 9));
|
||||
int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
unsigned seed;
|
||||
xxread(fd, &seed, sizeof(seed));
|
||||
return seed;
|
||||
}());
|
||||
uniform_int_distribution<int> dist(0, sizeof(ALPHANUM) - 2);
|
||||
std::uniform_int_distribution<int> dist(0, sizeof(ALPHANUM) - 2);
|
||||
if (varlen) {
|
||||
uniform_int_distribution<int> len_dist(len / 2, len);
|
||||
std::uniform_int_distribution<int> len_dist(len / 2, len);
|
||||
len = len_dist(gen);
|
||||
}
|
||||
for (int i = 0; i < len - 1; ++i)
|
||||
|
@@ -9,7 +9,7 @@
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#define ZYGISK_API_VERSION 2
|
||||
#define ZYGISK_API_VERSION 3
|
||||
|
||||
/*
|
||||
|
||||
@@ -98,6 +98,7 @@ struct AppSpecializeArgs {
|
||||
jint &gid;
|
||||
jintArray &gids;
|
||||
jint &runtime_flags;
|
||||
jobjectArray &rlimits;
|
||||
jint &mount_external;
|
||||
jstring &se_info;
|
||||
jstring &nice_name;
|
||||
@@ -105,6 +106,7 @@ struct AppSpecializeArgs {
|
||||
jstring &app_data_dir;
|
||||
|
||||
// Optional arguments. Please check whether the pointer is null before de-referencing
|
||||
jintArray *const fds_to_ignore;
|
||||
jboolean *const is_child_zygote;
|
||||
jboolean *const is_top_app;
|
||||
jobjectArray *const pkg_data_info_list;
|
||||
|
@@ -87,7 +87,7 @@ class ForkAndSpec(JNIHook):
|
||||
return 'nativeForkAndSpecialize'
|
||||
|
||||
def init_args(self):
|
||||
return 'AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);'
|
||||
return 'AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);'
|
||||
|
||||
def body(self):
|
||||
decl = ''
|
||||
@@ -118,7 +118,7 @@ class ForkServer(ForkAndSpec):
|
||||
return 'nativeForkSystemServer'
|
||||
|
||||
def init_args(self):
|
||||
return 'ServerSpecializeArgsImpl args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);'
|
||||
return 'ServerSpecializeArgs_v1 args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);'
|
||||
|
||||
# Common args
|
||||
uid = Argument('uid', jint)
|
||||
@@ -134,7 +134,7 @@ instruction_set = Argument('instruction_set', jstring)
|
||||
app_data_dir = Argument('app_data_dir', jstring)
|
||||
|
||||
# o
|
||||
fds_to_ignore = Argument('fds_to_ignore', jintArray)
|
||||
fds_to_ignore = Argument('fds_to_ignore', jintArray, True)
|
||||
|
||||
# p
|
||||
is_child_zygote = Argument('is_child_zygote', jboolean, True)
|
||||
|
@@ -43,8 +43,8 @@ void name##_post();
|
||||
struct HookContext {
|
||||
JNIEnv *env;
|
||||
union {
|
||||
AppSpecializeArgsImpl *args;
|
||||
ServerSpecializeArgsImpl *server_args;
|
||||
AppSpecializeArgs_v3 *args;
|
||||
ServerSpecializeArgs_v1 *server_args;
|
||||
void *raw_args;
|
||||
};
|
||||
const char *process;
|
||||
@@ -292,10 +292,11 @@ bool ZygiskModule::RegisterModule(ApiTable *table, long *module) {
|
||||
|
||||
// Fill in API accordingly with module API version
|
||||
switch (ver) {
|
||||
case 3:
|
||||
case 2:
|
||||
table->v2.getModuleDir = [](ZygiskModule *m) { return m->getModuleDir(); };
|
||||
table->v2.getFlags = [](auto) { return ZygiskModule::getFlags(); };
|
||||
[[fallthrough]];
|
||||
// fallthrough
|
||||
case 1:
|
||||
table->v1.hookJniNativeMethods = &hookJniNativeMethods;
|
||||
table->v1.pltHookRegister = [](const char *p, const char *s, void *n, void **o) {
|
||||
@@ -391,6 +392,21 @@ void HookContext::run_modules_pre(const vector<int> &fds) {
|
||||
}
|
||||
}
|
||||
|
||||
// Add all ignored fd onto whitelist
|
||||
if (state[APP_SPECIALIZE] && args->fds_to_ignore) {
|
||||
if (jintArray fdsToIgnore = *args->fds_to_ignore) {
|
||||
int len = env->GetArrayLength(fdsToIgnore);
|
||||
int *arr = env->GetIntArrayElements(fdsToIgnore, nullptr);
|
||||
for (int i = 0; i < len; ++i) {
|
||||
int fd = arr[i];
|
||||
if (fd >= 0 && fd < 1024) {
|
||||
open_fds[fd] = true;
|
||||
}
|
||||
}
|
||||
env->ReleaseIntArrayElements(fdsToIgnore, arr, JNI_ABORT);
|
||||
}
|
||||
}
|
||||
|
||||
// Close all unrecorded fds
|
||||
rewinddir(dir.get());
|
||||
for (dirent *entry; (entry = xreaddir(dir.get()));) {
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
void *nativeForkAndSpecialize_orig = nullptr;
|
||||
jint nativeForkAndSpecialize_l(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -14,7 +14,8 @@ jint nativeForkAndSpecialize_l(JNIEnv *env, jclass clazz, jint uid, jint gid, ji
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_o(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -26,7 +27,8 @@ jint nativeForkAndSpecialize_o(JNIEnv *env, jclass clazz, jint uid, jint gid, ji
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_p(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
@@ -39,7 +41,8 @@ jint nativeForkAndSpecialize_p(JNIEnv *env, jclass clazz, jint uid, jint gid, ji
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_q_alt(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
args.is_top_app = &is_top_app;
|
||||
HookContext ctx;
|
||||
@@ -53,7 +56,8 @@ jint nativeForkAndSpecialize_q_alt(JNIEnv *env, jclass clazz, jint uid, jint gid
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_r(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
args.is_top_app = &is_top_app;
|
||||
args.pkg_data_info_list = &pkg_data_info_list;
|
||||
@@ -71,7 +75,7 @@ jint nativeForkAndSpecialize_r(JNIEnv *env, jclass clazz, jint uid, jint gid, ji
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_samsung_m(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _0, jint _1, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -83,7 +87,7 @@ jint nativeForkAndSpecialize_samsung_m(JNIEnv *env, jclass clazz, jint uid, jint
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_samsung_n(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _2, jint _3, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir, jint _4) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -95,7 +99,8 @@ jint nativeForkAndSpecialize_samsung_n(JNIEnv *env, jclass clazz, jint uid, jint
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_samsung_o(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _5, jint _6, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -107,7 +112,8 @@ jint nativeForkAndSpecialize_samsung_o(JNIEnv *env, jclass clazz, jint uid, jint
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkAndSpecialize_samsung_p(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _7, jint _8, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.fds_to_ignore = &fds_to_ignore;
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
@@ -170,7 +176,7 @@ constexpr int nativeForkAndSpecialize_methods_num = std::size(nativeForkAndSpeci
|
||||
|
||||
void *nativeSpecializeAppProcess_orig = nullptr;
|
||||
void nativeSpecializeAppProcess_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
@@ -182,7 +188,7 @@ void nativeSpecializeAppProcess_q(JNIEnv *env, jclass clazz, jint uid, jint gid,
|
||||
ctx.nativeSpecializeAppProcess_post();
|
||||
}
|
||||
void nativeSpecializeAppProcess_q_alt(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
args.is_top_app = &is_top_app;
|
||||
HookContext ctx;
|
||||
@@ -195,7 +201,7 @@ void nativeSpecializeAppProcess_q_alt(JNIEnv *env, jclass clazz, jint uid, jint
|
||||
ctx.nativeSpecializeAppProcess_post();
|
||||
}
|
||||
void nativeSpecializeAppProcess_r(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
args.is_top_app = &is_top_app;
|
||||
args.pkg_data_info_list = &pkg_data_info_list;
|
||||
@@ -212,7 +218,7 @@ void nativeSpecializeAppProcess_r(JNIEnv *env, jclass clazz, jint uid, jint gid,
|
||||
ctx.nativeSpecializeAppProcess_post();
|
||||
}
|
||||
void nativeSpecializeAppProcess_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _9, jint _10, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||
AppSpecializeArgsImpl args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||
args.is_child_zygote = &is_child_zygote;
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
@@ -249,7 +255,7 @@ constexpr int nativeSpecializeAppProcess_methods_num = std::size(nativeSpecializ
|
||||
|
||||
void *nativeForkSystemServer_orig = nullptr;
|
||||
jint nativeForkSystemServer_l(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
|
||||
ServerSpecializeArgsImpl args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||
ServerSpecializeArgs_v1 args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
@@ -261,7 +267,7 @@ jint nativeForkSystemServer_l(JNIEnv *env, jclass clazz, jint uid, jint gid, jin
|
||||
return ctx.pid;
|
||||
}
|
||||
jint nativeForkSystemServer_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jint _11, jint _12, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
|
||||
ServerSpecializeArgsImpl args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||
ServerSpecializeArgs_v1 args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||
HookContext ctx;
|
||||
ctx.env = env;
|
||||
ctx.raw_args = &args;
|
||||
|
@@ -4,11 +4,39 @@
|
||||
|
||||
namespace {
|
||||
|
||||
using module_abi_v1 = zygisk::internal::module_abi;
|
||||
struct HookContext;
|
||||
struct ZygiskModule;
|
||||
|
||||
struct AppSpecializeArgsImpl {
|
||||
struct AppSpecializeArgs_v3 {
|
||||
jint &uid;
|
||||
jint &gid;
|
||||
jintArray &gids;
|
||||
jint &runtime_flags;
|
||||
jobjectArray &rlimits;
|
||||
jint &mount_external;
|
||||
jstring &se_info;
|
||||
jstring &nice_name;
|
||||
jstring &instruction_set;
|
||||
jstring &app_data_dir;
|
||||
|
||||
jintArray *fds_to_ignore = nullptr;
|
||||
jboolean *is_child_zygote = nullptr;
|
||||
jboolean *is_top_app = nullptr;
|
||||
jobjectArray *pkg_data_info_list = nullptr;
|
||||
jobjectArray *whitelisted_data_info_list = nullptr;
|
||||
jboolean *mount_data_dirs = nullptr;
|
||||
jboolean *mount_storage_dirs = nullptr;
|
||||
|
||||
AppSpecializeArgs_v3(
|
||||
jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
||||
jobjectArray &rlimits, jint &mount_external, jstring &se_info, jstring &nice_name,
|
||||
jstring &instruction_set, jstring &app_data_dir) :
|
||||
uid(uid), gid(gid), gids(gids), runtime_flags(runtime_flags), rlimits(rlimits),
|
||||
mount_external(mount_external), se_info(se_info), nice_name(nice_name),
|
||||
instruction_set(instruction_set), app_data_dir(app_data_dir) {}
|
||||
};
|
||||
|
||||
struct AppSpecializeArgs_v1 {
|
||||
jint &uid;
|
||||
jint &gid;
|
||||
jintArray &gids;
|
||||
@@ -19,24 +47,35 @@ struct AppSpecializeArgsImpl {
|
||||
jstring &instruction_set;
|
||||
jstring &app_data_dir;
|
||||
|
||||
/* Optional */
|
||||
jboolean *is_child_zygote = nullptr;
|
||||
jboolean *is_top_app = nullptr;
|
||||
jobjectArray *pkg_data_info_list = nullptr;
|
||||
jobjectArray *whitelisted_data_info_list = nullptr;
|
||||
jboolean *mount_data_dirs = nullptr;
|
||||
jboolean *mount_storage_dirs = nullptr;
|
||||
jboolean *const is_child_zygote;
|
||||
jboolean *const is_top_app;
|
||||
jobjectArray *const pkg_data_info_list;
|
||||
jobjectArray *const whitelisted_data_info_list;
|
||||
jboolean *const mount_data_dirs;
|
||||
jboolean *const mount_storage_dirs;
|
||||
|
||||
AppSpecializeArgsImpl(
|
||||
jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
||||
jint &mount_external, jstring &se_info, jstring &nice_name,
|
||||
jstring &instruction_set, jstring &app_data_dir) :
|
||||
uid(uid), gid(gid), gids(gids), runtime_flags(runtime_flags),
|
||||
mount_external(mount_external), se_info(se_info), nice_name(nice_name),
|
||||
instruction_set(instruction_set), app_data_dir(app_data_dir) {}
|
||||
AppSpecializeArgs_v1(const AppSpecializeArgs_v3 *v3) :
|
||||
uid(v3->uid), gid(v3->gid), gids(v3->gids), runtime_flags(v3->runtime_flags),
|
||||
mount_external(v3->mount_external), se_info(v3->se_info), nice_name(v3->nice_name),
|
||||
instruction_set(v3->instruction_set), app_data_dir(v3->app_data_dir),
|
||||
is_child_zygote(v3->is_child_zygote), is_top_app(v3->is_top_app),
|
||||
pkg_data_info_list(v3->pkg_data_info_list),
|
||||
whitelisted_data_info_list(v3->whitelisted_data_info_list),
|
||||
mount_data_dirs(v3->mount_data_dirs), mount_storage_dirs(v3->mount_storage_dirs) {}
|
||||
};
|
||||
|
||||
struct ServerSpecializeArgsImpl {
|
||||
struct module_abi_raw {
|
||||
long api_version;
|
||||
void *_this;
|
||||
void (*preAppSpecialize)(void *, void *);
|
||||
void (*postAppSpecialize)(void *, const void *);
|
||||
void (*preServerSpecialize)(void *, void *);
|
||||
void (*postServerSpecialize)(void *, const void *);
|
||||
};
|
||||
|
||||
using module_abi_v1 = module_abi_raw;
|
||||
|
||||
struct ServerSpecializeArgs_v1 {
|
||||
jint &uid;
|
||||
jint &gid;
|
||||
jintArray &gids;
|
||||
@@ -44,7 +83,7 @@ struct ServerSpecializeArgsImpl {
|
||||
jlong &permitted_capabilities;
|
||||
jlong &effective_capabilities;
|
||||
|
||||
ServerSpecializeArgsImpl(
|
||||
ServerSpecializeArgs_v1(
|
||||
jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
||||
jlong &permitted_capabilities, jlong &effective_capabilities) :
|
||||
uid(uid), gid(gid), gids(gids), runtime_flags(runtime_flags),
|
||||
@@ -63,21 +102,6 @@ enum : uint32_t {
|
||||
PRIVATE_MASK = (0x3u << 30)
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct force_cast_wrapper {
|
||||
template<typename U>
|
||||
operator U() const { return reinterpret_cast<U>(mX); }
|
||||
force_cast_wrapper(T &&x) : mX(std::forward<T>(x)) {}
|
||||
force_cast_wrapper &operator=(const force_cast_wrapper &) = delete;
|
||||
private:
|
||||
T &&mX;
|
||||
};
|
||||
|
||||
template<typename R>
|
||||
force_cast_wrapper<R> force_cast(R &&x) {
|
||||
return force_cast_wrapper<R>(std::forward<R>(x));
|
||||
}
|
||||
|
||||
struct ApiTable {
|
||||
// These first 2 entries are permanent
|
||||
ZygiskModule *module;
|
||||
@@ -100,18 +124,32 @@ struct ApiTable {
|
||||
ApiTable(ZygiskModule *m);
|
||||
};
|
||||
|
||||
#define call_app(method) \
|
||||
switch (*ver) { \
|
||||
case 1: \
|
||||
case 2: { \
|
||||
AppSpecializeArgs_v1 a(args); \
|
||||
v1->method(v1->_this, &a); \
|
||||
break; \
|
||||
} \
|
||||
case 3: \
|
||||
v1->method(v1->_this, args); \
|
||||
break; \
|
||||
}
|
||||
|
||||
struct ZygiskModule {
|
||||
void preAppSpecialize(AppSpecializeArgsImpl *args) const {
|
||||
v1->preAppSpecialize(v1->_this, force_cast(args));
|
||||
|
||||
void preAppSpecialize(AppSpecializeArgs_v3 *args) const {
|
||||
call_app(preAppSpecialize)
|
||||
}
|
||||
void postAppSpecialize(const AppSpecializeArgsImpl *args) const {
|
||||
v1->postAppSpecialize(v1->_this, force_cast(args));
|
||||
void postAppSpecialize(const AppSpecializeArgs_v3 *args) const {
|
||||
call_app(postAppSpecialize)
|
||||
}
|
||||
void preServerSpecialize(ServerSpecializeArgsImpl *args) const {
|
||||
v1->preServerSpecialize(v1->_this, force_cast(args));
|
||||
void preServerSpecialize(ServerSpecializeArgs_v1 *args) const {
|
||||
v1->preServerSpecialize(v1->_this, args);
|
||||
}
|
||||
void postServerSpecialize(const ServerSpecializeArgsImpl *args) const {
|
||||
v1->postServerSpecialize(v1->_this, force_cast(args));
|
||||
void postServerSpecialize(const ServerSpecializeArgs_v1 *args) const {
|
||||
v1->postServerSpecialize(v1->_this, args);
|
||||
}
|
||||
|
||||
int connectCompanion() const;
|
||||
|
@@ -422,15 +422,15 @@ get_flags() {
|
||||
find_boot_image() {
|
||||
BOOTIMAGE=
|
||||
if $RECOVERYMODE; then
|
||||
BOOTIMAGE=`find_block recovery_ramdisk$SLOT recovery$SLOT sos`
|
||||
BOOTIMAGE=$(find_block "recovery_ramdisk$SLOT" "recovery$SLOT" "sos")
|
||||
elif [ ! -z $SLOT ]; then
|
||||
BOOTIMAGE=`find_block ramdisk$SLOT recovery_ramdisk$SLOT boot$SLOT`
|
||||
BOOTIMAGE=$(find_block "ramdisk$SLOT" "recovery_ramdisk$SLOT" "init_boot$SLOT" "boot$SLOT")
|
||||
else
|
||||
BOOTIMAGE=`find_block ramdisk recovery_ramdisk kern-a android_boot kernel bootimg boot lnx boot_a`
|
||||
BOOTIMAGE=$(find_block ramdisk recovery_ramdisk kern-a android_boot kernel bootimg init_boot boot lnx boot_a)
|
||||
fi
|
||||
if [ -z $BOOTIMAGE ]; then
|
||||
# Lets see what fstabs tells me
|
||||
BOOTIMAGE=`grep -v '#' /etc/*fstab* | grep -E '/boot(img)?[^a-zA-Z]' | grep -oE '/dev/[a-zA-Z0-9_./-]*' | head -n 1`
|
||||
BOOTIMAGE=$(grep -v '#' /etc/*fstab* | grep -E '/boot(img)?[^a-zA-Z]' | grep -oE '/dev/[a-zA-Z0-9_./-]*' | head -n 1)
|
||||
fi
|
||||
}
|
||||
|
||||
|
@@ -106,12 +106,15 @@ public class DynLoad {
|
||||
if (Build.VERSION.SDK_INT < 29)
|
||||
replaceClassLoader(context);
|
||||
|
||||
// noinspection InlinedApi
|
||||
int flags = PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES
|
||||
| PackageManager.GET_PROVIDERS | PackageManager.GET_RECEIVERS;
|
||||
| PackageManager.GET_PROVIDERS | PackageManager.GET_RECEIVERS
|
||||
| PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
|
||||
var pm = context.getPackageManager();
|
||||
|
||||
final PackageInfo info;
|
||||
try {
|
||||
// noinspection WrongConstant
|
||||
info = pm.getPackageInfo(context.getPackageName(), flags);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
// Impossible
|
||||
@@ -122,6 +125,7 @@ public class DynLoad {
|
||||
|
||||
final var cl = loadApk(context);
|
||||
if (cl != null) try {
|
||||
// noinspection WrongConstant
|
||||
var pkgInfo = pm.getPackageArchiveInfo(apk.getPath(), flags);
|
||||
cl.updateComponentMap(info, pkgInfo);
|
||||
|
||||
@@ -162,7 +166,6 @@ public class DynLoad {
|
||||
}
|
||||
|
||||
// Replace LoadedApk mClassLoader
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
private static void replaceClassLoader(Context context) {
|
||||
// Get ContextImpl
|
||||
while (context instanceof ContextWrapper) {
|
||||
@@ -173,6 +176,7 @@ public class DynLoad {
|
||||
Field mInfo = context.getClass().getDeclaredField("mPackageInfo");
|
||||
mInfo.setAccessible(true);
|
||||
Object loadedApk = mInfo.get(context);
|
||||
assert loadedApk != null;
|
||||
Field mcl = loadedApk.getClass().getDeclaredField("mClassLoader");
|
||||
mcl.setAccessible(true);
|
||||
mcl.set(loadedApk, new DelegateClassLoader());
|
||||
|
@@ -2,4 +2,5 @@
|
||||
<string name="upgrade_msg">완전한 Magisk Manager로 업데이트하여 설치를 마치십시오. 다운로드하고 설치하시겠습니까?</string>
|
||||
<string name="no_internet_msg">인터넷에 연결해 주시기 바랍니다! 완전한 Magisk Manager로 업데이트 해야 합니다.</string>
|
||||
<string name="dling">다운로드중</string>
|
||||
<string name="relaunch_app">앱을 수동으로 재시작 하세요</string>
|
||||
</resources>
|
||||
|
Reference in New Issue
Block a user