Move over to ABSL logging and flags.

Removes gperftools too since that wants gflags.

Here come the fireworks.

Change-Id: I79cb7bcf60f1047fbfa28bfffc21a0fd692e4b1c
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/aos/starter/BUILD b/aos/starter/BUILD
index 9d359d4..13751e0 100644
--- a/aos/starter/BUILD
+++ b/aos/starter/BUILD
@@ -37,7 +37,8 @@
         "//aos/events:shm_event_loop",
         "//aos/util:scoped_pipe",
         "//aos/util:top",
-        "@com_github_google_glog//:glog",
+        "@com_google_absl//absl/log",
+        "@com_google_absl//absl/log:check",
     ],
 )
 
@@ -53,7 +54,8 @@
         "//aos:configuration",
         "//aos:macros",
         "//aos/events:shm_event_loop",
-        "@com_github_google_glog//:glog",
+        "@com_google_absl//absl/log",
+        "@com_google_absl//absl/log:check",
     ],
 )
 
@@ -179,7 +181,8 @@
     deps = [
         ":starter_rpc_lib",
         "//aos/time",
-        "@com_github_google_glog//:glog",
+        "@com_google_absl//absl/log",
+        "@com_google_absl//absl/log:check",
         "@com_google_absl//absl/strings:str_format",
     ],
 )
@@ -245,7 +248,8 @@
     hdrs = ["irq_affinity_lib.h"],
     deps = [
         "//aos/scoped:scoped_fd",
-        "@com_github_google_glog//:glog",
+        "@com_google_absl//absl/log",
+        "@com_google_absl//absl/log:check",
         "@com_google_absl//absl/strings",
     ],
 )
diff --git a/aos/starter/irq_affinity.cc b/aos/starter/irq_affinity.cc
index 94c9c71..0dad287 100644
--- a/aos/starter/irq_affinity.cc
+++ b/aos/starter/irq_affinity.cc
@@ -15,12 +15,13 @@
 #include <utility>
 #include <vector>
 
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "flatbuffers/buffer.h"
 #include "flatbuffers/string.h"
 #include "flatbuffers/vector.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
 
 #include "aos/configuration.h"
 #include "aos/events/event_loop.h"
@@ -33,12 +34,13 @@
 #include "aos/util/file.h"
 #include "aos/util/top.h"
 
-DEFINE_string(config, "aos_config.json", "File path of aos configuration");
+ABSL_FLAG(std::string, config, "aos_config.json",
+          "File path of aos configuration");
 
-DEFINE_string(user, "",
-              "Starter runs as though this user ran a SUID binary if set.");
-DEFINE_string(irq_config, "rockpi_config.json",
-              "File path of rockpi configuration");
+ABSL_FLAG(std::string, user, "",
+          "Starter runs as though this user ran a SUID binary if set.");
+ABSL_FLAG(std::string, irq_config, "rockpi_config.json",
+          "File path of rockpi configuration");
 
 namespace aos {
 
@@ -281,7 +283,7 @@
 int main(int argc, char **argv) {
   aos::InitGoogle(&argc, &argv);
 
-  if (!FLAGS_user.empty()) {
+  if (!absl::GetFlag(FLAGS_user).empty()) {
     // Maintain root permissions as we switch to become the user so we can
     // actually manipulate priorities.
     PCHECK(prctl(PR_SET_SECUREBITS, SECBIT_NO_SETUID_FIXUP | SECBIT_NOROOT) ==
@@ -290,12 +292,12 @@
     uid_t uid;
     uid_t gid;
     {
-      struct passwd *user_data = getpwnam(FLAGS_user.c_str());
+      struct passwd *user_data = getpwnam(absl::GetFlag(FLAGS_user).c_str());
       if (user_data != nullptr) {
         uid = user_data->pw_uid;
         gid = user_data->pw_gid;
       } else {
-        LOG(FATAL) << "Could not find user " << FLAGS_user;
+        LOG(FATAL) << "Could not find user " << absl::GetFlag(FLAGS_user);
         return 1;
       }
     }
@@ -306,22 +308,22 @@
     constexpr int kUnchanged = -1;
     if (setresgid(/* ruid */ gid, /* euid */ gid,
                   /* suid */ kUnchanged) != 0) {
-      PLOG(FATAL) << "Failed to change GID to " << FLAGS_user;
+      PLOG(FATAL) << "Failed to change GID to " << absl::GetFlag(FLAGS_user);
     }
 
     if (setresuid(/* ruid */ uid, /* euid */ uid,
                   /* suid */ kUnchanged) != 0) {
-      PLOG(FATAL) << "Failed to change UID to " << FLAGS_user;
+      PLOG(FATAL) << "Failed to change UID to " << absl::GetFlag(FLAGS_user);
     }
   }
 
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
-      aos::configuration::ReadConfig(FLAGS_config);
+      aos::configuration::ReadConfig(absl::GetFlag(FLAGS_config));
 
   aos::FlatbufferDetachedBuffer<aos::starter::IrqAffinityConfig>
       irq_affinity_config =
           aos::JsonFileToFlatbuffer<aos::starter::IrqAffinityConfig>(
-              FLAGS_irq_config);
+              absl::GetFlag(FLAGS_irq_config));
 
   aos::ShmEventLoop shm_event_loop(&config.message());
 
diff --git a/aos/starter/irq_affinity_lib.cc b/aos/starter/irq_affinity_lib.cc
index 7075e31..de58be6 100644
--- a/aos/starter/irq_affinity_lib.cc
+++ b/aos/starter/irq_affinity_lib.cc
@@ -7,12 +7,13 @@
 #include <ostream>
 #include <utility>
 
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/ascii.h"
 #include "absl/strings/match.h"
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
-#include "glog/logging.h"
 
 #include "aos/scoped/scoped_fd.h"
 
diff --git a/aos/starter/mock_starter.cc b/aos/starter/mock_starter.cc
index d52db95..d729833 100644
--- a/aos/starter/mock_starter.cc
+++ b/aos/starter/mock_starter.cc
@@ -5,11 +5,12 @@
 #include <string_view>
 #include <utility>
 
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "flatbuffers/buffer.h"
 #include "flatbuffers/flatbuffer_builder.h"
 #include "flatbuffers/string.h"
 #include "flatbuffers/vector.h"
-#include "glog/logging.h"
 
 #include "aos/configuration.h"
 #include "aos/starter/starter_rpc_generated.h"
diff --git a/aos/starter/starter_cmd.cc b/aos/starter/starter_cmd.cc
index b79485a..c4d324d 100644
--- a/aos/starter/starter_cmd.cc
+++ b/aos/starter/starter_cmd.cc
@@ -16,12 +16,13 @@
 #include <utility>
 #include <vector>
 
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/str_join.h"
 #include "flatbuffers/string.h"
 #include "flatbuffers/vector.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
 
 #include "aos/configuration.h"
 #include "aos/flatbuffers.h"
@@ -31,21 +32,21 @@
 #include "aos/starter/starter_rpc_lib.h"
 #include "aos/time/time.h"
 
-DEFINE_string(config, "aos_config.json", "File path of aos configuration");
+ABSL_FLAG(std::string, config, "aos_config.json",
+          "File path of aos configuration");
 // TODO(james): Bash autocompletion for node names.
-DEFINE_string(
-    node, "",
-    "Node to interact with. If empty, just interact with local node.");
-DEFINE_bool(all_nodes, false, "Interact with all nodes.");
+ABSL_FLAG(std::string, node, "",
+          "Node to interact with. If empty, just interact with local node.");
+ABSL_FLAG(bool, all_nodes, false, "Interact with all nodes.");
 
-DEFINE_bool(_bash_autocomplete, false,
-            "Internal use: Outputs commands or applications for use with "
-            "autocomplete script.");
-DEFINE_string(_bash_autocomplete_word, "",
-              "Internal use: Current word being autocompleted");
-DEFINE_string(sort, "name",
-              "The name of the column to sort processes by.  "
-              "Can be \"name\", \"state\", \"pid\", or \"uptime\".");
+ABSL_FLAG(bool, _bash_autocomplete, false,
+          "Internal use: Outputs commands or applications for use with "
+          "autocomplete script.");
+ABSL_FLAG(std::string, _bash_autocomplete_word, "",
+          "Internal use: Current word being autocompleted");
+ABSL_FLAG(std::string, sort, "name",
+          "The name of the column to sort processes by.  "
+          "Can be \"name\", \"state\", \"pid\", or \"uptime\".");
 
 namespace {
 
@@ -62,12 +63,14 @@
     return {nullptr};
   }
 
-  if (!FLAGS_node.empty()) {
-    CHECK(!FLAGS_all_nodes) << "Can't specify both --node and --all_nodes.";
-    return {aos::configuration::GetNode(configuration, FLAGS_node)};
+  if (!absl::GetFlag(FLAGS_node).empty()) {
+    CHECK(!absl::GetFlag(FLAGS_all_nodes))
+        << "Can't specify both --node and --all_nodes.";
+    return {
+        aos::configuration::GetNode(configuration, absl::GetFlag(FLAGS_node))};
   }
 
-  if (FLAGS_all_nodes) {
+  if (absl::GetFlag(FLAGS_all_nodes)) {
     return aos::configuration::GetNodes(configuration);
   }
 
@@ -114,25 +117,26 @@
     sorted_statuses.push_back(app_status);
   }
   // If --sort flag not set, then return this unsorted vector as is.
-  if (FLAGS_sort.empty()) {
+  if (absl::GetFlag(FLAGS_sort).empty()) {
     return sorted_statuses;
   }
 
   // Convert --sort flag to lowercase for testing below.
-  std::transform(FLAGS_sort.begin(), FLAGS_sort.end(), FLAGS_sort.begin(),
-                 tolower);
+  std::transform(absl::GetFlag(FLAGS_sort).begin(),
+                 absl::GetFlag(FLAGS_sort).end(),
+                 absl::GetFlag(FLAGS_sort).begin(), tolower);
 
   // This function is called once for each node being reported upon, so there is
   // no need to sort on node, it happens implicitly.
 
-  if (FLAGS_sort == "name") {
+  if (absl::GetFlag(FLAGS_sort) == "name") {
     // Sort on name using std::string_view::operator< for lexicographic order.
     std::sort(sorted_statuses.begin(), sorted_statuses.end(),
               [](const aos::starter::ApplicationStatus *lhs,
                  const aos::starter::ApplicationStatus *rhs) {
                 return lhs->name()->string_view() < rhs->name()->string_view();
               });
-  } else if (FLAGS_sort == "state") {
+  } else if (absl::GetFlag(FLAGS_sort) == "state") {
     // Sort on state first, and then name for apps in same state.
     // ApplicationStatus::state is an enum, so need to call EnumNameState()
     // convenience wrapper to convert enum to char*, and then wrap in
@@ -148,7 +152,7 @@
                            : (lhs->name()->string_view() <
                               rhs->name()->string_view());
               });
-  } else if (FLAGS_sort == "pid") {
+  } else if (absl::GetFlag(FLAGS_sort) == "pid") {
     // Sort on pid first, and then name for when both apps are not running.
     // If the app state is STOPPED, then it will not have a pid, so need to test
     // that first. If only one app is STOPPED, then return Boolean state to put
@@ -171,7 +175,7 @@
                   }
                 }
               });
-  } else if (FLAGS_sort == "uptime") {
+  } else if (absl::GetFlag(FLAGS_sort) == "uptime") {
     // Sort on last_start_time first, and then name for when both apps are not
     // running, or have exact same start time. Only use last_start_time when app
     // is not STOPPED. If only one app is STOPPED, then return Boolean state to
@@ -198,7 +202,8 @@
           }
         });
   } else {
-    std::cerr << "Unknown sort criteria \"" << FLAGS_sort << "\"" << std::endl;
+    std::cerr << "Unknown sort criteria \"" << absl::GetFlag(FLAGS_sort) << "\""
+              << std::endl;
     exit(1);
   }
 
@@ -486,7 +491,7 @@
   const std::string_view app_name = (argc >= 3 ? argv[2] : "");
 
   std::cout << "COMPREPLY=(";
-  if (FLAGS__bash_autocomplete_word == command) {
+  if (absl::GetFlag(FLAGS__bash_autocomplete_word) == command) {
     // Autocomplete the starter command
     for (const auto &entry : kCommands) {
       if (std::get<0>(entry).find(command) == 0) {
@@ -515,9 +520,9 @@
   aos::InitGoogle(&argc, &argv);
 
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
-      aos::configuration::ReadConfig(FLAGS_config);
+      aos::configuration::ReadConfig(absl::GetFlag(FLAGS_config));
 
-  if (FLAGS__bash_autocomplete) {
+  if (absl::GetFlag(FLAGS__bash_autocomplete)) {
     Autocomplete(argc, argv, &config.message());
     return 0;
   }
diff --git a/aos/starter/starter_rpc_lib.cc b/aos/starter/starter_rpc_lib.cc
index b497792..4a54f71 100644
--- a/aos/starter/starter_rpc_lib.cc
+++ b/aos/starter/starter_rpc_lib.cc
@@ -3,11 +3,12 @@
 #include <algorithm>
 #include <ostream>
 
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "flatbuffers/buffer.h"
 #include "flatbuffers/flatbuffer_builder.h"
 #include "flatbuffers/string.h"
 #include "flatbuffers/vector.h"
-#include "glog/logging.h"
 
 #include "aos/events/context.h"
 #include "aos/events/shm_event_loop.h"
diff --git a/aos/starter/starter_test.cc b/aos/starter/starter_test.cc
index 0a074e0..65d43aa 100644
--- a/aos/starter/starter_test.cc
+++ b/aos/starter/starter_test.cc
@@ -8,10 +8,12 @@
 #include <string>
 #include <thread>
 
+#include "absl/flags/flag.h"
+#include "absl/flags/reflection.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_format.h"
 #include "flatbuffers/string.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
 #include "gtest/gtest.h"
 
 #include "aos/configuration.h"
@@ -56,7 +58,7 @@
  public:
   StarterdTest() {
     // Nuke the shm dir:
-    aos::util::UnlinkRecursive(FLAGS_shm_base);
+    aos::util::UnlinkRecursive(absl::GetFlag(FLAGS_shm_base));
   }
 
  protected:
@@ -71,7 +73,7 @@
                    std::chrono::milliseconds(100));
   }
 
-  gflags::FlagSaver flag_saver_;
+  absl::FlagSaver flag_saver_;
   // Used to track when the test completes so that we can clean up the starter
   // in its thread.
   std::atomic<bool> test_done_{false};
@@ -87,8 +89,8 @@
       public ::testing::WithParamInterface<TestParams> {};
 
 TEST_P(StarterdConfigParamTest, MultiNodeStartStopTest) {
-  gflags::FlagSaver flag_saver;
-  FLAGS_override_hostname = GetParam().hostname;
+  absl::FlagSaver flag_saver;
+  absl::SetFlag(&FLAGS_override_hostname, GetParam().hostname);
   const std::string config_file = ArtifactPath(GetParam().config);
 
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
@@ -111,9 +113,9 @@
                                     "args": ["--shm_base", "%s", "--config", "%s", "--override_hostname", "%s"]
                                   }
                                 ]})",
-          ArtifactPath("aos/events/ping"), FLAGS_shm_base, config_file,
-          GetParam().hostname, ArtifactPath("aos/events/pong"), FLAGS_shm_base,
-          config_file, GetParam().hostname));
+          ArtifactPath("aos/events/ping"), absl::GetFlag(FLAGS_shm_base),
+          config_file, GetParam().hostname, ArtifactPath("aos/events/pong"),
+          absl::GetFlag(FLAGS_shm_base), config_file, GetParam().hostname));
 
   const aos::Configuration *config_msg = &new_config.message();
 
@@ -220,8 +222,9 @@
       aos::configuration::ReadConfig(config_file);
 
   auto new_config = aos::configuration::MergeWithConfig(
-      &config.message(), absl::StrFormat(
-                             R"({"applications": [
+      &config.message(),
+      absl::StrFormat(
+          R"({"applications": [
                                   {
                                     "name": "ping",
                                     "executable_name": "%s",
@@ -233,8 +236,8 @@
                                     "args": ["--shm_base", "%s"]
                                   }
                                 ]})",
-                             ArtifactPath("aos/events/ping"), FLAGS_shm_base,
-                             ArtifactPath("aos/events/pong"), FLAGS_shm_base));
+          ArtifactPath("aos/events/ping"), absl::GetFlag(FLAGS_shm_base),
+          ArtifactPath("aos/events/pong"), absl::GetFlag(FLAGS_shm_base)));
 
   const aos::Configuration *config_msg = &new_config.message();
 
@@ -307,8 +310,9 @@
       aos::configuration::ReadConfig(config_file);
 
   auto new_config = aos::configuration::MergeWithConfig(
-      &config.message(), absl::StrFormat(
-                             R"({"applications": [
+      &config.message(),
+      absl::StrFormat(
+          R"({"applications": [
                                   {
                                     "name": "ping",
                                     "executable_name": "%s",
@@ -321,8 +325,8 @@
                                     "args": ["--shm_base", "%s"]
                                   }
                                 ]})",
-                             ArtifactPath("aos/events/ping"), FLAGS_shm_base,
-                             ArtifactPath("aos/events/pong"), FLAGS_shm_base));
+          ArtifactPath("aos/events/ping"), absl::GetFlag(FLAGS_shm_base),
+          ArtifactPath("aos/events/pong"), absl::GetFlag(FLAGS_shm_base)));
 
   const aos::Configuration *config_msg = &new_config.message();
 
@@ -397,8 +401,9 @@
       aos::configuration::ReadConfig(config_file);
 
   auto new_config = aos::configuration::MergeWithConfig(
-      &config.message(), absl::StrFormat(
-                             R"({"applications": [
+      &config.message(),
+      absl::StrFormat(
+          R"({"applications": [
                                   {
                                     "name": "ping",
                                     "executable_name": "%s",
@@ -411,8 +416,8 @@
                                     "args": ["--shm_base", "%s"]
                                   }
                                 ]})",
-                             ArtifactPath("aos/events/ping"), FLAGS_shm_base,
-                             ArtifactPath("aos/events/pong"), FLAGS_shm_base));
+          ArtifactPath("aos/events/ping"), absl::GetFlag(FLAGS_shm_base),
+          ArtifactPath("aos/events/pong"), absl::GetFlag(FLAGS_shm_base)));
 
   const aos::Configuration *config_msg = &new_config.message();
 
@@ -488,8 +493,9 @@
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
       aos::configuration::ReadConfig(config_file);
   auto new_config = aos::configuration::MergeWithConfig(
-      &config.message(), absl::StrFormat(
-                             R"({"applications": [
+      &config.message(),
+      absl::StrFormat(
+          R"({"applications": [
                                 {
                                   "name": "ping",
                                   "executable_name": "%s",
@@ -502,8 +508,8 @@
                                   "args": ["--shm_base", "%s"]
                                 }
                               ]})",
-                             ArtifactPath("aos/events/ping"), FLAGS_shm_base,
-                             ArtifactPath("aos/events/pong"), FLAGS_shm_base));
+          ArtifactPath("aos/events/ping"), absl::GetFlag(FLAGS_shm_base),
+          ArtifactPath("aos/events/pong"), absl::GetFlag(FLAGS_shm_base)));
 
   const aos::Configuration *config_msg = &new_config.message();
   // Set up starter with config file
diff --git a/aos/starter/starterd.cc b/aos/starter/starterd.cc
index 64858d4..127bf41 100644
--- a/aos/starter/starterd.cc
+++ b/aos/starter/starterd.cc
@@ -4,8 +4,9 @@
 #include <ostream>
 #include <string>
 
-#include "gflags/gflags.h"
-#include "glog/logging.h"
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 
 #include "aos/configuration.h"
 #include "aos/events/event_loop.h"
@@ -14,33 +15,34 @@
 #include "aos/starter/starterd_lib.h"
 #include "aos/util/file.h"
 
-DEFINE_string(config, "aos_config.json", "File path of aos configuration");
-DEFINE_string(user, "",
-              "Starter runs as though this user ran a SUID binary if set.");
-DEFINE_string(version_string, "",
-              "Version to report for starterd and subprocesses.");
+ABSL_FLAG(std::string, config, "aos_config.json",
+          "File path of aos configuration");
+ABSL_FLAG(std::string, user, "",
+          "Starter runs as though this user ran a SUID binary if set.");
+ABSL_FLAG(std::string, version_string, "",
+          "Version to report for starterd and subprocesses.");
 
-DECLARE_string(shm_base);
-DEFINE_bool(purge_shm_base, false,
-            "If true, delete everything in --shm_base before starting.");
+ABSL_DECLARE_FLAG(std::string, shm_base);
+ABSL_FLAG(bool, purge_shm_base, false,
+          "If true, delete everything in --shm_base before starting.");
 
 int main(int argc, char **argv) {
   aos::InitGoogle(&argc, &argv);
 
-  if (FLAGS_purge_shm_base) {
-    aos::util::UnlinkRecursive(FLAGS_shm_base);
+  if (absl::GetFlag(FLAGS_purge_shm_base)) {
+    aos::util::UnlinkRecursive(absl::GetFlag(FLAGS_shm_base));
   }
 
-  if (!FLAGS_user.empty()) {
+  if (!absl::GetFlag(FLAGS_user).empty()) {
     uid_t uid;
     uid_t gid;
     {
-      struct passwd *user_data = getpwnam(FLAGS_user.c_str());
+      struct passwd *user_data = getpwnam(absl::GetFlag(FLAGS_user).c_str());
       if (user_data != nullptr) {
         uid = user_data->pw_uid;
         gid = user_data->pw_gid;
       } else {
-        LOG(FATAL) << "Could not find user " << FLAGS_user;
+        LOG(FATAL) << "Could not find user " << absl::GetFlag(FLAGS_user);
         return 1;
       }
     }
@@ -51,24 +53,24 @@
     constexpr int kUnchanged = -1;
     if (setresgid(/* ruid */ gid, /* euid */ gid,
                   /* suid */ kUnchanged) != 0) {
-      PLOG(FATAL) << "Failed to change GID to " << FLAGS_user << ", group "
-                  << gid;
+      PLOG(FATAL) << "Failed to change GID to " << absl::GetFlag(FLAGS_user)
+                  << ", group " << gid;
     }
 
     if (setresuid(/* ruid */ uid, /* euid */ uid,
                   /* suid */ kUnchanged) != 0) {
-      PLOG(FATAL) << "Failed to change UID to " << FLAGS_user;
+      PLOG(FATAL) << "Failed to change UID to " << absl::GetFlag(FLAGS_user);
     }
   }
 
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
-      aos::configuration::ReadConfig(FLAGS_config);
+      aos::configuration::ReadConfig(absl::GetFlag(FLAGS_config));
 
   const aos::Configuration *config_msg = &config.message();
 
   aos::starter::Starter starter(config_msg);
-  if (!FLAGS_version_string.empty()) {
-    starter.event_loop()->SetVersionString(FLAGS_version_string);
+  if (!absl::GetFlag(FLAGS_version_string).empty()) {
+    starter.event_loop()->SetVersionString(absl::GetFlag(FLAGS_version_string));
   }
 
   starter.Run();
diff --git a/aos/starter/starterd_lib.cc b/aos/starter/starterd_lib.cc
index 79e564e..e507507 100644
--- a/aos/starter/starterd_lib.cc
+++ b/aos/starter/starterd_lib.cc
@@ -11,27 +11,29 @@
 #include <thread>
 #include <utility>
 
+#include "absl/flags/declare.h"
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "flatbuffers/buffer.h"
 #include "flatbuffers/flatbuffer_builder.h"
 #include "flatbuffers/string.h"
 #include "flatbuffers/vector.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
 
 #include "aos/events/context.h"
 #include "aos/json_to_flatbuffer.h"
 
 // FLAGS_shm_base is defined elsewhere, declare it here so it can be used
 // to override the shared memory folder for unit testing.
-DECLARE_string(shm_base);
+ABSL_DECLARE_FLAG(std::string, shm_base);
 // FLAGS_permissions is defined elsewhere, declare it here so it can be used
 // to set the file permissions on the shared memory block.
-DECLARE_uint32(permissions);
+ABSL_DECLARE_FLAG(uint32_t, permissions);
 
-DEFINE_uint32(queue_initialization_threads, 0,
-              "Number of threads to spin up to initialize the queue.  0 means "
-              "use the main thread.");
-DECLARE_bool(enable_ftrace);
+ABSL_FLAG(uint32_t, queue_initialization_threads, 0,
+          "Number of threads to spin up to initialize the queue.  0 means "
+          "use the main thread.");
+ABSL_DECLARE_FLAG(bool, enable_ftrace);
 
 namespace aos::starter {
 
@@ -64,7 +66,7 @@
           1),
       timing_report_fetcher_(
           event_loop_.MakeFetcher<aos::timing::Report>("/aos")),
-      shm_base_(FLAGS_shm_base),
+      shm_base_(absl::GetFlag(FLAGS_shm_base)),
       listener_(&event_loop_,
                 [this](signalfd_siginfo signal) { OnSignal(signal); }),
       top_(&event_loop_, aos::util::Top::TrackThreadsMode::kDisabled,
@@ -132,7 +134,7 @@
     std::vector<const aos::Channel *> channels_to_construct;
     for (const aos::Channel *channel : *config_msg_->channels()) {
       if (aos::configuration::ChannelIsReadableOnNode(channel, this_node)) {
-        if (FLAGS_queue_initialization_threads == 0) {
+        if (absl::GetFlag(FLAGS_queue_initialization_threads) == 0) {
           AddChannel(channel);
         } else {
           channels_to_construct.push_back(channel);
@@ -140,11 +142,12 @@
       }
     }
 
-    if (FLAGS_queue_initialization_threads != 0) {
+    if (absl::GetFlag(FLAGS_queue_initialization_threads) != 0) {
       std::mutex pool_mutex;
       std::vector<std::thread> threads;
-      threads.reserve(FLAGS_queue_initialization_threads);
-      for (size_t i = 0; i < FLAGS_queue_initialization_threads; ++i) {
+      threads.reserve(absl::GetFlag(FLAGS_queue_initialization_threads));
+      for (size_t i = 0; i < absl::GetFlag(FLAGS_queue_initialization_threads);
+           ++i) {
         threads.emplace_back([this, &pool_mutex, &channels_to_construct]() {
           while (true) {
             const aos::Channel *channel;
@@ -160,7 +163,8 @@
           }
         });
       }
-      for (size_t i = 0; i < FLAGS_queue_initialization_threads; ++i) {
+      for (size_t i = 0; i < absl::GetFlag(FLAGS_queue_initialization_threads);
+           ++i) {
         threads[i].join();
       }
     }
@@ -230,7 +234,7 @@
   if (info.ssi_signo == SIGCHLD) {
     // SIGCHLD messages can be collapsed if multiple are received, so all
     // applications must check their status.
-    if (FLAGS_enable_ftrace) {
+    if (absl::GetFlag(FLAGS_enable_ftrace)) {
       ftrace_.FormatMessage("SIGCHLD");
       ftrace_.TurnOffOrDie();
     }
@@ -324,7 +328,8 @@
   CHECK(channel != nullptr);
   std::unique_ptr<aos::ipc_lib::MemoryMappedQueue> queue =
       std::make_unique<aos::ipc_lib::MemoryMappedQueue>(
-          shm_base_, FLAGS_permissions, event_loop_.configuration(), channel);
+          shm_base_, absl::GetFlag(FLAGS_permissions),
+          event_loop_.configuration(), channel);
 
   {
     std::unique_lock<std::mutex> locker(queue_mutex_);
diff --git a/aos/starter/subprocess.cc b/aos/starter/subprocess.cc
index c36d59b..593945b 100644
--- a/aos/starter/subprocess.cc
+++ b/aos/starter/subprocess.cc
@@ -15,9 +15,11 @@
 #include <ostream>
 #include <ratio>
 
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_split.h"
-#include "glog/logging.h"
 
 #include "aos/util/file.h"
 #include "aos/util/process_info_generated.h"
@@ -655,7 +657,7 @@
       last_timing_report_ +
           // Leave a bit of margin on the timing report receipt time, to allow
           // for timing errors.
-          3 * std::chrono::milliseconds(FLAGS_timing_report_ms) >
+          3 * std::chrono::milliseconds(absl::GetFlag(FLAGS_timing_report_ms)) >
       event_loop_->monotonic_now());
   status_builder.add_last_stop_reason(stop_reason_);
   if (pid_ != -1) {
diff --git a/aos/starter/subprocess_reliable_test.cc b/aos/starter/subprocess_reliable_test.cc
index a395870..894b6fe 100644
--- a/aos/starter/subprocess_reliable_test.cc
+++ b/aos/starter/subprocess_reliable_test.cc
@@ -9,8 +9,9 @@
 #include <string>
 #include <thread>
 
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
-#include "glog/logging.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
diff --git a/aos/starter/subprocess_test.cc b/aos/starter/subprocess_test.cc
index 2951b2b..d2dc3b0 100644
--- a/aos/starter/subprocess_test.cc
+++ b/aos/starter/subprocess_test.cc
@@ -6,10 +6,11 @@
 
 #include <ostream>
 
+#include "absl/flags/flag.h"
+#include "absl/log/check.h"
+#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
@@ -25,15 +26,10 @@
 
 class SubprocessTest : public ::testing::Test {
  protected:
-  SubprocessTest() : shm_dir_(aos::testing::TestTmpDir() + "/aos") {
-    FLAGS_shm_base = shm_dir_;
-
+  SubprocessTest() {
     // Nuke the shm dir:
-    aos::util::UnlinkRecursive(shm_dir_);
+    aos::util::UnlinkRecursive(absl::GetFlag(FLAGS_shm_base));
   }
-
-  gflags::FlagSaver flag_saver_;
-  std::string shm_dir_;
 };
 
 TEST_F(SubprocessTest, CaptureOutputs) {