diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index 5d1a694..5e88f78 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -48,6 +48,7 @@
 #include "ResolverStats.h"
 #include "netd_resolv/params.h"
 #include "netd_resolv/resolv.h"
+#include "netd_resolv/resolv_stub.h"
 #include "netd_resolv/stats.h"
 
 namespace android {
@@ -121,16 +122,17 @@
     if (DBG) {
         ALOGD("setDnsServers netId = %u, numservers = %d", netId, numservers);
     }
-    return -resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains, params);
+    return -RESOLV_STUB.resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains,
+                                                       params);
 }
 
 int ResolverController::clearDnsServers(unsigned netId) {
-    resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
+    RESOLV_STUB.resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
     if (DBG) {
         ALOGD("clearDnsServers netId = %u\n", netId);
     }
     mDns64Configuration.stopPrefixDiscovery(netId);
-    resolv_delete_private_dns_for_net(netId);
+    RESOLV_STUB.resolv_delete_private_dns_for_net(netId);
     return 0;
 }
 
@@ -139,7 +141,7 @@
         ALOGD("flushDnsCache netId = %u\n", netId);
     }
 
-    resolv_flush_cache_for_net(netId);
+    RESOLV_STUB.resolv_delete_cache_for_net(netId);
 
     return 0;
 }
@@ -167,8 +169,8 @@
     domains->clear();
     *params = __res_params{};
     stats->clear();
-    int revision_id = android_net_res_stats_get_info_for_net(netId, &nscount, res_servers, &dcount,
-            res_domains, params, res_stats);
+    int revision_id = RESOLV_STUB.android_net_res_stats_get_info_for_net(
+            netId, &nscount, res_servers, &dcount, res_domains, params, res_stats);
 
     // If the netId is unknown (which can happen for valid net IDs for which no DNS servers have
     // yet been configured), there is no revision ID. In this case there is no data to return.
@@ -185,7 +187,7 @@
     // Determine which servers are considered usable by the resolver.
     bool valid_servers[MAXNS];
     std::fill_n(valid_servers, MAXNS, false);
-    android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
+    RESOLV_STUB.android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
 
     // Convert the server sockaddr structures to std::string.
     stats->resize(nscount);
@@ -202,9 +204,9 @@
         }
         servers->push_back(std::move(server_str));
         android::net::ResolverStats& cur_stats = (*stats)[i];
-        android_net_res_stats_aggregate(&res_stats[i], &cur_stats.successes, &cur_stats.errors,
-                &cur_stats.timeouts, &cur_stats.internal_errors, &cur_stats.rtt_avg,
-                &cur_stats.last_sample_time);
+        RESOLV_STUB.android_net_res_stats_aggregate(
+                &res_stats[i], &cur_stats.successes, &cur_stats.errors, &cur_stats.timeouts,
+                &cur_stats.internal_errors, &cur_stats.rtt_avg, &cur_stats.last_sample_time);
         cur_stats.usable = valid_servers[i];
     }
 
@@ -251,13 +253,13 @@
     fwmark.protectedFromVpn = true;
     fwmark.permission = PERMISSION_SYSTEM;
 
-    const int err = resolv_set_private_dns_for_net(
+    const int err = RESOLV_STUB.resolv_set_private_dns_for_net(
             netId, fwmark.intValue, server_ptrs.data(), server_ptrs.size(), tlsName.c_str(),
             fingerprint_ptrs.data(), fingerprint_ptrs.size());
     if (err != 0) {
         return err;
     }
-    resolv_register_private_dns_callback(&onPrivateDnsValidation);
+    RESOLV_STUB.resolv_register_private_dns_callback(&onPrivateDnsValidation);
 
     // Convert network-assigned server list to bionic's format.
     server_ptrs.clear();
@@ -328,7 +330,7 @@
     ResolverStats::encodeAll(res_stats, stats);
 
     ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
-    resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+    RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
     for (unsigned i = 0; i < privateDnsStatus.numServers; i++) {
         std::string tlsServer_str = addrToString(&(privateDnsStatus.serverStatus[i].ss));
         tlsServers->push_back(std::move(tlsServer_str));
@@ -418,7 +420,7 @@
 
         mDns64Configuration.dump(dw, netId);
         ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
-        resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+        RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
         dw.println("Private DNS mode: %s",
                    getPrivateDnsModeString(static_cast<PrivateDnsMode>(privateDnsStatus.mode)));
         if (!privateDnsStatus.numServers) {
