diff --git a/app/src/main/java/org/itxtech/daedalus/Daedalus.java b/app/src/main/java/org/itxtech/daedalus/Daedalus.java index 29ac467..a72d875 100644 --- a/app/src/main/java/org/itxtech/daedalus/Daedalus.java +++ b/app/src/main/java/org/itxtech/daedalus/Daedalus.java @@ -22,8 +22,8 @@ import org.itxtech.daedalus.activity.MainActivity; import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.util.Configurations; import org.itxtech.daedalus.util.DnsServer; -import org.itxtech.daedalus.util.HostsProvider; -import org.itxtech.daedalus.util.HostsResolver; +import org.itxtech.daedalus.util.RulesProvider; +import org.itxtech.daedalus.util.RulesResolver; import java.io.File; import java.util.ArrayList; @@ -56,10 +56,14 @@ public class Daedalus extends Application { add(new DnsServer("123.206.21.48", R.string.server_aixyz_south_china)); }}; - public static final List HOSTS_PROVIDERS = new ArrayList() {{ - add(new HostsProvider("racaljk/hosts", "https://coding.net/u/scaffrey/p/hosts/git/raw/master/hosts")); - add(new HostsProvider("fengixng/google-hosts", "https://raw.githubusercontent.com/fengixng/google-hosts/master/hosts")); - add(new HostsProvider("sy618/hosts", "https://raw.githubusercontent.com/sy618/hosts/master/ADFQ")); + public static final List HOSTS_PROVIDERS = new ArrayList() {{ + add(new RulesProvider("racaljk/hosts", "https://coding.net/u/scaffrey/p/hosts/git/raw/master/hosts")); + add(new RulesProvider("fengixng/google-hosts", "https://raw.githubusercontent.com/fengixng/google-hosts/master/hosts")); + add(new RulesProvider("sy618/hosts", "https://raw.githubusercontent.com/sy618/hosts/master/ADFQ")); + }}; + + public static final List DNSMASQ_PROVIDERS = new ArrayList() {{ + }}; public static final String[] DEFAULT_TEST_DOMAINS = new String[]{ @@ -73,6 +77,7 @@ public class Daedalus extends Application { public static Configurations configurations; public static String hostsPath; + public static String dnsmasqPath; public static String configPath; private static Daedalus instance = null; @@ -83,10 +88,11 @@ public class Daedalus extends Application { public void onCreate() { super.onCreate(); - mHostsResolver = new Thread(new HostsResolver()); + mHostsResolver = new Thread(new RulesResolver()); mHostsResolver.start(); hostsPath = getExternalFilesDir(null).getPath() + "/hosts"; + dnsmasqPath = getExternalFilesDir(null).getPath() + "/dnsmasq"; configPath = getExternalFilesDir(null).getPath() + "/config.json"; initData(); @@ -114,7 +120,7 @@ public class Daedalus extends Application { }; public static void initHostsResolver() { - if (Daedalus.getPrefs().getBoolean("settings_local_host_resolution", false)) { + if (Daedalus.getPrefs().getBoolean("settings_local_rules_resolution", false)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permission = ActivityCompat.checkSelfPermission(Daedalus.getInstance(), Manifest.permission.WRITE_EXTERNAL_STORAGE); if (MainActivity.getInstance() != null) { @@ -125,8 +131,11 @@ public class Daedalus extends Application { return; } } - HostsResolver.startLoad(hostsPath); - HostsResolver.setPanResolution(Daedalus.getPrefs().getBoolean("settings_pan_resolution", false)); + if (Daedalus.getPrefs().getBoolean("settings_use_dnsmasq", false)) { + RulesResolver.startLoadDnsmasq(dnsmasqPath); + } else { + RulesResolver.startLoadHosts(hostsPath); + } } } public static SharedPreferences getPrefs() { @@ -140,9 +149,9 @@ public class Daedalus extends Application { instance = null; prefs = null; - HostsResolver.shutdown(); + RulesResolver.shutdown(); mHostsResolver.interrupt(); - HostsResolver.clean(); + RulesResolver.clean(); mHostsResolver = null; } diff --git a/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java b/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java index adea9e0..ef7e19f 100644 --- a/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java +++ b/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java @@ -52,7 +52,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public static final int FRAGMENT_DNS_TEST = 1; public static final int FRAGMENT_SETTINGS = 2; public static final int FRAGMENT_ABOUT = 3; - public static final int FRAGMENT_HOSTS = 4; + public static final int FRAGMENT_RULES = 4; public static final int FRAGMENT_DNS_SERVERS = 5; private static MainActivity instance = null; @@ -61,7 +61,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private DnsTestFragment mDnsTest; private SettingsFragment mSettings; private AboutFragment mAbout; - private HostsFragment mHosts; + private RulesFragment mHosts; private DnsServersFragment mDnsServers; private int currentFragment = FRAGMENT_NONE; @@ -160,7 +160,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case FRAGMENT_ABOUT: menu.findItem(R.id.nav_about).setChecked(true); break; - case FRAGMENT_HOSTS: + case FRAGMENT_RULES: menu.findItem(R.id.nav_hosts).setChecked(true); break; case FRAGMENT_DNS_SERVERS: @@ -183,8 +183,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case FRAGMENT_ABOUT: toolbar.setTitle(R.string.action_about); break; - case FRAGMENT_HOSTS: - toolbar.setTitle(R.string.action_hosts); + case FRAGMENT_RULES: + toolbar.setTitle(R.string.action_rules); break; case FRAGMENT_DNS_SERVERS: toolbar.setTitle(R.string.action_dns_servers); @@ -229,13 +229,13 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On toolbar.setTitle(R.string.action_about); currentFragment = FRAGMENT_ABOUT; break; - case FRAGMENT_HOSTS: + case FRAGMENT_RULES: if (mHosts == null) { - mHosts = new HostsFragment(); + mHosts = new RulesFragment(); } transaction.replace(R.id.id_content, mHosts); - toolbar.setTitle(R.string.action_hosts); - currentFragment = FRAGMENT_HOSTS; + toolbar.setTitle(R.string.action_rules); + currentFragment = FRAGMENT_RULES; break; case FRAGMENT_DNS_SERVERS: if (mDnsServers == null) { @@ -327,7 +327,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } if (id == R.id.nav_hosts) { - switchFragment(FRAGMENT_HOSTS); + switchFragment(FRAGMENT_RULES); } if (id == R.id.nav_dns_server) { diff --git a/app/src/main/java/org/itxtech/daedalus/fragment/HostsFragment.java b/app/src/main/java/org/itxtech/daedalus/fragment/RulesFragment.java similarity index 94% rename from app/src/main/java/org/itxtech/daedalus/fragment/HostsFragment.java rename to app/src/main/java/org/itxtech/daedalus/fragment/RulesFragment.java index 39409c2..64c23bf 100644 --- a/app/src/main/java/org/itxtech/daedalus/fragment/HostsFragment.java +++ b/app/src/main/java/org/itxtech/daedalus/fragment/RulesFragment.java @@ -14,7 +14,7 @@ import android.widget.Spinner; import android.widget.TextView; import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.R; -import org.itxtech.daedalus.util.HostsProvider; +import org.itxtech.daedalus.util.RulesProvider; import java.io.*; import java.net.URL; @@ -33,7 +33,7 @@ import java.util.Date; * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. */ -public class HostsFragment extends Fragment { +public class RulesFragment extends Fragment { private Thread mThread = null; private View view = null; @@ -46,7 +46,7 @@ public class HostsFragment extends Fragment { mHandler = new HostsHandler().setView(view).setHostsFragment(this); final Spinner spinnerHosts = (Spinner) view.findViewById(R.id.spinner_hosts); - ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, HostsProvider.getHostsProviderNames()); + ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, RulesProvider.getHostsProviderNames()); spinnerHosts.setAdapter(spinnerArrayAdapter); spinnerHosts.setSelection(0); @@ -61,7 +61,7 @@ public class HostsFragment extends Fragment { @Override public void run() { try { - URLConnection connection = new URL(HostsProvider.getDownloadUrlByName(spinnerHosts.getSelectedItem().toString())).openConnection(); + URLConnection connection = new URL(RulesProvider.getDownloadUrlByName(spinnerHosts.getSelectedItem().toString())).openConnection(); InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder builder = new StringBuilder(); @@ -130,14 +130,14 @@ public class HostsFragment extends Fragment { static final int MSG_DOWNLOADED = 0; private View view = null; - private HostsFragment mFragment = null; + private RulesFragment mFragment = null; HostsHandler setView(View view) { this.view = view; return this; } - HostsHandler setHostsFragment(HostsFragment fragment) { + HostsHandler setHostsFragment(RulesFragment fragment) { mFragment = fragment; return this; } diff --git a/app/src/main/java/org/itxtech/daedalus/fragment/SettingsFragment.java b/app/src/main/java/org/itxtech/daedalus/fragment/SettingsFragment.java index 6c4cd6d..315fa56 100644 --- a/app/src/main/java/org/itxtech/daedalus/fragment/SettingsFragment.java +++ b/app/src/main/java/org/itxtech/daedalus/fragment/SettingsFragment.java @@ -129,7 +129,7 @@ public class SettingsFragment extends PreferenceFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = super.onCreateView(inflater, container, savedInstanceState); - SwitchPreference localHostResolution = (SwitchPreference) findPreference("settings_local_host_resolution"); + SwitchPreference localHostResolution = (SwitchPreference) findPreference("settings_local_rules_resolution"); localHostResolution.setSummary(Daedalus.hostsPath); return view; } diff --git a/app/src/main/java/org/itxtech/daedalus/provider/UdpDnsProvider.java b/app/src/main/java/org/itxtech/daedalus/provider/UdpDnsProvider.java index 510fcf6..bc5852b 100644 --- a/app/src/main/java/org/itxtech/daedalus/provider/UdpDnsProvider.java +++ b/app/src/main/java/org/itxtech/daedalus/provider/UdpDnsProvider.java @@ -13,7 +13,7 @@ import de.measite.minidns.Record; import de.measite.minidns.record.A; import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.util.DnsServerHelper; -import org.itxtech.daedalus.util.HostsResolver; +import org.itxtech.daedalus.util.RulesResolver; import org.pcap4j.packet.*; import org.pcap4j.packet.factory.PacketFactoryPropertiesLoader; import org.pcap4j.util.PropertiesLoader; @@ -74,7 +74,7 @@ public class UdpDnsProvider extends DnsProvider { } } - void queueDeviceWrite(IpPacket ipOutPacket) { + private void queueDeviceWrite(IpPacket ipOutPacket) { dnsQueryTimes++; Log.i(TAG, "QT " + dnsQueryTimes); deviceWrites.add(ipOutPacket.getRawData()); @@ -340,8 +340,8 @@ public class UdpDnsProvider extends DnsProvider { String dnsQueryName = dnsMsg.getQuestion().name.toString(); try { - if (HostsResolver.canResolve(dnsQueryName)) { - String response = HostsResolver.resolve(dnsQueryName); + if (RulesResolver.canResolve(dnsQueryName)) { + String response = RulesResolver.resolve(dnsQueryName); Log.i(TAG, "handleDnsRequest: DNS Name " + dnsQueryName + " address " + response + ", using local hosts to resolve."); DNSMessage.Builder builder = dnsMsg.asBuilder(); int[] ip = new int[4]; diff --git a/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java b/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java index cf205bf..de8f413 100644 --- a/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java +++ b/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java @@ -20,7 +20,7 @@ import org.itxtech.daedalus.provider.TcpDnsProvider; import org.itxtech.daedalus.provider.UdpDnsProvider; import org.itxtech.daedalus.receiver.StatusBarBroadcastReceiver; import org.itxtech.daedalus.util.DnsServerHelper; -import org.itxtech.daedalus.util.HostsResolver; +import org.itxtech.daedalus.util.RulesResolver; import java.net.Inet4Address; @@ -146,7 +146,7 @@ public class DaedalusVpnService extends VpnService implements Runnable { Daedalus.updateShortcut(getApplicationContext()); } - HostsResolver.clean(); + RulesResolver.clean(); DnsServerHelper.cleanPortCache(); } diff --git a/app/src/main/java/org/itxtech/daedalus/util/HostsResolver.java b/app/src/main/java/org/itxtech/daedalus/util/HostsResolver.java deleted file mode 100644 index 277a3f3..0000000 --- a/app/src/main/java/org/itxtech/daedalus/util/HostsResolver.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.itxtech.daedalus.util; - -import android.util.Log; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.util.HashMap; - -/** - * Daedalus Project - * - * @author iTX Technologies - * @link https://itxtech.org - *

- * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - */ -public class HostsResolver implements Runnable { - private static final String TAG = "DHostsResolver"; - - public static final int STATUS_LOADED = 0; - public static final int STATUS_LOADING = 1; - public static final int STATUS_NOT_LOADED = 2; - public static final int STATUS_PENDING_LOAD = 3; - - private static int status = STATUS_NOT_LOADED; - private static String fileName; - private static HashMap hosts; - private static boolean shutdown = false; - private static boolean panResolution = false; - - public HostsResolver() { - status = STATUS_NOT_LOADED; - fileName = ""; - shutdown = false; - } - - public static void shutdown() { - shutdown = true; - } - - public static boolean isLoaded() { - return status == STATUS_LOADED; - } - - public static void startLoad(String loadFile) { - Log.d(TAG, "Loading file " + loadFile); - fileName = loadFile; - status = STATUS_PENDING_LOAD; - } - - public static void setPanResolution(boolean resolution) { - panResolution = resolution; - } - - public static void clean() { - hosts = null; - } - - public static boolean canResolve(String hostname) { - if (hosts == null) { - return false; - } - if (hosts.containsKey(hostname)) { - return true; - } - if (panResolution) { - String[] pieces = hostname.split("\\."); - StringBuilder builder; - builder = new StringBuilder(); - builder.append("*"); - for (int i = 1; i < pieces.length; i++) { - builder.append(".").append(pieces[i]); - } - if (hosts.containsKey(builder.toString())) { - return true; - } - } - return false; - } - - public static String resolve(String hostname) { - if (hosts == null) { - return ""; - } - if (hosts.containsKey(hostname)) { - return hosts.get(hostname); - } - if (panResolution) { - String[] pieces = hostname.split("\\."); - StringBuilder builder; - builder = new StringBuilder(); - builder.append("*"); - for (int i = 1; i < pieces.length; i++) { - builder.append(".").append(pieces[i]); - } - if (hosts.containsKey(builder.toString())) { - return hosts.get(builder.toString()); - } - } - return ""; - } - - private void load() { - try { - status = STATUS_LOADING; - File file = new File(fileName); - if (file.exists() && file.canRead()) { - FileInputStream stream = new FileInputStream(file); - BufferedReader dataIO = new BufferedReader(new InputStreamReader(stream)); - hosts = new HashMap<>(); - String strLine; - String[] data; - while ((strLine = dataIO.readLine()) != null) { - //Log.d(TAG, strLine); - if (!strLine.equals("") && !strLine.startsWith("#")) { - data = strLine.split("\\s+"); - hosts.put(data[1], data[0]); - Log.d(TAG, "Putting " + data[0] + " " + data[1]); - } - } - - dataIO.close(); - stream.close(); - status = STATUS_LOADED; - } else { - status = STATUS_NOT_LOADED; - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - } - } - - @Override - public void run() { - try { - while (!shutdown) { - if (status == STATUS_PENDING_LOAD) { - load(); - } - Thread.sleep(100); - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - } - } -} diff --git a/app/src/main/java/org/itxtech/daedalus/util/HostsProvider.java b/app/src/main/java/org/itxtech/daedalus/util/RulesProvider.java similarity index 85% rename from app/src/main/java/org/itxtech/daedalus/util/HostsProvider.java rename to app/src/main/java/org/itxtech/daedalus/util/RulesProvider.java index bb56a30..89985f1 100644 --- a/app/src/main/java/org/itxtech/daedalus/util/HostsProvider.java +++ b/app/src/main/java/org/itxtech/daedalus/util/RulesProvider.java @@ -15,11 +15,11 @@ import java.util.ArrayList; * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. */ -public class HostsProvider { +public class RulesProvider { private String name; private String downloadURL; - public HostsProvider(String name, String downloadURL) { + public RulesProvider(String name, String downloadURL) { this.name = name; this.downloadURL = downloadURL; } @@ -34,7 +34,7 @@ public class HostsProvider { public static String[] getHostsProviderNames() { ArrayList servers = new ArrayList<>(Daedalus.HOSTS_PROVIDERS.size()); - for (HostsProvider hostsProvider : Daedalus.HOSTS_PROVIDERS) { + for (RulesProvider hostsProvider : Daedalus.HOSTS_PROVIDERS) { servers.add(hostsProvider.getName()); } String[] stringServers = new String[Daedalus.HOSTS_PROVIDERS.size()]; @@ -42,7 +42,7 @@ public class HostsProvider { } public static String getDownloadUrlByName(String name) { - for (HostsProvider hostsProvider : Daedalus.HOSTS_PROVIDERS) { + for (RulesProvider hostsProvider : Daedalus.HOSTS_PROVIDERS) { if (hostsProvider.getName().equals(name)) { return hostsProvider.getDownloadURL(); } diff --git a/app/src/main/java/org/itxtech/daedalus/util/RulesResolver.java b/app/src/main/java/org/itxtech/daedalus/util/RulesResolver.java new file mode 100644 index 0000000..aad5916 --- /dev/null +++ b/app/src/main/java/org/itxtech/daedalus/util/RulesResolver.java @@ -0,0 +1,181 @@ +package org.itxtech.daedalus.util; + +import android.util.Log; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.util.HashMap; + +/** + * Daedalus Project + * + * @author iTX Technologies + * @link https://itxtech.org + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ +public class RulesResolver implements Runnable { + private static final String TAG = "DRulesResolver"; + + public static final int STATUS_LOADED = 0; + public static final int STATUS_LOADING = 1; + public static final int STATUS_NOT_LOADED = 2; + public static final int STATUS_PENDING_LOAD = 3; + + public static final int MODE_HOSTS = 0; + public static final int MODE_DNSMASQ = 1; + + private static int status = STATUS_NOT_LOADED; + private static int mode = MODE_HOSTS; + private static String hostsFile; + private static String dnsmasqFile; + private static HashMap rules; + private static boolean shutdown = false; + + public RulesResolver() { + status = STATUS_NOT_LOADED; + hostsFile = ""; + dnsmasqFile = ""; + shutdown = false; + } + + public static void shutdown() { + shutdown = true; + } + + public static boolean isLoaded() { + return status == STATUS_LOADED; + } + + public static void startLoadHosts(String loadFile) { + Log.d(TAG, "Loading hosts file " + loadFile); + hostsFile = loadFile; + mode = MODE_HOSTS; + status = STATUS_PENDING_LOAD; + } + + public static void startLoadDnsmasq(String loadFile) { + Log.d(TAG, "Loading DNSMasq file " + loadFile); + dnsmasqFile = loadFile; + mode = MODE_DNSMASQ; + status = STATUS_PENDING_LOAD; + } + + public static void clean() { + rules = null; + } + + public static boolean canResolve(String hostname) { + if (rules == null) { + return false; + } + if (rules.containsKey(hostname)) { + return true; + } + if (mode == MODE_DNSMASQ) { + String[] pieces = hostname.split("\\."); + StringBuilder builder; + builder = new StringBuilder(); + for (int i = 1; i < pieces.length; i++) { + builder.append(".").append(pieces[i]); + } + if (rules.containsKey(builder.toString())) { + return true; + } + } + return false; + } + + public static String resolve(String hostname) { + if (rules == null) { + return ""; + } + if (rules.containsKey(hostname)) { + return rules.get(hostname); + } + if (mode == MODE_DNSMASQ) { + String[] pieces = hostname.split("\\."); + StringBuilder builder; + builder = new StringBuilder(); + for (int i = 1; i < pieces.length; i++) { + builder.append(".").append(pieces[i]); + } + if (rules.containsKey(builder.toString())) { + return rules.get(builder.toString()); + } + } + return ""; + } + + private void load() { + try { + status = STATUS_LOADING; + rules = new HashMap<>(); + if (mode == MODE_HOSTS) { + File file = new File(hostsFile); + if (file.exists() && file.canRead()) { + FileInputStream stream = new FileInputStream(file); + BufferedReader dataIO = new BufferedReader(new InputStreamReader(stream)); + String strLine; + String[] data; + while ((strLine = dataIO.readLine()) != null) { + //Log.d(TAG, strLine); + if (!strLine.equals("") && !strLine.startsWith("#")) { + data = strLine.split("\\s+"); + rules.put(data[1], data[0]); + Log.d(TAG, "Putting " + data[0] + " " + data[1]); + } + } + + dataIO.close(); + stream.close(); + } + } else if (mode == MODE_DNSMASQ) { + File file = new File(dnsmasqFile); + if (file.exists() && file.canRead()) { + FileInputStream stream = new FileInputStream(file); + BufferedReader dataIO = new BufferedReader(new InputStreamReader(stream)); + String strLine; + String[] data; + while ((strLine = dataIO.readLine()) != null) { + //Log.d(TAG, strLine); + if (!strLine.equals("") && !strLine.startsWith("#")) { + data = strLine.split("/"); + if (data.length == 3 && data[0].equals("address=")) { + rules.put(data[1], data[2]); + Log.d(TAG, "Putting " + data[0] + " " + data[1]); + } + } + } + + dataIO.close(); + stream.close(); + } + } + status = STATUS_LOADED; + } catch (Exception e) { + Log.e(TAG, e.toString()); + + status = STATUS_NOT_LOADED; + } + } + + @Override + public void run() { + try { + while (!shutdown) { + if (status == STATUS_PENDING_LOAD) { + load(); + } + Thread.sleep(100); + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + } + } +} diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 6b4ed29..58f8c5b 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -21,7 +21,7 @@ android:title="@string/action_dns_servers" android:icon="@drawable/ic_device_hub"/> diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 5bef825..b569de9 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -43,19 +43,18 @@ GitHub 高级系统设置 开启 - 本地 hosts 解析 + 本地规则解析 重新启用 Daedalus 以应用设置。 - Daedalus 需要访问外部储存以实现本地 hosts 解析。 - Hosts + Daedalus 需要访问外部储存以实现本地规则解析。 + 规则 下载 hosts - 正在下载 hosts,请稍等 …… + 正在下载 rules,请稍等 …… 已下载 hosts 。 - Daedalus 当前正在下载hosts,请稍等。 + Daedalus 当前正在下载规则,请稍等。 找不到本地 hosts 文件。 本地 hosts 路径: 最后修改: 大小: - Hosts 域名泛解析 服务器 服务器名称 服务器地址 @@ -66,4 +65,5 @@ DNS over TCP 已移除。 撤销 + 使用 DNSMasq 替代 Hosts \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85dd79a..a79b3a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,20 +42,19 @@ GitHub Advanced System Settings On - Local hosts resolution + Local hosts resolution Re-activate Daedalus to make the settings take effect. - Daedalus requires access to external storage for local host resolution. + Daedalus requires access to external storage for local rules resolution. - Hosts + Rules Download hosts - Downloading hosts, please wait … + Downloading rules, please wait … Hosts has been downloaded. - Daedalus is currently downloading hosts, please wait. + Daedalus is currently downloading rules, please wait. Local hosts not found. Local hosts path: Last modified: Size: - Hosts pan domain name resolution Servers Server Name Server Address @@ -66,4 +65,5 @@ DNS over TCP Removed. Undo + Use DNSMasq instead of Hosts diff --git a/app/src/main/res/xml/perf_settings.xml b/app/src/main/res/xml/perf_settings.xml index cfa7c1e..9d8a750 100644 --- a/app/src/main/res/xml/perf_settings.xml +++ b/app/src/main/res/xml/perf_settings.xml @@ -50,13 +50,13 @@ android:defaultValue="false" android:enabled="false"/>