From eac658f03324934c69dcc3a09536054cfea22617 Mon Sep 17 00:00:00 2001 From: Konrad Kollnig <5175206+kasnder@users.noreply.github.com> Date: Wed, 5 Aug 2026 11:45:41 +0200 Subject: [PATCH 1/2] Stop asking about Private DNS during onboarding, notify when it breaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Blocking DoT on port 853 is on by default, so Private DNS on "automatic" now resolves itself: Android falls back to plaintext and tracker detection carries on. The onboarding slide asks the user to go turn a setting off that no longer costs them anything, in the middle of the one flow where attention is scarcest. "Hostname" mode is the case that still breaks, and it breaks harder than the slide ever conveyed: Android does not fall back to plaintext for a resolver the user pinned by name, so DNS simply fails and nothing loads. Onboarding is also the wrong place to say so — it fires once, before the user has any traffic to lose, and says nothing to whoever turns Private DNS on next week. Notify from where the tunnel is built instead, so the reason arrives when the failure does, naming the configured resolver and opening the network settings that hold the switch. Clear that notification and the local network one on VPN stop, but not on a temporary one: re-posting a cancelled notification alerts again, and these two describe configuration that has not changed, so cancelling on every incoming call buzzes the user each time the VPN returns. The WireGuard error notification wants the opposite, once it can retract itself. stopInternal() never cleared lastError, and the state listener checks lastError before isRunning — deliberately, so a start that fails without ever producing a tunnel still reports — so a stopped tunnel went on reporting its final error and the listener's isRunning branch could never run. Clear it there, and the listener retracts the notification as the tunnel goes down, which is more accurate than holding a tunnel error over a tunnel that no longer exists. The call in stop() stays for the case the listener cannot see, a failed start with no tunnel to tear down. Util.isPrivateDns() had no callers left once the slide went; the notification uses getPrivateDnsSpecifier(), which is non-null only in the mode that actually breaks. Co-Authored-By: Claude Opus 5 --- .../eu/faircode/netguard/ServiceSinkhole.java | 66 +++++++++++++++++++ .../main/java/eu/faircode/netguard/Util.java | 8 --- .../missioncontrol/ActivityOnboarding.java | 35 +--------- .../net/kollnig/missioncontrol/wg/WgEgress.kt | 5 ++ app/src/main/res/values/strings.xml | 8 +-- 5 files changed, 75 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index e18113017..13e4dab62 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -231,6 +231,7 @@ public class ServiceSinkhole extends VpnService { private static final int NOTIFY_DOH_ERROR = 11; private static final int NOTIFY_WG_ERROR = 12; private static final int NOTIFY_LOCAL_NETWORK = 13; + private static final int NOTIFY_PRIVATE_DNS = 14; public static final String EXTRA_COMMAND = "Command"; private static final String EXTRA_REASON = "Reason"; @@ -706,7 +707,20 @@ private void stop(boolean temporary) { net.kollnig.missioncontrol.wg.WgEgress.INSTANCE.stop( () -> { jni_wireguard_stop(); return kotlin.Unit.INSTANCE; }); jni_wireguard_required(false); + // WgEgress clears its error as it tears the tunnel down, so the + // state listener already retracts this one; the call remains for + // the case it cannot see, a start that failed without ever + // producing a tunnel, where stop() finds nothing to notify about. clearWireGuardErrorNotification(); + // The other two are config warnings nothing else retracts, and + // both describe a tunnel that is no longer running — but leave + // them on a temporary stop (a call, say): the VPN is coming + // straight back, and re-posting a cancelled notification alerts + // again, so the user would be buzzed on every call. + if (!temporary) { + clearLocalNetworkNotification(); + clearPrivateDnsNotification(); + } unprepare(); // Stop DoH proxy @@ -1674,6 +1688,18 @@ private Builder getBuilder(List listAllowed, List listRule) { } else clearLocalNetworkNotification(); + // Blocking port 853 is what lets us keep seeing DNS: with Private DNS on + // "automatic", Android falls back to plaintext and detection carries on. + // In "hostname" mode it does not fall back — the user picked that + // resolver explicitly, so DNS simply fails and nothing resolves. That + // looks like TC broke the connection, with no hint of why, so say it. + if (prefs.getBoolean("block_dot", true) && Util.getPrivateDnsSpecifier(this) != null) { + Log.w(TAG, "Private DNS set to a hostname: DoT is blocked and Android will not" + + " fall back to plaintext DNS, so name resolution fails"); + showPrivateDnsNotification(); + } else + clearPrivateDnsNotification(); + // Dynamically exclude carrier ePDG IPs so Wi-Fi calling works globally. // ePDG domains follow 3GPP standard: epdg.epc.mnc{MNC}.mcc{MCC}.pub.3gppnetwork.org // TC excludes itself from the VPN (addDisallowedApplication), so this DNS resolution @@ -3776,6 +3802,46 @@ private void clearLocalNetworkNotification() { NotificationManagerCompat.from(this).cancel(NOTIFY_LOCAL_NETWORK); } + /** + * Private DNS is pinned to a hostname while we block DoT, which leaves the + * device with no working resolver. Opens the network settings, where the + * setting lives; naming the resolver makes clear which one is meant. + */ + private void showPrivateDnsNotification() { + Intent settings = new Intent(Settings.ACTION_WIRELESS_SETTINGS); + if (settings.resolveActivity(getPackageManager()) == null) + settings = new Intent(Settings.ACTION_WIFI_SETTINGS); + PendingIntent pi = PendingIntentCompat.getActivity(this, NOTIFY_PRIVATE_DNS, settings, + PendingIntent.FLAG_UPDATE_CURRENT); + + String detail = getString(R.string.msg_private_dns_notify, + Util.getPrivateDnsSpecifier(this)); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "notify"); + builder.setSmallIcon(R.drawable.ic_error_white_24dp) + .setContentTitle(getString(R.string.msg_private_dns_title)) + .setContentText(detail) + .setContentIntent(pi) + .setColor(getResources().getColor(R.color.colorTrackerControl)) + .setOngoing(false) + .setAutoCancel(true) + // Rebuilt on every network change; alert once, then sit quietly. + .setOnlyAlertOnce(true); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + builder.setCategory(NotificationCompat.CATEGORY_STATUS) + .setVisibility(NotificationCompat.VISIBILITY_SECRET); + + NotificationCompat.BigTextStyle notification = new NotificationCompat.BigTextStyle(builder); + notification.bigText(detail); + + Util.notify(this, NOTIFY_PRIVATE_DNS, notification.build()); + } + + private void clearPrivateDnsNotification() { + NotificationManagerCompat.from(this).cancel(NOTIFY_PRIVATE_DNS); + } + private void showUpdateNotification(String name, String url) { if (Util.isFDroidInstall()) return; diff --git a/app/src/main/java/eu/faircode/netguard/Util.java b/app/src/main/java/eu/faircode/netguard/Util.java index 153bfb0e4..82c1ec715 100644 --- a/app/src/main/java/eu/faircode/netguard/Util.java +++ b/app/src/main/java/eu/faircode/netguard/Util.java @@ -260,14 +260,6 @@ public static boolean isEU(String country) { return (country != null && listEU.contains(country.toUpperCase())); } - public static boolean isPrivateDns(Context context) { - String dns_mode = Settings.Global.getString(context.getContentResolver(), "private_dns_mode"); - Log.i(TAG, "Private DNS mode=" + dns_mode); - if (dns_mode == null) - dns_mode = "off"; - return (!"off".equals(dns_mode)); - } - public static String getNetworkGeneration(int networkType) { switch (networkType) { case TelephonyManager.NETWORK_TYPE_1xRTT: diff --git a/app/src/main/java/net/kollnig/missioncontrol/ActivityOnboarding.java b/app/src/main/java/net/kollnig/missioncontrol/ActivityOnboarding.java index e20d982a6..14f4529bb 100644 --- a/app/src/main/java/net/kollnig/missioncontrol/ActivityOnboarding.java +++ b/app/src/main/java/net/kollnig/missioncontrol/ActivityOnboarding.java @@ -242,20 +242,8 @@ private void setupSlides() { // } // } - // 7. Private DNS (Mandatory) - boolean privateDnsEnabled = Util.isPrivateDns(this); - if (privateDnsEnabled) { - slides.add(new Slide( - R.string.onboarding_privatedns_title, - getText(R.string.onboarding_privatedns_title), - android.text.TextUtils.concat(getText(R.string.onboarding_privatedns_desc), "\n\n", - android.text.Html - .fromHtml("" + getString(R.string.onboarding_privatedns_instruction) + "")), - R.drawable.screen, - getString(R.string.onboarding_privatedns_action), - R.string.onboarding_privatedns_skip_msg, - null)); - } + // 7. Private DNS - no longer asked about: DoT (port 853) is blocked by + // default, so Android falls back to plaintext DNS on its own. // 8. Timeline slides.add(new Slide( @@ -394,25 +382,6 @@ private void refreshSlides() { // }; // } - // 7. Private DNS - if (slide.titleResId == R.string.onboarding_privatedns_title) { - boolean privateDnsEnabled = Util.isPrivateDns(this); - slide.actionButtonText = privateDnsEnabled ? getString(R.string.onboarding_privatedns_action) - : getString(R.string.onboarding_action_disabled); - slide.warningResId = privateDnsEnabled ? R.string.onboarding_privatedns_skip_msg : 0; - if (privateDnsEnabled) { - slide.actionListener = v -> { - Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); - if (intent.resolveActivity(getPackageManager()) == null) { - intent = new Intent(Settings.ACTION_WIFI_SETTINGS); - } - startActivity(intent); - }; - } else { - slide.actionListener = null; - } - } - // Lockdown if (slide.titleResId == R.string.onboarding_lockdown_title) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { diff --git a/app/src/main/java/net/kollnig/missioncontrol/wg/WgEgress.kt b/app/src/main/java/net/kollnig/missioncontrol/wg/WgEgress.kt index 5b92ff665..ff1928173 100644 --- a/app/src/main/java/net/kollnig/missioncontrol/wg/WgEgress.kt +++ b/app/src/main/java/net/kollnig/missioncontrol/wg/WgEgress.kt @@ -699,6 +699,11 @@ object WgEgress { currentKeepaliveAlwaysOn = false lastCheapRecoveryMs = 0 verificationGeneration++ + // An error describes a tunnel that no longer exists. Listeners check + // lastError before isRunning — deliberately, so a start that fails + // without ever producing a tunnel still reports — so leaving it set + // here kept a stopped tunnel reporting its final error forever. + lastError = null if (t != null) { try { t.stop() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3dc0023a5..c6ff7cfd5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -696,6 +696,8 @@ Sincerely,\n\n]]> Tap to allow local network access, which Android asks about as \"nearby devices\". Android 17 blocks it by default, so your own DNS server, Secure DNS resolver, WireGuard peer or proxy cannot be reached. Local network access needed TrackerControl cannot reach your own DNS server, Secure DNS resolver, WireGuard peer or proxy, so name resolution may fail. Android 17 requires permission for this, which Android asks about as \"nearby devices\". Tap to open TrackerControl and allow it. + Private DNS blocks name resolution + Android\'s \"Private DNS\" is set to %1$s, and TrackerControl blocks encrypted DNS so it can detect trackers. Android does not fall back to normal DNS in this mode, so nothing will load. Tap to set Private DNS to \"Automatic\" or \"Off\" — TrackerControl offers its own Secure DNS in Settings. Monitor system apps Route system apps (Play Services, carrier services, etc.) through the VPN so their trackers are detected and blocked, and show them in the app list.\n\nOff by default: excluding system apps is friendlier to battery, because their background traffic no longer wakes the VPN. Turning this on conflicts with \"Block connections without VPN\" in the Android VPN settings, which must be DISABLED. @@ -727,12 +729,6 @@ Sincerely,\n\n]]> Allow Notifications Without notification permissions, you will not be able to see real-time updates or control protection from the status bar. Are you sure? - Disable Private DNS - Android\'s \"Private DNS\" feature interferes with TrackerControl\'s ability to block trackers. This setting must be set to \"Off\" to proceed. - Settings -> Network & internet -> Private DNS -> Off. - Open DNS Settings - Skip Private DNS Disabling? - Proceeding with Private DNS enabled will heavily restrict TrackerControl. Most tracking will not be blocked, leaving only the tracker library analysis. Additionally, the VPN filter will be disabled to ensure basic functionality. Watch the Timeline Fill Up TrackerControl starts on the Timeline. At first it can be empty: apps usually contact trackers only while you use them.\n\nAfter finishing setup, open a few apps, then return to TrackerControl to see detected and blocked tracking activity. From e733f632c22dbd3a0bc3de4fcfda6d2aa70b3857 Mon Sep 17 00:00:00 2001 From: Konrad Kollnig <5175206+kasnder@users.noreply.github.com> Date: Wed, 5 Aug 2026 12:53:01 +0200 Subject: [PATCH 2/2] Gate the Private DNS notification on mode, not the specifier isPrivateDnsHostnameMode() checks private_dns_mode directly, so a resolver that reads back null for any reason no longer silently suppresses the warning in exactly the configuration that is broken; the specifier is now read once and passed through instead of a second Settings lookup, and a missing specifier falls back to generic text instead of interpolating "null". Also drops the onboarding_privatedns_* strings left behind in seven locale files after the onboarding slide was removed. --- .../eu/faircode/netguard/ServiceSinkhole.java | 8 ++++---- app/src/main/java/eu/faircode/netguard/Util.java | 16 ++++++++++++---- app/src/main/res/values-fi-rFI/strings.xml | 6 ------ app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 6 ------ app/src/main/res/values-ru-rRU/strings.xml | 6 ------ app/src/main/res/values-sl-rSI/strings.xml | 6 ------ app/src/main/res/values-uk-rUA/strings.xml | 6 ------ app/src/main/res/values-zh-rCN/strings.xml | 6 ------ app/src/main/res/values/strings.xml | 1 + 10 files changed, 17 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index 13e4dab62..1f060e805 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -1693,10 +1693,10 @@ private Builder getBuilder(List listAllowed, List listRule) { // In "hostname" mode it does not fall back — the user picked that // resolver explicitly, so DNS simply fails and nothing resolves. That // looks like TC broke the connection, with no hint of why, so say it. - if (prefs.getBoolean("block_dot", true) && Util.getPrivateDnsSpecifier(this) != null) { + if (prefs.getBoolean("block_dot", true) && Util.isPrivateDnsHostnameMode(this)) { Log.w(TAG, "Private DNS set to a hostname: DoT is blocked and Android will not" + " fall back to plaintext DNS, so name resolution fails"); - showPrivateDnsNotification(); + showPrivateDnsNotification(Util.getPrivateDnsSpecifier(this)); } else clearPrivateDnsNotification(); @@ -3807,7 +3807,7 @@ private void clearLocalNetworkNotification() { * device with no working resolver. Opens the network settings, where the * setting lives; naming the resolver makes clear which one is meant. */ - private void showPrivateDnsNotification() { + private void showPrivateDnsNotification(String specifier) { Intent settings = new Intent(Settings.ACTION_WIRELESS_SETTINGS); if (settings.resolveActivity(getPackageManager()) == null) settings = new Intent(Settings.ACTION_WIFI_SETTINGS); @@ -3815,7 +3815,7 @@ private void showPrivateDnsNotification() { PendingIntent.FLAG_UPDATE_CURRENT); String detail = getString(R.string.msg_private_dns_notify, - Util.getPrivateDnsSpecifier(this)); + specifier != null ? specifier : getString(R.string.msg_private_dns_unknown_resolver)); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "notify"); builder.setSmallIcon(R.drawable.ic_error_white_24dp) diff --git a/app/src/main/java/eu/faircode/netguard/Util.java b/app/src/main/java/eu/faircode/netguard/Util.java index 82c1ec715..5ed4b2405 100644 --- a/app/src/main/java/eu/faircode/netguard/Util.java +++ b/app/src/main/java/eu/faircode/netguard/Util.java @@ -556,12 +556,20 @@ public static String getProtocolName(int protocol, int version, boolean brief) { return ((brief ? b : p) + (version > 0 ? version : "")); } - public static String getPrivateDnsSpecifier(Context context) { + /** + * Whether Android's Private DNS is pinned to a specific resolver hostname + * ("hostname" mode) rather than left on "automatic" or turned off. In this + * mode Android does not fall back to plaintext DNS when DoT is blocked. + */ + public static boolean isPrivateDnsHostnameMode(Context context) { String dns_mode = Settings.Global.getString(context.getContentResolver(), "private_dns_mode"); - if ("hostname".equals(dns_mode)) - return Settings.Global.getString(context.getContentResolver(), "private_dns_specifier"); - else + return "hostname".equals(dns_mode); + } + + public static String getPrivateDnsSpecifier(Context context) { + if (!isPrivateDnsHostnameMode(context)) return null; + return Settings.Global.getString(context.getContentResolver(), "private_dns_specifier"); } public interface DoubtListener { diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 2a91a5e92..c95c9dbee 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -400,12 +400,6 @@ Ystävällisin terveisin,\n\n]]> Salli ilmoitukset, jotta voit nähdä reaaliaikaiset päivitykset ja hallita suojausta suoraan tilapalkista. Salli ilmoitukset Ilman ilmoituslupaa et voi nähdä reaaliaikaisia päivityksiä tai hallita suojausta tilapalkista. Oletko varma? - Poista yksityinen DNS käytöstä - Androidin ”Yksityinen DNS” -ominaisuus häiritsee TrackerControlin kykyä estää seurantalaitteita. Tämä asetus on asetettava ”Pois päältä” -tilaan, jotta voit jatkaa. - Asetukset -> Verkko & Internet -> Yksityinen DNS -> POIS. - Avaa DNS-asetukset - Ohita yksityisen DNS:n päältä poisto? - Jatkaessasi yksityisen DNS:n ollessa käytössä TrackerControlin toiminta rajoittuu huomattavasti. Suurin osa seurannasta ei esty, vaan jäljelle jää vain seurantakirjaston analysointi. Lisäksi VPN-suodatin poistetaan käytöstä perusominaisuuksien toimivuuden varmistamiseksi. Rajoittamaton verkko Tietojen tallennusasetukset voivat estää TrackerControlin toimimasta oikein taustalla. Anna rajoittamaton käyttöoikeus, jotta saat luotettavimman suojan. Myönnä rajoittamaton käyttöoikeus diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 01b39141c..3024a1114 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -541,8 +541,6 @@ Cordialement,\n\n]]> Sans désactiver l\'optimisation de la batterie, TrackerControl peut être couper par Android à tout moment. Êtes-vous sûr de vouloir continuer ? Restez informé Autoriser les notifications - Désactiver le DNS privé - Ouvrir les paramètres DNS Paramètres de verrouillage VPN Ouvrir les paramètres VPN DNS sécurisé (fonctionnalité béta ; peut ne pas fonctionner comme prévu) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2882725b1..9c607c4c8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -409,12 +409,6 @@ O seu tráfego de internet não está sendo enviado para um servidor VPN remoto. Permite notificações para ver atualizações em tempo real e controlar a proteção diretamente na barra de status. Permitir notificações Sem permissões de notificação, você não poderá ver atualizações ou proteção de controle em tempo real na barra de status. Tem certeza? - Desabilitar DNS privado - O recurso \"DNS privado\" do Android interfere com a capacidade do TrackerControl de bloquear rastreadores. Esta configuração deve ser definida como desativada para continuar. - Configurações -> Rede & Internet -> DNS privado -> Desligado. - Abrir configurações de DNS - Ignorar o DNS privado desativado? - Prosseguir com DNS privado habilitado irá restringir fortemente o TrackerControl. A maioria do rastreamento não será bloqueada, deixando apenas a análise da biblioteca de rastreamento. Além disso, o filtro da VPN será desativado para garantir as funcionalidades básicas. Rede irrestrita A Economia de dados pode impedir que o TrackerControl funcione corretamente em segundo plano. Conceda acesso irrestrito para uma proteção mais confiável. Conceder acesso irrestrito diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 3e468c2fc..247c96d2e 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -434,12 +434,6 @@ Разрешить уведомления, чтобы видеть обновления в режиме реального времени и управлять защитой непосредственно из строки состояния. Разрешить уведомления Без разрешения на показ уведомлений вы не сможете видеть обновления или управлять защитой из строки состояния. Вы уверены? - Отключить приватный DNS - Android-функция \"Private DNS\" препятствует возможности TrackerControl блокировать трекеры. Эта настройка должна быть \"Выключено\" для продолжения. - Настройки -> Сеть & Интернет -> Частный DNS -> Выключить. - Открыть настройки DNS - Пропустить отключение приватного DNS? - Включение приватного DNS сильно ограничит TrackerControl. Большинство треков не будет блокироваться, оставляя только анализ библиотеки трекеров. Кроме того, фильтр VPN будет отключен для обеспечения базовой функциональности. Не ограничивать сеть Data Saving может предотвратить корректную работу TrackerControl в фоновом режиме. Предоставьте неограниченный доступ для наиболее надежной защиты. Предоставить неограниченный доступ diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index 6d22188c7..eea944e64 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -554,12 +554,6 @@ Vaš internetni promet se ne pošilja na oddaljeni strežnik VPN. Dovoli obvestila, da si ogledate posodobitve v resničnem času in nadzirate zaščito neposredno iz vrstice stanja. Dovoli obvestila Brez dovoljenj za obvestila si ne boste mogli ogledati posodobitev v resničnem času ali nadzirati zaščite iz vrstice stanja. Ali ste prepričani? - Onemogoči zasebni DNS - Androidova značilnost \"Zasebni DNS\" moti zmožnost blokiranja sledilcev programa TrackerControl. Če želite nadaljevati, morate to nastavitev izklopiti. - Nastavitve –> Omrežje in internet –> Zasebni DNS –> Izklopi. - Odpri nastavitve DNS - Preskoči onemogočanje zasebnega DNS-a? - Če nadaljujete z omogočenim zasebnim DNS-om, bo to znatno omejilo TrackerControl. Večina sledenja ne bo blokirana – program bo zmožen samo preučevanja sledilnih knjižnic. Poleg tega bo filter VPN onemogočen, da se zagotovi osnovno delovanje. Oglejte si, kako se časovnica napolni TrackerControl se zažene po časovnici. Na začetku je lahko prazna — programi običajno stopijo v stik s sledilci šele med njihovo uporabo.\n\nKo končate z nastavitvijo odprite nekaj programov in se vrnite v TrackerControl, da si ogledate zaznano in blokirano sledilno dejavnost. Neomejeno omrežje diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index e610d01c1..c6f0cf4db 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -585,12 +585,6 @@ Дозвольте сповіщення, щоб бачити оновлення в режимі реального часу та керувати захистом безпосередньо зі смуги стану. Дозволити сповіщення Без дозволу на отримання сповіщень ви не зможете бачити оновлення в режимі реального часу та керувати захистом із панелі стану. Ви впевнені? - Вимкнути приватний DNS - Функція «Приватний DNS» в Android заважає TrackerControl блокувати трекери. Щоб продовжити, це налаштування необхідно встановити в положення «Вимкнено». - Налаштування -> Мережа & інтернет -> Приватний DNS -> Вимкнено. - Відкрити налаштування DNS - Пропустити вимкнення приватного DNS? - Продовження роботи з увімкненим приватним DNS значно обмежить роботу TrackerControl. Більшість відстежень не буде заблоковано, залишиться лише аналіз бібліотеки трекерів. Крім того, фільтр VPN буде вимкнено, щоб забезпечити базову функціональність. Спостерігайте за заповненням часової шкали TrackerControl запускається на часовій шкалі. Спочатку вона може бути порожньою: зазвичай програми зв’язуються з трекерами лише під час їхнього використання.\n\nПісля завершення налаштування відкрийте кілька програм, а потім поверніться до TrackerControl, щоб переглянути виявлену та заблоковану активність трекерів. Необмежена мережа diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 790adaa3e..e6a01a329 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -580,12 +580,6 @@ 允许通知以直接从状态栏查看实时更新并控制保护。 允许通知 没有通知权限,您将无法从状态栏查看实时更新或控制保护。您确定吗? - 禁用私人DNS - Android 的 Private DNS 功能会妨碍 TrackerControl 拦截跟踪器的能力。要继续此设置 必须设为“关闭”。 - 设置 -> 网络 & 互联网 -> Private DNS -> 关闭。 - 打开 DNS 设置 - 跳过私人DNS禁用? - 在开启 Private DNS 情况下继续会极大限制 TrackControl 的运行。多数跟踪不会被拦截,只剩下跟踪库分析。另外, VPN 过滤器会被禁用来确保基础功能。 观看时间轴填充 通过 TrackerControl 时间轴观察跟踪器活动 。时间轴一开始可能是空的:应用程序通常只在您使用时才与跟踪服务器联系。\n\n完成设置后,打开几个应用程序,然后返回到TrackerControl查看检测到和被阻止的跟踪活动。 不受限制的网络 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6ff7cfd5..055e11626 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -698,6 +698,7 @@ Sincerely,\n\n]]> TrackerControl cannot reach your own DNS server, Secure DNS resolver, WireGuard peer or proxy, so name resolution may fail. Android 17 requires permission for this, which Android asks about as \"nearby devices\". Tap to open TrackerControl and allow it. Private DNS blocks name resolution Android\'s \"Private DNS\" is set to %1$s, and TrackerControl blocks encrypted DNS so it can detect trackers. Android does not fall back to normal DNS in this mode, so nothing will load. Tap to set Private DNS to \"Automatic\" or \"Off\" — TrackerControl offers its own Secure DNS in Settings. + a custom resolver Monitor system apps Route system apps (Play Services, carrier services, etc.) through the VPN so their trackers are detected and blocked, and show them in the app list.\n\nOff by default: excluding system apps is friendlier to battery, because their background traffic no longer wakes the VPN. Turning this on conflicts with \"Block connections without VPN\" in the Android VPN settings, which must be DISABLED.