diff --git a/Android.bp b/Android.bp
index c81e41c..6d335a6 100644
--- a/Android.bp
+++ b/Android.bp
@@ -47,6 +47,18 @@
         "src",
     ],
 
+    /*
+    TODO: Header refactoring cleanup:
+
+    Option 1): Move src/$component/file_name.h to src/$component/include/$component/file_name.h
+    Option 2): Symlink src/$component/include/$component to src/$component
+
+    Set export_include_dirs to '$component/include' for that component.
+
+    Also delete the 'include' directory unless we have code other non-iorap
+    targets are allowed to reference.
+    */
+
     clang: true,
     shared_libs: ["libbase"],
 }
@@ -56,31 +68,29 @@
 
     static_libs: [
         "libiorap-binder",
+        "libplatformprotos",  // android framework C++ protos.
     ],
     shared_libs: [
-        "libiorap",
         "libbinder",
         "libutils",
         "libcutils", // tracing.
 
+        "libfruit",  // dependency injection.
         // TODO: remove these annoying dependencies by hiding them in the main library code.
-    ],
-}
 
-cc_library_shared {
-    name: "libiorap",
-    defaults: [
-        "iorap-default-flags",
-    ],
-    srcs: [
+        // dependency for libplatformprotos
+        // "libprotobuf-cpp-lite",
+
+        // libplatformprotos has an indirect dependency on full, causing compilation/linking
+        // errors if we use lite
+        "libprotobuf-cpp-full",
     ],
 
-    //export_include_dirs: ["include"],
-    //local_include_dirs: ["src/native"],
+    // srcs: [":libprotobuf-internal-protos"],
+    // commented out because it causes compilation errors
+    // TODO: can we use the lite library somehow?
 
-    static_libs: [
-        "libprotobuf-cpp-lite",
-    ],
+    header_libs: ["librxcpp"],
 }
 
 cc_library_static {
@@ -101,6 +111,34 @@
         include_dirs: ["frameworks/native/aidl/binder"],
         export_aidl_headers: true,
     },
+    static_libs: [
+       "libplatformprotos",  // android framework C++ protos.
+    ],
+}
+
+cc_defaults {
+    name: "libiorap-manager-default-dependencies",
+    static_libs: [
+        "libiorap-perfetto",
+    ],
+    defaults: [
+        "libiorap-perfetto-default-dependencies",
+    ],
+    // Users of 'libiorap-manager' also need to include these defaults to avoid
+    // linking errors.
+}
+
+cc_library_static {
+    name: "libiorap-manager",
+    defaults: [
+        "iorap-default-flags",
+        "iorap-default-dependencies",
+        "libiorap-manager-default-dependencies",
+    ],
+
+    srcs: [
+        "src/manager/**.cc",
+    ],
 }
 
 cc_binary {
@@ -108,18 +146,61 @@
     defaults: [
         "iorap-default-flags",
         "iorap-default-dependencies",
+        "libiorap-manager-default-dependencies",
     ],
     srcs: [
         "src/iorapd/main.cc",
     ],
+    static_libs: [
+        "libiorap-manager",
+    ],
     init_rc: [
         "iorapd.rc",
     ],
 }
 
+cc_library_static {
+    name: "libiorap-inode2filename",
+    defaults: [
+        "iorap-default-flags",
+        "iorap-default-dependencies",
+    ],
+
+    srcs: [
+        "src/inode2filename/**/*.cc",
+    ],
+}
+
+cc_binary {
+  name: "iorap.inode2filename",
+  defaults: [
+      "iorap-default-flags",
+      "iorap-default-dependencies",
+  ],
+  srcs: [
+      "src/inode2filename/**/*.cc",
+  ],
+  // Easier debugging. TODO: make a separate debug config.
+  // XX: Using -O0 seems to completely hide some errors.
+  cflags: ["-O2", "-UNDEBUG", "-DIORAP_INODE2FILENAME_MAIN=1"],
+  sanitize: {
+    undefined: true,
+    all_undefined: true,
+    // Pretty print when ubsan detects a problem.
+    // Otherwise it just calls abort().
+
+/*
+    diag: {
+      undefined: true,
+    },
+    */ // don't use the diag when you want it to crash.
+  },
+}
+
 cc_test {
     name: "iorapd-tests",
     test_suites: ["device-tests"],
+    gtest: false,  // we use gtest *and* gmock.
     defaults: [
         "iorap-default-flags",
         "iorap-default-dependencies",
@@ -127,4 +208,88 @@
     srcs: [
         "tests/src/**/*.cc",
     ],
+    cflags: ["-O2", "-UNDEBUG"],
+
+    // TODO:  we should probably have per-component tests.
+    static_libs: ["libgmock_main", "libgmock", "libgtest", "libiorap-inode2filename"],
+}
+
+filegroup {
+  name: "libiorap-perfetto-protos",
+  srcs: [
+  ],
+}
+
+// Static libraries cannot export their dependencies,
+// the current convention is to use an extra 'defaults' rule for statics
+// to bring in all the dependencies.
+cc_defaults {
+    name: "libiorap-perfetto-default-dependencies",
+
+    // Some of the libperfetto header typedefs leak out into iorap.
+    // Avoids compilation #include errors.
+    // TODO: clean this up, the headers should not leak out (maybe all we need is a PerfettoConsumer
+    // forward declaration?).
+    include_dirs: ["external/perfetto/include"],
+    // Various perfetto protos are used directly by iorap.
+    //
+    // Furthermore, we need this regardless to avoid linking errors when linking
+    // libiorap-perfetto.a into the main cc_binary rule.
+    static_libs: [
+        "perfetto_trace_protos",
+    ],
+
+    shared_libs: [
+        // Not part of true dependencies: Users of 'libiorap-perfetto' do not link against
+        // libperfetto.
+        // We only put this to avoid linking errors when building iorapd.
+        // TODO: can we split iorapd into libiorapd-main that doesn't link against libperfetto?
+        // only the last cc_binary should need the full transitive closure of the dependency graph.
+        "libperfetto",
+    ]
+}
+
+cc_library_static {
+    name: "libiorap-perfetto",
+    defaults: [
+        "iorap-default-flags",
+        "iorap-default-dependencies",
+        "libiorap-perfetto-default-dependencies",
+    ],
+
+    srcs: [
+        "src/perfetto/**/*.cc",
+    ],
+}
+
+cc_binary {
+  name: "iorap.cmd.perfetto",
+  defaults: [
+      "iorap-default-flags",
+      "iorap-default-dependencies",
+  ],
+  shared_libs: ["libperfetto"],
+  include_dirs: ["external/perfetto/include"],
+  srcs: [
+      "src/perfetto/**/*.cc",
+  ],
+  // Easier debugging. TODO: make a separate debug config.
+  // XX: Using -O0 seems to completely hide some errors.
+  cflags: ["-O2", "-UNDEBUG", "-DIORAP_PERFETTO_MAIN=1"],
+  sanitize: {
+    undefined: true,
+    all_undefined: true,
+    // Pretty print when ubsan detects a problem.
+    // Otherwise it just calls abort().
+
+/*
+    diag: {
+      undefined: true,
+    },
+    */ // don't use the diag when you want it to crash.
+  },
+
+  static_libs: [
+    "perfetto_trace_protos",
+  ],
 }
diff --git a/binder/com/google/android/startop/iorap/AppLaunchEvent.aidl b/binder/com/google/android/startop/iorap/AppLaunchEvent.aidl
new file mode 100644
index 0000000..ea3f9f1
--- /dev/null
+++ b/binder/com/google/android/startop/iorap/AppLaunchEvent.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.startop.iorap;
+
+/** @hide */
+parcelable AppLaunchEvent cpp_header "binder/app_launch_event.h";
diff --git a/binder/com/google/android/startop/iorap/IIorap.aidl b/binder/com/google/android/startop/iorap/IIorap.aidl
index 2b58905..fe91d15 100644
--- a/binder/com/google/android/startop/iorap/IIorap.aidl
+++ b/binder/com/google/android/startop/iorap/IIorap.aidl
@@ -19,6 +19,7 @@
 import com.google.android.startop.iorap.ITaskListener;
 
 import com.google.android.startop.iorap.PackageEvent;
+import com.google.android.startop.iorap.AppLaunchEvent;
 import com.google.android.startop.iorap.AppIntentEvent;
 import com.google.android.startop.iorap.SystemServiceEvent;
 import com.google.android.startop.iorap.SystemServiceUserEvent;
@@ -107,6 +108,7 @@
     // in frameworks/base/startop/src/com/google/android/startop/iorap/${Type}Event.java
 
     // void onActivityHintEvent(in RequestId request, in ActivityHintEvent event);
+    void onAppLaunchEvent(in RequestId request, in AppLaunchEvent event);
     void onPackageEvent(in RequestId request, in PackageEvent event);
     void onAppIntentEvent(in RequestId request, in AppIntentEvent event);
     void onSystemServiceEvent(in RequestId request, in SystemServiceEvent event);
diff --git a/include/binder/app_launch_event.h b/include/binder/app_launch_event.h
new file mode 100644
index 0000000..784db16
--- /dev/null
+++ b/include/binder/app_launch_event.h
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IORAP_BINDER_APP_LAUNCH_EVENT_H_
+#define IORAP_BINDER_APP_LAUNCH_EVENT_H_
+
+#include "binder/common.h"
+#include "common/introspection.h"
+#include "common/expected.h"
+
+#include <binder/Parcel.h>
+#include <binder/Parcelable.h>
+#include <frameworks/base/core/proto/android/content/intent.pb.h>  // IntentProto
+#include <frameworks/base/core/proto/android/server/activitymanagerservice.pb.h>  // ActivityRecord
+
+namespace iorap {
+namespace binder {
+
+// These protos are part of the iorapd binder ABI, alias them for easier usage.
+using IntentProto = ::android::content::IntentProto;
+using ActivityRecordProto = ::com::android::server::am::ActivityRecordProto;
+
+struct AppLaunchEvent : public ::android::Parcelable {
+  // Index position matters: Keep up-to-date with AppLaunchEvent.java sTypes field.
+  enum class Type : int32_t {
+    kUninitialized = -1,
+    kIntentStarted = 0,
+    kIntentFailed = 1,
+    kActivityLaunched = 2,
+    kActivityLaunchFinished = 3,
+    kActivityLaunchCancelled = 4,
+  };
+
+  enum class Temperature : int32_t {
+    kUninitialized = -1,
+    kCold = 1,
+    kWarm = 2,
+    kHot = 3,
+  };
+
+  Type type{Type::kUninitialized};
+  int64_t sequence_id{-1};
+  // kIntentStarted only.
+  std::unique_ptr<IntentProto> intent_proto;
+  // kActivityLaunched only.
+  Temperature temperature{Temperature::kUninitialized};
+  // kActivityLaunch*. Can be null in kActivityLaunchCancelled.
+  std::unique_ptr<ActivityRecordProto> activity_record_proto;
+
+  AppLaunchEvent() = default;
+  AppLaunchEvent(Type type,
+                 int64_t sequence_id,
+                 std::unique_ptr<IntentProto> intent_proto = nullptr,
+                 Temperature temperature = Temperature::kUninitialized,
+                 std::unique_ptr<ActivityRecordProto> activity_record_proto = nullptr)
+    : type(type),
+      sequence_id(sequence_id),
+      intent_proto(std::move(intent_proto)),
+      temperature(temperature),
+      activity_record_proto(std::move(activity_record_proto)) {
+  }
+
+  ::android::status_t readFromParcel(const android::Parcel* parcel) override {
+
+#   define PARCEL_READ_OR_RETURN(function, ...) \
+    if (::android::status_t res = function(__VA_ARGS__); res != ::android::NO_ERROR) { \
+      LOG(ERROR) << "AppLaunchEvent::readFromParcel failed"; \
+      return res; \
+    }
+
+    int32_t type_int;
+    PARCEL_READ_OR_RETURN(parcel->readInt32, &type_int);
+    type = static_cast<Type>(type_int);
+
+    LOG(VERBOSE) << "AppLaunchEvent::readFromParcel (type=" << type_int << ")";
+
+    PARCEL_READ_OR_RETURN(parcel->readInt64, &sequence_id);
+
+    switch (type) {
+      case Type::kIntentStarted:
+        PARCEL_READ_OR_RETURN(readIntent, parcel);
+        break;
+      case Type::kIntentFailed:
+        // No extra arguments.
+        break;
+      case Type::kActivityLaunched: {
+        PARCEL_READ_OR_RETURN(readActivityRecordProto, parcel);
+        int32_t temperature_int;
+        PARCEL_READ_OR_RETURN(parcel->readInt32, &temperature_int);
+        temperature = static_cast<Temperature>(temperature_int);
+        break;
+      }
+      case Type::kActivityLaunchFinished:
+        PARCEL_READ_OR_RETURN(readActivityRecordProto, parcel);
+        break;
+      case Type::kActivityLaunchCancelled:
+        PARCEL_READ_OR_RETURN(readActivityRecordProtoNullable, parcel);
+        break;
+      default:
+        return android::BAD_VALUE;
+    }
+#   undef PARCEL_READ_OR_RETURN
+
+    return ::android::NO_ERROR;
+
+    // TODO: std::variant + protobuf implementation in AutoParcelable.
+  }
+
+#define PARCEL_WRITE_OR_RETURN(function, ...) \
+  if (::android::status_t res = function(__VA_ARGS__); res != ::android::NO_ERROR) { \
+    return res; \
+  }
+
+  ::android::status_t writeToParcel(android::Parcel* parcel) const override {
+    PARCEL_WRITE_OR_RETURN(parcel->writeInt32, static_cast<int32_t>(type));
+    PARCEL_WRITE_OR_RETURN(parcel->writeInt64, sequence_id);
+
+    switch (type) {
+      case Type::kIntentStarted:
+        PARCEL_WRITE_OR_RETURN(writeIntent, parcel);
+        break;
+      case Type::kIntentFailed:
+        // No extra arguments.
+        break;
+      case Type::kActivityLaunched:
+        PARCEL_WRITE_OR_RETURN(writeActivityRecordProto, parcel);
+        PARCEL_WRITE_OR_RETURN(parcel->writeInt32, static_cast<int32_t>(temperature));
+        break;
+      case Type::kActivityLaunchFinished:
+        PARCEL_WRITE_OR_RETURN(writeActivityRecordProto, parcel);
+        break;
+      case Type::kActivityLaunchCancelled:
+        PARCEL_WRITE_OR_RETURN(writeActivityRecordProtoNullable, parcel);
+        break;
+      default:
+        DCHECK(false) << "attempted to write an uninitialized AppLaunchEvent to Parcel";
+        return android::BAD_VALUE;
+    }
+
+#undef PARCEL_WRITE_OR_RETURN
+
+    return android::NO_ERROR;
+  }
+
+ private:
+  // Using 'unique_ptr' here because protobufs don't have a move constructor. Is there
+  // a better way that is cheap to pass them around?
+  template <typename T>
+  static expected<std::unique_ptr<T>, ::android::status_t>
+  ReadProto(const android::Parcel* parcel) {
+    DCHECK(parcel != nullptr);
+
+    ::android::status_t res;
+
+    std::vector<uint8_t> byte_vector;
+    if ((res = parcel->readByteVector(/*out*/&byte_vector)) != ::android::NO_ERROR) {
+      return unexpected(res);
+    }
+    // TODO: we may want to do this without an extra copy, by parsing
+    // the protobuf directly out of the parcel.
+
+    const uint8_t* data = byte_vector.data();
+    const size_t size = byte_vector.size();
+
+    std::unique_ptr<T> proto_ptr{new T{}};
+
+    if (!proto_ptr) {
+      return unexpected(::android::NO_MEMORY);
+    }
+
+    if (!proto_ptr->ParseFromArray(data, size)) {
+      return unexpected(::android::BAD_VALUE);
+    }
+
+    return proto_ptr;
+  }
+
+  template <typename T>
+  static expected<std::unique_ptr<T>, ::android::status_t>
+  ReadNullableProto(const android::Parcel* parcel) {
+    DCHECK(parcel != nullptr);
+
+    bool value;
+
+    ::android::status_t res;
+    res = parcel->readBool(/*out*/&value);
+
+    if (res != ::android::NO_ERROR) {
+      return unexpected(res);
+    }
+
+    if (!value) {
+      return std::unique_ptr<T>{nullptr};
+    }
+
+    return ReadProto<T>(parcel);
+  }
+
+  template <typename T>
+  static ::android::status_t
+  WriteProto(android::Parcel* parcel, const std::unique_ptr<T>& proto) {
+    DCHECK(parcel != nullptr);
+    DCHECK(proto != nullptr);
+
+    std::vector<uint8_t> byte_vector;
+    {
+      const int serialized_size = proto->ByteSize();
+      byte_vector.resize(serialized_size);
+      if (!proto->SerializeToArray(byte_vector.data(), serialized_size)) {
+        return ::android::BAD_VALUE;
+      }
+    }
+
+    ::android::status_t res;
+    if ((res = parcel->writeByteVector(/*in*/byte_vector)) != ::android::NO_ERROR) {
+      return res;
+    }
+
+    return ::android::NO_ERROR;
+  }
+
+  template <typename T>
+  static ::android::status_t
+  WriteNullableProto(android::Parcel* parcel, const std::unique_ptr<T>& maybe_proto) {
+    bool value = (maybe_proto != nullptr);
+
+    ::android::status_t res;
+    res = parcel->writeBool(value);
+
+    if (res != ::android::NO_ERROR) {
+      return res;
+    }
+
+    if (!value) {
+      return ::android::NO_ERROR;
+    }
+
+    return WriteProto<T>(parcel, maybe_proto);
+  }
+
+  android::status_t readIntent(const android::Parcel* parcel) {
+    expected<std::unique_ptr<IntentProto>, ::android::status_t> maybe_intent =
+        ReadProto<IntentProto>(parcel);
+
+    if (maybe_intent) {
+      intent_proto = std::move(maybe_intent.value());
+      return ::android::NO_ERROR;
+    } else {
+      return maybe_intent.error();
+    }
+  }
+
+  android::status_t readActivityRecordProto(const android::Parcel* parcel) {
+    expected<std::unique_ptr<ActivityRecordProto>, ::android::status_t> maybe_record =
+        ReadProto<ActivityRecordProto>(parcel);
+
+    if (maybe_record) {
+      activity_record_proto = std::move(maybe_record.value());
+      return ::android::NO_ERROR;
+    } else {
+      return maybe_record.error();
+    }
+  }
+
+  android::status_t readActivityRecordProtoNullable(const android::Parcel* parcel) {
+    expected<std::unique_ptr<ActivityRecordProto>, ::android::status_t> maybe_record =
+        ReadNullableProto<ActivityRecordProto>(parcel);
+
+    if (maybe_record) {
+      activity_record_proto = std::move(maybe_record.value());
+      return ::android::NO_ERROR;
+    } else {
+      return maybe_record.error();
+    }
+  }
+
+  android::status_t writeIntent(android::Parcel* parcel) const {
+    return WriteProto<IntentProto>(parcel, intent_proto);
+  }
+
+  android::status_t writeActivityRecordProto(android::Parcel* parcel) const {
+    return WriteProto<ActivityRecordProto>(parcel, activity_record_proto);
+  }
+
+  android::status_t writeActivityRecordProtoNullable(android::Parcel* parcel) const {
+    return WriteNullableProto<ActivityRecordProto>(parcel, activity_record_proto);
+  }
+};
+
+inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent::Type& type) {
+  switch (type) {
+    case AppLaunchEvent::Type::kUninitialized:
+      os << "kUninitialized";
+      break;
+    case AppLaunchEvent::Type::kIntentStarted:
+      os << "kIntentStarted";
+      break;
+    case AppLaunchEvent::Type::kIntentFailed:
+      os << "kIntentFailed";
+      break;
+    case AppLaunchEvent::Type::kActivityLaunched:
+      os << "kActivityLaunched";
+      break;
+    case AppLaunchEvent::Type::kActivityLaunchCancelled:
+      os << "kActivityLaunchCancelled";
+      break;
+    case AppLaunchEvent::Type::kActivityLaunchFinished:
+      os << "kActivityLaunchFinished";
+      break;
+    default:
+      os << "(unknown)";
+  }
+  return os;
+}
+
+inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent::Temperature& type) {
+  switch (type) {
+    case AppLaunchEvent::Temperature::kUninitialized:
+      os << "kUninitialized";
+      break;
+    case AppLaunchEvent::Temperature::kCold:
+      os << "kCold";
+      break;
+    case AppLaunchEvent::Temperature::kWarm:
+      os << "kWarm";
+      break;
+    case AppLaunchEvent::Temperature::kHot:
+      os << "kHot";
+      break;
+    default:
+      os << "(unknown)";
+  }
+  return os;
+}
+
+inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent& e) {
+  os << "AppLaunchEvent{";
+  os << "type=" << e.type << ",";
+  os << "sequence_id=" << e.sequence_id << ",";
+
+  os << "intent_proto=";
+  if (e.intent_proto == nullptr) {
+    os << "(nullptr)";
+  } else {
+    os << "(action=" << e.intent_proto->action() << ",";
+    os << "component=";
+    if (e.intent_proto->has_component()) {
+      // $package/$class_name
+      os << e.intent_proto->component().package_name() << "/"
+         << e.intent_proto->component().class_name();
+    } else {
+      os << "(no component)";
+    }
+    os << ")";
+  }
+  os << ",";
+
+  os << "temperature=" << e.temperature << ",";
+  os << ",";
+
+  os << "activity_record_proto=";
+  if (e.activity_record_proto == nullptr) {
+    os << "(nullptr)";
+  } else {
+    // title or component name.
+    os << "'" << e.activity_record_proto->identifier().title() << "'";
+  }
+  os << "}";
+
+  return os;
+}
+
+/*
+IORAP_INTROSPECT_ADAPT_STRUCT(AppLaunchEvent,
+                              type,
+                              sequence_id,
+                              intent_proto,
+                              temperature,
+                              activity_record_proto);
+*/
+
+}  // namespace binder
+}  // namespace iorap
+
+IORAP_JAVA_NAMESPACE_BINDER_TYPEDEF(AppLaunchEvent)
+
+#endif  // IORAP_BINDER_APP_LAUNCH_EVENT_H_
diff --git a/src/binder/iiorap_def.h b/src/binder/iiorap_def.h
index b88f873..0c1eac8 100644
--- a/src/binder/iiorap_def.h
+++ b/src/binder/iiorap_def.h
@@ -27,6 +27,8 @@
 FN_BEGIN(::com::google::android::startup::iorap::,IIorap)                                          \
 /* name              <see IORAP_BINDER_PARAM_JOIN> */                                              \
 FN(setTaskListener, (const ::android::sp<::com::google::android::startop::iorap::,ITaskListener,>&,listener)) /*NOLINT*/ \
+FN(onAppLaunchEvent,(const ::com::google::android::startop::iorap::,RequestId,&,request),          \
+                    (const ::com::google::android::startop::iorap::,AppLaunchEvent,&,event))       \
 FN(onPackageEvent,  (const ::com::google::android::startop::iorap::,RequestId,&,request),          \
                     (const ::com::google::android::startop::iorap::,PackageEvent,&,event))         \
 FN(onAppIntentEvent,(const ::com::google::android::startop::iorap::,RequestId,&,request),          \
diff --git a/src/binder/iiorap_impl.cc b/src/binder/iiorap_impl.cc
index 52ef9fa..a6f6409 100644
--- a/src/binder/iiorap_impl.cc
+++ b/src/binder/iiorap_impl.cc
@@ -17,8 +17,10 @@
 #include "binder/iiorap_impl.h"
 #include "binder/iiorap_def.h"
 #include "common/macros.h"
+#include "manager/event_manager.h"
 
 #include <android-base/logging.h>
+#include <android-base/properties.h>
 #include <binder/BinderService.h>
 #include <binder/IPCThreadState.h>
 #include <include/binder/request_id.h>
@@ -57,6 +59,25 @@
 #undef IIORAP_IMPL_ARG_NAMES
 #undef IIORAP_IMPL_ARGS
 
+namespace {
+
+struct ServiceParams {
+  bool fake_{false};
+  std::shared_ptr<manager::EventManager> event_manager_;
+};
+
+static std::atomic<bool> s_service_started_{false};
+static std::atomic<bool> s_service_params_ready_{false};
+
+// TODO: BinderService constructs IIorapImpl,
+// but how do I get a pointer to it afterwards?
+//
+// This is a workaround for that, by using a global.
+static ServiceParams s_service_params_;
+static std::atomic<ServiceParams*> s_service_params_atomic_;
+
+}  // namespace anonymous
+
 class IIorapImpl::Impl {
  public:
   void SetTaskListener(const ::android::sp<ITaskListener>& listener) {
@@ -90,28 +111,88 @@
     }
   }
 
+  bool OnAppLaunchEvent(const RequestId& request_id,
+                        const AppLaunchEvent& event) {
+    if (MaybeHandleFakeBehavior(request_id)) {
+      return true;
+    }
+
+    return service_params_.event_manager_->OnAppLaunchEvent(request_id, event);
+  }
+
+  void HandleFakeBehavior(const RequestId& request_id) {
+    DCHECK(service_params_.fake_);
+
+    // Send these dummy callbacks for testing only.
+    ReplyWithResult(request_id, TaskResult::State::kBegan);
+    ReplyWithResult(request_id, TaskResult::State::kOngoing);
+    ReplyWithResult(request_id, TaskResult::State::kCompleted);
+  }
+
+  // TODO: Subclass IIorap with a separate fake implementation.
+  bool MaybeHandleFakeBehavior(const RequestId& request_id) {
+    if (service_params_.fake_) {
+      HandleFakeBehavior(request_id);
+      return true;
+    }
+
+    return false;
+  }
+
   ::android::sp<ITaskListener> listener_;
+
+  Impl(ServiceParams p) : service_params_{std::move(p)} {
+    CHECK(service_params_.event_manager_ != nullptr);
+  }
+
+  ServiceParams service_params_;
 };
 
 using Impl = IIorapImpl::Impl;
 
-IIorapImpl::IIorapImpl() : impl_(new Impl()) {}
+IIorapImpl::IIorapImpl() {
+  // Acquire edge of synchronizes-with IIorapImpl::Start().
+  CHECK(s_service_params_ready_.load());
+  // Do not turn this into a DCHECK, the above atomic load
+  // must happen-before the read of s_service_params_ready_.
+  impl_.reset(new Impl(std::move(s_service_params_)));
+}
 
 namespace {
   static bool started_ = false;
 }
-bool IIorapImpl::Start() {
-  if (started_) {
+bool IIorapImpl::Start(std::shared_ptr<manager::EventManager> event_manager) {
+  if (s_service_started_.load()) {  // Acquire-edge (see bottom of function).
+    // Note: Not meant to be idempotent. Two threads could race, and the second
+    // one would likely fail the publish.
+
     LOG(ERROR) << "service was already started";
     return false;  // Already started
   }
 
+  CHECK(event_manager != nullptr);
+
+  {
+    // This block of code needs to happen-before IIorapImpl::IIorapImpl.
+
+    // TODO: There should be a simpler way of passing down
+    // this data which doesn't involve globals and memory synchronization.
+    ServiceParams* p = &s_service_params_;
+    // TODO: move all property reads to a dedicated Config class.
+    p->fake_ = ::android::base::GetBoolProperty("iorapd.binder.fake", /*default*/false);
+    p->event_manager_ = std::move(event_manager);
+
+    // Release edge of synchronizes-with IIorapImpl::IIorapImpl.
+    s_service_params_ready_.store(true);
+  }
+
   ::android::IPCThreadState::self()->disableBackgroundScheduling(/*disable*/true);
   ::android::status_t ret = android::BinderService<IIorapImpl>::publish();
   if (ret != android::OK) {
     LOG(ERROR) << "BinderService::publish failed with error code: " << ret;
     return false;
   }
+
   android::sp<android::ProcessState> ps = android::ProcessState::self();
   // Reduce thread consumption by only using 1 thread.
   // We should also be able to leverage this by avoiding locks, etc.
@@ -119,45 +200,72 @@
   ps->startThreadPool();
   ps->giveThreadPoolName();
 
-  started_ = true;
+  // Release edge synchronizes-with the top of this function.
+  s_service_started_.store(true);
 
   return true;
 }
 
 namespace {
-template <typename ... Args>
-void SendArgs(const char* function_name,
-              Impl* self,
-              const RequestId& request_id,
-              Args&&... /*rest*/) {
-  // TODO: verbose, not INFO
-  LOG(VERBOSE) << "IIorap::" << function_name << " (request_id = " << request_id.request_id << ")";
-  // TODO: implementation.
 
-  // Send these dummy callbacks for testing only.
-  // TODO: these should only be sent back when the client connects in a special 'test' mode.
-  self->ReplyWithResult(request_id, TaskResult::State::kBegan);
-  self->ReplyWithResult(request_id, TaskResult::State::kOngoing);
-  self->ReplyWithResult(request_id, TaskResult::State::kCompleted);
+#define MAYBE_HAVE_FAKE_BEHAVIOR(self, request_id) \
+  if (self->MaybeHandleFakeBehavior(request_id)) { return ::android::binder::Status::ok(); }
+
+template <typename ... Args>
+Status SendArgs(const char* function_name,
+                Impl* self,
+                const RequestId& request_id,
+                Args&&... /*rest*/) {
+  LOG(VERBOSE) << "IIorap::" << function_name << " (request_id = " << request_id.request_id << ")";
+
+  MAYBE_HAVE_FAKE_BEHAVIOR(self, request_id);
+
+  // TODO: implementation.
+  LOG(ERROR) << "IIorap::" << function_name << " -- not implemented for real code";
+  return Status::fromStatusT(::android::INVALID_OPERATION);
 }
 
 template <typename ... Args>
-void SendArgs(const char* /*function_name*/, Impl* self, Args&&... rest) {
-  // TODO: may want an assert here for readability.
+Status SendArgs(const char* function_name, Impl* self, Args&&... rest) {
+  DCHECK_EQ(std::string(function_name), "setTaskListener");
   LOG(VERBOSE) << "IIorap::setTaskListener";
   self->SetTaskListener(std::forward<Args&&>(rest)...);
+
+  return Status::ok();
+}
+
+template <typename ... Args>
+Status SendArgs(const char* function_name,
+                Impl* self,
+                const RequestId& request_id,
+                const AppLaunchEvent& app_launch_event) {
+  DCHECK_EQ(std::string(function_name), "onAppLaunchEvent");
+  LOG(VERBOSE) << "IIorap::onAppLaunchEvent";
+
+  MAYBE_HAVE_FAKE_BEHAVIOR(self, request_id);
+
+  if (self->OnAppLaunchEvent(request_id, app_launch_event)) {
+    return Status::ok();
+  } else {
+    // TODO: I suppose this should write out an exception back,
+    // like a service-specific error or something.
+    //
+    // It depends on whether or not we even have any synchronous
+    // errors.
+    //
+    // Most of the work here is done async, so it should handle
+    // async callbacks.
+    return Status::fromStatusT(::android::BAD_VALUE);
+  }
 }
 
 template <typename ... Args>
 Status Send(const char* function_name, Args&&... args) {
   LOG(VERBOSE) << "IIorap::Send(" << function_name << ")";
 
-  SendArgs(function_name, std::forward<Args>(args)...);
+  return SendArgs(function_name, std::forward<Args>(args)...);
+}
+}  // namespace <anonymous>
 
-  // Note: The exact return code doesn't matter: all the AIDL methods are oneway.
-  return Status::ok();
-}
-}
-
-}
-}
+}  // namespace binder
+}  // namespace iorap
diff --git a/src/binder/iiorap_impl.h b/src/binder/iiorap_impl.h
index 753967d..811497f 100644
--- a/src/binder/iiorap_impl.h
+++ b/src/binder/iiorap_impl.h
@@ -22,11 +22,17 @@
 
 #include "com/google/android/startop/iorap/BnIorap.h"
 
+#include <memory>
+
 namespace android {
 template <typename Service>
 class BinderService;
 }
 
+namespace iorap::manager {
+  class EventManager;
+};
+
 namespace iorap {
 namespace binder {
 
@@ -36,7 +42,7 @@
 // See also IIorap.aidl.
 class IIorapImpl : public ::com::google::android::startop::iorap::BnIorap {
 public:
-  static bool Start();
+  static bool Start(std::shared_ptr<iorap::manager::EventManager> event_manager);
   static constexpr const char* getServiceName() { return "iorapd"; };
 
 // Join all parameter declarations by splitting each parameter with a comma.
diff --git a/src/common/debug.h b/src/common/debug.h
new file mode 100644
index 0000000..bc21c74
--- /dev/null
+++ b/src/common/debug.h
@@ -0,0 +1,98 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <ostream>
+
+namespace iorap {
+
+// kIsDebugBuild is special.
+// It gets to be in the 'iorap' namespace
+// so that different modules don't need to qualify it.
+#ifndef NDEBUG
+static constexpr bool kIsDebugBuild = true;
+#else
+static constexpr bool kIsDebugBuild = false;
+#endif
+
+namespace common {
+
+// TODO: move below code to helpers.
+template <typename T, bool>
+struct base_if_condition {};
+
+template <typename T>
+struct base_if_condition<T, true> : public T {};
+
+template <typename T>
+using base_if_debug = base_if_condition<T, kIsDebugBuild>;
+
+namespace detail {
+// "if constexpr" doesn't allow us to exclude fields from a struct/class,
+// and also "if constexpr" doesn't allow us to reference a field that does not
+// exist.
+// so we must move everything into a separate base class.
+template <bool kIsDebug = kIsDebugBuild>
+struct DebugCounterBase {
+  constexpr size_t value() const {
+    return counter;
+  }
+
+  constexpr void set_value(size_t value) {
+    counter = value;
+  }
+
+  size_t counter{1};  // Don't start with 0.
+};
+
+template <>
+struct DebugCounterBase<false /*kIsDebug*/> {
+  constexpr size_t value() const {
+    return 0;
+  }
+
+  constexpr void set_value(size_t value) {
+  }
+};
+}  // namespace detail
+
+// This counter does absolutely nothing, the code compiles to no-ops
+// when debugging is disabled.
+struct DebugCounter : detail::DebugCounterBase<> {
+  constexpr DebugCounter& operator++() {
+    set_value(value() + 1);
+    return *this;
+  }
+
+  constexpr DebugCounter operator++(int) {
+    DebugCounter now = *this;
+    set_value(value() + 1);
+    return now;
+  }
+
+  constexpr operator size_t() const {
+    return value();
+  }
+
+  friend std::ostream& operator<<(std::ostream& os, DebugCounter counter);
+};
+
+inline std::ostream& operator<<(std::ostream& os, DebugCounter counter) {
+  os << counter.value();
+  return os;
+}
+
+// TODO: refactor DebugCounter and base traits into their own files?
+
+}  // namespace common
+}  // namespace iorap
diff --git a/src/common/expected.h b/src/common/expected.h
new file mode 100644
index 0000000..3d8eef7
--- /dev/null
+++ b/src/common/expected.h
@@ -0,0 +1,404 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_COMMON_EXPECTED_H_
+#define IORAP_SRC_COMMON_EXPECTED_H_
+
+#include <type_traits>
+#include <utility>
+
+#include <android-base/logging.h>  // CHECK/DCHECK.
+
+// Ignore the tautological-undefined-compare warning.
+// We obviously want to do this to protect against undefined behavior
+// that sets a reference to a null value.
+#define DCHECK_UB_NOT_NULL(x) \
+  DCHECK(reinterpret_cast<volatile decltype(x)>(x) != nullptr)
+
+/**
+ * Result<Value, Error>-like interface.
+ *
+ * Subset of the experimental standard C++ proposal (p0323r3)
+ *
+ * Example:
+ *
+ *   expected<std::string, status_t> x = function_which_might_fail();
+ *   if (x) {
+ *     std::string str = x.value();
+ *   } else {
+ *     status_t err = x.error();
+ *   }
+ */
+
+namespace iorap {
+namespace detail {
+  // Use perfect forwarding for expected_data constructors with overloading.
+  struct expected_tag{};
+  struct expected_tag_right : public expected_tag {
+    static constexpr bool is_right_v = true;
+  };
+  struct expected_tag_error : public expected_tag {
+    static constexpr bool is_right_v = false;
+  };
+
+  template <typename T, typename E, bool DefineDestructor>
+  struct expected_data;
+
+  // This doesn't always work because this code could be instantiated with a non-trivial T/E,
+  // and then the union becomes invalid.
+  template <typename T, typename E>
+  struct expected_data<T, E, /*DefineDestructor*/true> {
+    // Mark everything 'constexpr' to keep the code the same as the other partial specialization.
+
+    template <typename U>
+    constexpr expected_data(U&& either, expected_tag_right)
+        : right_{std::forward<U>(either)}, is_right_{true} {}
+
+    template <typename U>
+    constexpr expected_data(U&& either, expected_tag_error)
+        : error_{std::forward<U>(either)}, is_right_{false} {}
+
+    constexpr bool has_value() const {
+      return is_right_;
+    }
+
+    constexpr const T& value() const {
+      return right_;
+    }
+
+    constexpr T& value() {
+      return right_;
+    }
+
+    constexpr const E& error() const {
+      return error_;
+    }
+
+    constexpr E& error() {
+      return error_;
+    }
+
+    // Using an "anonymous union" here allows non-trivial types to be stored.
+    union {
+      T right_;
+      E error_;
+    };
+
+    bool is_right_;
+
+    // Below code differs slightly by handling non-trivial constructors/destructors.
+    bool moved_from_{false};
+
+    // Note: Destructors cannot be templated, so it is illegal to use SFINAE to try to
+    // conditionalize this destructor somehow.
+    ~expected_data() {
+      if (moved_from_) { return; }
+      if (is_right_) {
+        right_.~T();
+      } else {
+        error_.~E();
+      }
+    }
+
+    expected_data(expected_data&& other)
+        noexcept(
+            noexcept(T(std::move(other.right_))) &&
+            noexcept(E(std::move(other.error_)))
+        ) {
+      DCHECK_UB_NOT_NULL(&other) << __PRETTY_FUNCTION__;
+      DCHECK_EQ(other.moved_from_, false) << __PRETTY_FUNCTION__;
+      if (other.is_right_) {
+        new (&right_) T(std::move(other.right_));
+      } else {
+        new (&error_) E(std::move(other.error_));
+      }
+      other.moved_from_ = true;
+      is_right_ = other.is_right_;
+    }
+
+    expected_data(const expected_data& other) {
+      DCHECK_UB_NOT_NULL(&other) << __PRETTY_FUNCTION__;
+      DCHECK_EQ(other.moved_from_, false) << __PRETTY_FUNCTION__;
+      if (other.is_right_) {
+        new (&right_) T(other.right_);
+      } else {
+        new (&error_) E(other.error_);
+      }
+      is_right_ = other.is_right_;
+    }
+
+    expected_data& operator=(const expected_data& other) {
+      DCHECK_UB_NOT_NULL(&other) << __PRETTY_FUNCTION__;
+      DCHECK_EQ(other.moved_from_, false) << __PRETTY_FUNCTION__;
+
+      if (this == &other) {
+        return *this;
+      }
+
+      if (other.is_right_) {
+        if (!is_right_) {
+          error_.~E();
+          new (&right_) T(other.right_);
+        } else {
+          right_ = other.right_;
+        }
+      } else {
+        if (is_right_) {
+          right_.~T();
+          new (&error_) E(other.error_);
+        } else {
+          error_ = other.error_;
+        }
+      }
+      is_right_ = other.is_right_;
+
+      return *this;
+    }
+
+    expected_data& operator=(expected_data&& other) {
+      DCHECK_UB_NOT_NULL(&other) << __PRETTY_FUNCTION__;
+      DCHECK_EQ(other.moved_from_, false) << __PRETTY_FUNCTION__;
+
+      if (this == &other) {
+        return *this;
+      }
+
+      if (other.is_right_) {
+        if (!is_right_) {
+          error_.~E();
+          new (&right_) T(std::move(other.right_));
+        } else {
+          right_ = std::move(other.right_);
+        }
+      } else {
+        if (is_right_) {
+          right_.~T();
+          new (&error_) E(std::move(other.error_));
+        } else {
+          error_ = std::move(other.error_);
+        }
+      }
+
+      other.moved_from_ = true;
+      is_right_ = other.is_right_;
+
+      return *this;
+    }
+  };
+
+  // Trivial-destructor copy of the above struct.
+  //
+  // A separate copy is required because otherwise compilation fails with an error about
+  // the union having an implicitly deleted constructor.
+  //
+  // Having this implementation gives us the property that
+  //
+  //     (is_trivially_destructible<T> && is_trivially_destructible<E>
+  //       ==> is_trivially_destructible<expected<T, E>>)
+  template <typename T, typename E>
+  struct expected_data<T, E, /*DefineDestructor*/false> {
+    template <typename U>
+    constexpr expected_data(U&& either, expected_tag_right)
+        : right_{std::forward<U>(either)}, is_right_{true} {}
+
+    template <typename U>
+    constexpr expected_data(U&& either, expected_tag_error)
+        : error_{std::forward<U>(either)}, is_right_{false} {}
+
+    constexpr bool has_value() const {
+      return is_right_;
+    }
+
+    constexpr const T& value() const {
+      return right_;
+    }
+
+    constexpr T& value() {
+      return right_;
+    }
+
+    constexpr const E& error() const {
+      return error_;
+    }
+
+    constexpr E& error() {
+      return error_;
+    }
+
+    // Using an "anonymous union" here allows non-trivial types to be stored.
+    union {
+      T right_;
+      E error_;
+    };
+
+    bool is_right_;
+
+    ~expected_data() = default;
+  };
+
+  // Select between trivial and non-trivial implementations. Trivial implementations
+  // are more optimized and constexpr-compatible.
+  template <typename T, typename E>
+  using expected_pick_data_t =
+      expected_data<T, E,
+        !(std::is_trivially_destructible_v<T> && std::is_trivially_destructible_v<E>) >;
+}  // namespace detail
+
+template <typename E>
+struct unexpected;
+
+// Subset of std::experimental::expected proposal (p0323r3).
+template <typename T, typename E>
+struct expected {
+  // Never-empty: expected<T,E> values have either 'T' or 'E' in them.
+  template <typename U = T, typename _ = std::enable_if_t<std::is_default_constructible_v<U>>>
+  constexpr expected() noexcept(noexcept(T{})) : expected(T{}) {}
+
+  constexpr expected(const T& value) : data_{value, detail::expected_tag_right{}} {}
+  constexpr expected(T&& value) : data_{std::move(value), detail::expected_tag_right{}} {}
+  constexpr expected(const E& error) : data_{error, detail::expected_tag_error{}} {}
+  constexpr expected(E&& error) : data_{std::move(error), detail::expected_tag_error{}} {}
+
+  template <typename G = E>
+  constexpr expected(unexpected<G> const& u) : expected{u.value()} {}
+
+  template <typename G = E>
+  constexpr expected(unexpected<G>&& u) : expected{std::move(u.value())} {}
+
+  explicit constexpr operator bool() const {
+    return has_value();
+  }
+
+  constexpr bool has_value() const {
+    return data_.has_value();
+  }
+
+  constexpr const T& operator*() const {
+    return data_.value();
+  }
+
+  constexpr T& operator*() {
+    return data_.value();
+  }
+
+  // TODO: arrow operator?
+
+  constexpr T& value() & {
+    CHECK(has_value());
+    return data_.value();
+  }
+
+  constexpr const T& value() const & {
+    CHECK(has_value());
+    return data_.value();
+  }
+
+  constexpr T&& value() && {
+    CHECK(has_value());
+    return std::move(data_.value());
+  }
+
+  constexpr const T& value() const && {
+    CHECK(has_value());
+    return std::move(data_.value());
+  }
+
+  constexpr E& error() {
+    DCHECK(!has_value());
+    return data_.error();
+  }
+
+  constexpr const E& error() const {
+    DCHECK(!has_value());
+    return data_.error();
+  }
+
+  // TODO: other functions such as operator=, unexpected, etc.
+ private:
+  detail::expected_pick_data_t<T, E> data_;
+};
+
+// TODO: move to tests file
+namespace {
+  struct TestType {
+    TestType() {}
+    ~TestType() {}
+  };
+  struct TestType2 : TestType {};
+
+  static_assert(std::is_trivially_destructible_v<expected<int, /*error*/double> >);
+  static_assert(!std::is_trivially_destructible_v<expected<TestType, /*error*/double> >);
+  static_assert(!std::is_trivially_destructible_v<expected<int, /*error*/TestType> >);
+  static_assert(!std::is_trivially_destructible_v<expected<TestType, /*error*/TestType2> >);
+
+  // Ensure expected is constexpr-compatible.
+  struct TestCase {
+    static constexpr auto t1 = expected<int, double>{};
+  };
+}  // namespace <anonymous>
+
+template <typename E>
+struct unexpected {
+  unexpected() = delete;
+  constexpr explicit unexpected(const E& error) : error_{error} {}
+  constexpr explicit unexpected(E&& error) : error_{std::move(error)} {}
+  constexpr const E& value() const& { return error_; }
+  constexpr E& value() & { return error_; }
+  constexpr E&& value() && { return std::move(error_); }
+  constexpr E const&& value() const&& { return std::move(error_); }
+ private:
+  E error_;
+};
+
+template <class E>
+constexpr bool operator==(const unexpected<E>& x, const unexpected<E>& y) {
+  return x.value() == y.value();
+}
+
+template <class E>
+constexpr bool operator!=(const unexpected<E>& x, const unexpected<E>& y) {
+  return !(x == y);
+}
+
+// TODO: move below codes to separate utils file
+//
+// future C++20 implementation of std::identity
+struct identity {
+  template <typename U>
+  constexpr auto operator()(U&& v) const noexcept {
+    return std::forward<U>(v);
+  }
+};
+
+// Given a lambda [...](auto&& var) {...}
+//   apply std::forward to 'var' to achieve perfect forwarding.
+//
+// Note that this doesn't work when var is a template type, i.e.
+//   template <typename T>
+//   void func(T&& tvar) {...}
+//
+// It would be invalid to use this macro with 'tvar' in that context.
+#define IORAP_FORWARD_LAMBDA(var) std::forward<decltype(var)>(var)
+
+// Borrowed non-null pointer, i.e. we do not own the lifetime.
+//
+// Function calls: This pointer is not used past the call.
+// Struct fields: This pointer is not used past the lifetime of the struct.
+template <class T, class = std::enable_if_t<std::is_pointer<T>::value>>
+using borrowed = T _Nonnull;
+// TODO: need a DCHECK or high warning levels, since null is technically well-defined.
+
+}  // namespace iorap
+
+#endif  // IORAP_SRC_COMMON_EXPECTED_H_
diff --git a/src/inode2filename/inode.cc b/src/inode2filename/inode.cc
new file mode 100644
index 0000000..cdb2325
--- /dev/null
+++ b/src/inode2filename/inode.cc
@@ -0,0 +1,81 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "inode2filename/inode.h"
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+#include <string>
+#include <vector>
+
+#include <sys/sysmacros.h>
+
+using android::base::ParseUint;
+
+namespace iorap::inode2filename {
+
+// TODO: refactor to return expected<Inode, string>
+bool Inode::Parse(const std::string& str, Inode* out, std::string* error_msg) {
+  DCHECK(out != nullptr);
+  DCHECK(error_msg != nullptr);
+
+  // Major:minor:inode OR dev_t@inode
+  std::vector<std::string> lst_pair = android::base::Split(str, "@");
+  if (lst_pair.size() == 2) {
+    size_t dev_whole = 0;
+    if (!ParseUint(lst_pair[0], &dev_whole)) {
+      *error_msg = "Failed to parse the whole device id as uint.";
+      return false;
+    }
+
+    dev_t dev_w = static_cast<dev_t>(dev_whole);
+    out->device_major = major(dev_w);
+    out->device_minor = minor(dev_w);
+
+    if (!ParseUint(lst_pair[1], &out->inode)) {
+      *error_msg = "Failed to parse inode as uint.";
+      return false;
+    }
+
+    return true;
+  }
+
+  std::vector<std::string> lst = android::base::Split(str, ":");
+
+  if (lst.size() != 3) {
+    *error_msg = "Too few : separated items";
+    return false;
+  }
+
+  if (!ParseUint(lst[0], &out->device_major)) {
+    *error_msg = "Failed to parse 0th element as a uint";
+    return false;
+  }
+
+  if (!ParseUint(lst[1], &out->device_minor)) {
+    *error_msg = "Failed to parse 1st element as a uint";
+    return false;
+  }
+
+  if (!ParseUint(lst[2], &out->inode)) {
+    *error_msg = "Failed to parse 2nd element as a uint";
+    return false;
+  }
+
+  return true;
+}
+
+}  // namespace iorap::inode2filename
diff --git a/src/inode2filename/inode.h b/src/inode2filename/inode.h
new file mode 100644
index 0000000..2dd5611
--- /dev/null
+++ b/src/inode2filename/inode.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_INODE2FILENAME_INODE_H_
+#define IORAP_SRC_INODE2FILENAME_INODE_H_
+
+#include <functional>
+#include <ostream>
+#include <string>
+
+#include <stddef.h>
+
+namespace iorap::inode2filename {
+
+struct Inode {
+  size_t device_major;  // dev_t = makedev(major, minor)
+  size_t device_minor;
+  size_t inode;         // ino_t = inode
+
+  static bool Parse(const std::string& str, /*out*/Inode* out, /*out*/std::string* error_msg);
+
+  bool operator==(const Inode& rhs) const {
+    return device_major == rhs.device_major &&
+        device_minor == rhs.device_minor &&
+        inode == rhs.inode;
+  }
+
+  bool operator!=(const Inode& rhs) const {
+    return !(*this == rhs);
+  }
+};
+
+inline std::ostream& operator<<(std::ostream& os, const Inode& inode) {
+  os << inode.device_major << ":" << inode.device_minor << ":" << inode.inode;
+  return os;
+}
+
+}  // namespace iorap::inode2filename
+
+namespace std {
+  template <>
+  struct hash<iorap::inode2filename::Inode> {
+      using argument_type = iorap::inode2filename::Inode;
+      using result_type = size_t;
+      result_type operator()(argument_type const& s) const noexcept {
+        // Hash the inode by using only the inode#. Ignore devices, we are extremely unlikely
+        // to ever collide on the devices.
+        result_type const h1 = std::hash<size_t>{}(s.inode);
+        return h1;
+      }
+  };
+}  // namespace std
+
+#endif  // IORAP_SRC_INODE2FILENAME_INODE_H_
diff --git a/src/inode2filename/main.cc b/src/inode2filename/main.cc
new file mode 100644
index 0000000..2da364c
--- /dev/null
+++ b/src/inode2filename/main.cc
@@ -0,0 +1,152 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "common/debug.h"
+#include "common/expected.h"
+#include "inode2filename/search_directories.h"
+
+using namespace iorap::inode2filename;  // NOLINT
+
+#if defined(IORAP_INODE2FILENAME_MAIN)
+
+void Usage(char** argv) {
+  std::cerr << "Usage: " << argv[0] << " <options> <<inode_syntax>> [inode_syntax1 inode_syntax2 ...]" << std::endl;
+  std::cerr << "" << std::endl;
+  std::cerr << "  Block until all inodes have been read in, then begin searching for filenames for those inodes." << std::endl;
+  std::cerr << "  Results are written immediately as they are available, and once all inodes are found, " << std::endl;
+  std::cerr << "  the program will terminate." << std::endl;
+  std::cerr << "" << std::endl;
+  std::cerr << "    Inode syntax:     ('dev_t@inode' | 'major:minor:inode')" << std::endl;
+  std::cerr << "    --help,-h         Print this Usage." << std::endl;
+  std::cerr << "    --root,-r         Add root directory (default '.'). Repeatable." << std::endl;
+  std::cerr << "    --verbose,-v      Set verbosity (default off)." << std::endl;
+  std::cerr << "    --wait,-w         Wait for key stroke before continuing (default off)." << std::endl;
+  exit(1);
+}
+
+static fruit::Component<SearchDirectories> GetSearchDirectoriesComponent() {
+    return fruit::createComponent().bind<SystemCall, SystemCallImpl>();
+}
+
+int main(int argc, char** argv) {
+  android::base::InitLogging(argv);
+  android::base::SetLogger(android::base::StderrLogger);
+
+  bool wait_for_keystroke = false;
+  bool enable_verbose = false;
+  std::vector<std::string> root_directories;
+  std::vector<Inode> inode_list;
+
+  if (argc == 1) {
+    Usage(argv);
+  }
+
+  for (int arg = 1; arg < argc; ++arg) {
+    std::string argstr = argv[arg];
+    bool has_arg_next = (arg+1)<argc;
+    std::string arg_next = has_arg_next ? argv[arg+1] : "";
+
+    if (argstr == "--help" || argstr == "-h") {
+      Usage(argv);
+    } else if (argstr == "--root" || argstr == "-r") {
+      if (!has_arg_next) {
+        std::cerr << "Missing --root <value>" << std::endl;
+        return 1;
+      }
+      root_directories.push_back(arg_next);
+      ++arg;
+    } else if (argstr == "--verbose" || argstr == "-v") {
+      enable_verbose = true;
+    } else if (argstr == "--wait" || argstr == "-w") {
+      wait_for_keystroke = true;
+    } else {
+      Inode maybe_inode{};
+
+      std::string error_msg;
+      if (Inode::Parse(argstr, /*out*/&maybe_inode, /*out*/&error_msg)) {
+        inode_list.push_back(maybe_inode);
+      } else {
+        if (argstr.size() >= 1) {
+          if (argstr[0] == '-') {
+            std::cerr << "Unrecognized flag: " << argstr << std::endl;
+            return 1;
+          }
+        }
+
+        std::cerr << "Failed to parse inode (" << argstr << ") because: " << error_msg << std::endl;
+        return 1;
+      }
+    }
+  }
+
+  if (root_directories.size() == 0) {
+    root_directories.push_back(".");
+  }
+
+  if (inode_list.size() == 0) {
+    DCHECK_EQ(true, false);
+    std::cerr << "Provide at least one inode." << std::endl;
+    return 1;
+  }
+
+  if (enable_verbose) {
+    android::base::SetMinimumLogSeverity(android::base::VERBOSE);
+
+    LOG(VERBOSE) << "Verbose check";
+    LOG(VERBOSE) << "Debug check: " << ::iorap::kIsDebugBuild;
+
+    for (auto& inode_num : inode_list) {
+      LOG(VERBOSE) << "Searching for inode " << inode_num;
+    }
+  }
+
+  // Useful to attach a debugger...
+  // 1) $> inode2filename -w <args>
+  // 2) $> gdbclient <pid>
+  if (wait_for_keystroke) {
+    LOG(INFO) << "Self pid: " << getpid();
+    LOG(INFO) << "Press any key to continue...";
+    std::cin >> wait_for_keystroke;
+  }
+
+  fruit::Injector<SearchDirectories> injector(GetSearchDirectoriesComponent);
+  SearchDirectories* search_directories = injector.get<SearchDirectories*>();
+
+  auto/*observable[2]*/ [inode_results, connectable] =
+      search_directories->FindFilenamesFromInodesPair(
+          std::move(root_directories),
+          std::move(inode_list),
+          SearchMode::kInProcessDirect);
+
+  int return_code = 1;
+  inode_results.subscribe([&return_code](const InodeResult& result) {
+    if (result) {
+      LOG(DEBUG) << "Inode match: " << result.inode << ", " << result.data.value();
+      std::cout << "Inode match: " << result.inode << ", " << result.data.value() << std::endl;
+      return_code = 0;
+    } else {
+      LOG(WARNING) << "Failed to match inode: " << result.inode;
+    }
+  });
+
+  // Normally #subscribe would start emitting items immediately, but this does nothing yet
+  // because one of the nodes in the flow graph was published. Published streams make the entire
+  // downstream inert until #connect is called.
+  connectable->connect();
+
+  // 0 -> found at least a single match, 1 -> could not find any matches.
+  return return_code;
+}
+
+#endif
diff --git a/src/inode2filename/search_directories.cc b/src/inode2filename/search_directories.cc
new file mode 100644
index 0000000..2ec09d9
--- /dev/null
+++ b/src/inode2filename/search_directories.cc
@@ -0,0 +1,915 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "common/debug.h"
+#include "inode2filename/search_directories.h"
+#include "inode2filename/system_call.h"
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/scopeguard.h>
+#include <android-base/stringprintf.h>
+#include <android-base/unique_fd.h>
+
+#include "rxcpp/rx.hpp"
+
+#include <iostream>
+#include <stdio.h>
+#include <fstream>
+#include <vector>
+#include <optional>
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+
+#ifdef __ANDROID__
+#include <sys/sysmacros.h>
+#endif
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <dirent.h>
+
+#include <unordered_map>
+
+namespace rx = rxcpp;
+using android::base::unique_fd;  // NOLINT
+using android::base::StringPrintf;  // NOLINT
+
+namespace iorap::inode2filename {
+
+// A multimap of 'ino_t -> List[Inode]' (where the value Inodes have the same ino_t as the key).
+//
+// A flat list of Inodes is turned into the above map, then keys can be removed one at a time
+// until the InodeSet eventually becomes empty.
+struct InodeSet {
+  struct ValueRange {
+    auto/*Iterable<Inode>*/ begin() {
+      return begin_;
+    }
+
+    auto/*Iterable<Inode>*/ end() {
+      return end_;
+    }
+
+    bool empty() const {
+      return begin_ == end_;
+    }
+
+    explicit operator bool() const {
+      return !empty();
+    }
+
+    std::unordered_multimap<ino_t, Inode>::iterator begin_, end_;
+
+    friend std::ostream& operator<<(std::ostream& os, const ValueRange& s);
+  };
+
+  // Create an observable that emits the remaining inodes in the map.
+  //
+  // Mutation functions must not be called until this observable
+  // has been finished emitting all values (e.g. with on_completed) since that
+  // would cause the underlying iterators to go into an undefined state.
+  auto/*observable<Inode>*/ IterateValues() const {
+    return rxcpp::observable<>::iterate(set_).map(  // XX: should we use identity_immediate here?
+        [](const std::pair<const ino_t, Inode>& pair) {
+          return pair.second;
+        }
+    );
+    // TODO: this would be more efficient as a range-v3 view.
+  }
+
+  constexpr bool Empty() const {
+    return set_.empty();
+  }
+
+  static InodeSet OfList(const std::vector<Inode>& list) {
+    InodeSet new_inode_set;
+    std::unordered_multimap<ino_t, Inode>* map = &new_inode_set.set_;
+
+    for (const Inode& inode : list) {
+      map->insert({inode.inode, inode});
+    }
+
+    return new_inode_set;
+  }
+
+  // Return an optional list of 'Inode' structs whose 'inode' field matches the 'inode' parameter.
+  // Returns an empty range if there was nothing found.
+  ValueRange FindInodeList(ino_t inode) {
+    auto range = set_.equal_range(inode);
+    return ValueRange{range.first, range.second};
+  }
+
+  // Match all fields of an Inode against a 'struct stat' stat_buf.
+  //
+  // The returned Inode (if any) is removed from the InodeSet; it will not be returned by
+  // FindInodeList in future calls.
+  std::optional<Inode> FindAndRemoveInodeInList(ValueRange inode_list,
+                                                const struct stat& stat_buf) {
+    LOG(VERBOSE) << "FindAndRemoveInodeInList " << inode_list << ", "
+                 << "stat_buf{st_dev=" << stat_buf.st_dev << ",st_ino=" << stat_buf.st_ino << "}";
+
+    auto /*iterator*/ found = std::find_if(inode_list.begin(),
+                                           inode_list.end(),
+                                           [&](const std::pair<ino_t, Inode>& pair) {
+      const Inode& inode = pair.second;
+      if (inode.inode != stat_buf.st_ino) {
+        return false;
+      }
+
+      dev_t inode_dev =
+          makedev(static_cast<int>(inode.device_major), static_cast<int>(inode.device_minor));
+
+      // Inodes could be the same across different devices.
+      // Also match the device id.
+      if (inode_dev != stat_buf.st_dev) {
+        LOG(VERBOSE) << "InodeSet:FindAndRemoveInodeInList matched ino: " << inode.inode
+                     << " but not device"
+                     << ", expected dev: " << stat_buf.st_dev
+                     << ", actual dev: " << inode_dev;
+        return false;
+      }
+      return true;
+    });
+
+    if (found != inode_list.end()) {
+      const Inode& inode = found->second;
+      LOG(VERBOSE) << "InodeSet:FindAndRemoveInodeInList *success* inode+device " << inode;
+      DCHECK(found->second.inode == stat_buf.st_ino);
+      // Erase the inode from the list. This is important.
+      set_.erase(found);
+      return inode;
+    }
+
+    return std::nullopt;
+  }
+
+  // TODO: equality and string operators for testing/logging.
+ private:
+  // Explanation: readdir returns a 'file' -> 'ino_t inode' mapping.
+  //
+  // However inodes can be reused on different partitions (but they have a different device number).
+  // To handle this edge case, and to avoid calling stat whenever the inode definitely doesn't match
+  // store the inodes into a single-key,multi-value container.
+  //
+  // This enables fast scanning of readdir results by matching just the 'inode' portion,
+  // then calling stat only when the inode portion definitely matches to confirm the device.
+
+  // There are no single-key multi-value containers in standard C++, so pretend
+  // we have one by writing this simple facade around an unordered set.
+  //
+  // We expect that the vector size is usually size=1 (or 2 or 3) since the # of devices
+  // is fixed by however many partitions there are on the system, AND the same inode #
+  // would have to be reused across a different file.
+  std::unordered_multimap<ino_t, Inode> set_;  // TODO: Rename to map_.
+
+  friend std::ostream& operator<<(std::ostream& os, const InodeSet& s);
+};
+
+std::ostream& operator<<(std::ostream& os, const InodeSet& s) {
+  os << "InodeSet{";
+  for (const auto& kv : s.set_) {
+    // e.g. "123=>(1:2:123)" ... its expected for the 'ino_t' portion to be repeated.
+    os << "" << kv.first << "=>(" << kv.second << "),";
+  }
+  os << "}";
+  return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const InodeSet::ValueRange& v) {
+  // Don't want to make a const and non const version of ValueRange.
+  InodeSet::ValueRange& s = const_cast<InodeSet::ValueRange&>(v);
+
+  os << "InodeSet::ValueRange{";
+  for (const auto& kv : s) {
+    // e.g. "123=>(1:2:123)" ... its expected for the 'ino_t' portion to be repeated.
+    os << "" << kv.first << "=>(" << kv.second << "),";
+  }
+  os << "}";
+  return os;
+}
+
+void search_for_inodes_in(std::vector<Inode>& inode_list, const std::string& dirpath);
+
+enum DirectoryEntryErrorCode {
+  kInvalid,    // not a real error code. to detect bad initialization.
+  kOpenDir,    // opendir failed.
+  kReadDir,    // readdir failed.
+  kDtUnknown,  // d_type was DT_UNKNOWN error.
+};
+
+struct DirectoryEntryError {
+  DirectoryEntryErrorCode code;
+  int err_no;
+  std::string filename;
+};
+
+std::ostream& operator<<(std::ostream& os, const DirectoryEntryError& e) {
+  os << "DirectoryEntryError{"
+     << static_cast<int>(e.code) << "," << e.err_no << "," << e.filename << "}";
+  return os;
+  // TODO: pretty-print code and err-no
+}
+
+static common::DebugCounter gDebugDirectoryEntryCounter{};
+static constexpr bool kDebugDirectoryEntry = false;
+
+#define DIRECTORY_ENTRY_MOVE_DCHECK() \
+    DCHECK_EQ(other.moved_from_, false) << __PRETTY_FUNCTION__ << "CNT:" << other.debug_counter_;
+#define DIRECTORY_ENTRY_TRACE_CTOR() \
+    if (kDebugDirectoryEntry) LOG(VERBOSE) << __PRETTY_FUNCTION__ << "@CNT:" << debug_counter_
+
+struct DirectoryEntry {
+  using ResultT = iorap::expected<DirectoryEntry, DirectoryEntryError>;
+  using ObservableT = rx::observable<ResultT>;
+
+  static constexpr ino_t kInvalidIno = std::numeric_limits<ino_t>::max();
+  static constexpr auto kInvalidFileName = "";
+
+  // Path to file, the prefix is one of the root directories.
+  std::string filename{kInvalidFileName};
+  // Inode number of the file. Not unique across different devices.
+  ino_t d_ino{kInvalidIno};
+  // File type (DT_LNK, DT_REG, DT_DIR, or DT_UNKNOWN)
+  unsigned char d_type{DT_UNKNOWN};  // Note: not seen outside of sentinel roots.
+  // TODO: Consider invariant checks for valid combinations of above fields?
+
+  // Debug-only flags.
+  bool moved_from_{false};
+  size_t debug_counter_{0};
+
+ private:
+  // TODO: remove default constructor?
+  //
+  // SEEMS TO BE USED by std::vector etc. FIX DAT.
+  DirectoryEntry() noexcept {
+    debug_counter_ = gDebugDirectoryEntryCounter++;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+  }
+ public:
+  DirectoryEntry(std::string filename, ino_t d_ino, unsigned char d_type) noexcept
+    : filename{std::move(filename)},
+      d_ino{d_ino},
+      d_type{d_type} {
+    debug_counter_ = gDebugDirectoryEntryCounter++;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+  }
+
+  DirectoryEntry(const DirectoryEntry& other) noexcept {
+    // Do not use member-initialization syntax so that this DCHECK can execute first.
+    DIRECTORY_ENTRY_MOVE_DCHECK();
+
+    filename = other.filename;
+    d_ino = other.d_ino;
+    d_type = other.d_type;
+    children_paths_ = other.children_paths_;
+    children_initialized_ = other.children_initialized_;
+    debug_counter_ = other.debug_counter_;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+  }
+
+  DirectoryEntry& operator=(const DirectoryEntry& other) noexcept {
+    if (this == &other) {
+      return *this;
+    }
+
+    DIRECTORY_ENTRY_MOVE_DCHECK();
+
+    filename = other.filename;
+    d_ino = other.d_ino;
+    d_type = other.d_type;
+    children_paths_ = other.children_paths_;
+    children_initialized_ = other.children_initialized_;
+    debug_counter_ = other.debug_counter_;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+
+    return *this;
+  }
+
+  DirectoryEntry& operator=(DirectoryEntry&& other) noexcept {
+    if (this == &other) {
+      return *this;
+    }
+
+    DIRECTORY_ENTRY_MOVE_DCHECK();
+
+    filename = std::move(other.filename);
+    d_ino = other.d_ino;
+    d_type = other.d_type;
+    children_paths_ = std::move(other.children_paths_);
+    children_initialized_ = other.children_initialized_;
+    debug_counter_ = other.debug_counter_;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+
+    return *this;
+  }
+
+  DirectoryEntry(DirectoryEntry&& other) noexcept {
+    DIRECTORY_ENTRY_MOVE_DCHECK();
+    other.moved_from_ = true;
+
+    filename = std::move(other.filename);
+    d_ino = other.d_ino;
+    d_type = other.d_type;
+    children_paths_ = std::move(other.children_paths_);
+    children_initialized_ = other.children_initialized_;
+    debug_counter_ = other.debug_counter_;
+    DIRECTORY_ENTRY_TRACE_CTOR();
+  }
+
+  // Create a sentinel (root of roots) whose children entries are those specified by
+  // children_paths.
+  static DirectoryEntry CreateSentinel(std::vector<std::string> children_paths) {
+    DirectoryEntry e;
+    e.d_type = DT_DIR;
+    ++gDebugDirectoryEntryCounter;
+
+    for (std::string& child_path : children_paths) {
+      // TODO: Should we call Stat on the child path here to reconstitute the ino_t for a root dir?
+      // Otherwise it can look a little strange (i.e. the root dir itself will never match
+      // the searched inode).
+      //
+      // Probably not too big of a problem in practice.
+      DirectoryEntry child_entry{std::move(child_path), kInvalidIno, DT_DIR};
+      ResultT child_entry_as_result{std::move(child_entry)};
+      e.children_paths_.push_back(std::move(child_entry_as_result));
+    }
+
+    e.children_initialized_ = true;
+
+    return e;
+  }
+
+  // Return an observable which emits the direct children only.
+  // The children entries are now read from disk (with readdir) if they weren't read previously.
+  std::vector<ResultT> GetChildrenEntries(borrowed<SystemCall*> system_call) const& {
+    BuildChildrenPaths(system_call);
+    return children_paths_;
+  }
+
+  // Return an observable which emits the direct children only.
+  // The children entries are now read from disk (with readdir) if they weren't read previously.
+  // Movable overload.
+  std::vector<ResultT> GetChildrenEntries(borrowed<SystemCall*> system_call) && {
+    BuildChildrenPaths(system_call);
+    return std::move(children_paths_);
+  }
+
+  // Returns a (lazy) observable that emits every single node, in pre-order,
+  // rooted at this tree.
+  //
+  // New entries are only read from disk (with e.g. readdir) when more values are pulled
+  // from the observable. Only the direct children of any entry are read at any time.
+  //
+  // The emission can be stopped prematurely by unsubscribing from the observable.
+  // This means the maximum amount of 'redundant' IO reads is bounded by the children count
+  // of all entries emitted thus far minus entries actually emitted.
+  ObservableT GetSubTreePreOrderEntries(borrowed<SystemCall*> system_call) const;
+
+ private:
+  // Out-of-line definition to avoid circular type dependency.
+  void BuildChildrenPaths(borrowed<SystemCall*> system_call) const;
+
+  // We need to lazily initialize children_paths_ only when we try to read them.
+  //
+  // Assuming the underlying file system doesn't change (which isn't strictly true),
+  // the directory children are referentially transparent.
+  //
+  // In practice we do not need to distinguish between the file contents changing out
+  // from under us in this code, so we don't need the more strict requirements.
+  mutable std::vector<ResultT> children_paths_;
+  mutable bool children_initialized_{false};
+
+  friend std::ostream& operator<<(std::ostream& os, const DirectoryEntry& d);
+};
+
+std::ostream& operator<<(std::ostream& os, const DirectoryEntry& d) {
+  os << "DirectoryEntry{" << d.filename << ",ino:" << d.d_ino << ",type:" << d.d_type << "}";
+  return os;
+}
+
+using DirectoryEntryResult = DirectoryEntry::ResultT;
+
+// Read all directory entries and return it as a vector. This must be an eager operation,
+// as readdir is not re-entrant.
+//
+// This could be considered as a limitation from the 'observable' perspective since
+// one can end up reading unnecessary extra directory entries that are then never consumed.
+//
+// The following entries are skipped:
+//  - '.' self
+//  - ".." parent
+//
+// All DT types except the following are removed:
+//  * DT_LNK - symbolic link (empty children)
+//  * DT_REG - regular file  (empty children)
+//  * DT_DIR - directory     (has children)
+static std::vector<DirectoryEntryResult>
+    ReadDirectoryEntriesFromDirectoryPath(std::string dirpath, borrowed<SystemCall*> system_call) {
+  DIR *dirp;
+  struct dirent *dp;
+
+  LOG(VERBOSE) << "ReadDirectoryEntriesFromDirectoryPath(" << dirpath << ")";
+
+  if ((dirp = system_call->opendir(dirpath.c_str())) == nullptr) {
+    PLOG(ERROR) << "Couldn't open directory: " << dirpath;
+    return {DirectoryEntryError{kOpenDir, errno, dirpath}};
+  }
+
+  // Read all the results up front because readdir is not re-entrant.
+  std::vector<DirectoryEntryResult> results;
+
+  // Get full path + the directory entry path.
+  auto child_path = [&] { return dirpath + "/" + dp->d_name; };
+
+  do {
+    errno = 0;
+    if ((dp = system_call->readdir(dirp)) != nullptr) {
+      if (dp->d_type == DT_DIR) {
+        if (strcmp(".", dp->d_name) == 0 || strcmp("..", dp->d_name) == 0) {
+          LOG(VERBOSE) << "Skip self/parent: " << dp->d_name;
+          continue;
+        }
+
+        LOG(VERBOSE) << "Find entry " << child_path()
+                     << ", ino: " << dp->d_ino << ", type: " << dp->d_type;
+        results.push_back(DirectoryEntry{child_path(),
+                                         static_cast<ino_t>(dp->d_ino),
+                                         dp->d_type});
+      } else if (dp->d_type == DT_UNKNOWN) {
+        // This seems bad if it happens. We should probably do something about this.
+        LOG(WARNING) << "Found unknown DT entry: " << child_path();
+
+        results.push_back(DirectoryEntryError{kDtUnknown, /*errno*/0, child_path()});
+      } else if (dp->d_type == DT_LNK || dp->d_type == DT_REG) {
+        // Regular non-directory file entry.
+        results.push_back(DirectoryEntry{child_path(),
+                                         static_cast<ino_t>(dp->d_ino),
+                                         dp->d_type});
+      } else {
+        // Block device, character device, socket, etc...
+        LOG(VERBOSE) << "Skip DT entry of type: " << dp->d_type << " " << child_path();
+      }
+    } else if (errno != 0) {
+      PLOG(ERROR) << "Error reading directory entry in " << dirpath;
+
+      results.push_back(DirectoryEntryError{kReadDir, errno, dirpath});
+    }
+  } while (dp != nullptr);
+
+  if (system_call->closedir(dirp) < 0) {
+    PLOG(ERROR) << "Failed to close directory " << dirpath;
+  }
+
+  return results;
+}
+
+void DirectoryEntry::BuildChildrenPaths(borrowed<SystemCall*> system_call) const {
+  if (children_initialized_) {
+    return;
+  }
+
+  if (d_type == DT_DIR) {
+    children_paths_ = ReadDirectoryEntriesFromDirectoryPath(filename, system_call);
+    // TODO: consider using dependency injection here to substitute this function during testing?
+  }
+}
+
+struct InodeSearchParameters {
+  std::vector<Inode> inode_list;
+  std::vector<std::string> root_dirs;
+};
+
+// [IN]
+// observable: expected<Value, Error>, ...
+// [OUT]
+// observable: Value, ...
+//
+// Any encountered 'Error' items are dropped after logging.
+template <typename T>
+auto MapExpectedOrLog(T&& observable,
+                      ::android::base::LogSeverity log_level) {
+  return observable.filter([log_level](const auto& result) {
+    if (result) {
+      return true;
+    } else {
+      LOG(log_level) << result.error();
+      return false;
+    }
+  }).map([](auto&& result) {
+    return IORAP_FORWARD_LAMBDA(result).value();
+  });
+}
+
+template <typename T>
+auto MapExpectedOrLogError(T&& observable) {
+  return MapExpectedOrLog(std::forward<T>(observable), ::android::base::ERROR);
+}
+
+template <typename T>
+auto MapOptionalOrDrop(T&& observable) {
+  return observable.filter([](const auto& result) {
+    return result.has_value();
+  }).map([](auto&& result) {
+    return IORAP_FORWARD_LAMBDA(result).value();
+  });
+  // TODO: static_assert this isn't used with an unexpected.
+}
+
+template <typename T, typename F>
+auto VisitValueOrLogError(T&& expected, F&& visit_func, const char* error_prefix = "") {
+  if (!expected) {
+    LOG(ERROR) << error_prefix << " " << expected.error();
+  } else {
+    visit_func(std::forward<T>(expected).value());
+  }
+  // TODO: Could be good to make this more monadic by returning an optional.
+}
+
+template <typename TSimple, typename T, typename F>
+void TreeTraversalPreOrderObservableImpl(rx::subscriber<TSimple> dest, T&& node, F&& fn) {
+  LOG(VERBOSE) << "TreeTraversalPreOrderObservableImpl (begin) " << __PRETTY_FUNCTION__;
+
+  if (!dest.is_subscribed()) {
+    LOG(VERBOSE) << "TreeTraversalPreOrderObservableImpl (unsubscribed)";
+    return;
+  } else {
+    LOG(VERBOSE) << "TreeTraversalPreOrderObservableImpl (on_next node)";
+
+    // Copy the node here. This is less bad than it seems since we haven't yet
+    // calculated its children (except in the root), so its just doing a shallow memcpy (sizeof(T)).
+    //
+    // This assumes the children are calculated lazily, otherwise we'd need to have a separate
+    // NodeBody class which only holds the non-children elements.
+
+    TSimple copy = std::forward<T>(node);
+    dest.on_next(std::move(copy));
+
+    if (!node.has_value()) {
+      return;
+    }
+
+    // Whenever we call 'on_next' also check if we end up unsubscribing.
+    // This avoids the expensive call into the children.
+    if (!dest.is_subscribed()) {
+      LOG(VERBOSE) << "TreeTraversalPreOrderObservableImpl (post-self unsubscribe)";
+      return;
+    }
+
+    // Eagerly get the childrem, moving them instead of copying them.
+    auto&& children = fn(std::forward<T>(node));
+    for (auto&& child : children) {
+      TreeTraversalPreOrderObservableImpl(dest, IORAP_FORWARD_LAMBDA(child), fn);
+      // TODO: double check this is doing the std::move properly for rvalues.
+
+      if (!dest.is_subscribed()) {
+        LOG(VERBOSE) << "TreeTraversalPreOrderObservableImpl (unsubscribed in children)";
+        break;
+      }
+    };
+  }
+}
+
+// Creates an observable over all the nodes in the tree rooted at node.
+// fn is a function that returns the children of that node.
+//
+// The items are emitted left-to-right pre-order, and stop early if the
+// observable is unsubscribed from.
+//
+// Implementation requirement:
+//    typeof(node) -> expected<V, E> or optional<V> or similar.
+//    fn(node) -> iterable<typeof(node)>
+//
+// preorder(self):
+//   visit(self)
+//   for child in fn(self):
+//     preorder(child)
+template <typename T, typename F>
+auto/*observable<T>*/ TreeTraversalPreOrderObservable(T&& node, F&& fn) {
+  LOG(VERBOSE) << "TreeTraversalPreOrderObservable: " << __PRETTY_FUNCTION__;
+
+  using T_simple = std::decay_t<T>;
+  return rx::observable<>::create<T_simple>(
+    // Copy node to avoid lifetime issues.
+    [node=node,fn=std::forward<F>(fn)](rx::subscriber<T_simple> dest) {
+      LOG(VERBOSE) << "TreeTraversalPreOrderObservable (lambda)";
+      TreeTraversalPreOrderObservableImpl<T_simple>(dest,
+                                                    std::move(node),
+                                                    std::move(fn));
+      dest.on_completed();
+    }
+  );
+}
+
+DirectoryEntry::ObservableT
+    DirectoryEntry::GetSubTreePreOrderEntries(borrowed<SystemCall*> system_call) const {
+  return TreeTraversalPreOrderObservable(
+      DirectoryEntryResult{*this},
+      [system_call=system_call](auto/*DirectoryEntryResult*/&& result)
+          -> std::vector<DirectoryEntryResult> {
+        if (!result) {
+          LOG(VERBOSE) << "GetSubTreePreOrderEntries (no value return)";
+          // Cannot have children when it was an error.
+          return {};
+        }
+        return
+            IORAP_FORWARD_LAMBDA(result)
+            .value()
+            .GetChildrenEntries(system_call);
+      });
+}
+
+struct StatError {
+  int err_no;
+  std::string path_name;
+};
+
+std::ostream& operator<<(std::ostream& os, const StatError& e) {
+  os << "StatError{" << e.err_no << "," << e.path_name << "}";
+  return os;
+}
+
+template <typename U = void>  // suppress unused warning.
+static iorap::expected<struct stat, StatError> Stat(const std::string& path_name,
+                                                    borrowed<SystemCall*> system_call) {
+  struct stat statbuf{};
+
+  // Call stat(2) in live code. Overridden in test code.
+  if (system_call->stat(path_name.c_str(), /*out*/&statbuf) == 0) {
+    return statbuf;
+  } else {
+    return iorap::unexpected(StatError{errno, path_name});
+  }
+}
+
+using StatResult = iorap::expected<struct stat, StatError>;
+
+// An inode's corresponding filename on the system.
+struct SearchMatch {
+  Inode inode;
+  // Relative path joined with a root directory.
+  //
+  // Use absolute path root dirs to get back absolute path filenames.
+  // If relative, this is relative to the current working directory.
+  std::string filename;
+};
+
+std::ostream& operator<<(std::ostream& os, const SearchMatch& s) {
+  os << "SearchMatch{" << s.inode << ", " << s.filename << "}";
+  return os;
+}
+
+struct SearchState {
+  // Emit 'match' Inodes corresponding to the ones here.
+  InodeSet inode_set;
+
+  // An inode matching one of the ones in inode_set was discovered in the most-recently
+  // emitted SearchState.
+  //
+  // The InodeSet removes any matching 'Inode'.
+  std::optional<SearchMatch> match;
+
+  // TODO: make sure this doesn't copy [inodes], as that would be unnecessarily expensive.
+};
+
+std::ostream& operator<<(std::ostream& os, const SearchState& s) {
+  os << "SearchState{match:";
+  // Print the 'match' first. The InodeSet could be very large so it could be truncated in logs.
+  if (s.match) {
+    os << s.match.value();
+  } else {
+    os << "(none)";
+  }
+  os << ", inode_set:" << s.inode_set << "}";
+  return os;
+}
+
+// TODO: write operator<< etc.
+
+// Return a lazy observable that will search for all filenames whose inodes
+// match the inodes in inode_search_list.
+//
+// Every unmatched inode will be emitted as an unexpected at the end of the stream.
+auto/*[observable<InodeResult>, connectable]*/ SearchDirectoriesForMatchingInodes(
+    std::vector<std::string> root_dirs,
+    std::vector<Inode> inode_search_list,
+    borrowed<SystemCall*> system_call) {
+
+  // Create a (lazy) observable that will emit each DirectoryEntry that is a recursive subchild
+  // of root_dirs. Emission will be stopped when its unsubscribed from.
+  //
+  // This is done by calling readdir(3) lazily.
+  auto/*obs<DirectoryEntry>*/ find_all_subdir_entries = ([&]() {
+    DirectoryEntry sentinel = DirectoryEntry::CreateSentinel(std::move(root_dirs));
+    auto/*obs<DirectoryEntryResult*/ results = sentinel.GetSubTreePreOrderEntries(system_call);
+
+    // Drop any errors by logging them to logcat. "Unwrap" the expected into the underlying data.
+    auto/*obs<DirectoryEntry*>*/ expected_drop_errors = MapExpectedOrLogError(std::move(results));
+    return expected_drop_errors;
+  })();
+
+  // DirectoryEntry is missing the dev_t portion, so we may need to call scan(2) again
+  // to confirm the dev_t. We skip calling scan(2) when the ino_t does not match.
+  // InodeSet lets us optimally avoid calling scan(2).
+  SearchState initial;
+  initial.inode_set = InodeSet::OfList(inode_search_list);
+
+  auto/*[observable<SearchState>,Connectable]*/ search_state_results = find_all_subdir_entries.scan(
+      std::move(initial),
+      [system_call=system_call](SearchState search_state, const DirectoryEntry& dir_entry) {
+        LOG(VERBOSE) << "SearchDirectoriesForMatchingInodes#Scan "
+                     << dir_entry << ", state: " << search_state;
+
+        search_state.match = std::nullopt;
+
+        InodeSet* inodes = &search_state.inode_set;
+
+        // Find all the possible inodes across different devices.
+        InodeSet::ValueRange inode_list = inodes->FindInodeList(dir_entry.d_ino);
+
+        // This directory doesn't correspond to any inodes we are searching for.
+        if (!inode_list) {
+          return search_state;
+        }
+
+        StatResult maybe_stat = Stat(dir_entry.filename, system_call);
+        VisitValueOrLogError(maybe_stat, [&](const struct stat& stat_buf) {
+          // Try to match the specific inode. Usually this will not result in a match (nullopt).
+          std::optional<Inode> inode = inodes->FindAndRemoveInodeInList(inode_list, stat_buf);
+
+          if (inode) {
+            search_state.match = SearchMatch{inode.value(), dir_entry.filename};
+          }
+        });
+
+        return search_state;  // implicit move.
+      }
+  // Avoid exhausting a potentially 'infinite' stream of files by terminating as soon
+  // as we find every single inode we care about.
+  ).take_while([](const SearchState& state) {
+      // Also emit the last item that caused the search set to go empty.
+      bool cond = !state.inode_set.Empty() || state.match;
+
+      if (WOULD_LOG(VERBOSE)) {
+        static int kCounter = 0;
+        LOG(VERBOSE) << "SearchDirectoriesForMatchingInodes#take_while (" << kCounter++ <<
+                     ",is_empty:"
+                     << state.inode_set.Empty() << ", match:" << state.match.has_value();
+      }
+      // Minor O(1) implementation inefficiency:
+      // (Too minor to fix but it can be strange if looking at the logs or readdir traces).
+      //
+      // Note, because we return 'true' after the search set went empty,
+      // the overall stream graph still pulls from search_state_results exactly once more:
+      //
+      // This means that for cond to go to false, we would've read one extra item and then discarded
+      // it. If that item was the first child of a directory, that means we essentially did
+      // one redundant pass of doing a readdir.
+      //
+      // In other words if the search set goes to empty while the current item is a directory,
+      // it will definitely readdir on it at least once as we try to get the first child in
+      // OnTreeTraversal.
+      //
+      // This could be fixed with a 'take_until(Predicate)' operator which doesn't discard
+      // the last item when the condition becomes false. However rxcpp seems to lack this operator,
+      // whereas RxJava has it.
+
+      if (!cond) {
+        LOG(VERBOSE) << "SearchDirectoriesForMatchingInodes#take_while "
+                     << "should now terminate for " << state;
+      }
+
+      return cond;
+  }).publish();
+  // The publish here is mandatory. The stream is consumed twice (once by matched and once by
+  // unmatched streams). Without the publish, once all items from 'matched' were consumed it would
+  // start another instance of 'search_state_results' (i.e. it appears as if the search
+  // is restarted).
+  //
+  // By using 'publish', the search_state_results is effectively shared by both downstream nodes.
+  // Note that this also requires the subscriber to additionally call #connect on the above stream,
+  // otherwise no work will happen.
+
+  // Lifetime notes:
+  //
+  // The the 'SearchState' is emitted into both below streams simultaneously.
+  //    The 'unmatched_inode_values' only touches the inode_set.
+  //    The 'matched_inode_values' only touches the match.
+  // Either stream can 'std::move' from those fields because they don't move each other's fields.
+  auto/*observable<InodeResult>*/ matched_inode_values = search_state_results
+      .filter([](const SearchState& search_state) { return search_state.match.has_value(); })
+      .map([](SearchState& search_state) { return std::move(search_state.match.value()); })
+                     // observable<SearchMatch>
+      .map([](SearchMatch search_match) {
+          return InodeResult::makeSuccess(search_match.inode, std::move(search_match.filename));
+      });            // observable<InodeResult>
+
+  auto/*observable<?>*/ unmatched_inode_values = search_state_results
+      // The 'last' SearchState is the one that contains all the remaining inodes.
+      .take_last(1)  // observable<SearchState>
+      .flat_map([](const SearchState& search_state) {
+          LOG(VERBOSE) << "SearchDirectoriesForMatchingInodes#unmatched -- flat_map";
+          // Aside: Could've used a move here if the inodes weren't so lightweight already.
+          return search_state.inode_set.IterateValues(); })
+                     // observable<Inode>
+      .map([](const Inode& inode) {
+          LOG(VERBOSE) << "SearchDirectoriesForMatchingInodes#unmatched -- map";
+          return InodeResult::makeFailure(inode, InodeResult::kCouldNotFindFilename);
+      });
+                     // observable<InodeResult>
+
+  // The matched and unmatched InodeResults are emitted together.
+  //   Use merge, not concat, because we need both observables to be subscribed to simultaneously.
+
+  auto/*observable<InodeResult*/ all_inode_results =
+      matched_inode_values.merge(unmatched_inode_values);
+
+  // Now that all mid-stream observables have been connected, turn the Connectable observable
+  // into a regular observable.
+
+  // The caller has to call 'connect' on the search_state_results after subscribing
+  // and before any work can actually start.
+  return std::make_pair(all_inode_results, search_state_results);
+}
+
+
+rxcpp::observable<InodeResult> SearchDirectories::FindFilenamesFromInodes(
+    std::vector<std::string> root_directories,
+    std::vector<Inode> inode_list,
+    SearchMode mode) {
+  DCHECK(mode == SearchMode::kInProcessDirect) << " other modes not implemented yet";
+
+  auto/*observable[2]*/ [inode_results, connectable] = SearchDirectoriesForMatchingInodes(
+      std::move(root_directories),
+      std::move(inode_list),
+      system_call_);
+
+  return inode_results;
+}
+
+// I think we could avoid this with auto_connect, which rxcpp doesn't seem to have.
+//
+// I can't figure out any other way to avoid this, or at least to allow connecting
+// on the primary observable (instead of a secondary side-observable).
+//
+// If using the obvious publish+ref_count then the unmerged stream gets no items emitted into it.
+// If tried to ref_count later, everything turns into no-op.
+// If trying to call connect too early, the subscribe is missed.
+template <typename T>
+struct RxAnyConnectableFromObservable : public SearchDirectories::RxAnyConnectable {
+  virtual void connect() override {
+    observable.connect();
+  }
+
+  virtual ~RxAnyConnectableFromObservable() {}
+
+  RxAnyConnectableFromObservable(rxcpp::connectable_observable<T> observable)
+    : observable(observable) {
+  }
+
+  rxcpp::connectable_observable<T> observable;
+};
+
+// Type deduction helper.
+template <typename T>
+std::unique_ptr<SearchDirectories::RxAnyConnectable>
+    MakeRxAnyConnectableFromObservable(rxcpp::connectable_observable<T> observable) {
+  SearchDirectories::RxAnyConnectable* ptr = new RxAnyConnectableFromObservable<T>{observable};
+  return std::unique_ptr<SearchDirectories::RxAnyConnectable>{ptr};
+}
+
+std::pair<rxcpp::observable<InodeResult>, std::unique_ptr<SearchDirectories::RxAnyConnectable>>
+    SearchDirectories::FindFilenamesFromInodesPair(
+        std::vector<std::string> root_directories,
+        std::vector<Inode> inode_list,
+        SearchMode mode) {
+  DCHECK(mode == SearchMode::kInProcessDirect) << " other modes not implemented yet";
+
+  auto/*observable[2]*/ [inode_results, connectable] = SearchDirectoriesForMatchingInodes(
+      std::move(root_directories),
+      std::move(inode_list),
+      system_call_);
+
+  std::unique_ptr<SearchDirectories::RxAnyConnectable> connectable_ptr =
+    MakeRxAnyConnectableFromObservable(connectable.as_dynamic());
+
+  return {inode_results, std::move(connectable_ptr)};
+}
+
+}  // namespace iorap::inode2filename
diff --git a/src/inode2filename/search_directories.h b/src/inode2filename/search_directories.h
new file mode 100644
index 0000000..8156574
--- /dev/null
+++ b/src/inode2filename/search_directories.h
@@ -0,0 +1,147 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_INODE2FILENAME_SEARCH_DIRECTORIES_H_
+#define IORAP_SRC_INODE2FILENAME_SEARCH_DIRECTORIES_H_
+
+#include "common/expected.h"
+#include "inode2filename/inode.h"
+#include "inode2filename/system_call.h"
+
+#include <fruit/fruit.h>
+
+#include <rxcpp/rx.hpp>
+namespace iorap::inode2filename {
+
+// Tuple of (Inode -> (Filename|Errno))
+struct InodeResult {
+  // We set this error when all root directories have been searched and
+  // yet we still could not find a corresponding filename for the inode under search.
+  static constexpr int kCouldNotFindFilename = -ENOENT;
+
+  Inode inode;
+  // Value: Contains the filename (with a root directory as a prefix).
+  // Error: Contains the errno, usually -ENOENT or perhaps a security error.
+  iorap::expected<std::string /*filename*/, int /*errno*/> data;
+
+  static InodeResult makeSuccess(Inode inode, std::string filename) {
+    return InodeResult{inode, std::move(filename)};
+  }
+
+  static InodeResult makeFailure(Inode inode, int err_no) {
+    return InodeResult{inode, iorap::unexpected{err_no}};
+  }
+
+  constexpr operator bool() const {
+    return data.has_value();
+  }
+};
+
+enum class SearchMode {
+  // Test modes:
+  kInProcessDirect,  // Execute the code directly.
+  kInProcessIpc,     // Execute code via IPC layer using multiple threads.
+  // Shipping mode:
+  kOutOfProcessIpc,  // Execute code via fork+exec with IPC.
+
+  // Note: in-process system-wide stat(2)/readdir/etc is blocked by selinux.
+  // Attempting to call the test modes will fail with -EPERM.
+  //
+  // Use fork+exec mode in shipping configurations, which spawns inode2filename
+  // as a separate command.
+};
+
+struct SearchDirectories {
+  // Type-erased subset of rxcpp::connectable_observable<?>
+  struct RxAnyConnectable {
+    // Connects to the underlying observable.
+    //
+    // This kicks off the graph, streams begin emitting items.
+    // This method will block until all items have been fully emitted
+    // and processed by any subscribers.
+    virtual void connect() = 0;
+
+    virtual ~RxAnyConnectable(){}
+  };
+
+
+  // Create a cold observable of inode results (a lazy stream) corresponding
+  // to the inode search list.
+  //
+  // A depth-first search is done on each of the root directories (in order),
+  // until all inodes have been found (or until all directories have been exhausted).
+  //
+  // Some internal errors may occur during emission that aren't part of an InodeResult;
+  // these will be sent to the error logcat and dropped.
+  //
+  // Calling this function does not begin the search.
+  // The returned observable will begin the search after subscribing to it.
+  //
+  // The emitted InodeResult stream has these guarantees:
+  // - All inodes in inode_list will eventually be emitted exactly once in an InodeResult
+  // - When all inodes are found, directory traversal is halted.
+  // - The order of emission can be considered arbitrary.
+  //
+  // Lifetime rules:
+  // - The observable must be fully consumed before deleting any of the SearchDirectory's
+  //   borrowed constructor parameters (e.g. the SystemCall).
+  // - SearchDirectory itself can be deleted at any time after creating an observable.
+  rxcpp::observable<InodeResult>
+      FindFilenamesFromInodes(std::vector<std::string> root_directories,
+                              std::vector<Inode> inode_list,
+                              SearchMode mode);
+
+  // Create a cold observable of inode results (a lazy stream) corresponding
+  // to the inode search list.
+  //
+  // A depth-first search is done on each of the root directories (in order),
+  // until all inodes have been found (or until all directories have been exhausted).
+  //
+  // Some internal errors may occur during emission that aren't part of an InodeResult;
+  // these will be sent to the error logcat and dropped.
+  //
+  // Calling this function does not begin the search.
+  // The returned observable will begin the search after subscribing to it.
+  //
+  // The emitted InodeResult stream has these guarantees:
+  // - All inodes in inode_list will eventually be emitted exactly once in an InodeResult
+  // - When all inodes are found, directory traversal is halted.
+  // - The order of emission can be considered arbitrary.
+  //
+  // Lifetime rules:
+  // - The observable must be fully consumed before deleting any of the SearchDirectory's
+  //   borrowed constructor parameters (e.g. the SystemCall).
+  // - SearchDirectory itself can be deleted at any time after creating an observable.
+  std::pair<rxcpp::observable<InodeResult>, std::unique_ptr<RxAnyConnectable>>
+      FindFilenamesFromInodesPair(std::vector<std::string> root_directories,
+                                  std::vector<Inode> inode_list,
+                                  SearchMode mode);
+
+  // Any borrowed parameters here can also be borrowed by the observables returned by the above
+  // member functions.
+  //
+  // The observables must be fully consumed within the lifetime of the borrowed parameters.
+  INJECT(SearchDirectories(borrowed<SystemCall*> system_call))
+      : system_call_(system_call) {}
+
+  // TODO: is there a way to get rid of this second RxAnyConnectable parameter?
+ private:
+  // This gets passed around to lazy lambdas, so we must finish consuming any observables
+  // before the injected system call is deleted.
+  borrowed<SystemCall*> system_call_;
+};
+
+}  // namespace iorap::inode2filename
+
+#endif  // IORAP_SRC_INODE2FILENAME_SEARCH_DIRECTORIES_H_
diff --git a/src/inode2filename/system_call.h b/src/inode2filename/system_call.h
new file mode 100644
index 0000000..43c371f
--- /dev/null
+++ b/src/inode2filename/system_call.h
@@ -0,0 +1,73 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_INODE2FILENAME_SYSTEM_CALL_H_
+#define IORAP_SRC_INODE2FILENAME_SYSTEM_CALL_H_
+
+#include <fruit/fruit.h>
+
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+// Abstract out the system calls behind a virtual interface:
+// This enables us to use dependency injection to provide mock implementations
+// during tests.
+struct SystemCall {
+  // stat(2)
+  virtual int stat(const char *pathname, struct stat *statbuf) = 0;
+
+  // opendir(3)
+  virtual DIR *opendir(const char *name) = 0;
+
+  // readdir(3)
+  virtual struct dirent *readdir(DIR *dirp) = 0;
+
+  // closedir(3)
+  virtual int closedir(DIR *dirp) = 0;
+
+  virtual ~SystemCall() {}
+};
+
+// "Live" implementation that calls down to libc.
+struct SystemCallImpl : public SystemCall {
+  // Marks this constructor as the one to use for injection.
+  INJECT(SystemCallImpl()) = default;
+
+  // stat(2)
+  virtual int stat(const char *pathname, struct stat *statbuf) override {
+    return ::stat(pathname, statbuf);
+  }
+
+  // opendir(3)
+  virtual DIR *opendir(const char *name) override {
+    return ::opendir(name);
+  }
+
+  // readdir(3)
+  virtual struct dirent *readdir(DIR *dirp) override {
+    return ::readdir(dirp);
+  }
+
+  // closedir(3)
+  virtual int closedir(DIR *dirp) override {
+    return ::closedir(dirp);
+  }
+
+  virtual ~SystemCallImpl() {}
+};
+
+#endif  // IORAP_SRC_INODE2FILENAME_SYSTEM_CALL_H_
+
diff --git a/src/iorapd/main.cc b/src/iorapd/main.cc
index 074984d..ab73fe5 100644
--- a/src/iorapd/main.cc
+++ b/src/iorapd/main.cc
@@ -15,8 +15,11 @@
  */
 
 #include "binder/iiorap_impl.h"
+#include "common/debug.h"
+#include "manager/event_manager.h"
 
 #include <android-base/logging.h>
+#include <android-base/properties.h>
 #include <binder/IPCThreadState.h>
 #include <utils/Trace.h>
 
@@ -46,22 +49,24 @@
 };
 
 int main(int /*argc*/, char** argv) {
-  // Log everything!! TODO: less aggressive logging once this is closer to being shipped.
-  setenv("ANDROID_LOG_TAGS", "*:v", /*overwrite*/ 1);
+  if (android::base::GetBoolProperty("iorapd.log.verbose", iorap::kIsDebugBuild)) {
+    // Show verbose logs if the property is enabled or if we are a debug build.
+    setenv("ANDROID_LOG_TAGS", "*:v", /*overwrite*/ 1);
+  }
 
   // Logs go to system logcat.
   android::base::InitLogging(argv, StderrAndLogdLogger{android::base::SYSTEM});
 
-  // TODO: an selinux context is required, otherwise clients are rejected when trying to
-  // find this service.
-
-  // Testing workaround: use 'adb shell setenforce 0'
   {
     android::ScopedTrace trace_main{ATRACE_TAG_PACKAGE_MANAGER, "main"};
     LOG(INFO) << kServiceName << " (the prefetchening) firing up";
 
     android::ScopedTrace trace_start{ATRACE_TAG_PACKAGE_MANAGER, "IorapNativeService::start"};
-    if (!iorap::binder::IIorapImpl::Start()) {
+
+    // TODO: use fruit for this DI.
+    auto /*std::shared_ptr<EventManager>*/ event_manager =
+        iorap::manager::EventManager::Create();
+    if (!iorap::binder::IIorapImpl::Start(std::move(event_manager))) {
       LOG(ERROR) << "Unable to start IorapNativeService";
       exit(1);
     }
diff --git a/src/manager/event_manager.cc b/src/manager/event_manager.cc
new file mode 100644
index 0000000..3b75b89
--- /dev/null
+++ b/src/manager/event_manager.cc
@@ -0,0 +1,496 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "common/debug.h"
+#include "common/expected.h"
+#include "manager/event_manager.h"
+#include "perfetto/rx_producer.h"
+
+#include <android-base/properties.h>
+#include <rxcpp/rx.hpp>
+
+#include <atomic>
+#include <functional>
+
+using rxcpp::observe_on_one_worker;
+
+namespace iorap::manager {
+
+using binder::RequestId;
+using binder::AppLaunchEvent;
+using perfetto::PerfettoStreamCommand;
+using perfetto::PerfettoTraceProto;
+
+struct AppComponentName {
+  std::string package;
+  std::string activity_name;
+
+  static bool HasAppComponentName(const std::string& s) {
+    return s.find('/') != std::string::npos;
+  }
+
+  // "com.foo.bar/.A" -> {"com.foo.bar", ".A"}
+  static AppComponentName FromString(const std::string& s) {
+    constexpr const char delimiter = '/';
+    std::string package = s.substr(0, delimiter);
+
+    std::string activity_name = s;
+    activity_name.erase(0, s.find(delimiter) + sizeof(delimiter));
+
+    return {std::move(package), std::move(activity_name)};
+  }
+
+  // {"com.foo.bar", ".A"} -> "com.foo.bar/.A"
+  std::string ToString() const {
+    return package + "/" + activity_name;
+  }
+
+  /*
+   * '/' is encoded into %2F
+   * '%' is encoded into %25
+   *
+   * This allows the component name to be be used as a file name
+   * ('/' is illegal due to being a path separator) with minimal
+   * munging.
+   */
+
+  // "com.foo.bar%2F.A%25" -> {"com.foo.bar", ".A%"}
+  static AppComponentName FromUrlEncodedString(const std::string& s) {
+    std::string cpy = s;
+    Replace(cpy, "%2F", "/");
+    Replace(cpy, "%25", "%");
+
+    return FromString(cpy);
+  }
+
+  // {"com.foo.bar", ".A%"} -> "com.foo.bar%2F.A%25"
+  std::string ToUrlEncodedString() const {
+    std::string s = ToString();
+    Replace(s, "%", "%25");
+    Replace(s, "/", "%2F");
+    return s;
+  }
+
+ private:
+  static bool Replace(std::string& str, const std::string& from, const std::string& to) {
+    // TODO: call in a loop to replace all occurrences, not just the first one.
+    const size_t start_pos = str.find(from);
+    if (start_pos == std::string::npos) {
+      return false;
+    }
+
+    str.replace(start_pos, from.length(), to);
+
+    return true;
+}
+};
+
+std::ostream& operator<<(std::ostream& os, const AppComponentName& name) {
+  os << name.ToString();
+  return os;
+}
+
+// Main logic of the #OnAppLaunchEvent scan method.
+//
+// All functions are called from the same thread as the event manager
+// functions.
+//
+// This is a data type, it's moved (std::move) around from one iteration
+// of #scan to another.
+struct AppLaunchEventState {
+  std::optional<AppComponentName> component_name_;
+
+  bool is_tracing_{false};
+  std::optional<rxcpp::composite_subscription> rx_lifetime_;
+  std::vector<rxcpp::composite_subscription> rx_in_flight_;
+
+  borrowed<perfetto::RxProducerFactory*> perfetto_factory_;  // not null
+  borrowed<observe_on_one_worker*> thread_;  // not null
+  borrowed<observe_on_one_worker*> io_thread_;  // not null
+
+  explicit AppLaunchEventState(borrowed<perfetto::RxProducerFactory*> perfetto_factory,
+                               borrowed<observe_on_one_worker*> thread,
+                               borrowed<observe_on_one_worker*> io_thread) {
+    perfetto_factory_ = perfetto_factory;
+    DCHECK(perfetto_factory_ != nullptr);
+
+    thread_ = thread;
+    DCHECK(thread_ != nullptr);
+
+    io_thread_ = io_thread;
+    DCHECK(io_thread_ != nullptr);
+  }
+
+  // Updates the values in this struct only as a side effect.
+  //
+  // May create and fire a new rx chain on the same threads as passed
+  // in by the constructors.
+  void OnNewEvent(const AppLaunchEvent& event) {
+    LOG(VERBOSE) << "AppLaunchEventState#OnNewEvent: " << event;
+
+    using Type = AppLaunchEvent::Type;
+
+    switch (event.type) {
+      case Type::kIntentStarted: {
+        DCHECK(!IsTracing());
+        // Optimistically start tracing if we have the activity in the intent.
+        if (!event.intent_proto->has_component()) {
+          // Can't do anything if there is no component in the proto.
+          LOG(VERBOSE) << "AppLaunchEventState#OnNewEvent: no component, can't trace";
+          break;
+        }
+
+        const std::string& package_name = event.intent_proto->component().package_name();
+        const std::string& class_name = event.intent_proto->component().class_name();
+        AppComponentName component_name{package_name, class_name};
+
+        component_name_ = component_name;
+        rx_lifetime_ = StartTracing(std::move(component_name));
+
+        break;
+      }
+      case Type::kIntentFailed:
+        AbortTrace();
+        break;
+      case Type::kActivityLaunched: {
+        // Cancel tracing for warm/hot.
+        // Restart tracing if the activity was unexpected.
+
+        AppLaunchEvent::Temperature temperature = event.temperature;
+        if (temperature != AppLaunchEvent::Temperature::kCold) {
+          LOG(DEBUG) << "AppLaunchEventState#OnNewEvent aborting trace due to non-cold temperature";
+          AbortTrace();
+        } else if (!IsTracing()) {  // and the temperature is Cold.
+          // Start late trace when intent didn't have a component name
+          LOG(VERBOSE) << "AppLaunchEventState#OnNewEvent need to start new trace";
+
+          const std::string& title = event.activity_record_proto->identifier().title();
+          if (!AppComponentName::HasAppComponentName(title)) {
+            // Proto comment claim this is sometimes a window title.
+            // We need the actual 'package/component' here, so just ignore it if it's a title.
+            LOG(WARNING) << "App launched without a component name: " << event;
+            break;
+          }
+
+          AppComponentName component_name = AppComponentName::FromString(title);
+
+          component_name_ = component_name;
+          rx_lifetime_ = StartTracing(std::move(component_name));
+        } else {
+          // FIXME: match actual component name against intent component name.
+          // abort traces if they don't match.
+
+          LOG(VERBOSE) << "AppLaunchEventState#OnNewEvent already tracing";
+        }
+        break;
+      }
+      case Type::kActivityLaunchFinished:
+        // Finish tracing and collect trace buffer.
+        //
+        // TODO: this happens automatically when perfetto finishes its
+        // trace duration.
+        if (IsTracing()) {
+          MarkPendingTrace();
+        }
+        break;
+      case Type::kActivityLaunchCancelled:
+        // Abort tracing.
+        AbortTrace();
+        break;
+      default:
+        DCHECK(false) << "invalid type: " << event;  // binder layer should've rejected this.
+        LOG(ERROR) << "invalid type: " << event;  // binder layer should've rejected this.
+    }
+  }
+
+  bool IsTracing() const {
+    return is_tracing_;
+  }
+
+  rxcpp::composite_subscription StartTracing(AppComponentName component_name) {
+    DCHECK(!IsTracing());
+
+    auto /*observable<PerfettoStreamCommand>*/ perfetto_commands =
+      rxcpp::observable<>::just(PerfettoStreamCommand::kStartTracing)
+          // wait 1x
+          .concat(
+              // Pick a value longer than the perfetto config delay_ms, so that we send
+              // 'kShutdown' after tracing has already finished.
+              rxcpp::observable<>::interval(std::chrono::milliseconds(10000))
+                  .take(2)  // kStopTracing, kShutdown.
+                  .map([](int value) {
+                         // value is 1,2,3,...
+                         return static_cast<PerfettoStreamCommand>(value);  // 1,2, ...
+                       })
+          );
+
+    auto /*observable<PerfettoTraceProto>*/ trace_proto_stream =
+        perfetto_factory_->CreateTraceStream(perfetto_commands);
+    // This immediately connects to perfetto asynchronously.
+    //
+    // TODO: create a perfetto handle earlier, to minimize perfetto startup latency.
+
+    rxcpp::composite_subscription lifetime;
+
+    trace_proto_stream
+      .tap([](const PerfettoTraceProto& trace_proto) {
+             LOG(VERBOSE) << "StartTracing -- PerfettoTraceProto received (1)";
+           })
+      .observe_on(*thread_)   // All work prior to 'observe_on' is handled on thread_.
+      .subscribe_on(*thread_)   // All work prior to 'observe_on' is handled on thread_.
+      .observe_on(*io_thread_)  // Write data on an idle-class-priority thread.
+      .tap([](const PerfettoTraceProto& trace_proto) {
+             LOG(VERBOSE) << "StartTracing -- PerfettoTraceProto received (2)";
+           })
+      .as_blocking()  // TODO: remove.
+      .subscribe(/*out*/lifetime,
+        /*on_next*/[component_name]
+        (PerfettoTraceProto trace_proto) {
+          std::string file_path = "/data/misc/iorapd/";
+          file_path += component_name.ToUrlEncodedString();
+          file_path += ".perfetto_trace.pb";
+
+          // TODO: timestamp each file into a subdirectory.
+
+          if (!trace_proto.WriteFullyToFile(file_path)) {
+            LOG(ERROR) << "Failed to save TraceBuffer to " << file_path;
+          } else {
+            LOG(INFO) << "Perfetto TraceBuffer saved to file: " << file_path;
+          }
+        },
+        /*on_error*/[](rxcpp::util::error_ptr err) {
+          LOG(ERROR) << "Perfetto trace proto collection error: " << rxcpp::util::what(err);
+        });
+
+    is_tracing_ = true;
+
+    return lifetime;
+  }
+
+  void AbortTrace() {
+    LOG(VERBOSE) << "AppLaunchEventState - AbortTrace";
+    is_tracing_ = false;
+    if (rx_lifetime_) {
+      // TODO: it would be good to call perfetto Destroy.
+
+      LOG(VERBOSE) << "AppLaunchEventState - AbortTrace - Unsubscribe";
+      rx_lifetime_->unsubscribe();
+      rx_lifetime_.reset();
+    }
+  }
+
+  void MarkPendingTrace() {
+    LOG(VERBOSE) << "AppLaunchEventState - MarkPendingTrace";
+    DCHECK(is_tracing_);
+    DCHECK(rx_lifetime_.has_value());
+
+    if (rx_lifetime_) {
+      LOG(VERBOSE) << "AppLaunchEventState - MarkPendingTrace - lifetime moved";
+      // Don't unsubscribe because that would cause the perfetto TraceBuffer
+      // to get dropped on the floor.
+      //
+      // Instead, we want to let it finish and write it out to a file.
+      rx_in_flight_.push_back(*std::move(rx_lifetime_));
+      rx_lifetime_.reset();
+    } else {
+      LOG(VERBOSE) << "AppLaunchEventState - MarkPendingTrace - lifetime was empty";
+    }
+
+    // FIXME: how do we clear this vector?
+  }
+};
+
+// Convert callback pattern into reactive pattern.
+struct AppLaunchEventSubject {
+  using RefWrapper =
+    std::reference_wrapper<const AppLaunchEvent>;
+
+  AppLaunchEventSubject() {}
+
+  void Subscribe(rxcpp::subscriber<RefWrapper> subscriber) {
+    DCHECK(ready_ != true) << "Cannot Subscribe twice";
+
+    subscriber_ = std::move(subscriber);
+
+    // Release edge of synchronizes-with AcquireIsReady.
+    ready_.store(true);
+  }
+
+  void OnNext(const AppLaunchEvent& e) {
+    if (!AcquireIsReady()) {
+      return;
+    }
+
+    if (!subscriber_->is_subscribed()) {
+      return;
+    }
+
+    /*
+     * TODO: fix upstream.
+     *
+     * Rx workaround: this fails to compile when
+     * the observable is a reference type:
+     *
+     * external/Reactive-Extensions/RxCpp/Rx/v2/src/rxcpp/rx-observer.hpp:354:18: error: multiple overloads of 'on_next' instantiate to the same signature 'void (const iorap::binder::AppLaunchEvent &) const'
+     *   virtual void on_next(T&&) const {};
+     *
+     * external/Reactive-Extensions/RxCpp/Rx/v2/src/rxcpp/rx-observer.hpp:353:18: note: previous declaration is here
+     *   virtual void on_next(T&) const {};
+     *
+     * (The workaround is to use reference_wrapper instead
+     *  of const AppLaunchEvent&)
+     */
+    subscriber_->on_next(std::cref(e));
+
+  }
+
+  void OnCompleted() {
+    if (!AcquireIsReady()) {
+      return;
+    }
+
+    subscriber_->on_completed();
+  }
+
+ private:
+  bool AcquireIsReady() {
+    // Synchronizes-with the release-edge in Subscribe.
+    // This can happen much later, only once the subscription actually happens.
+
+    // However, as far as I know, 'rxcpp::subscriber' is not thread safe,
+    // (but the observable chain itself can be made thread-safe via #observe_on, etc).
+    // so we must avoid reading it until it has been fully synchronized.
+    //
+    // TODO: investigate rxcpp subscribers and see if we can get rid of this atomics,
+    // to make it simpler.
+    return ready_.load();
+  }
+
+  // TODO: also track the RequestId ?
+
+  std::atomic<bool> ready_{false};
+
+
+  std::optional<rxcpp::subscriber<RefWrapper>> subscriber_;
+};
+
+class EventManager::Impl {
+ public:
+  Impl(/*borrow*/perfetto::RxProducerFactory& perfetto_factory)
+    : perfetto_factory_(perfetto_factory),
+      worker_thread_(rxcpp::observe_on_new_thread()),
+      worker_thread2_(rxcpp::observe_on_new_thread()),
+      io_thread_(perfetto::ObserveOnNewIoThread()) {
+
+    // TODO: read all properties from one config class.
+    tracing_allowed_ = ::android::base::GetBoolProperty("iorapd.perfetto.enable", /*default*/false);
+
+    if (tracing_allowed_) {
+      rx_lifetime_ = InitializeRxGraph();
+    } else {
+      LOG(WARNING) << "Tracing disabled by iorapd.perfetto.enable=false";
+    }
+  }
+
+  bool OnAppLaunchEvent(RequestId request_id,
+                        const AppLaunchEvent& event) {
+    LOG(VERBOSE) << "EventManager::OnAppLaunchEvent("
+                 << "request_id=" << request_id.request_id << ","
+                 << event;
+
+    app_launch_event_subject_.OnNext(event);
+
+    return true;
+  }
+
+  rxcpp::composite_subscription InitializeRxGraph() {
+    LOG(VERBOSE) << "EventManager::InitializeRxGraph";
+
+    app_launch_events_ = rxcpp::observable<>::create<AppLaunchEventRefWrapper>(
+      [&](rxcpp::subscriber<AppLaunchEventRefWrapper> subscriber) {
+        app_launch_event_subject_.Subscribe(std::move(subscriber));
+      });
+
+    rxcpp::composite_subscription lifetime;
+
+    AppLaunchEventState initial_state{&perfetto_factory_, &worker_thread2_, &io_thread_};
+    app_launch_events_
+      .subscribe_on(worker_thread_)
+      .scan(std::move(initial_state),
+            [](AppLaunchEventState state, AppLaunchEventRefWrapper event) {
+              state.OnNewEvent(event.get());
+              return state;
+            })
+      .subscribe(/*out*/lifetime, [](const AppLaunchEventState& state) {
+                   // Intentionally left blank.
+                   (void)state;
+                 });
+
+    return lifetime;
+  }
+
+  perfetto::RxProducerFactory& perfetto_factory_;
+  bool tracing_allowed_{true};
+
+  using AppLaunchEventRefWrapper = AppLaunchEventSubject::RefWrapper;
+  rxcpp::observable<AppLaunchEventRefWrapper> app_launch_events_;
+  AppLaunchEventSubject app_launch_event_subject_;
+
+  rxcpp::observable<RequestId> completed_requests_;
+
+  // regular-priority thread to handle binder callbacks.
+  observe_on_one_worker worker_thread_;
+  observe_on_one_worker worker_thread2_;
+  // low priority idle-class thread for IO operations.
+  observe_on_one_worker io_thread_;
+
+  rxcpp::composite_subscription rx_lifetime_;
+
+//INTENTIONAL_COMPILER_ERROR_HERE:
+  // FIXME:
+  // ok so we want to expose a 'BlockingSubscribe' or a 'Subscribe' or some kind of function
+  // that the main thread can call. This would subscribe on all the observables we internally
+  // have here (probably on an event-manager-dedicated thread for simplicity).
+  //
+  // ideally we'd just reuse the binder thread to handle the events but I'm not super sure,
+  // maybe this already works with the identity_current_thread coordination?
+};
+using Impl = EventManager::Impl;
+
+EventManager::EventManager(perfetto::RxProducerFactory& perfetto_factory)
+    : impl_(new Impl(perfetto_factory)) {}
+
+std::shared_ptr<EventManager> EventManager::Create() {
+  static perfetto::PerfettoDependencies::Injector injector{
+    perfetto::PerfettoDependencies::CreateComponent
+  };
+  static perfetto::RxProducerFactory producer_factory{
+    /*borrow*/injector
+  };
+  return EventManager::Create(/*borrow*/producer_factory);
+}
+
+std::shared_ptr<EventManager> EventManager::Create(perfetto::RxProducerFactory& perfetto_factory) {
+  std::shared_ptr<EventManager> p{new EventManager{/*borrow*/perfetto_factory}};
+  return p;
+}
+
+bool EventManager::OnAppLaunchEvent(RequestId request_id,
+                                    const AppLaunchEvent& event) {
+  return impl_->OnAppLaunchEvent(request_id, event);
+}
+
+}  // namespace iorap::manager
diff --git a/src/manager/event_manager.h b/src/manager/event_manager.h
new file mode 100644
index 0000000..5355296
--- /dev/null
+++ b/src/manager/event_manager.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IORAP_MANAGER_EVENT_MANAGER_H_
+#define IORAP_MANAGER_EVENT_MANAGER_H_
+
+#include "binder/app_launch_event.h"
+#include "binder/request_id.h"
+
+#include <memory>
+
+namespace iorap::perfetto {
+  struct RxProducerFactory;
+}  // namespace iorap::perfetto
+
+namespace iorap::manager {
+
+class EventManager {
+ public:
+  static std::shared_ptr<EventManager> Create();
+  static std::shared_ptr<EventManager> Create(
+      /*borrow*/perfetto::RxProducerFactory& perfetto_factory);
+
+  // Handles an AppLaunchEvent:
+  //
+  // * Intent starts and app launch starts are treated critically
+  //   and will be handled immediately. This means the caller
+  //   (e.g. the binder pool thread) could be starved in the name
+  //   of low latency.
+  //
+  // * Other types are handled in a separate thread.
+  bool OnAppLaunchEvent(binder::RequestId request_id,
+                        const binder::AppLaunchEvent& event);
+
+  class Impl;
+ private:
+  std::unique_ptr<Impl> impl_;
+
+  EventManager(perfetto::RxProducerFactory& perfetto_factory);
+};
+
+}  // namespace iorap::manager
+
+#endif  // IORAP_MANAGER_EVENT_MANAGER_H_
diff --git a/src/perfetto/main.cc b/src/perfetto/main.cc
new file mode 100644
index 0000000..0b1056e
--- /dev/null
+++ b/src/perfetto/main.cc
@@ -0,0 +1,244 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//#undef NDEBUG // get DCHECK etc.
+
+
+#include "common/debug.h"
+#include "common/expected.h"
+#include "perfetto/rx_producer.h"
+
+#include <android-base/unique_fd.h>
+#include <android-base/parseint.h>
+#include <android-base/file.h>
+
+#include "rxcpp/rx.hpp"
+#include <iostream>
+#include <optional>
+
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <syscall.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+using namespace iorap::perfetto;  // NOLINT
+
+#if defined(IORAP_PERFETTO_MAIN)
+
+void Usage(char** argv) {
+  std::cerr << "Usage: " << argv[0] << " [--config-proto=config.pb] [--duration-ms=5000] [--output-proto=output.pb]" << std::endl;
+  std::cerr << "" << std::endl;
+  std::cerr << "  Request a perfetto trace, blocking until it's complete. The resulting trace proto" << std::endl;
+  std::cerr << "  is output to stdout as text, or to --output-proto as a binary." << std::endl;
+  std::cerr << "" << std::endl;
+  std::cerr << "  Optional flags:" << std::endl;
+  std::cerr << "    --help,-h                  Print this Usage." << std::endl;
+  std::cerr << "    --output-proto $,-op $     Perfetto tracebuffer output file (default stdout)." << std::endl;
+  std::cerr << "    --config-proto $,-cp $     Path to binary protobuf config." << std::endl;
+  std::cerr << "    --duration-ms $,-dm $      How long to run trace for in milliseconds." << std::endl;
+  std::cerr << "    --simple                   Simplest possible perfetto state transitions (default off)." << std::endl;
+  std::cerr << "    --verbose,-v               Set verbosity (default off)." << std::endl;
+  std::cerr << "    --wait,-w                  Wait for key stroke before continuing (default off)." << std::endl;
+  exit(1);
+}
+
+PerfettoDependencies::Component CreateCommandLinePerfettoDependenciesComponent(
+    uint32_t duration_ms) {
+  // TODO: read from command line.
+  static const uint32_t kBufferSize = 4096;
+
+  // TODO: remove this hack.
+  static const uint32_t kTraceDurationMs = duration_ms;
+
+  // fruit: using 'bindInstance' causes a segfault every time.
+#if 0
+
+  // fruit: Can't use a stateful lambda, so use bindInstance instead of registerProvider.
+  auto config = PerfettoDependencies::CreateConfig(duration_ms,
+                                                   /*deferred_start*/true,
+                                                   kBufferSize);
+
+  .... bindInstance(config);
+#endif
+
+  return fruit::createComponent()
+    .bind<PerfettoConsumer, PerfettoConsumerImpl>()
+    .registerProvider([]() /* -> TraceConfig */ {
+        return PerfettoDependencies::CreateConfig(kTraceDurationMs,
+                                                  /*deferred_start*/true,
+                                                  kBufferSize);
+    });
+}
+
+static void CollectPerfettoTraceBufferViaAbstractions(
+    RxProducerFactory& producer_factory,
+    const std::string& arg_output_proto,
+    const int arg_duration_ms) {
+  LOG(VERBOSE) << "CollectPerfettoTraceBufferViaAbstractions";
+
+  // Don't create a subscriber to emit the PerfettoStreamCommand.
+  // RxCpp is "greedy" and consumes every possible item emitted (it doesn't support 'pull'). We want
+  // to operate on a (command,state) iteration every time, just like in a real scenario.
+  // Adding the 'interval' turns into a non-greedy version (i.e. push).
+
+  // Immediately emit 'kStartTracing', wait and emit kStopTracing, wait and emit kShutdown.
+  // In reality, there would be a delay between all these events.
+  auto /*observable<PerfettoStreamCommand>*/ commands =
+      rxcpp::observable<>::just(PerfettoStreamCommand::kStartTracing)
+          // wait 1x
+          .concat(
+              // Pick a value longer than the perfetto config delay_ms, so that we send
+              // 'kShutdown' after tracing has already finished.
+              rxcpp::observable<>::interval(std::chrono::milliseconds(arg_duration_ms * 2))
+                  .take(2)  // kStopTracing, kShutdown.
+                  .map([](int value) {
+                         // value is 1,2,3,...
+                         return static_cast<PerfettoStreamCommand>(value);  // 1,2, ...
+                       })
+          );
+
+  auto /*observable<PerfettoTraceProto>*/ trace_proto_stream =
+      producer_factory.CreateTraceStream(commands);
+
+  trace_proto_stream
+    .observe_on(ObserveOnNewIoThread())  // Write data on an idle-class-priority thread.
+    .as_blocking()  // Wait for observable to terminate with on_completed or on_error.
+    .subscribe(/*on_next*/[arg_output_proto]
+      (PerfettoTraceProto trace_proto) {
+             if (!trace_proto.WriteFullyToFile(arg_output_proto)) {
+               LOG(ERROR) << "Failed to save TraceBuffer to " << arg_output_proto;
+             } else {
+               LOG(INFO) << "TraceBuffer saved to file: " << arg_output_proto;
+               LOG(INFO);
+               LOG(INFO) << "To print this in a human readable form, execute these commands:";
+               LOG(INFO) << "$> adb pull '" << arg_output_proto << "'";
+               LOG(INFO) << "$> trace_to_text systrace <filename.pb>";
+             }
+      },
+      /*on_error*/[](rxcpp::util::error_ptr err) {
+        LOG(ERROR) << "Perfetto trace proto collection error: " << rxcpp::util::what(err);
+      });
+}
+
+namespace iorap::perfetto {
+// Reach inside rx_producer.cc
+// Not part of any headers because it's internal.
+void CollectPerfettoTraceBufferImmediately(
+    RxProducerFactory& producer_factory,
+    const std::string& arg_output_proto);
+}
+
+int main(int argc, char** argv) {
+  android::base::InitLogging(argv);
+  android::base::SetLogger(android::base::StderrLogger);
+
+  bool wait_for_keystroke = false;
+  bool enable_verbose = false;
+
+  std::string arg_output_proto;
+  std::string arg_config_proto;
+  uint32_t arg_duration_ms = 1000;
+  bool arg_simple = false;
+
+  if (argc == 1) {
+    Usage(argv);
+  }
+
+  for (int arg = 1; arg < argc; ++arg) {
+    std::string argstr = argv[arg];
+    bool has_arg_next = (arg+1)<argc;
+    std::string arg_next = has_arg_next ? argv[arg+1] : "";
+
+    if (argstr == "--help" || argstr == "-h") {
+      Usage(argv);
+    } else if (argstr == "--output-proto" || argstr == "-op") {
+      if (!has_arg_next) {
+        std::cerr << "Missing --output-proto <value>" << std::endl;
+        return 1;
+      }
+      arg_output_proto = arg_next;
+      ++arg;
+    } else if (argstr == "--config-proto" || argstr == "-cp") {
+      if (!has_arg_next) {
+        std::cerr << "Missing --config-proto <value>" << std::endl;
+        return 1;
+      }
+      arg_config_proto = arg_next;
+      LOG(WARNING) << "TODO: parse configs from a file, not implemented yet.";
+      ++arg;
+    } else if (argstr == "--duration-ms" || argstr == "-dm") {
+      if (!has_arg_next) {
+        std::cerr << "Missing --duration-ms <value>" << std::endl;
+        return 1;
+      }
+      if (!android::base::ParseUint(arg_next.c_str(), /*out*/&arg_duration_ms)) {
+        std::cerr << "Invalid --duration-ms " << arg_next << ", reason: " << strerror(errno);
+        return 1;
+      }
+      ++arg;
+    } else if (argstr == "--simple") {
+      arg_simple = true;
+    } else if (argstr == "--verbose" || argstr == "-v") {
+      enable_verbose = true;
+    } else if (argstr == "--wait" || argstr == "-w") {
+      wait_for_keystroke = true;
+    }
+  }
+
+  if (enable_verbose) {
+    android::base::SetMinimumLogSeverity(android::base::VERBOSE);
+
+    LOG(VERBOSE) << "Verbose check";
+    LOG(VERBOSE) << "Debug check: " << ::iorap::kIsDebugBuild;
+  }
+
+  // Useful to attach a debugger...
+  // 1) $> iorap-cmd-perfetto -w <args>
+  // 2) $> gdbclient <pid>
+  if (wait_for_keystroke) {
+    LOG(INFO) << "Self pid: " << getpid();
+    LOG(INFO) << "Press any key to continue...";
+    std::cin >> wait_for_keystroke;
+  }
+
+  int return_code = 0;
+  // TODO: convert #on-error into a non-0 return code.
+
+  PerfettoDependencies::Injector injector{
+      CreateCommandLinePerfettoDependenciesComponent,
+      arg_duration_ms
+  };
+  RxProducerFactory rx_producer_factory{/*borrow*/injector};
+
+  if (arg_simple) {
+    // To debug any kind of low-level perfetto issues.
+    CollectPerfettoTraceBufferImmediately(/*inout*/rx_producer_factory, arg_output_proto);
+  } else {
+    // To debug our own iorap internal abstractions.
+    CollectPerfettoTraceBufferViaAbstractions(/*inout*/rx_producer_factory,
+                                              arg_output_proto,
+                                              arg_duration_ms);
+  }
+
+  // Uncomment this if we want to leave the process around to inspect it from adb shell.
+  // sleep(100000);
+
+  // 0 -> successfully wrote the TraceProto out to file.
+  // 1 -> failed along the way (#on_error and also see the error logs).
+  return return_code;
+}
+
+#endif
diff --git a/src/perfetto/perfetto_consumer.h b/src/perfetto/perfetto_consumer.h
new file mode 100644
index 0000000..ce04ffd
--- /dev/null
+++ b/src/perfetto/perfetto_consumer.h
@@ -0,0 +1,86 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_
+#define IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_
+
+#include <fruit/fruit.h>
+#include <perfetto/public/consumer_api.h>  // libperfetto
+
+namespace iorap::perfetto {
+
+// Abstract out the Perfetto C API behind a virtual interface:
+// This enables us to use dependency injection to provide mock implementations
+// during tests.
+struct PerfettoConsumer {
+  // 1:1 aliasing of type definitions and constants in perfetto/public/consumer_api.h
+  // Refer to the documentation there.
+  using State = ::perfetto::consumer::State;
+  using Handle = ::perfetto::consumer::Handle;
+  static constexpr Handle kInvalidHandle = ::perfetto::consumer::kInvalidHandle;
+  using OnStateChangedCb = ::perfetto::consumer::OnStateChangedCb;
+  using TraceBuffer = ::perfetto::consumer::TraceBuffer;
+
+  // 1:1 forwarding of C-style functions in perfetto/public/consumer_api.h
+  // Refer to the documentation there.
+
+  virtual Handle Create(const void* config_proto,
+                        size_t config_len,
+                        OnStateChangedCb callback,
+                        void* callback_arg) = 0;
+  virtual void StartTracing(Handle) = 0;
+  virtual TraceBuffer ReadTrace(Handle) = 0;
+  virtual void Destroy(Handle) = 0;
+  virtual State PollState(Handle) = 0;
+
+  virtual ~PerfettoConsumer() {}
+};
+
+// "Live" implementation that calls down to libperfetto.
+struct PerfettoConsumerImpl : public PerfettoConsumer {
+  // Marks this constructor as the one to use for injection.
+  INJECT(PerfettoConsumerImpl()) = default;
+
+  virtual Handle Create(const void* config_proto,
+                        size_t config_len,
+                        OnStateChangedCb callback,
+                        void* callback_arg) override {
+    return ::perfetto::consumer::Create(config_proto,
+                                      config_len,
+                                      callback,
+                                      callback_arg);
+  }
+
+  virtual void StartTracing(Handle handle) override {
+    ::perfetto::consumer::StartTracing(handle);
+  }
+
+  virtual TraceBuffer ReadTrace(Handle handle) override {
+    return ::perfetto::consumer::ReadTrace(handle);
+  }
+
+  virtual void Destroy(Handle handle) override {
+    ::perfetto::consumer::Destroy(handle);
+  }
+  virtual State PollState(Handle handle) override {
+    return ::perfetto::consumer::PollState(handle);
+  }
+
+  virtual ~PerfettoConsumerImpl() {}
+};
+
+}  // namespace iorap::perfetto
+
+#endif  // IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_
+
diff --git a/src/perfetto/rx_producer.cc b/src/perfetto/rx_producer.cc
new file mode 100644
index 0000000..14311a1
--- /dev/null
+++ b/src/perfetto/rx_producer.cc
@@ -0,0 +1,865 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "common/debug.h"
+#include "common/expected.h"
+#include "perfetto/rx_producer.h"
+
+#include <android-base/file.h>
+#include <android-base/properties.h>
+#include <android-base/unique_fd.h>
+
+#include <iostream>
+
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <syscall.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+// TODO: move to perfetto code
+namespace perfetto {
+namespace consumer {
+
+std::ostream& operator<<(std::ostream& os, State state) {
+  switch (state) {
+    case State::kTraceFailed:
+      os << "kTraceFailed";
+      break;
+    case State::kConnectionError:
+      os << "kConnectionError";
+      break;
+    case State::kSessionNotFound:
+      os << "kSessionNotFound";
+      break;
+    case State::kIdle:
+      os << "kIdle";
+      break;
+    case State::kConnecting:
+      os << "kConnecting";
+      break;
+    case State::kConfigured:
+      os << "kConfigured";
+      break;
+    case State::kTracing:
+      os << "kTracing";
+      break;
+    case State::kTraceEnded:
+      os << "kTraceEnded";
+      break;
+    default:
+      os << "(unknown)";  // did someone forget to update this code?
+      break;
+  }
+  return os;
+}
+
+}  // namespace consumer
+}  // namespace perfetto
+
+namespace iorap::perfetto {
+
+PerfettoDependencies::Component PerfettoDependencies::CreateComponent() {
+  // TODO: read from config.
+  static const uint32_t kTraceDurationMs =
+      ::android::base::GetUintProperty("iorapd.perfetto.trace_duration_ms", /*default*/5000U);
+
+  static const uint32_t kBufferSize =
+      ::android::base::GetUintProperty("iorapd.perfetto.buffer_size", /*default*/4096U);
+
+  return fruit::createComponent()
+    .bind<PerfettoConsumer, PerfettoConsumerImpl>()
+    .registerProvider([]() /* -> TraceConfig */ {
+        return CreateConfig(kTraceDurationMs,
+                            /*deferred_start*/true,
+                            kBufferSize);
+    });
+}
+
+::perfetto::protos::TraceConfig PerfettoDependencies::CreateConfig(uint32_t duration_ms,
+                                                                   bool deferred_start,
+                                                                   uint32_t buffer_size) {
+  ::perfetto::protos::TraceConfig trace_config;
+
+  trace_config.set_duration_ms(duration_ms);
+  trace_config.add_buffers()->set_size_kb(buffer_size);
+  trace_config.set_deferred_start(deferred_start);
+
+  auto* ds_config = trace_config.add_data_sources()->mutable_config();
+  ds_config->set_name("linux.ftrace");
+  ds_config->mutable_ftrace_config()->add_ftrace_events(
+      "mm_filemap_add_to_page_cache");
+  ds_config->mutable_ftrace_config()->add_ftrace_events(
+      "mm_filemap_delete_from_page_cache");
+  ds_config->set_target_buffer(0);
+
+  return trace_config;
+}
+
+// RAII-style wrapper around a perfetto handle that calls Destroy
+// in a thread-safe manner.
+struct PerfettoConsumerHandle {
+ private:
+  std::shared_ptr<PerfettoConsumer> consumer_;
+  PerfettoConsumer::Handle handle_;
+
+ public:
+  // Takes over ownership of the 'handle'.
+  //
+  // Consumer must not be null.
+  PerfettoConsumerHandle(std::shared_ptr<PerfettoConsumer> consumer,
+                         PerfettoConsumer::Handle handle)
+    : consumer_{std::move(consumer)},
+      handle_{std::move(handle)} {
+    DCHECK(consumer_ != nullptr);
+  }
+
+  std::shared_ptr<PerfettoConsumer> GetConsumer() const {
+    return consumer_;
+  }
+
+  PerfettoConsumer::Handle GetHandle() const {
+    return handle_;
+  }
+
+  ~PerfettoConsumerHandle() {
+    LOG(VERBOSE) << "PerfettoConsumerHandle::Destroy(" << handle_ << ")";
+    consumer_->Destroy(handle_);
+  }
+
+  bool operator==(const PerfettoConsumerHandle& other) const {
+    return handle_ == other.handle_ && consumer_ == other.consumer_;
+  }
+
+  bool operator!=(const PerfettoConsumerHandle& other) const {
+    return !(*this == other);
+  }
+};
+
+
+// Snapshot of a single perfetto OnStateChanged callback.
+//
+// Operate on the PerfettoConsumer to further change the state.
+//
+// The Handle is kept 'valid' until all references to the PerfettoConsumerHandle
+// are dropped to 0. This ensures the Handle is not destroyed too early. All
+// direct usages of 'Handle' must be scoped by the PerfettoConsumerHandle.
+struct PerfettoStateChange {
+ public:
+  using State = ::perfetto::consumer::State;
+  using Handle = ::perfetto::consumer::Handle;
+
+  State state;                                                           // Never invalid.
+  std::shared_ptr<PerfettoConsumerHandle> perfetto_consumer_and_handle;  // Never null.
+
+  // Safety: Use only within scope of the PerfettoStateChange.
+  Handle GetHandle() const {
+    // TODO: it would be even safer to wrap all the calls to the handle inside a class,
+    // instead of exposing this raw Handle.
+    return perfetto_consumer_and_handle->GetHandle();
+  }
+
+  std::shared_ptr<PerfettoConsumer> GetConsumer() const {
+    return perfetto_consumer_and_handle->GetConsumer();
+  }
+};
+
+std::ostream& operator<<(std::ostream& os, const PerfettoStateChange& state_change) {
+  os << "PerfettoStateChange{" << state_change.state << ","
+     << state_change.GetHandle() << ","
+     << state_change.GetConsumer().get() << "}";
+  return os;
+}
+
+// Once created, this acts as a hot observable, emitting 'PerfettoStateChange' transition items.
+// Only the 'state' will vary, the handle and perfetto_consumer are always the same value.
+//
+// Clients only need to handle the success states in #on_next, all failure states will go to
+// #on_error.
+//
+// Upon reaching the appropriate terminal states, either #on_completed or #on_error is called.
+// No future callbacks will then occur, so this object should be subsequently deleted.
+//
+// The Handle is destroyed automatically after the last item is emitted, so it must only be
+// manipulated from the #on_next callbacks. Do not save the Handle and use it at other times.
+class StateChangedSubject {
+ public:
+  using State = ::perfetto::consumer::State;
+  using Handle = ::perfetto::consumer::Handle;
+
+  StateChangedSubject(const ::perfetto::protos::TraceConfig& trace_config,
+                      rxcpp::subscriber<PerfettoStateChange> destination,
+                      std::shared_ptr<PerfettoConsumer> perfetto_consumer)
+    : deferred_start(trace_config.deferred_start()),
+      dest(std::move(destination)),
+      perfetto_consumer_(std::move(perfetto_consumer)) {
+    DCHECK(perfetto_consumer_ != nullptr);
+  }
+
+ private:
+  struct StateChangedError : public std::runtime_error {
+    explicit StateChangedError(const std::string& what_arg) : std::runtime_error(what_arg) {}
+  };
+
+  std::shared_ptr<PerfettoConsumerHandle> handle_;  // non-null after bound_ == true.
+  std::atomic<bool> bound_{false};  // synchronize-with for BindHandle -> OnStateChanged.
+
+  State last_state{State::kIdle};
+  bool deferred_start{false};
+
+  rxcpp::subscriber<PerfettoStateChange> dest;
+  std::shared_ptr<PerfettoConsumer> perfetto_consumer_;  // This is never null.
+
+  void DcheckBadStateTransition(State state, bool fail_unless = false) const {
+    DCHECK(fail_unless) << "Invalid state transition to " << state << " from " << last_state;
+  }
+
+  void DcheckValidStateTransition(State state) {
+    // State must not be out of range.
+    DCHECK_GE(state, State::kTraceFailed);
+    DCHECK_LE(state, State::kTraceEnded);
+
+    // Internal state that should never leak out into public perfetto API:
+    DCHECK_NE(state, State::kIdle);
+    // These can only be returned by PollState:
+    DCHECK_NE(state, State::kSessionNotFound);
+
+    // Validate state transitions as per the perfetto API contract.
+    // See the 'state diagram' in consumer_api.h
+    switch (last_state) {
+      case State::kTraceFailed:  // Final and unrecoverable.
+        // b/122548195: this can transition to 'kConnectionError' if selinux is disabled.
+        if (state == State::kConnectionError) {
+          LOG(WARNING) << "b/122548195: kTraceFailed is non-terminal, ignoring.";
+          // This is a bit awkward: rxcpp will drop the #on_error calls if its more than once.
+          break;
+        }
+        DcheckBadStateTransition(state);
+        break;
+      case State::kConnectionError:  // Final and unrecoverable.
+        DcheckBadStateTransition(state);
+        break;
+      case State::kSessionNotFound:
+        DcheckBadStateTransition(state);
+        break;
+      case State::kIdle:
+        // OK: we initialized our own state to idle prior to the first callback.
+        break;
+      case State::kConnecting:
+        switch (state) {
+          case State::kConfigured:
+            // kConfigured, if |deferred_start| == true in the trace config.
+            DcheckBadStateTransition(state, deferred_start);
+            break;
+          case State::kTracing:
+            // kTracing, if |deferred_start| == false.
+            DcheckBadStateTransition(state, !deferred_start);
+            break;
+          case State::kConnectionError:
+            // An error state, e.g. if cannot reach the traced daemon.
+            break;
+          default:
+            // Unconditionally invalid state transitions from kConnecting to anything else.
+            DcheckBadStateTransition(state);
+        }
+        break;
+      case State::kConfigured:
+        DCHECK(deferred_start);
+        if (state != State::kTracing  // OK: this is documented.
+            && state != State::kTraceFailed) {  // Undocumented selinux failure.
+            // Undocumented, but it appears to go directly from Configured->TraceEnded
+            // it can also go to kTraceFailed if e.g. there's an selinux violation
+            // however this appears to be underdocumented.
+            // b/122607276 #2
+
+          if (state != State::kTraceEnded) {  // b/122607276 #1
+            DcheckBadStateTransition(state);
+          }
+        }
+        break;
+      case State::kTracing:
+        switch (state) {
+          case State::kTraceEnded:
+            break;
+          case State::kTraceFailed:
+            break;
+          default:
+            DcheckBadStateTransition(state);
+        }
+        break;
+      case State::kTraceEnded:
+        // Cannot transition from terminal state to another state.
+        DcheckBadStateTransition(state);
+        break;
+
+      // default: This list is exhaustive
+    }
+  }
+
+  constexpr bool IsTerminalState() const {
+    switch (last_state) {
+      case State::kTraceFailed:
+      case State::kConnectionError:
+      case State::kTraceEnded:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  // Returns true for non-terminal states (i.e. this callback will be invoked again).
+  // Returns false otherwise.
+  bool OnStateChanged(Handle handle, State state) {
+    using namespace ::perfetto::consumer;
+
+    // Block until 'BoundHandle' is called by the other thread.
+    while (!bound_.load()) {}  // seq_cst acquire.
+
+    std::shared_ptr<PerfettoConsumerHandle> handle_ptr = handle_;
+    DCHECK(handle_ptr != nullptr);
+
+    DCHECK_EQ(handle_ptr->GetHandle(), handle);
+    DcheckValidStateTransition(state);
+
+    switch (state) {
+      // Error states (terminal).
+      case State::kTraceFailed:
+        EmitError("kTraceFailed");
+        break;
+      case State::kConnectionError:
+        EmitError("kConnectionError");
+        break;
+
+      // Regular transitions (non-terminal).
+      case State::kConnecting:
+      case State::kConfigured:
+      case State::kTracing:
+        EmitNext(state);
+        break;
+      // Regular transitions (terminal).
+      case State::kTraceEnded:  // XX: do we even need to emit the 'TraceEnded' state?
+        EmitNext(state);
+        dest.on_completed();
+        break;
+      default:
+        DcheckBadStateTransition(state);
+    }
+
+    bool force_non_terminal = false;
+
+    if (last_state == State::kConfigured &&  state == State::kConnectionError) {
+      // b/122548195: this can transition to 'kConnectionError' if selinux is disabled.
+      force_non_terminal = true;
+      // This function must 'return true' in this buggy case, otherwise we will
+      // call the destructor too early and subsequent callbacks will crash.
+    }
+
+    // Remember the state to validate prior state transitions.
+    last_state = state;
+
+    // The owner of this class should avoid leaking memory once we reach a terminal state.
+    return !IsTerminalState() || force_non_terminal;
+  }
+
+ public:
+  // Thread safety: Called by main thread, terminates the rx stream.
+  // When this function is invoked, no calls to this class from other threads can occur.
+  void OnCreateFailed() {
+    // returned when an invalid handle is passed to PollState().
+    last_state = State::kSessionNotFound;
+    EmitError("Create returned kInvalidHandle");
+  }
+
+  // Thread safety: Called by main thread, this could be concurrent to
+  // 'CallbackOnStateChanged'.
+  void BindHandle(const std::shared_ptr<PerfettoConsumerHandle>& handle) {
+    handle_ = handle;
+
+    // Unblock OnStateChanged.
+    bound_.store(true);  // seq_cst release.
+  }
+
+  // Thread safety: Called by libperfetto background thread (same one every time).
+  static void CallbackOnStateChanged(Handle handle, State state, void* callback_arg) {
+    LOG(VERBOSE) << "CallbackOnStateChanged(handle=" << handle << ",state=" << state
+                 << ",callback_arg=" << callback_arg << ")";
+
+    // Validate OnStateChanged callback invariants, guaranteed by libperfetto.
+    DCHECK_NE(handle, ::perfetto::consumer::kInvalidHandle);
+
+    // Note: Perfetto guarantees this callback always occurs on the same thread,
+    // so we don't need to do any extra thread synchronization here since we are only mutating
+    // StateChangedSubject from within this function.
+
+    // TODO: the memory ordering guarantees should be explicitly specified in consumer_api.h:
+    // This isn't specific enough:
+    // "The callback will be invoked on an internal thread and must not block."
+    // However looking at the implementation it posts onto a single-thread task runner,
+    // so this must be the case.
+
+    StateChangedSubject* state_subject = reinterpret_cast<StateChangedSubject*>(callback_arg);
+    // This current thread owns 'StateChangedSubject', no other threads must access it.
+    // Explicit synchronization is not necessary.
+
+    if (!state_subject->OnStateChanged(handle, state)) {
+      // Clean up the state tracker when we reach a terminal state.
+      // This means that no future callbacks will occur anymore.
+      delete state_subject;
+    }
+  }
+
+ private:
+  void EmitError(const std::string& msg) {
+    // Sidenote: Exact error class does not matter, rxcpp only lets us access the error
+    // as a string (rxcpp::util::what).
+    //
+    // Either way, the recovery strategy is identical (log then try and restart).
+    dest.on_error(rxcpp::util::make_error_ptr(StateChangedError{msg}));
+  }
+
+  void EmitNext(State state) {
+    if (WOULD_LOG(VERBOSE) && !dest.is_subscribed()) {
+      // This is purely for logging: #on_next already filters out items after unsubscription.
+      LOG(VERBOSE) << "StateChangedSubject#EmitNext(" << state << ") - drop due to unsubscribe";
+    }
+
+    auto handle_ptr = handle_;
+    DCHECK(handle_ptr != nullptr);
+
+    // Non-null guarantee for the items emitted into this stream.
+    PerfettoStateChange state_change{state, handle_ptr};
+    dest.on_next(std::move(state_change));
+  }
+
+  // TODO: inherit from rx subject and handle #unsubscribe explicitly, instead
+  // of just being subject-like?
+};
+
+// Note: The states will be emitted on a separate thread, so e.g. #as_blocking()
+// needs to be used to avoid dropping everything on the floor.
+//
+// Important: The #on_error case must be handled explicitly by the observable,
+// because the default behavior is to 'throw' which will cause an std::terminate with -fno-except.
+static auto /*[observable<State>, shared_ptr<PerfettoConsumerHandle>]*/
+    CreatePerfettoStateStream(::perfetto::protos::TraceConfig perfetto_config,
+                              std::shared_ptr<PerfettoConsumer> perfetto_consumer) {
+  auto obs = rxcpp::observable<>::create<PerfettoStateChange>(
+    [perfetto_config = std::move(perfetto_config), perfetto_consumer = std::move(perfetto_consumer)]
+        (rxcpp::subscriber<PerfettoStateChange> subscriber) {
+      std::unique_ptr<StateChangedSubject> state_subject{
+          new StateChangedSubject{perfetto_config, subscriber, perfetto_consumer}};
+
+      // Perfetto API requires a pointer to a serialized protobuf, it doesn't accept
+      // the code-generated object.
+      std::string perfetto_config_str = perfetto_config.SerializeAsString();
+
+      ::perfetto::consumer::Handle handle =
+          perfetto_consumer->Create(perfetto_config_str.data(),
+                                    perfetto_config_str.size(),
+                                    // executes on the same background thread repeatedly.
+                                    &StateChangedSubject::CallbackOnStateChanged,
+                                    // inter-thread-move
+                                    reinterpret_cast<void*>(state_subject.get()));
+      // perfetto::consumer::Create synchronizes-with OnStateChanged callback, this means
+      // we don't need to explicitly synchronize state_subject here so long as we don't access
+      // it on this thread again.
+      LOG(DEBUG) << "Create Perfetto handle " << handle;
+
+      if (handle == ::perfetto::consumer::kInvalidHandle) {
+        LOG(ERROR) << "Failed to create Perfetto handle";
+        // No callbacks will occur, so our thread still owns the state subject.
+        state_subject->OnCreateFailed();
+        return;
+      }
+
+      std::shared_ptr<PerfettoConsumerHandle> safe_handle{
+          new PerfettoConsumerHandle{perfetto_consumer, handle}};
+
+      // Share ownership of the Handle with the StateSubject.
+      // This way we defer calling 'Destroy' until the callback reaches a terminal state
+      // *and* all users of the stream are done with the handle.
+      state_subject->BindHandle(safe_handle);
+
+      // state_subject ownership is taken over by OnStateChanged.
+      // It will also be touched in a separate thread, so we must never access it here again.
+      state_subject.release();
+
+      // 'subscriber#add' is actually a call to register an on_unsubscribe listener.
+      subscriber.add([safe_handle]() {
+        LOG(VERBOSE) << "PerfettoStateChange#unsubscribe";
+
+        // Release our ref-count to the handle.
+        // safe_handle.reset();  // This happens implicitly.
+
+        // TODO: I think this won't handle the case where we need to shut down early.
+        // Need to use the explicit kShutdown for that?
+      });
+
+      // TODO: this would be an excellent place to shuffle the perfetto config protobuf
+      // into a global debug state for dumpsys.
+    });
+
+  return obs;
+}
+
+template <typename T>
+bool BinaryWireProtobuf<T>::WriteFullyToFile(const std::string& path,
+                                             bool follow_symlinks) const {
+  // TODO: it would be great if android::base had a string_view overload to avoid copying
+  // data into an std::string.
+
+  // u  g  o
+  // rw-rw----
+  //
+  // Protobufs can be read/written but not executed.
+  static constexpr const mode_t kMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
+
+  int flags =
+      O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY | (follow_symlinks ? 0 : O_NOFOLLOW);
+  android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(path.c_str(), flags, kMode)));
+
+  if (fd == -1) {
+    PLOG(ERROR) << "BinaryWireProtobuf::WriteFullyToFile open failed";
+    return false;
+  }
+
+  if (!::android::base::WriteFully(fd, data_.data(), size())) {
+    PLOG(ERROR) << "BinaryWireProtobuf::WriteFullyToFile write failed";
+    return CleanUpAfterFailedWrite(path);
+  }
+
+  return true;
+}
+
+template <typename T>
+bool BinaryWireProtobuf<T>::CleanUpAfterFailedWrite(const std::string& path) {
+  // Something went wrong. Let's not leave a corrupt file lying around.
+  int saved_errno = errno;
+  unlink(path.c_str());
+  errno = saved_errno;
+  return false;
+}
+
+template <typename T>
+bool BinaryWireProtobuf<T>::WriteStringToFd(int fd) const {
+  const char* p = reinterpret_cast<const char*>(data_.data());
+  size_t left = size();
+  while (left > 0) {
+    ssize_t n = TEMP_FAILURE_RETRY(write(fd, p, left));
+    if (n == -1) {
+      return false;
+    }
+    p += n;
+    left -= n;
+  }
+  return true;
+}
+
+// explicit template instantiation.
+template struct BinaryWireProtobuf<::google::protobuf::MessageLite>;
+// TODO: refactor this not to need the template instantiation.
+
+#if defined(__ANDROID__)
+// Copy of the 2.6.18 kernel header (linux/ioprio.h)
+
+#define IOPRIO_WHO_PROCESS (1)
+#define IOPRIO_CLASS_IDLE (3)
+
+#define IOPRIO_BITS		(16)
+#define IOPRIO_CLASS_SHIFT	(13)
+#define IOPRIO_PRIO_MASK	((1UL << IOPRIO_CLASS_SHIFT) - 1)
+
+#define IOPRIO_PRIO_CLASS(mask)	((mask) >> IOPRIO_CLASS_SHIFT)
+#define IOPRIO_PRIO_DATA(mask)	((mask) & IOPRIO_PRIO_MASK)
+#define IOPRIO_PRIO_VALUE(class, data)	(((class) << IOPRIO_CLASS_SHIFT) | data)
+#endif
+
+static int ioprio_get(int which, int who) {
+  return syscall(SYS_ioprio_get, which, who);
+}
+
+static int ioprio_set(int which, int who, int ioprio) {
+  return syscall(SYS_ioprio_set, which, who, ioprio);
+}
+
+// An rx Coordination, which will cause a new thread to spawn for each new Worker.
+//
+// Idle-class priority is set for the CPU and IO priorities on the new thread.
+rxcpp::observe_on_one_worker ObserveOnNewIoThread() {
+  // IO thread factory for idle-priority threads.
+  // Both the CPU scheduler and the IO scheduler are set to idle.
+  //
+  // Use this when needing to schedule disk access from a normal-priority thread onto a
+  // very low priority thread, but not so low that we need to use a BackgroundJobScheduler.
+  struct io_thread_factory {
+    std::thread operator()(std::function<void()> start) const {
+      return std::thread{
+        [start=std::move(start)]() {
+          // Set IO priority to idle.
+          do {
+            int value = ioprio_get(IOPRIO_WHO_PROCESS, /*pid*/0);
+            if (value == -1) {
+              PLOG(ERROR) << "io_thread_factory failed ioprio_get";
+              break;  // Can't set the ioprio, we don't know what data to use.
+            }
+
+            int data = IOPRIO_PRIO_DATA(value); // priority level
+            // This appears to be '4' in practice. We may want to raise to
+            // be the highest-priority within the idle class.
+
+            // idle scheduling class. only access disk when nobody else needs disk.
+            int res = ioprio_set(IOPRIO_WHO_PROCESS,
+                                 /*pid*/0,
+                                 IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, data));
+            if (res < 0) {
+              PLOG(ERROR) << "io_thread_factory failed ioprio_set";
+              break;
+            }
+
+            // Changing the IO priority only has any effect with cfq scheduler:
+            // $> cat /sys/block/sda/queue/scheduler
+            LOG(VERBOSE) << "ioprio_set(WHO_PROCESS, class=IDLE, data=" << data << ")";
+          } while (false);
+
+          // Set CPU priority to idle.
+          do {
+            struct sched_param param{};
+            param.sched_priority = 0;  // Required to be statically 0 when used with SCHED_IDLE.
+
+            if (sched_setscheduler(/*pid*/0,  // current thread,
+                                   SCHED_IDLE,
+                                   /*in*/&param) != 0) {
+              PLOG(ERROR) << "io_thread_factory failed sched_setscheduler";
+              break;
+            }
+
+            LOG(VERBOSE) << "sched_setscheduler(self, IDLE)";
+          } while (false);
+
+          // XX: if changing the scheduling is too aggressive (i.e. it causes starvation),
+          // we may want to stick with the default class and change the nice (priority) levels
+          // to the minimum.
+
+          // TODO: future work, maybe use cgroups configuration file instead?
+
+          // Call the rxcpp-supplied code.
+          start();
+        }
+      };
+    }
+  };
+
+  static rxcpp::schedulers::scheduler thread_scheduler =
+      rxcpp::schedulers::make_new_thread(io_thread_factory{});
+
+  static rxcpp::observe_on_one_worker observe_on_io_thread{thread_scheduler};
+
+  return observe_on_io_thread;
+}
+
+static auto/*observable<PerfettoTraceProto>*/
+    CreatePerfettoStream(rxcpp::observable<PerfettoStreamCommand> input,
+                         std::shared_ptr<PerfettoConsumer> perfetto_consumer,
+                         const ::perfetto::protos::TraceConfig& trace_config) {
+        // XX: should I also take a scheduler for input here???
+
+  auto /*observable<PerfettoStateChange>*/ perfetto_states =
+    CreatePerfettoStateStream(trace_config, perfetto_consumer);
+
+  using State = ::perfetto::consumer::State;
+
+  auto/*coordinator*/ serialize_coordinator = rxcpp::observe_on_new_thread();
+  // Rx note:
+  // The optimal thing to do would be to have a lock/unlock for an entire subset of a chain.
+  // This would avoid creating new threads, and could also be used to intentionally block
+  // the regular C-callback perfetto thread.
+  //
+  // It seems possible to create a coordinator to lock a single operator in a chain, but this
+  // appears to be unsound. In particular, it doesn't even make life any simpler below because
+  // it would only apply the synchronization to 'zip' but not 'flat_map' which is unsound.
+  //
+  // There is also the built-in 'serialize_new_thread' which seems to create a new thread but
+  // then never actually uses it, that seems unfortunate and wasteful.
+  //
+  // Instead, do the simple thing which is create a new thread and always queue on there.
+  // Execution an action on that worker is itself unsynchronized, but this doesn't matter since
+  // the worker is only backed by 1 thread (no 2 schedulables can be executed concurrently
+  // on the 'observe_new_thread' worker).
+  return input
+    .tap([](PerfettoStreamCommand command) {
+           LOG(VERBOSE) << "CreatePerfettoStreamCommand#tap(command=" << command << ")";
+         })
+    // Input A, thread tA. Input B, thread tB. Continue execution with (A,B) on thread tC.
+    .zip(serialize_coordinator,  // rest of chain is also executed on the same thread.
+         perfetto_states)
+    // Note: zip terminates when either of the streams complete.
+    .flat_map(
+         [](std::tuple<PerfettoStreamCommand, PerfettoStateChange> p) {
+           auto& [command, state_change] = p;
+           LOG(VERBOSE) << "CreatePerfettoStream#combine("
+                        << command << "," << state_change << ")";
+           if (command == PerfettoStreamCommand::kShutdown) {
+             // Perfetto: Always safe to call ::perfetto::consumer::Destroy
+             // at any time.
+             //
+             // XX: How do we clean up the StateChangedSubject without racing
+             // against the callback? It strikes me that we may need a 'kDestroyed'
+             // state that perfetto can transition to from kConfigured.
+             LOG(VERBOSE) << "Call Perfetto_Consumer->Destroy";
+             state_change.GetConsumer()->Destroy(state_change.GetHandle());
+
+             // XX: Do we even have any guarantees about not getting more callbacks?
+             // We could just say 'there can still be spurious output after Shutdown'
+             // and just ignore it (e.g. Shutdown and immediately unsubscribe).
+           } else if (command == PerfettoStreamCommand::kStartTracing
+                          && state_change.state == State::kConfigured) {
+             LOG(VERBOSE) << "Call Perfetto_Consumer->StartTracing";
+             state_change.GetConsumer()->StartTracing(state_change.GetHandle());
+           } else if (command == PerfettoStreamCommand::kStopTracing &&
+                          state_change.state == State::kTraceEnded) {
+             // TODO: if perfetto actually had a 'StopTracing' we could call that here.
+             // right now we just pretend it exists, but rely on the config timer instead.
+             ::perfetto::consumer::TraceBuffer trace_buffer =
+                 state_change.GetConsumer()->ReadTrace(state_change.GetHandle());
+
+             LOG(VERBOSE) << "Perfetto Trace ended"
+                          << ", addr=" << reinterpret_cast<void*>(trace_buffer.begin)
+                          << ",size= " << trace_buffer.size;
+
+             PerfettoTraceProto wire_proto{trace_buffer.begin, trace_buffer.size};
+             return rxcpp::observable<>::just(std::move(wire_proto)).as_dynamic();
+           }
+           return rxcpp::observable<>::empty<PerfettoTraceProto>().as_dynamic();
+         }
+    );
+}
+
+std::ostream& operator<<(std::ostream& os, PerfettoStreamCommand c) {
+  switch (c) {
+    case PerfettoStreamCommand::kStartTracing:
+      os << "kStartTracing";
+      break;
+    case PerfettoStreamCommand::kStopTracing:
+      os << "kStopTracing";
+      break;
+    case PerfettoStreamCommand::kShutdown:
+      os << "kShutdown";
+      break;
+    default:
+      os << "(unknown)";
+      break;
+  }
+  return os;
+}
+
+RxProducerFactory::RxProducerFactory(PerfettoDependencies::Injector& injector)
+  : injector_(injector) {
+}
+
+// TODO: (fruit) maybe this could be streamlined further by avoiding this boilerplate?
+rxcpp::observable<PerfettoTraceProto> RxProducerFactory::CreateTraceStream(
+    rxcpp::observable<PerfettoStreamCommand> commands) {
+  std::shared_ptr<PerfettoConsumer> perfetto_consumer =
+      injector_.get<std::shared_ptr<PerfettoConsumer>>();
+  const ::perfetto::protos::TraceConfig& trace_config =
+      injector_.get<::perfetto::protos::TraceConfig>();
+
+  DCHECK(perfetto_consumer != nullptr);
+  DCHECK(reinterpret_cast<volatile const void*>(&trace_config) != nullptr);
+
+  return CreatePerfettoStream(commands,
+                              perfetto_consumer,
+                              trace_config);
+}
+
+// For testing/debugging only.
+//
+// Saves protobuf results in file name specified by 'arg_output_proto'.
+void CollectPerfettoTraceBufferImmediately(
+    RxProducerFactory& producer_factory,
+    const std::string& arg_output_proto) {
+  LOG(VERBOSE) << "CollectPerfettoTraceBufferImmediately";
+
+  std::shared_ptr<PerfettoConsumer> perfetto_consumer =
+      producer_factory.injector_.get<std::shared_ptr<PerfettoConsumer>>();
+  const ::perfetto::protos::TraceConfig& trace_config =
+      producer_factory.injector_.get<const ::perfetto::protos::TraceConfig&>();
+
+  auto /*observable<PerfettoStateChange>*/ perfetto_states =
+    CreatePerfettoStateStream(trace_config, perfetto_consumer);
+
+  perfetto_states
+    .as_blocking()  // Wait for observable to terminate with on_completed or on_error.
+    .subscribe(/*on_next*/[&](auto state_change) {
+       LOG(VERBOSE) << "Perfetto post-processed State change: " << state_change;
+
+       using State = ::perfetto::consumer::State;
+       switch (state_change.state) {
+         case State::kConnecting:
+           LOG(VERBOSE) << "Perfetto Tracing is Connecting";
+           // Transitional state. No-op.
+           break;
+         case State::kConfigured:
+           state_change.GetConsumer()->StartTracing(state_change.GetHandle());
+           break;
+         case State::kTracing:
+           LOG(VERBOSE) << "Perfetto Tracing started";
+           // Transitional state. No-op.
+           break;
+         case State::kTraceEnded: {
+           ::perfetto::consumer::TraceBuffer trace_buffer =
+             state_change.GetConsumer()->ReadTrace(state_change.GetHandle());
+
+           LOG(VERBOSE) << "Perfetto Trace ended"
+                        << ", addr=" << reinterpret_cast<void*>(trace_buffer.begin)
+                        << ",size= " << trace_buffer.size;
+
+           if (!arg_output_proto.empty()) {
+             std::string trace_buffer_str;
+             trace_buffer_str.resize(trace_buffer.size);
+             std::copy(trace_buffer.begin,
+                       trace_buffer.begin + trace_buffer.size,
+                       trace_buffer_str.data());
+             if (!android::base::WriteStringToFile(trace_buffer_str, arg_output_proto)) {
+               LOG(ERROR) << "Failed to save TraceBuffer to " << arg_output_proto;
+             } else {
+               LOG(INFO) << "TraceBuffer saved to file: " << arg_output_proto;
+               LOG(INFO);
+               LOG(INFO) << "To print this in a human readable form, execute these commands:";
+               LOG(INFO) << "$> adb pull '" << arg_output_proto << "'";
+               LOG(INFO) << "$> trace_to_text systrace <filename.pb>";
+             }
+           }
+
+           // TODO: something more useful with this TraceBuffer, such as saving it to a file
+           // and printing the output.
+           break;
+         }
+         default:
+           // No other states are possible, because they go to #on_error or cause a dcheck.
+           DCHECK(false) << "Invalid state: " << state_change;
+       }
+
+       //INTENTIONAL_COMPILER_ERROR_HERE // lets make sure this code actually does a trace.
+
+     }, /*on_error*/[](rxcpp::util::error_ptr err) {
+       LOG(ERROR) << "Perfetto post-processed state change failed: " << rxcpp::util::what(err);
+     }, /*on_completed*/[]() {
+       LOG(VERBOSE) << "Perfetto post-processed State #on_completed";
+     });
+}
+
+
+}  // namespace iorap::perfetto
diff --git a/src/perfetto/rx_producer.h b/src/perfetto/rx_producer.h
new file mode 100644
index 0000000..f4c40b4
--- /dev/null
+++ b/src/perfetto/rx_producer.h
@@ -0,0 +1,165 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_PERFETTO_RX_PRODUCER_H_
+#define IORAP_SRC_PERFETTO_RX_PRODUCER_H_
+
+#include "perfetto/perfetto_consumer.h"       // libiorap
+
+#include <perfetto/config/trace_config.pb.h>  // libperfetto
+#include <rxcpp/rx.hpp>
+
+#include <iosfwd>
+#include <functional>
+#include <optional>
+#include <vector>
+
+namespace iorap::perfetto {
+
+struct PerfettoDependencies {
+  using Component =
+      fruit::Component<PerfettoConsumer, ::perfetto::protos::TraceConfig>;
+  using Injector =
+      fruit::Injector<PerfettoConsumer, ::perfetto::protos::TraceConfig>;
+  using NormalizedComponent =
+      fruit::NormalizedComponent<PerfettoConsumer, ::perfetto::protos::TraceConfig>;
+
+  // Create a 'live' component that will talk to perfetto via traced.
+  static Component CreateComponent(/*TODO: config params*/);
+
+  // Create perfetto.protos.TraceConfig , serialized as a (machine-readable) string.
+  //
+  // The following ftrace events are enabled:
+  // * mm_filemap_add_to_page_cache
+  // * mm_filemap_delete_from_page_cache
+  //
+  // If deferred starting is also enabled, no tracing will begin until
+  // ::perfetto::consumer::StartTracing is invoked.
+  static ::perfetto::protos::TraceConfig CreateConfig(uint32_t duration_ms,
+                                                      bool deferred_start = true,
+                                                      uint32_t buffer_size = 4096);
+};
+
+// This acts as a lightweight type marker so that we know what data has actually
+// encoded under the hood.
+template <typename T>
+struct BinaryWireProtobuf {
+  std::vector<std::byte>& data() {
+    return data_;
+  }
+
+  const std::vector<std::byte>& data() const {
+    return data_;
+  }
+
+  size_t size() const {
+    return data_.size();
+  }
+
+  explicit BinaryWireProtobuf(char* data, size_t size)
+    : BinaryWireProtobuf(reinterpret_cast<std::byte*>(data), size) {
+  }
+
+  explicit BinaryWireProtobuf(std::byte* data, size_t size) {
+    data_.resize(size);
+    std::copy(data,
+              data + size,
+              data_.data());
+  }
+
+  // Important: Deserialization could fail, for example data is truncated or
+  // some minor disc corruption occurred.
+  template <typename U>
+  std::optional<U> MaybeUnserialize() {
+    U unencoded;
+
+    if (!unencoded.ParseFromArray(data_.data(), data_.size())) {
+      return std::nullopt;
+    }
+
+    return {std::move(unencoded)};
+  }
+
+  bool WriteFullyToFile(const std::string& path,
+                        bool follow_symlinks = false) const;
+
+ private:
+  static bool CleanUpAfterFailedWrite(const std::string& path);
+  bool WriteStringToFd(int fd) const;
+
+  std::vector<std::byte> data_;
+};
+
+//using PerfettoTraceProto = BinaryWireProtobuf<::perfetto::protos::Trace>;
+using PerfettoTraceProto = BinaryWireProtobuf<::google::protobuf::MessageLite>;
+
+enum class PerfettoStreamCommand {
+  kStartTracing, // -> () | on_error
+  kStopTracing,  // -> on_next(PerfettoTraceProto) | on_error
+  kShutdown,     // -> on_completed | on_error
+  // XX: should shutdown be converted to use the rx suscriber#unsubscribe instead?
+};
+
+std::ostream& operator<<(std::ostream& os, PerfettoStreamCommand c);
+
+struct RxProducerFactory {
+  // Passing anything by value leads to a lot of pain and headache.
+  // Pass in the injector by reference because nothing else seems to work.
+  explicit RxProducerFactory(PerfettoDependencies::Injector& injector);
+
+  // Create a one-shot perfetto observable that will begin
+  // asynchronously producing a PerfettoTraceProto after the 'kStartTracing'
+  // command is observed.
+  //
+  // libperfetto is immediately primed (i.e. connected in a deferred state)
+  // upon calling this function, to reduce the latency of 'kStartTracing'.
+  //
+  // To finish the trace, push 'kStopTracing'. To cancel or tear down at any
+  // time, push 'kShutdown'.
+  //
+  // The TraceProto may come out at any time after 'kStartTracing',
+  // this is controlled by duration_ms in the TraceConfig.
+  //
+  // TODO: libperfetto should actually stop tracing when we ask it to,
+  // instead of using a hardcoded time.
+  //
+  // The observable may go into #on_error at any time, if the underlying
+  // libperfetto states transition to a failing state.
+  // This usually means the OS is not configured correctly.
+  rxcpp::observable<PerfettoTraceProto> CreateTraceStream(
+      rxcpp::observable<PerfettoStreamCommand> commands);
+
+  // TODO: is this refactor-able into a subscriber factory that takes
+  // the commands-observable as a parameter?
+
+  // TODO: infinite perfetto stream.
+
+ private:
+  // XX: why doesn't this just let me pass in a regular Component?
+  PerfettoDependencies::Injector& injector_;
+
+  friend void CollectPerfettoTraceBufferImmediately(
+      RxProducerFactory& producer_factory,
+      const std::string& arg_output_proto);
+};
+
+// An rx Coordination, which will cause a new thread to spawn for each new Worker.
+//
+// Idle-class priority is set for the CPU and IO priorities on the new thread.
+//
+// TODO: move to separate file
+rxcpp::observe_on_one_worker ObserveOnNewIoThread();
+
+}  // namespace iorap::perfetto
+#endif  // IORAP_SRC_PERFETTO_RX_PRODUCER_H_
diff --git a/tests/src/binder/app_launch_event_test.cc b/tests/src/binder/app_launch_event_test.cc
new file mode 100644
index 0000000..1d19bb1
--- /dev/null
+++ b/tests/src/binder/app_launch_event_test.cc
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/app_launch_event.h>
+
+#include <gtest/gtest.h>
+
+// TODO: move to app_launch_event.h
+#include <google/protobuf/util/message_differencer.h>
+
+using namespace iorap::binder;  // NOLINT
+
+using android::Parcel;
+
+using Type = AppLaunchEvent::Type;
+using Temperature = AppLaunchEvent::Temperature;
+
+namespace iorap::binder {
+
+inline bool ProtosEqual(const ::google::protobuf::Message& lhs,
+                        const ::google::protobuf::Message& rhs) {
+  return ::google::protobuf::util::MessageDifferencer::Equals(lhs, rhs);
+}
+
+inline bool ProtosEqual(const ::google::protobuf::MessageLite& lhs,
+                        const ::google::protobuf::MessageLite& rhs) {
+  // MessageLite does not support 'MessageDifferencer' which requires protobuf-full
+  // because it uses reflection.
+  //
+  // Serialize as a string and compare. This may lead to false inequality when protobufs
+  // are actually the same but their encodings are slightly different.
+  return lhs.GetTypeName() == rhs.GetTypeName()
+      && lhs.SerializeAsString() == rhs.SerializeAsString();
+}
+
+template <typename T>
+inline bool ProtoPointersEqual(const T& lhs_ptr, const T& rhs_ptr) {
+  if (lhs_ptr == nullptr && rhs_ptr == nullptr) {
+    return true;
+  }
+  else if (lhs_ptr != nullptr && rhs_ptr != nullptr) {
+    return ProtosEqual(*lhs_ptr, *rhs_ptr);
+  }
+  return false;
+}
+
+// Field-by-field equality.
+// Protos are compared according by checking that their serialized encodings are the same.
+inline bool operator==(const AppLaunchEvent& lhs, const AppLaunchEvent& rhs) {
+# define EQ_OR_RETURN(l, r, val) if (!(l.val == r.val)) { return false; }
+# define PROTO_EQ_OR_RETURN(l, r, val) if (!ProtoPointersEqual(l.val, r.val)) { return false; }
+
+  EQ_OR_RETURN(lhs, rhs, type);
+  EQ_OR_RETURN(lhs, rhs, sequence_id);
+  PROTO_EQ_OR_RETURN(lhs, rhs, intent_proto);
+  EQ_OR_RETURN(lhs, rhs, temperature);
+  PROTO_EQ_OR_RETURN(lhs, rhs, activity_record_proto);
+
+# undef EQ_OR_RETURN
+# undef PROTO_EQ_OR_RETURN
+
+  return true;
+}
+
+inline bool operator!=(const AppLaunchEvent& lhs, const AppLaunchEvent& rhs) {
+  return !(lhs == rhs);
+}
+
+static AppLaunchEvent MakeIntentStarted(int64_t sequence_id,
+                                            // non-null
+                                            std::unique_ptr<IntentProto> intent_proto) {
+  DCHECK(intent_proto != nullptr);
+
+  AppLaunchEvent e{Type::kIntentStarted, sequence_id, std::move(intent_proto)};
+  return e;
+}
+
+static AppLaunchEvent MakeIntentFailed(int64_t sequence_id) {
+  AppLaunchEvent e{Type::kIntentFailed, sequence_id};
+  return e;
+}
+
+static AppLaunchEvent
+MakeActivityLaunched(int64_t sequence_id,
+                     Temperature temperature,
+                     // non-null
+                     std::unique_ptr<ActivityRecordProto> activity_record_proto) {
+  DCHECK(activity_record_proto != nullptr);
+
+  AppLaunchEvent e{Type::kActivityLaunched,
+                   sequence_id,
+                   /*intent_proto*/nullptr,
+                   temperature,
+                   std::move(activity_record_proto)};
+  return e;
+}
+
+static AppLaunchEvent
+MakeActivityLaunchCancelled(int64_t sequence_id,
+                            // nullable
+                            std::unique_ptr<ActivityRecordProto> activity_record_proto = nullptr) {
+  AppLaunchEvent e{Type::kActivityLaunchCancelled,
+                   sequence_id,
+                   /*intent_proto*/nullptr,
+                   Temperature::kUninitialized,
+                   std::move(activity_record_proto)};
+  return e;
+}
+
+static AppLaunchEvent
+MakeActivityLaunchFinished(int64_t sequence_id,
+                           // non-null
+                           std::unique_ptr<ActivityRecordProto> activity_record_proto) {
+  DCHECK(activity_record_proto != nullptr);
+  AppLaunchEvent e{Type::kActivityLaunchFinished,
+                   sequence_id,
+                   /*intent_proto*/nullptr,
+                   Temperature::kUninitialized,
+                   std::move(activity_record_proto)};
+  return e;
+}
+
+}  // namespace iorap::binder
+
+auto MakeDummyIntent(std::string action = "package_name/.ClassName") {
+  std::unique_ptr<IntentProto> dummy_intent{new IntentProto{}};
+  dummy_intent->set_action(action);
+  return dummy_intent;
+}
+
+auto MakeDummyActivityRecord(std::string title = "package_name/.ClassName") {
+  std::unique_ptr<ActivityRecordProto> dummy{new ActivityRecordProto{}};
+
+  dummy->mutable_identifier()->set_title(title);
+
+  return dummy;
+}
+
+TEST(AppLaunchEventTest, Equals) {
+  EXPECT_EQ(MakeIntentStarted(456, MakeDummyIntent()), MakeIntentStarted(456, MakeDummyIntent()));
+  EXPECT_NE(MakeIntentStarted(45, MakeDummyIntent()), MakeIntentStarted(45, MakeDummyIntent("a")));
+
+  EXPECT_EQ(MakeIntentFailed(123), MakeIntentFailed(123));
+  EXPECT_NE(MakeIntentFailed(0), MakeIntentFailed(123));
+
+  EXPECT_EQ((MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord())),
+            (MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord())));
+  EXPECT_NE((MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord())),
+            (MakeActivityLaunched(3, Temperature::kCold, MakeDummyActivityRecord())));
+  EXPECT_NE((MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord())),
+            (MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord("other title"))));
+
+  EXPECT_EQ((MakeActivityLaunchCancelled(4)),
+            (MakeActivityLaunchCancelled(4)));
+  EXPECT_EQ((MakeActivityLaunchCancelled(4, MakeDummyActivityRecord())),
+            (MakeActivityLaunchCancelled(4, MakeDummyActivityRecord())));
+  EXPECT_NE((MakeActivityLaunchCancelled(4, MakeDummyActivityRecord())),
+            (MakeActivityLaunchCancelled(4, MakeDummyActivityRecord("other"))));
+  EXPECT_NE((MakeActivityLaunchCancelled(4, MakeDummyActivityRecord())),
+            (MakeActivityLaunchCancelled(4)));
+
+  EXPECT_EQ((MakeActivityLaunchFinished(5, MakeDummyActivityRecord())),
+            (MakeActivityLaunchFinished(5, MakeDummyActivityRecord())));
+  EXPECT_NE((MakeActivityLaunchFinished(5, MakeDummyActivityRecord())),
+            (MakeActivityLaunchFinished(5, MakeDummyActivityRecord("other title"))));
+}
+
+template <typename T>
+T ValueParcelRoundTrip(const T& value) {
+  ::android::Parcel p;
+  CHECK_EQ(value.writeToParcel(&p), ::android::NO_ERROR);
+
+  T new_value;
+  p.setDataPosition(0);
+  CHECK_EQ(new_value.readFromParcel(&p), ::android::NO_ERROR);
+
+  return new_value;
+}
+
+#define EXPECT_PARCELING_ROUND_TRIP(a) EXPECT_EQ((a), ValueParcelRoundTrip((a)))
+
+TEST(AppLaunchEventTest, ParcelingRoundTrip) {
+  EXPECT_PARCELING_ROUND_TRIP(MakeIntentStarted(456, MakeDummyIntent()));
+  EXPECT_PARCELING_ROUND_TRIP(MakeIntentFailed(123));
+  EXPECT_PARCELING_ROUND_TRIP(MakeActivityLaunched(3, Temperature::kHot, MakeDummyActivityRecord()));
+  EXPECT_PARCELING_ROUND_TRIP(MakeActivityLaunchCancelled(4));
+  EXPECT_PARCELING_ROUND_TRIP(MakeActivityLaunchCancelled(4, MakeDummyActivityRecord()));
+  EXPECT_PARCELING_ROUND_TRIP(MakeActivityLaunchFinished(5, MakeDummyActivityRecord()));
+}
diff --git a/tests/src/inode2filename/search_directories_test.cc b/tests/src/inode2filename/search_directories_test.cc
new file mode 100644
index 0000000..d9903d6
--- /dev/null
+++ b/tests/src/inode2filename/search_directories_test.cc
@@ -0,0 +1,2819 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "inode2filename/search_directories.h"
+#include "inode2filename/system_call.h"
+
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+
+#include <fruit/fruit.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <optional>
+
+#include <sys/sysmacros.h>
+
+
+// Set this to 1 when debugging by hand to get more output.
+// Otherwise the spam might be too much when most tests are failing.
+#define LOG_WITH_VERBOSE 0
+// Set this to 1 when debugging by hand to have the logging output go to stderr.
+// TODO: I think the automated test bots have problems capturing non-logcat output.
+#define LOG_TO_STDERR 1
+
+// TODO: Might be nice to have these controlled by command line.
+
+using namespace std::literals::string_literals;  // NOLINT
+using namespace std::literals::string_view_literals;  // NOLINT
+using namespace iorap::inode2filename;  // NOLINT
+using namespace testing;  // NOLINT
+
+static void ConfigureLogging() {
+  if (LOG_TO_STDERR) {
+    ::android::base::SetLogger(::android::base::StderrLogger);
+  }
+  if (LOG_WITH_VERBOSE) {
+    ::android::base::SetMinimumLogSeverity(::android::base::VERBOSE);
+  } else {
+    ::android::base::SetMinimumLogSeverity(::android::base::DEBUG);
+  }
+}
+
+// Iterate substrings in 'what' that are separated by 'separator'.
+// Should be similar to the python 'str.split' behavior.
+//
+// Empty separators will have 0 iterations.
+//
+// NOTE: this could end up returning empty strings, e.g. '/'.split('/') -> ('', '')
+// Think of it more like splitting on "$/^" except the $ and ^ become empty strings in the end.
+//
+// Zero-copy guarantee (and no dynamic allocation).
+struct StringSplit {
+  struct SplitIterable;
+
+  // Return a 0-length substring whose address range is one past the end of 'what'.
+  // Logically equivalent to a "", but its real address will be within 'what'.
+  //
+  // Repeatedly applying this function on itself will return the same value.
+  //
+  // Do not use operator[] on the returned substring, as that would cause undefined
+  // behavior.
+  //
+  // To safely access the pointer, use #data(). The pointer must not be dereferenced,
+  // which would cause undefined behavior.
+  static constexpr std::string_view EmptySubstringAtEnd(std::string_view what) {
+    return what.substr(/*pos*/what.size(), /*count*/0);
+  }
+
+  // Create an Iterable that will iterate over substrings in 'what' separated by 'separator'.
+  //
+  // Each such 'value' emitted is guaranteed to be:
+  //  - a substring of 'what'
+  //  - not have any 'separator' substrings
+  //  - the address range of 'value' is within the address range of 'what' (or one-past-the-end)
+  //
+  // For example:
+  //
+  //   for (std::string_view substr : StringSplit("hello/world"sv, "/"sv)) {
+  //     ... // loop 0: substr == "hello"
+  //     ... // loop 1: substr == "world"
+  //   }
+  static constexpr SplitIterable Iterable(std::string_view what,
+                                          std::string_view separator) {
+    return SplitIterable{what, separator};
+  }
+
+  // Implement LegacyForwardIterator concept.
+  struct SplitIterator {
+    using value_type = std::string_view;
+    using reference = value_type&;
+    using pointer = value_type*;
+    using iterator_category = std::forward_iterator_tag;
+    using difference_type = std::ptrdiff_t;  // required by concept, but its meaningless.
+
+    constexpr bool operator==(const SplitIterator& other) const {
+      if (state != other.state) {
+        return false;
+      }
+      switch (state) {
+        case kNormal:
+        case kNearEnd:
+          return current_split.data() == other.current_split.data();
+        case kAtEnd:
+          return true;
+      }
+    }
+
+    constexpr bool operator!=(const SplitIterator& other) const {
+      return !(*this == other);
+    }
+
+    constexpr std::string_view& operator*() {
+        DCHECK(state != kAtEnd) << "Undefined behavior to dereference end() iterators";
+        return current_split;
+    }
+
+    constexpr std::string_view* operator->() {
+        DCHECK(state != kAtEnd) << "Undefined behavior to dereference end() iterators";
+        return &current_split;
+    }
+
+    /*
+    constexpr const std::string_view& operator*() const {
+        return current_split;
+    }
+
+    constexpr const std::string_view* operator->() const {
+        return &current_split;
+    }
+    */
+
+    constexpr SplitIterator& operator++() {
+      UpdateValues();
+      return *this;
+    }
+
+    constexpr SplitIterator operator++(int) {
+      SplitIterator copy{*this};
+      ++(*this);
+      return copy;
+    }
+
+   private:
+    // Avoid defining constructors etc. We get the default constructors and operator= then.
+
+    friend struct SplitIterable;  // Use below Make functions.
+
+    constexpr static SplitIterator MakeBegin(std::string_view whole, std::string_view separator) {
+      SplitIterator it;
+      it.state = kNormal;
+
+      if (separator == "") {
+        it.rest_of_string = StringSplit::EmptySubstringAtEnd(whole);
+        // point to one past-the end (which is legal), also equivalent to ""
+        // the difference being that the address range is guaranteed to be within 'whole'
+        // actually any 0-length subrange would be appropriate here, but just go with the 'end'
+        // because dereferencing it would be obviously bad.
+        it.state = kAtEnd;
+        // Empty separator -> empty # of visits. This seems the most composable.
+        // Note: Need to handle this case especially since find_first_of("") would return the
+        // entire string.
+      } else {
+        it.rest_of_string = whole;
+        it.separator = separator;
+        it.UpdateValues();
+      }
+      return it;
+    }
+
+    constexpr static SplitIterator MakeEnd() {
+      SplitIterator it;
+      it.state = kAtEnd;
+      return it;
+    }
+
+    constexpr void UpdateValues() {
+      switch (state) {
+        case kNormal:
+          break;
+        case kNearEnd:
+          // Address of emitted value is always within subrange of 'whole'.
+          current_split = StringSplit::EmptySubstringAtEnd(rest_of_string);
+          state = kAtEnd;
+          return;
+        case kAtEnd:
+          // Incrementing the 'end()' operator is undefined behavior.
+          DCHECK(false) << "Undefined behavior: Cannot increment end() iterator.";
+          return;
+      }
+
+      DCHECK(state == kNormal);
+
+      size_t pos = rest_of_string.find_first_of(separator);
+      if (std::string_view::npos == pos) {
+        // Always visit at least once for non-empty separators, even if the string is empty.
+
+        current_split = rest_of_string;
+        // Address of emitted value is always within subrange of 'whole'.
+        rest_of_string = rest_of_string.substr(/*pos*/0, /*count*/0);  // = ""
+        state = kNearEnd;
+      } else {
+        // includes the starting position of the needle
+        // e.g. "+x-".find_first_of('x') -> 1
+
+        // current_split = rest_of_string[0..pos)
+        current_split = rest_of_string.substr(/*pos*/0, pos);
+
+        // strip '${left}${separator}' from the left hand side.
+        // continue iterating.
+        rest_of_string = rest_of_string.substr(pos + separator.size());
+      }
+    }
+
+ public:
+
+    void PrintToStream(std::ostream& os) const {
+      os << "SplitIterator{";
+      os << "current_split:\"" << current_split << "\",";
+      os << "rest_of_string:\"" << rest_of_string << "\",";
+      os << "separator:\"" << separator << "\",";
+      os << "state:";
+      switch (state) {
+        case kNormal:
+          os << "kNormal";
+          break;
+        case kNearEnd:
+          os << "kNearEnd";
+          break;
+        case kAtEnd:
+          os << "kAtEnd";
+          break;
+      }
+      os << "}";
+    }
+ private:
+    // Not intended to be used directly.
+    // Public visibility to avoid making extra constructors.
+    std::string_view current_split;
+    std::string_view rest_of_string;
+    std::string_view separator;
+
+    enum State {
+      kNormal,
+      kNearEnd,
+      kAtEnd
+    };
+    State state{kNormal};
+    // This cannot have a field initializer due to a clang bug,
+    // https://bugs.llvm.org/show_bug.cgi?id=36684
+    // So define an explicit constructor below.
+
+    // This needs to go last:
+    // undefined constructor 'SplitIterator' cannot be used in a constant expression
+    // constexpr SplitIterator() : state{kNormal} {}
+   // constexpr SplitIterator() {}
+  };
+
+  friend struct SplitIterable;
+
+  struct SplitIterable {
+    std::string_view whole;
+    std::string_view separator;
+
+    constexpr SplitIterator begin() {
+      return SplitIterator::MakeBegin(whole, separator);
+    }
+
+    constexpr SplitIterator end() {
+      return SplitIterator::MakeEnd();
+    }
+  };
+};
+
+std::ostream& operator<<(std::ostream& os, const StringSplit::SplitIterator& it) {
+  it.PrintToStream(os);
+  return os;
+}
+
+static constexpr  const StringSplit::SplitIterator kBlankSplit;
+
+// Visit substrings in 'what' that are separated by 'separator'.
+// Should be similar to the python 'str.split' behavior.
+//
+// Empty separators will have 0 visits.
+//
+// 'f' is called back for each visit of a substring, this means there's 0 allocations here.
+//
+// NOTE: this could end up returning empty strings, e.g. '/'.split('/') -> ('', '')
+// Think of it more like splitting on "$/^" except the $ and ^ become empty strings in the end.
+//
+// (Dynamic allocation free)
+template <typename Fn>
+static constexpr void VisitSplitStringView(std::string_view what,
+                                           std::string_view separator,
+                                           Fn f) {
+  // Empty separator -> empty # of visits. This seems the most composable.
+  if (separator == "") {
+    // Note: Need to handle this case especially since find_first_of("") would return the
+    // entire string.
+    return;
+  }
+
+  size_t sep_length = separator.size();
+
+  do {
+    size_t pos = what.find_first_of(separator);
+    if (std::string_view::npos == pos) {
+      // Always visit at least once for non-empty separators, even if the string is empty.
+      f(what);
+      break;
+    } else {
+      // includes the starting position of the needle
+      // e.g. "+x-".find_first_of('x') -> 1
+
+      // left = what[0..pos)
+      std::string_view left_split = what.substr(/*pos*/0, pos);
+      f(left_split);
+
+      // strip '${left}${separator}' from the left hand side.
+      // continue iterating.
+      what = what.substr(pos + sep_length);
+    }
+  }
+  while (true);
+}
+
+std::vector<std::string> VisitSplitStringViewVec(std::string_view what,
+                                                 std::string_view separator) {
+  std::vector<std::string> vec;
+  VisitSplitStringView(what, separator, [&vec](auto&& part) {
+                         vec.push_back(std::string{part});
+                       });
+  return vec;
+}
+
+std::vector<std::string> IterableSplitStringViewVec(std::string_view what,
+                                                    std::string_view separator) {
+  auto iterable = StringSplit::Iterable(what, separator);
+  std::vector<std::string> vec{iterable.begin(), iterable.end()};
+
+  return vec;
+}
+
+TEST(SplitStringView, Tests) {
+  EXPECT_THAT(VisitSplitStringViewVec("", ""), IsEmpty());
+  EXPECT_THAT(VisitSplitStringViewVec("abcdef", ""), IsEmpty());
+  EXPECT_THAT(VisitSplitStringViewVec("", "/"), ElementsAre(""s));
+  EXPECT_THAT(VisitSplitStringViewVec("/", "/"), ElementsAre(""s, ""s));
+  EXPECT_THAT(VisitSplitStringViewVec("//", "/"), ElementsAre(""s, ""s, ""s));
+  EXPECT_THAT(VisitSplitStringViewVec("/hello", "/"), ElementsAre(""s, "hello"s));
+  EXPECT_THAT(VisitSplitStringViewVec("/hello/world", "/"), ElementsAre(""s, "hello"s, "world"s));
+  EXPECT_THAT(VisitSplitStringViewVec("bar", "/"), ElementsAre("bar"s));
+  EXPECT_THAT(VisitSplitStringViewVec("bar/baz", "/"), ElementsAre("bar"s, "baz"s));
+
+  EXPECT_THAT(IterableSplitStringViewVec("", ""), IsEmpty());
+  EXPECT_THAT(IterableSplitStringViewVec("abcdef", ""), IsEmpty());
+  EXPECT_THAT(IterableSplitStringViewVec("", "/"), ElementsAre(""s));
+  EXPECT_THAT(IterableSplitStringViewVec("/", "/"), ElementsAre(""s, ""s));
+  EXPECT_THAT(IterableSplitStringViewVec("//", "/"), ElementsAre(""s, ""s, ""s));
+  EXPECT_THAT(IterableSplitStringViewVec("/hello", "/"), ElementsAre(""s, "hello"s));
+  EXPECT_THAT(IterableSplitStringViewVec("/hello/world", "/"), ElementsAre(""s, "hello"s, "world"s));
+  EXPECT_THAT(IterableSplitStringViewVec("bar", "/"), ElementsAre("bar"s));
+  EXPECT_THAT(IterableSplitStringViewVec("bar/baz", "/"), ElementsAre("bar"s, "baz"s));
+
+  EXPECT_THAT(IterableSplitStringViewVec("/hello", "/"), ElementsAre(""sv, "hello"sv));
+  EXPECT_THAT(IterableSplitStringViewVec("/hello///", "/"), ElementsAre(""sv, "hello"sv, ""sv, ""sv, ""sv));
+ 
+}
+
+
+// Allocation-free immutable path representation and manipulation.
+//
+// A PurePath is logically represented by its 'parts', which is a view of each component.
+//
+// Examples:
+//   parts('foo/bar') -> ['foo', 'bar']
+//   parts('/bar') -> ['/', 'bar']
+//   parts('') -> []
+//   parts('.') -> []
+//   parts('baz//') -> ['baz']
+//   parts('hello/././world') -> ['hello', 'world']
+//   parts('../down/../down2') -> ['..', 'down', '..', 'down2']
+//
+// See also #VisitParts which allows an allocation-free traversal of the parts.
+//
+// Memory allocation/ownership guarantees:
+// * Functions marked as 'constexpr' are guaranteed never to allocate (zero-copy).
+// * Functions not marked as 'constexpr' and returning a PurePath will always return an object
+//   with its own internal copy of the underlying data (i.e. the memory is not borrowed).
+struct PurePath {
+  using part_type = std::string_view;
+
+  struct PartIterable;
+
+  // Create an empty PurePath.
+  //
+  // Empty paths are considered to have 0 parts, i.e.
+  //   PurePath{}.VisitParts() -> []
+  constexpr PurePath() : path_(".") {
+  }
+
+  // Create a PurePath from a string view.
+  //
+  // This borrows memory ownership of the string view. If you wish to make a copy,
+  // use the PurePath(std::string) constructor.
+  //
+  // Paths are non-normalized (i.e. redundant up-references, "..", are not stripped),
+  // you may wish to call 'NormalizePath' if this is important.
+  constexpr PurePath(std::string_view path)  : path_(path) {
+    /// : owner_(std::string(path)), path_(owner_.value()) {
+    // TODO: no copy
+  }
+
+  constexpr PurePath(const char* path) : PurePath(std::string_view(path)) {}
+
+  // Creates a PurePath from a string.
+  //
+  // The PurePath owns the memory of the string path.
+  //
+  // Only accepts movable strings, so that the cheaper borrowing (string_view)
+  // constructor is used by default.
+  PurePath(std::string&& path) : owner_(std::move(path)), path_(owner_.value()) {
+  }
+
+  // Return an Iterable, which upon traversing would
+  // return each part as an std::string_view.
+  //
+  // Empty and '.' path components are not visited,
+  // effectively ignoring redundant // and intermediate '.' components.
+  //
+  // To also ignore redundant up-references, see #NormalizePath.
+  //
+  // Example:
+  //   for (std::string_view part : PurePath("hello//world/./").IterateParts()) {
+  //     // loop 0, part == "hello"sv
+  //     // loop 1, part == "world"sv
+  //   }
+  constexpr PartIterable IterateParts() const {
+    return PartIterable::FromPath(*this);
+  }
+
+  // f is a function<void(std::string_view part)>
+  //
+  // Invoke 'f' repeatedly on each logical part of this path.
+  //
+  // Empty and '.' path components are not visited,
+  // effectively ignoring redundant // and intermediate '.' components.
+  //
+  // To also ignore redundant up-references, see #NormalizePath.
+  template <typename Fn>
+  constexpr void VisitParts(Fn f) const {
+    // Note: Near the top to avoid -Wundefined-inline warnings.
+    if (IsAbsolute()) {
+      f(kRoot);  // When we split, we no longer visit the '/' tokens. Handle root explicitly.
+    }
+    VisitSplitStringView(path_,
+                         kRoot,
+                         [&f](auto&& substr) {
+                           // Ignore duplicate /// and also .
+                           //
+                           // e.g.
+                           //   '//foo' -> ['/', 'foo']
+                           //   './foo' -> ['foo']
+                           //
+                           // This is consistent with PurePath.parts implementation.
+                           //
+                           // Note that redundant .. are not removed, e.g.
+                           //   '../foo/..' is not rewritten to ['..']
+                           //
+                           // Use 'NormalizePath' to do this explicitly.
+                           if (!substr.empty() && substr != ".") {
+                             f(substr);
+                           }
+                         });
+  }
+
+
+  // A path is considered equal to another path if all of the parts are identical.
+  /*constexpr*/ bool operator==(const PurePath& other) const {
+    /*if (path_ == other.path_) {
+      return true;
+    } else*/ {
+      auto this_range = IterateParts();
+      auto other_range = other.IterateParts();
+
+      return std::equal(this_range.begin(),
+                        this_range.end(),
+                        other_range.begin(),
+                        other_range.end());
+    }
+  }
+
+  // Returns the name component (if any).
+  //
+  // Logically equivalent to returning the last part unless:
+  //   - the last part is the root '/'
+  //   - there are no parts
+  //
+  // If the above conditions do not hold, return the empty string.
+  constexpr std::string_view Name() const {
+    std::string_view component = StringSplit::EmptySubstringAtEnd(path_);
+
+    size_t count = 0;
+    for (auto&& part : IterateParts()) {
+      if (count++ == 0 && part == kRoot) {
+        continue;  // '/' does not count as a name.
+      } else {
+        DCHECK_NE(part, kRoot);
+      }
+
+      component = part;
+    }
+
+    return component;
+  }
+
+  // Find the parent of this path.
+  //
+  // This is usually the path with the last part stripped off, with some special cases:
+  // - The parent of '/' is always '/' (recursive).
+  // - The parent of '' is always '..'.
+  // - The parent of '..[/..]*' is an additional '/..' appended.
+  //
+  // The parent is always distinct (i.e. not equal to this) except for '/', whose parent
+  // is itself.
+  /*constexpr*/ PurePath Parent() const {
+    size_t parts_count = 0;
+    size_t upreference_count = 0;
+    // TODO: this should be constexpr, but it complains about PurePath not being a literal type.
+
+    for (auto&& part : IterateParts()) {
+      ++parts_count;
+
+      if (part == "..") {
+        ++upreference_count;
+      }
+    }
+
+    if (upreference_count == parts_count) {  // Could also have 0 parts.
+      // "../../../" etc. No other parts are there.
+      // We need to add another '..'
+
+      // Explicitly handle a few iterations to remain constexpr.
+      switch (upreference_count) {
+        case 0:
+          return {".."};
+        case 1:
+          return {"../.."};
+        case 2:
+          return {"../../.."};
+        case 3:
+          return {"../../../.."};
+        default:
+          break;
+      }
+
+      // As a special case, this part of the function is not constexpr.
+      std::string built_parent_string = "..";
+      for (size_t i = 0; i < upreference_count; ++i) {
+        built_parent_string += kRoot;
+        built_parent_string += "..";
+      }
+
+      return PurePath{std::move(built_parent_string)};
+
+    } else if (parts_count == 1) {
+      if (IsAbsolute()) {
+        // "/" + ".." is still "/"
+        return {kRoot};
+      } else {
+        // <NOT-ROOT-OR-UP-REFERENCE> + ".." is just "."
+        return {};
+      }
+    } else {
+      DCHECK_GE(parts_count, 2u);
+
+      // Find the last iterator before we hit the end.
+      std::optional<std::string_view> last;
+      std::optional<std::string_view> prev_last;
+      for (auto&& part : IterateParts()) {
+        prev_last = last;
+        last = part;
+      }
+
+      DCHECK(last.has_value());
+      DCHECK(prev_last.has_value());
+
+      std::string_view& prev_last_view = *prev_last;
+      // prev_last_view must be within address of subrange_.
+      DCHECK_GE(prev_last_view.data(), path_.data());
+      DCHECK_LE(prev_last_view.data() + prev_last_view.size(), path_.data() + path_.size());
+
+      // take advantage of the address subrange property by calculating a new substring
+      // for the parent.
+      size_t length = prev_last_view.data() + prev_last_view.size() - path_.data();
+      std::string_view parent = std::string_view{path_.data(), length} ;
+
+      if ((false)) {
+        LOG(DEBUG) << "PurePath::Parent of \"" << path_ << "\" returns \"" << parent << "\"";
+      }
+      return { parent };
+    }
+  }
+
+  // A path is considered non-equal to another path if one or more of the parts differ.
+  constexpr bool operator!=(const PurePath& other) const {
+    return !(*this == other);
+  }
+
+  // Return the string view, i.e. to pass to other classes that need a string-like type.
+  //
+  // This passes in the original string as was passed into the constructor.
+  // The exact char-by-char representation may be different than concatenating all the parts
+  // together.
+  //
+  // See also #NormalizePath if you want to get a 1:1 mapping between a PurePath
+  // and a string.
+  constexpr std::string_view AsStringView() const {
+    // This is slightly inconsistent with PurePath#bytes because it actually collapses the string
+    // to the equivalent of concatenating the parts together. But we prefer not to do that,
+    // since it just causes more work and more allocations unnecessarily.
+    //
+    // This is generally not-noticeable when operating with the path at the logical layer.
+    return path_;
+  }
+
+  constexpr bool IsAbsolute() const {
+    return !path_.empty() && path_[0] == '/';  // left-whitespace is considered significant.
+  }
+
+  // Join one or more paths together.
+  //
+  // Logically equivalent to calling JoinPath(other) repeatedly.
+  template <typename It>
+  PurePath JoinPath(It begin, It end) const {
+    std::vector<std::string_view> parts_stack = PartsList();
+
+    while (begin != end) {
+      const PurePath& path = *begin;
+
+      if (path.IsAbsolute()) {
+        parts_stack = path.PartsList();
+      } else {
+        path.VisitParts([&parts_stack](auto&& part) {
+          parts_stack.push_back(part);
+        });
+      }
+
+      ++begin;
+    }
+
+    return {JoinPartsList(parts_stack)};
+  }
+
+  // Join two paths together:
+  //
+  // If 'other' is an absolute path, it is returned.
+  //
+  // Otherwise, return the concatenation of the parts (this and other) as a new path.
+  // (The returned path is always owned by the caller -- this is triggering an allocation every
+  // time).
+  PurePath JoinPath(const PurePath& other) const {
+    if (other.IsAbsolute()) {
+      return other.OwningCopy();
+    } else {
+      std::vector<std::string_view> parts_stack = PartsList();
+      other.VisitParts([&parts_stack](auto&& part) {
+        parts_stack.push_back(part);
+      });
+      return {JoinPartsList(parts_stack)};
+    }
+  }
+
+  constexpr PurePath(const PurePath& other) {
+    if (this == &other) {
+      return;
+    }
+    if (other.owner_) {  // stay constexpr for non-owning paths.
+      owner_ = other.owner_;
+      path_ = *owner_;   // path_ always points to owner if possible.
+    } else {
+      path_ = other.path_;
+    }
+  }
+
+  constexpr PurePath(PurePath&& other) {
+    if (this == &other) {
+      return;
+    }
+    if (other.owner_) {  // stay constexpr for non-owning paths.
+      owner_ = std::move(other.owner_);
+      path_ = *owner_;   // path_ always points to owner if possible.
+    } else {
+      path_ = std::move(other.path_);
+    }
+  }
+
+  // "/.." -> "/"
+  // "../foo/.." -> ".."
+  // etc.
+  //
+  // PurePath returned always owns its own memory (this always triggers an allocation).
+  PurePath NormalizePath() const {
+    if (IsNormalized()) {
+      return OwningCopy();  // Don't call this function if you want to avoid copies!
+    } else {
+      // Invariant: [/]? <UP-REFERENCE>* <NOT-AN-UP-REFERENCE>*
+      std::vector<std::string_view> parts_stack;
+      size_t not_an_up_reference = 0;
+
+      // Special handling of absolute paths:
+      //   '/' '..'* -> '/'
+      //
+      // Otherwise, remove the last part when encountering redundant up-references:
+      //   e.g. '../foo/bar/baz/..' -> '../foo/bar'
+      VisitParts([&](auto&& part) {
+                   if (part == "..") {
+                     // <UP-REFERENCE>
+                     if (not_an_up_reference > 0) {
+                       // Remove redundant up-references.
+                       DCHECK(!parts_stack.empty());
+
+                       // Could trigger de-normalization, remove redundant part from stack.
+
+                       if (parts_stack.back() != kRoot) {  // '/' '..'* -> '/'
+                         parts_stack.pop_back();
+                         --not_an_up_reference;            // '../foo/..' -> '..'
+                       }
+                     } else {
+                       // Did not trigger a denormalization.
+                       parts_stack.push_back(part);
+                     }
+                   } else {
+                     // <NOT-AN-UP-REFERENCE> or '/' (note: / is only visited the first time).
+                     parts_stack.push_back(part);
+                     ++not_an_up_reference;
+                   }
+                 });
+
+      // join again with empty delimiter.
+      std::string concat = JoinPartsList(std::move(parts_stack));
+
+      return PurePath(std::move(concat));
+    }
+  }
+
+  // Returns true if 'NormalizePath' would return a Path with a different parts representation.
+  //
+  // (This is not as strict as normalizing the underlying string, i.e. redundant '.' and "//"
+  // in AsStringView() could still be seen).
+  //
+  // A path is considered non-normalized unless all up-references are at the start.
+  //
+  //   NormalizedString := <UP-REFERENCE>* <NOT-AN-UP-REFERENCE>*
+  //
+  // where each token is a 'part' returned by VisitParts.
+  //
+  // Returning false here means that 'NormalizePath' will also trigger an extra allocation.
+  constexpr bool IsNormalized() const {
+    size_t not_an_up_reference = 0;
+    bool is_normalized = true;
+
+    // Note that this also handles '/' [..]* because '/' is treated identically to non-up-refs.
+    VisitParts([&](auto&& part) {
+                // Remove redundant up-references.
+                if (part != "..") {
+                  ++not_an_up_reference;
+                } else {  // part == ".."
+                  if (not_an_up_reference > 0) {   // <not-an-up-reference> <up-reference>
+                    is_normalized = false;
+                  }
+                }
+               });
+
+    return is_normalized;
+  }
+
+  // Implement LegacyForwardIterator concept.
+  struct PartIterator {
+    using value_type = std::string_view;
+    using reference = value_type&;
+    using pointer = value_type*;
+    using iterator_category = std::forward_iterator_tag;
+    using difference_type = std::ptrdiff_t;  // required by concept, but its meaningless.
+
+   private:
+    enum State {
+      kUninitialized,
+      kAtRoot,
+      kInitialized,
+      kAtEnd
+    };
+
+    using SplitIterable = StringSplit::SplitIterable;
+    using SplitIterator = StringSplit::SplitIterator;
+
+    State state{kUninitialized};
+    value_type cur_value;
+    SplitIterator cur;
+    SplitIterator end;
+
+    friend std::ostream& operator<<(std::ostream& os, const PartIterator& it);
+
+    // Print out extra debugging information when looping through the iterator.
+    static constexpr bool kLogDebug = false;
+
+   public:
+    void PrintToStream(std::ostream& os) const {
+      os << "PartIterator{";
+      os << "state:";
+      switch (state) {
+        case kUninitialized:
+          os << "kUninitialized";
+          break;
+        case kAtRoot:
+          os << "kAtRoot";
+          break;
+        case kInitialized:
+          os << "kInitialized";
+          break;
+        case kAtEnd:
+          os << "kAtEnd";
+          break;
+      }
+      os << ",";
+      os << "cur_value:\"" << cur_value << "\",";
+      os << "cur:" << cur << ",";
+      os << "end:" << end << ",";
+      os << "}";
+    }
+
+    /*constexpr*/ bool operator==(const PartIterator& other) const {
+      DCHECK(state != kUninitialized) << "State must be initialized";
+      DCHECK(other.state != kUninitialized) << "Other state must be initialized";
+
+      if (kLogDebug) {
+        LOG(DEBUG) << "PartIterator ==";
+      }
+
+      if (state != other.state) {
+        if (kLogDebug) {
+          LOG(DEBUG) << "State: " << static_cast<int>(state);
+          LOG(DEBUG) << "Other State: " << static_cast<int>(other.state);
+
+          LOG(DEBUG) << "== states differ (&self=" << this << ",&other=" << &other << ")";
+          LOG(DEBUG) << "Self=" << *this;
+          LOG(DEBUG) << "Other=" << other;
+        }
+        return false;
+      }
+
+      switch (state) {
+        case kAtRoot:
+          DCHECK(cur != end);
+          return cur == other.cur;
+        case kInitialized:
+          DCHECK(cur != end);
+          return cur == other.cur;
+        case kAtEnd:
+          DCHECK(cur == end);
+          DCHECK(cur == other.cur);
+          return true;
+        default:
+          DCHECK(false);  // -Werror -Wswitch
+          return true;
+      }
+    }
+
+    constexpr bool operator!=(const PartIterator& other) const {
+      return !(*this == other);
+    }
+
+    constexpr reference operator*() {
+        DCHECK(state != kAtEnd) << "Undefined behavior to dereference end() iterators";
+        return cur_value;  // Can't use *cur because we could yield a '/'.
+    }
+
+    constexpr pointer operator->() {
+        DCHECK(state != kAtEnd) << "Undefined behavior to dereference end() iterators";
+        return &cur_value;  // Can't use &*cur because we could yield a '/'.
+    }
+
+    /*
+    constexpr const reference operator*() const {
+        return *cur;
+    }
+
+    constexpr const pointer operator->() const {
+        return &*cur;
+    }*/
+
+    constexpr PartIterator& operator++() {
+      DCHECK(state != kAtEnd) << "Undefined behavior to increment end() iterators";
+      UpdateValues();
+      return *this;
+    }
+
+    constexpr PartIterator operator++(int) {
+      PartIterator copy{*this};
+      ++(*this);
+      return copy;
+    }
+
+    constexpr static PartIterator MakeBegin(SplitIterable& split_iterable,
+                                            std::string_view whole_path) {
+      SplitIterator begin = split_iterable.begin();
+      SplitIterator end = split_iterable.end();
+
+      PartIterator it;
+      it.end = end;
+
+      const bool is_absolute = !whole_path.empty() && whole_path[0] == '/';
+
+      if (begin == end) {
+        it.cur = end;
+        it.state = kAtEnd;
+        // I'm not sure this path is actually possible due to the nature of how StringSplit
+        // works, but it's better to cover this case just to be safe.
+        DCHECK(false) << "unreachable code, splitting by '/' always returns at least 1 split";
+      } else {
+        it.cur = begin;
+
+        if (is_absolute) {
+          // When we split, we no longer visit the '/' tokens. Handle root explicitly.
+          //
+          // All emitted values must be within the address range of the whole path.
+          it.cur_value = whole_path.substr(0, /*count*/1);  // '/'
+          DCHECK_EQ(it.cur_value, "/"sv);
+          it.state = kAtRoot;
+        } else {
+          it.state = kUninitialized;
+          it.UpdateValues();
+        }
+      }
+
+      return it;
+    }
+
+    constexpr static PartIterator MakeEnd(SplitIterable& split_iterable) {
+      SplitIterator end = split_iterable.end();
+
+      PartIterator it;
+      it.cur = end;
+      it.end = end;
+      it.state = kAtEnd;
+
+      return it;
+    }
+
+   private:
+    void UpdateValues() {
+      State previous_state = state;
+
+      if (kLogDebug) {
+        LOG(DEBUG) << "operator ++ // UpdateValues (&this=" << this << ")";
+      }
+
+      if (state == kAtEnd) {
+        return;
+      }
+
+      if (state == kInitialized) {
+        DCHECK(IsValidCurrent());
+      }
+
+      // '/' has no corresponding split, so it's handled as a special case.
+      // Furthermore, any splits that are empty or "." are skipped since they aren't
+      // considered to be a valid path component.
+      //
+      // The below code handles these special cases.
+
+      if (state == kAtRoot) {
+        state = kUninitialized;
+      }
+
+      if (state == kUninitialized) {
+        // If we are already at a valid value stop.
+        if (cur != end && IsValidCurrent()) {
+          state = kInitialized;
+          cur_value = *cur;
+          return;
+        }
+
+        // Otherwise we are either at the end, or
+        // the current value is invalid (e.g. empty or '.').
+        state = kInitialized;
+      }
+
+      DCHECK(state == kInitialized) << static_cast<int>(state);
+      if (previous_state == kInitialized) {
+        // If we fell-through from kAtRoot or kUninitialized
+        // then there's no guarantee that the current value is valid.
+        DCHECK(IsValidCurrent());
+      }
+
+      auto old_cur_value = *cur;
+
+      // Already at the end. Switch to end state.
+      if (cur == end) {
+        state = kAtEnd;
+        LOG(DEBUG) << "Updated state is: kAtEnd (1)";
+        return;
+      }
+
+      // Skip ahead.
+      // We may or may not be at a valid value now.
+      ++cur;
+
+      // If we aren't at a valid value yet, then keep going forward
+      // until we hit a valid value (or we exhaust the iterator).
+      while (cur != end && !IsValidCurrent()) {
+        ++cur;
+      }
+
+      if (cur == end) {
+        state = kAtEnd;
+      } else {
+        // We reached a valid value before exhausting the iterator.
+
+        // Stay in the 'Initialized' state.
+        DCHECK(IsValidCurrent()) << *cur;
+        cur_value = *cur;
+
+        // After we go forward, the old and current value cannot match.
+        DCHECK_NE(&cur_value[0], &old_cur_value[0]);
+      }
+
+      if (kLogDebug) {
+        LOG(DEBUG) << "Updated state is: " << state;
+      }
+    }
+
+    constexpr bool IsValidCurrent() {
+      if (cur->empty()) {
+        return false;
+      } else if (*cur == ".") {
+        return false;
+      }
+
+      return true;
+    }
+  };
+
+  friend struct PartIterable;
+
+  struct PartIterable {
+    constexpr static PartIterable FromPath(const PurePath& path) {
+      return PartIterable{
+          path.AsStringView(),
+          StringSplit::Iterable(path.AsStringView(), PurePath::kRoot),
+      };
+    }
+
+    constexpr PartIterator begin() {
+      return PartIterator::MakeBegin(split_iterable, whole_path);
+    }
+
+    constexpr PartIterator end() {
+      return PartIterator::MakeEnd(split_iterable);
+    }
+
+    std::string_view whole_path;
+    StringSplit::SplitIterable split_iterable;
+  };
+
+  // This isn't performance-efficient, but it might be needed by some functions
+  // that have to allocate anyway such as JoinPaths.
+  //
+  // Intended only for testing.
+  std::vector<std::string_view> PartsList() const {
+    PartIterable iterable = IterateParts();
+
+    std::vector<std::string_view> parts{iterable.begin(), iterable.end()};
+    return parts;
+  }
+
+  // Does this PurePath own the underlying memory?
+  //
+  // true = borrowing memory from someone else (might not be safe to retain this object)
+  // false = owns its own memory (can keep this object indefinitely long)
+  //
+  // Currently intended only for testing.
+  constexpr bool IsBorrowed() const {
+    return !owner_.has_value();
+  }
+
+ private:
+  // Return a PurePath that owns its own memory.
+  //
+  // This way functions which 'may' allocate memory turn into functions
+  // that always allocate memory, and avoid a dangling reference.
+  const PurePath OwningCopy() const {
+    std::string make_copy{path_};
+    return PurePath{std::move(make_copy)};
+  }
+
+  constexpr size_t PartsCount() const {
+    size_t count = 0;
+    VisitParts([&count](auto&& /*part*/) {
+      ++count;
+    });
+    return count;
+  }
+
+  // Basically a string join with an empty delimiter.
+  template <typename Container>
+  static std::string JoinPartsList(Container&& c) {
+    std::string build;
+    for (auto begin = c.begin(), end = c.end(); begin != end; ++begin) {
+      build += *begin;
+
+      // TODO: use forward_dependent here.
+    }
+
+    return build;
+  }
+
+  // This might be empty, in which case path_ is just a temporary borrow of path_.
+  std::optional<std::string> owner_;
+  std::string_view path_;  // points to owner_ if there's a value there.
+
+  // TODO: this is a bit error-prone, so we might want to refactor into a
+  // never-owning PathView and an always-owning PurePath.
+
+  static constexpr std::string_view kRoot = "/";
+};
+
+std::ostream& operator<<(std::ostream& os, const PurePath::PartIterator& it) {
+  it.PrintToStream(os);
+  return os;
+}
+
+static constexpr const PurePath::PartIterator kMakeMeABlank;
+
+std::ostream& operator<<(std::ostream& os, const PurePath& path) {
+  os << path.AsStringView();
+  return os;
+}
+
+TEST(PurePathTest, Ctor) {
+  ConfigureLogging();
+
+  EXPECT_EQ(PurePath{}.AsStringView(), "."sv);
+  EXPECT_EQ(PurePath{""}.AsStringView(), ""sv);
+  EXPECT_EQ(PurePath{""sv}.AsStringView(), ""sv);
+  EXPECT_EQ(PurePath{""s}.AsStringView(), ""sv);
+  EXPECT_EQ(PurePath{"/hello/world"}.AsStringView(), "/hello/world"sv);
+  EXPECT_EQ(PurePath{"/hello/world"s}.AsStringView(), "/hello/world"sv);
+  EXPECT_EQ(PurePath{"/hello/world"sv}.AsStringView(), "/hello/world"sv);
+  EXPECT_EQ(PurePath{"hello/world"}.AsStringView(), "hello/world"sv);
+  EXPECT_EQ(PurePath{"hello/world"s}.AsStringView(), "hello/world"sv);
+  EXPECT_EQ(PurePath{"hello/world"sv}.AsStringView(), "hello/world"sv);
+
+  // Ensure that std::string is only owning memory when we move a string into it.
+  // Otherwise, always take the string_view constructor.
+  EXPECT_FALSE(PurePath{std::string{"hello"}}.IsBorrowed());
+  std::string hello{"hello"};
+  EXPECT_TRUE(PurePath{hello}.IsBorrowed());
+  EXPECT_FALSE(PurePath{std::move(hello)}.IsBorrowed());
+}
+
+TEST(PurePathTest, Parts) {
+  ConfigureLogging();
+
+  EXPECT_THAT(PurePath{}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{"."}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{"./"}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{"./."}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{".///"}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{"./././."}.PartsList(), IsEmpty());
+  EXPECT_THAT(PurePath{"/"s}.PartsList(), ElementsAre("/"sv));
+  EXPECT_THAT(PurePath{"///"s}.PartsList(), ElementsAre("/"sv));
+  EXPECT_THAT(PurePath{"/hello"s}.PartsList(), ElementsAre("/"sv, "hello"sv));
+  EXPECT_THAT(PurePath{"/hello///"s}.PartsList(), ElementsAre("/"sv, "hello"sv));
+  EXPECT_THAT(PurePath{"/hello/world"s}.PartsList(), ElementsAre("/"sv, "hello"sv, "world"sv));
+  EXPECT_THAT(PurePath{"hello/world"sv}.PartsList(), ElementsAre("hello"sv, "world"sv));
+  EXPECT_THAT(PurePath{"hello/world"sv}.PartsList(), ElementsAre("hello"sv, "world"sv));
+  EXPECT_THAT(PurePath{"hello//world"sv}.PartsList(), ElementsAre("hello"sv, "world"sv));
+  EXPECT_THAT(PurePath{"hello/./world"sv}.PartsList(), ElementsAre("hello"sv, "world"sv));
+  EXPECT_THAT(PurePath{"hello/./world/././"sv}.PartsList(), ElementsAre("hello"sv, "world"sv));
+}
+
+#define EXPECT_PATH_EQ(lhs, rhs) EXPECT_EQ(PurePath{lhs}, PurePath{rhs})
+#define EXPECT_PATH_NE(lhs, rhs) EXPECT_NE(PurePath{lhs}, PurePath{rhs})
+
+TEST(PurePathTest, Equals) {
+  ConfigureLogging();
+
+  EXPECT_PATH_EQ("", "");
+  EXPECT_PATH_EQ(".", ".");
+  EXPECT_PATH_EQ("", ".");
+  EXPECT_PATH_EQ("./", ".");
+  EXPECT_PATH_EQ(".////", ".");
+  EXPECT_PATH_EQ(".//././", ".");
+  EXPECT_PATH_EQ("hello/world//", "hello/world");
+  EXPECT_PATH_EQ("hello/world//", "./hello/world");
+  EXPECT_PATH_EQ("//hello/world//", "/hello/world");
+  EXPECT_PATH_EQ("/./hello/world//", "/hello/world/./");
+  EXPECT_PATH_EQ("..", ".././.");
+  EXPECT_PATH_EQ("../..//", "../..");
+
+  // Also make sure that the path is not equal to its parent [which is a substring].
+  EXPECT_PATH_NE("/data", "/data/baz");
+  EXPECT_PATH_NE("/data/././baz", "/data/baz/bar");
+
+  // Also make sure its not equal when the other path shares the same underlying starting data().
+  {
+    std::string_view view = "/data/bar";
+    EXPECT_PATH_NE(PurePath{view}, PurePath{view.substr(/*pos*/0, /*count*/5)});
+  }
+}
+
+// A parent is always different than its child (except for '/').
+#define EXPECT_PATH_PARENT_EQ(actual, expected) \
+    EXPECT_EQ(PurePath{actual}.Parent(), PurePath{expected}); \
+    { auto act = PurePath{actual};   \
+      EXPECT_NE(act, act.Parent());  \
+    }
+TEST(PurePathTest, Parent) {
+  ConfigureLogging();
+
+  // Special recursive case: parent of '/' is still '/'.
+  EXPECT_EQ(PurePath{"/"}, PurePath{"/"}.Parent());
+  EXPECT_NE(PurePath{""}, PurePath{"/"}.Parent());
+
+  // All other cases are non-recursive.
+  EXPECT_PATH_PARENT_EQ("", "..");
+  EXPECT_PATH_PARENT_EQ("..", "../..");
+  EXPECT_PATH_PARENT_EQ("../..", "../../..");
+  EXPECT_PATH_PARENT_EQ("../../../../../../../../..", "../../../../../../../../../..");
+
+  EXPECT_PATH_PARENT_EQ("/abc", "/");
+  EXPECT_PATH_PARENT_EQ("abc", "");
+
+  EXPECT_PATH_PARENT_EQ("/foo/bar", "/foo");
+  EXPECT_PATH_PARENT_EQ("/foo/bar/b", "/foo/bar");
+  EXPECT_PATH_PARENT_EQ("/foo/bar///baz///././/nay", "/foo/bar/baz");
+
+  EXPECT_PATH_PARENT_EQ("foo/bar", "foo");
+  EXPECT_PATH_PARENT_EQ("foo/bar/b", "foo/bar");
+  EXPECT_PATH_PARENT_EQ("foo/bar///baz///././/nay", "foo/bar/baz");
+
+  EXPECT_PATH_PARENT_EQ("../foo/bar", "../foo");
+  EXPECT_PATH_PARENT_EQ("../foo/bar/b", "../foo/bar");
+  EXPECT_PATH_PARENT_EQ("../foo/bar///baz///././/nay", "../foo/bar/baz");
+}
+
+#define EXPECT_PATH_NAME_EQ(expected, actual) EXPECT_EQ(PurePath{actual}, PurePath{expected}.Name())
+TEST(PurePathTest, Name) {
+  ConfigureLogging();
+
+  EXPECT_PATH_NAME_EQ("", "");
+  EXPECT_PATH_NAME_EQ("..", "..");
+  EXPECT_PATH_NAME_EQ("../..", "..");
+  EXPECT_PATH_NAME_EQ("../../../../../../../../..", "..");
+
+  EXPECT_PATH_NAME_EQ("/", "");
+  EXPECT_PATH_NAME_EQ("/abc", "abc");
+  EXPECT_PATH_NAME_EQ("abc", "abc");
+
+  EXPECT_PATH_NAME_EQ("/foo/bar", "bar");
+  EXPECT_PATH_NAME_EQ("/foo/bar/b", "b");
+  EXPECT_PATH_NAME_EQ("/foo/bar///baz///././/nay", "nay");
+  EXPECT_PATH_NAME_EQ("/foo/bar///baz///././/nay//./.", "nay");
+
+  EXPECT_PATH_NAME_EQ("foo/bar", "bar");
+  EXPECT_PATH_NAME_EQ("foo/bar/b", "b");
+  EXPECT_PATH_NAME_EQ("foo/bar///baz///././/nay", "nay");
+
+  EXPECT_PATH_NAME_EQ("../foo/bar", "bar");
+  EXPECT_PATH_NAME_EQ("../foo/bar/b", "b");
+  EXPECT_PATH_NAME_EQ("../foo/bar///baz///././/nay", "nay");
+}
+
+
+struct PathEntry {
+  Inode inode;
+  PurePath path;  // full path
+
+  static std::vector<PathEntry> Zip(std::vector<Inode>& inodes, std::vector<std::string>& paths) {
+    CHECK_EQ(inodes.size(), paths.size());
+
+    std::vector<PathEntry> entries;
+
+    static bool debug = true;  // Print only once.
+
+    if (debug) {
+      LOG(DEBUG) << "PathEntry::Zip (begin)";
+    }
+
+    for (size_t i = 0; i < inodes.size(); ++i) {
+      entries.push_back(PathEntry{inodes[i], PurePath{std::string{paths[i]}}});
+
+      // TODO: this seems awkward, maybe refactor into PurePath + PurePathView ?
+      DCHECK(entries[i].path.IsBorrowed() == false);
+
+      if (debug) {
+        LOG(DEBUG) << "PathEntry - add " << inodes[i] << " at '" << paths[i] << "'";
+      }
+    }
+
+    debug = false;
+
+    return entries;
+  }
+};
+
+std::ostream& operator<<(std::ostream& os, const PathEntry& path_entry) {
+  os << "PathEntry{inode=" << path_entry.inode << ",path=\"" << path_entry.path << "\"}";
+  return os;
+}
+
+// This super-inefficient class models a Tree to a list of absolute path names.
+// Obviously intended only for testing, since its algorithmically suboptimal.
+struct PathEntryTree {
+  std::vector<PathEntry> entries;
+
+  static constexpr bool debug{false};
+#define PET_LOG_DEBUG if (debug) LOG(DEBUG)
+
+  std::optional<PathEntry> GetEntryFor(const std::string& path_name) {
+    PurePath path{path_name};
+    for (auto&& entry : entries) {
+      if (entry.path == path) {
+        return entry;
+      }
+    }
+    return {};
+  }
+
+  bool HasDirectory(const std::string& path_name) {
+    PurePath path{path_name};
+    for (auto&& entry : entries) {
+      if (entry.path == path) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  std::vector<PathEntry> OpenDirectory(const std::string& path_name) {
+    PurePath path{path_name};
+    return OpenDirectory(path);
+  }
+
+  std::vector<PathEntry> OpenDirectory(const PurePath& path) {
+    std::vector<PathEntry> children;
+
+    PET_LOG_DEBUG << "OpenDirectory(" << path << ")";
+
+    for (auto&& entry : entries) {
+      // Only find the immediate children, don't find any other offspring.
+      PurePath parent = entry.path.Parent();
+      if (parent == path) {
+        if (parent == entry.path) {
+          // Ignore recursive parents, e.g. '/'
+          PET_LOG_DEBUG << "OpenDirectory - Ignore recursive parent " << parent;
+          continue;
+        }
+
+        children.push_back(entry);
+
+        DCHECK(!children.back().path.IsBorrowed());
+
+        PET_LOG_DEBUG << "OpenDirectory - Child added = " << entry;
+      }
+    }
+
+
+    return children;
+  }
+
+  size_t size() const {
+    return entries.size();
+  }
+};
+
+
+static std::vector<std::string> ParseLines(const char* what) {
+  std::vector<std::string> do_split = android::base::Split(what, "\n");
+
+  std::vector<std::string> output;
+  for (std::string& s : do_split) {
+    if (s.size() != 0) {
+      output.push_back(s);
+    }
+  }
+
+  return output;
+}
+
+static std::vector<Inode> ParseInodes(std::vector<std::string> inode_strings) {
+  std::vector<Inode> results;
+
+  for (std::string& s : inode_strings) {
+    Inode inode;
+
+    std::string error_msg;
+    bool inode_parse_succeeded = Inode::Parse(s, /*out*/&inode, /*out*/&error_msg);
+    CHECK(inode_parse_succeeded) << s << ", error: " << error_msg;
+
+    results.push_back(inode);
+  }
+
+  return results;
+}
+
+
+
+static PathEntryTree CreateFakePathEntries() {
+#if 1
+    // adb shell 'find /data/data/com.google.android.googlequicksearchbox/ | xargs stat -c "%d@%i"'
+    static const char* kInodeValues = R"1N0D3(
+66323@1117133
+66323@1127133
+66323@1137133
+66323@1327133
+66323@1336383
+66323@1376559
+66323@1376448
+66323@1376446
+66323@1376596
+66323@1376638
+66323@1376438
+66323@1376444
+66323@1376563
+66323@1376434
+66323@1376439
+66323@1336384
+66323@1335704
+66323@1336031
+66323@1335751
+66323@1337692
+66323@1336090
+66323@1336385
+66323@1376543
+66323@1376449
+66323@1376544
+66323@1376547
+66323@1376436
+66323@1336619
+66323@1336070
+66323@1336681
+66323@1336064
+66323@1336088
+66323@1336470
+66323@1335570
+66323@1335668
+66323@1336471
+66323@1335514
+66323@1376475
+66323@1376462
+66323@1376435
+66323@1376476
+66323@1376632
+66323@1351934
+66323@1351948
+66323@1351949
+66323@1351950
+66323@1351939
+66323@1376479
+66323@1376437
+66323@1376450
+66323@1376480
+66323@1376442
+66323@1376451
+66323@1376454
+66323@1376457
+66323@1376452
+66323@1376546
+66323@1335629
+66323@1343800
+66323@1343801
+66323@1336890
+66323@1336616
+66323@1336921
+66323@1327135
+66323@1335862
+66323@1336547
+66323@1351681
+66323@1351684
+66323@1351744
+66323@1351705
+66323@1351699
+66323@1351711
+66323@1351748
+66323@1351734
+66323@1351682
+66323@1351683
+66323@1351719
+66323@1351739
+66323@1351689
+66323@1351724
+66323@1351690
+66323@1351745
+66323@1351686
+66323@1351691
+66323@1351741
+66323@1351687
+66323@1351747
+66323@1351736
+66323@1351698
+66323@1351697
+66323@1351730
+66323@1351712
+66323@1351703
+66323@1351721
+66323@1351701
+66323@1351717
+66323@1351716
+66323@1351695
+66323@1351720
+66323@1351688
+66323@1351685
+66323@1351727
+66323@1351738
+66323@1351729
+66323@1351704
+66323@1351743
+66323@1351723
+66323@1351700
+66323@1351713
+66323@1351707
+66323@1351709
+66323@1351731
+66323@1351732
+66323@1351693
+66323@1351726
+66323@1351708
+66323@1351714
+66323@1351728
+66323@1351694
+66323@1351706
+66323@1351722
+66323@1351696
+66323@1351715
+66323@1351740
+66323@1351725
+66323@1351702
+66323@1351710
+66323@1351737
+66323@1351742
+66323@1351746
+66323@1351735
+66323@1351733
+66323@1351692
+66323@1351718
+66323@1336864
+66323@1335446
+66323@1337584
+66323@1335740
+66323@1335854
+66323@1336644
+66323@1376553
+66323@1376554
+66323@1376469
+66323@1376637
+66323@1376555
+66323@1376556
+66323@1376570
+66323@1376565
+66323@1376557
+66323@1376558
+66323@1376432
+66323@1376567
+66323@1376440
+66323@1343805
+66323@1336646
+66323@1336947
+66323@1336393
+66323@1336394
+66323@1335920
+66323@1336041
+66323@1335650
+66323@1336667
+66323@1336665
+66323@1335760
+66323@1343802
+66323@1343803
+66323@1344013
+66323@1344134
+66323@1376276
+66323@1336598
+66323@1336634
+66323@1336652
+66323@1336656
+66323@1336446
+66323@1336863
+66323@1337682
+66323@1336866
+66323@1336867
+66323@1335678
+66323@1336865
+66323@1327631
+66323@1327664
+66323@1327660
+66323@1327134
+66323@1336825
+66323@1337969
+66323@1335938
+66323@1337849
+66323@1337839
+66323@1337866
+66323@1337122
+66323@1337756
+66323@1336966
+66323@1337982
+66323@1337097
+66323@1336683
+66323@1337824
+66323@1337460
+66323@1337775
+66323@1337810
+66323@1337847
+66323@1335853
+66323@1337594
+66323@1337808
+66323@1337817
+66323@1337092
+66323@1337699
+66323@1337593
+66323@1337089
+66323@1335959
+66323@1337788
+66323@1337181
+66323@1337610
+66323@1336980
+66323@1337972
+66323@1337554
+66323@1337661
+66323@1337770
+66323@1335951
+66323@1337984
+66323@1336061
+66323@1337497
+66323@1337835
+66323@1337805
+66323@1336557
+66323@1336780
+66323@1337816
+66323@1337732
+66323@1337983
+66323@1337954
+66323@1337713
+66323@1337687
+66323@1337597
+66323@1337466
+66323@1337814
+66323@1337603
+66323@1337031
+66323@1336784
+66323@1337534
+66323@1337727
+66323@1337693
+66323@1337791
+66323@1337567
+66323@1337748
+66323@1337777
+66323@1336194
+66323@1337843
+66323@1336971
+66323@1337974
+66323@1336785
+66323@1337871
+66323@1337815
+66323@1337709
+66323@1337551
+66323@1337088
+66323@1337776
+66323@1337672
+66323@1335979
+66323@1337823
+66323@1336028
+66323@1337526
+66323@1337971
+66323@1337853
+66323@1337596
+66323@1337901
+66323@1337572
+66323@1335921
+66323@1336954
+66323@1337820
+66323@1335492
+66323@1337809
+66323@1337696
+66323@1335636
+66323@1337608
+66323@1335746
+66323@1337731
+66323@1337967
+66323@1337769
+66323@1337751
+66323@1337973
+66323@1337697
+66323@1335939
+66323@1336001
+66323@1337598
+66323@1336713
+66323@1337702
+66323@1337844
+66323@1337862
+66323@1336978
+66323@1337975
+66323@1336798
+66323@1337858
+66323@1337605
+66323@1337510
+66323@1337914
+66323@1376548
+66323@1376549
+66323@1376550
+66323@1376564
+66323@1376571
+66323@1376683
+66323@1376681
+66323@1376652
+66323@1376682
+66323@1376684
+66323@1376649
+66323@1376568
+66323@1376569
+66323@1376576
+66323@1376578
+66323@1376579
+66323@1376581
+66323@1376582
+66323@1376577
+66323@1376580
+66323@1376597
+66323@1376598
+66323@1376602
+66323@1376599
+66323@1376600
+66323@1376601
+66323@1376583
+66323@1376551
+66323@1376552
+66323@1376560
+66323@1376561
+66323@1376562
+66323@1376591
+66323@1376497
+66323@1376482
+66323@1376536
+66323@1376533
+66323@1376532
+66323@1336380
+66323@1336425
+66323@1337738
+66323@1337978
+66323@1337796
+66323@1337819
+66323@1337781
+66323@1337857
+66323@1337963
+66323@1335777
+66323@1337569
+66323@1337818
+66323@1337758
+66323@1337742
+66323@1336950
+66323@1337730
+66323@1337021
+66323@1335774
+66323@1337813
+66323@1337755
+66323@1337964
+66323@1337860
+66323@1338005
+66323@1336592
+66323@1336428
+66323@1335779
+66323@1337976
+66323@1337461
+66323@1337789
+66323@1337745
+66323@1337602
+66323@1337698
+66323@1336813
+66323@1337606
+66323@1337896
+66323@1337712
+66323@1337970
+66323@1337981
+66323@1335435
+66323@1337587
+66323@1337821
+66323@1337716
+66323@1337754
+66323@1337786
+66323@1337778
+66323@1336032
+66323@1338029
+66323@1337550
+66323@1337783
+66323@1337609
+66323@1337107
+66323@1337841
+66323@1337557
+66323@1337700
+66323@1337604
+66323@1337920
+66323@1337469
+66323@1337811
+66323@1337715
+66323@1337980
+66323@1336949
+66323@1337812
+66323@1337806
+66323@1337779
+66323@1337600
+66323@1336080
+66323@1337601
+66323@1336920
+66323@1337703
+66323@1337033
+66323@1336824
+66323@1337104
+66323@1337854
+66323@1336078
+66323@1336970
+66323@1337917
+66323@1337671
+66323@1337926
+66323@1336802
+66323@1337797
+66323@1338031
+66323@1337095
+66323@1337676
+66323@1337708
+66323@1335905
+66323@1336124
+66323@1337859
+66323@1337784
+66323@1337795
+66323@1337724
+66323@1337822
+66323@1336426
+66323@1337852
+66323@1337856
+66323@1337855
+66323@1337780
+66323@1337607
+66323@1336956
+66323@1337038
+66323@1336513
+66323@1336918
+66323@1336739
+66323@1337924
+66323@1337530
+66323@1337757
+66323@1337850
+66323@1337701
+66323@1336613
+66323@1337737
+66323@1336817
+66323@1337977
+66323@1336314
+66323@1337465
+66323@1336991
+66323@1337279
+66323@1337922
+66323@1337710
+66323@1337599
+66323@1337861
+66323@1336388
+66323@1336389
+66323@1336084
+66323@1335615
+66323@1336375
+66323@1335759
+66323@1336036
+66323@1336433
+66323@1335649
+66323@1337744
+66323@1336008
+66323@1336004
+66323@1336026
+66323@1335834
+66323@1336376
+66323@1336377
+66323@1336505
+66323@1336378
+66323@1335382
+66323@1337015
+66323@1336108
+66323@1337103
+66323@1335413
+66323@1335935
+66323@1335429
+66323@1337733
+66323@1336382
+66323@1336381
+66323@1336633
+66323@1337522
+66323@1336694
+66323@1335428
+)1N0D3";
+
+    const char* kPathNames = R"F1L3N4M3(
+/
+/data/
+/data/data/
+/data/data/com.google.android.googlequicksearchbox/
+/data/data/com.google.android.googlequicksearchbox/app_si
+/data/data/com.google.android.googlequicksearchbox/app_si/searchbox_stats_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/searchbox_stats_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/searchbox_stats_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/searchbox_stats_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/searchbox_stats_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/shortcuts_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/shortcuts_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/shortcuts_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/shortcuts_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/shortcuts_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/now_content_store_blob_9060309284749123123.bin
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/now_content_store_blob_9184734810098631032.bin
+/data/data/com.google.android.googlequicksearchbox/app_si/now_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/proactive_key_value_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/proactive_key_value_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/proactive_key_value_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/proactive_key_value_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/proactive_key_value_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/srp_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/srp_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/srp_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/srp_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/srp_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/state_dump_event_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/state_dump_event_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/state_dump_event_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/state_dump_event_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/state_dump_event_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/homescreen_shortcut_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/homescreen_shortcut_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/homescreen_shortcut_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/homescreen_shortcut_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/homescreen_shortcut_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/search_widget_overlay_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/search_widget_overlay_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/search_widget_overlay_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/search_widget_overlay_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/search_widget_overlay_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/opa_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/opa_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/opa_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_si/opa_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/opa_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/accl_conv_client_content_store
+/data/data/com.google.android.googlequicksearchbox/app_si/accl_conv_client_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/app_si/accl_conv_client_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/app_si/accl_conv_client_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/app_si/accl_conv_client_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/app_session
+/data/data/com.google.android.googlequicksearchbox/app_monet_init_data
+/data/data/com.google.android.googlequicksearchbox/app_monet_init_data/search.TYPE_SEARCHNOW.binarypb
+/data/data/com.google.android.googlequicksearchbox/no_backup
+/data/data/com.google.android.googlequicksearchbox/no_backup/com.google.InstanceId.properties
+/data/data/com.google.android.googlequicksearchbox/no_backup/com.google.android.gms.appid-no-backup
+/data/data/com.google.android.googlequicksearchbox/code_cache
+/data/data/com.google.android.googlequicksearchbox/app_sid
+/data/data/com.google.android.googlequicksearchbox/app_g3_models
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/CLG.prewalk.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/verbalizer_terse.mfar
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_app-actions_prompted-app-name_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/contacts.abnf
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_monastery_contact-disambig-static_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/wordlist.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/norm_fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/APP_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/APP_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/ep_portable_mean_stddev
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/portable_meanstddev
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/SONG_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/g2p_phonemes.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/TERSE_LSTM_LM.lstm_lm.main_model.uint8.data
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/voice_actions.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/CONTACT_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/TERSE_LSTM_LM.lstm_lm.self_normalized_model.uint8.data
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/pumpkin.mmap
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/CONTACT_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/word_confidence_classifier
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/offline_action_data.pb
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/config.pumpkin
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/compile_grammar.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/lstm_model.uint8.data
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_read-items_SearchMessageAction-Prompted-Read_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/embedded_class_denorm.mfar
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/g2p.data
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/dictation.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/endpointer_model.mmap
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/endpointer_model
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/c_fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/ep_portable_model.uint8.mmap
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/SONG_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/CONTACT.transform.mfar
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/hmmlist
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/portable_lstm
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/lexicon.U.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/embedded_normalizer.mfar
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/semantics.pumpkin
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/g2p_graphemes.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/dict
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_read-items_SearchMessageAction-Prompted-Skip_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_confirmation_confirmation-cancellation_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_media-actions_music-service-controllable_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/magic_mic.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/metadata
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/am_phonemes.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/hmm_symbols
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_gmm-actions_gmm-nav-actions_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_time-actions_time-context_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/input_mean_std_dev
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/benchmark.volvo.txt
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_calendar-actions_AddCalendarEvent-Prompted-FieldToChange_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/g2p_fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/commands.abnf
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/endpointer_dictation.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/prons_exception_dictionary_file.txt
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/grammar.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/dnn
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/en-US_monastery_GenericAction-Prompted-ContactName_TWIDDLER_FST.fst
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/phonelist
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/rescoring.fst.compact
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/voice_actions_compiler.config
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/offensive_word_normalizer.mfar
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/monastery_config.pumpkin
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/TERSE_LSTM_LM.lstm_lm.syms
+/data/data/com.google.android.googlequicksearchbox/app_g3_models/en-US/endpointer_voicesearch.config
+/data/data/com.google.android.googlequicksearchbox/app_textures
+/data/data/com.google.android.googlequicksearchbox/files
+/data/data/com.google.android.googlequicksearchbox/files/current_experiments.bin
+/data/data/com.google.android.googlequicksearchbox/files/training_question_data
+/data/data/com.google.android.googlequicksearchbox/files/now_request_queue
+/data/data/com.google.android.googlequicksearchbox/files/velour
+/data/data/com.google.android.googlequicksearchbox/files/velour/preferences
+/data/data/com.google.android.googlequicksearchbox/files/velour/preferences/ipa
+/data/data/com.google.android.googlequicksearchbox/files/velour/preferences/ipa/IpaBgTask
+/data/data/com.google.android.googlequicksearchbox/files/velour/preferences/wernicke_player
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_0p_instant_cache
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ZeroPrefixContacts
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_content_store
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_content_store/content_store.db
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_content_store/content_store.db-wal
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_content_store/content_store.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/files/velour/feature_data/ipa/ipa_content_store/content_store.db-shm
+/data/data/com.google.android.googlequicksearchbox/files/velour/jar_data
+/data/data/com.google.android.googlequicksearchbox/files/velour/verified_jars
+/data/data/com.google.android.googlequicksearchbox/files/velour/dex_cache
+/data/data/com.google.android.googlequicksearchbox/files/native_crash_dir
+/data/data/com.google.android.googlequicksearchbox/files/native_crash_dir/com.google.android.googlequicksearchbox:search
+/data/data/com.google.android.googlequicksearchbox/files/current_configuration.bin
+/data/data/com.google.android.googlequicksearchbox/files/dynamic_update_config_log
+/data/data/com.google.android.googlequicksearchbox/files/brainsuggest
+/data/data/com.google.android.googlequicksearchbox/files/brainsuggest/libbrainsuggest.so
+/data/data/com.google.android.googlequicksearchbox/files/brainsuggest/tensors.bin
+/data/data/com.google.android.googlequicksearchbox/files/persisted_profiling_statistics
+/data/data/com.google.android.googlequicksearchbox/files/en-US
+/data/data/com.google.android.googlequicksearchbox/files/en-US/x_hotword.data
+/data/data/com.google.android.googlequicksearchbox/files/recently
+/data/data/com.google.android.googlequicksearchbox/files/recently/libcore.test@gmail.com
+/data/data/com.google.android.googlequicksearchbox/files/dump
+/data/data/com.google.android.googlequicksearchbox/files/bloblobber
+/data/data/com.google.android.googlequicksearchbox/files/bloblobber/pending
+/data/data/com.google.android.googlequicksearchbox/files/web_suggest_model
+/data/data/com.google.android.googlequicksearchbox/files/web_suggest_model/index.bin
+/data/data/com.google.android.googlequicksearchbox/files/client_data_request_log
+/data/data/com.google.android.googlequicksearchbox/app_webview
+/data/data/com.google.android.googlequicksearchbox/app_webview/variations_seed_new
+/data/data/com.google.android.googlequicksearchbox/app_webview/Cookies-journal
+/data/data/com.google.android.googlequicksearchbox/app_webview/variations_stamp
+/data/data/com.google.android.googlequicksearchbox/app_webview/variations_seed
+/data/data/com.google.android.googlequicksearchbox/app_webview/Cookies
+/data/data/com.google.android.googlequicksearchbox/app_shared_prefs
+/data/data/com.google.android.googlequicksearchbox/app_shared_prefs/StartupSettings.bin
+/data/data/com.google.android.googlequicksearchbox/app_shared_prefs/SearchSettings.bin
+/data/data/com.google.android.googlequicksearchbox/cache
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/fd12e9a1ba593cbe075c925a95626534054861f9dd82fa27f656ac0088648fd9.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/4a19d733c917d730443eaff509ee0496e116f79c69d0d2fa54a594f5accd19d1.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/76f6a9848373162cd602a03e00e363ad8455e62293e9218d57da728f7382ee34.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/666d7a8c0d257a9a9f1457a1bb04b8eda821966283d466db872d5693de42d29b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/0f714cd570228ce48e2741fd6ff959bcbbab49e40427b6eb5c4b1ff3aae4ad40.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/458acc9b996dc815a7259a2c9dbf5b94ae549da3d66f3649d1e0a1e239214390.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/13ec5eaf61460a0be11467ba2e0efad6602142e45fd1c97988bc42aa54832407.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/99b468ff1549d8e260ce274f7afdaaf32fb70064c31596173b812ea2d11c8097.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/40c737d31b2d843c5772648820deeb4c8d5bef9426b025f75bdc72ba7913e0fd.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/41186543405abfea16b57da566ce9e509826f9b1b6337473d05d9421f53912aa.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/cda361ffde7db6bedfeb9f01a63dd51ebbe4b733d3c6be69cede7a681d20b583.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/108adf201cd9b479777504c8e7fb74299bbc2b51082d2872a34616abe6c743fb.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/47a3358d7989bf06c4ce1ecb350149b1669bf16073ea1d321371a02ad3507d63.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/0c25c0bd4df514cdd4531872553e053b74a3b9a60476871184b7e8c2a1b67048.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/936a9280b8b33ffaf98e9497927d7d84cfc87757bf235569fa950c55922ab76c.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/4cb136284aa9e19be2492e23d421297736f888ddf03cd7eebdb690d4f3b929c1.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/43f3dcad386912254bc1b2a6cd8414c3373f465665655584a0cf31b9c2f6ce6f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/73c62366e6dda1ee960692d71e4ff9ba92d193b966986866793e64dec10fdc9b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/d361cbbc4c1c8a5eeda8dda6173926c112f28f0bc49efc7946a0c218b4195fa3.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/eb0939417658eea85bdccd5b4c1c460f836649e442cad3100393e039f8f82fe6.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/5979b3d43ade0ddbf8aa86e3ef5e2951fb677bcc0a39d133433bd58989328130.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/82f2aaeedc6ddb9a8086912bd8064c5aac85437814d7ef6e5a6fb5e22bd71491.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/cf4ed99e5d88c5bbf18d812c6eb7a5b90f12e47f346b33061f6ad6c073d81be7.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/f5f95fe8ca532f13faeb1209981138d786f0df2e061d151fe655a571a8ddd88c.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/5a5f20fcb280a697e2f22c460d796fbd291481760480a764d6fe6a6c83e6380a.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/dba86bd8a4f75d2148b80fb04d525193b29b060fbf8a4743fe1b41e39c4fb25d.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/d7017ff3c9fbda9a376ff72d8a95eb9e0a5858cf50ee82a5b92d6e995550867d.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/a6bf758115a73beafa9124803667e93729442e7cad367a86608ad9ad8655b08b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/24ae44003669f9f9640832b4c9cf9acb8ac3c2adf5ab5a2444a7715b090b3f67.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/b39aac6d9d0b5ea2ce78831602e48e0a48f7f2c792697e9c58de1d45b27a792a.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/9194df1b37d6a7da9ee8fd03abebdc3e81ec6ea366224eecb0cd7d3d66024062.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/f64b3e72b098f53f10ca3f3031b93df60c8ef407510bab8a003c9747e82f6043.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/6ff297c691797ab5fd5222b0c1fa13abc750fc031685a29589eace7748864318.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/8704bbe8a29455b6034d773c57246b1633da5393fd102f87fcb6eca819b82753.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ef4146d94b8e32988b3cb0eba7e967cfa9627a683a1359cf00a1d76aa5022680.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ebf974f9350e2f784145463f0afcccac69f265af0e8b233813617829684a290f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/06a6aaede02e9527e1eb6dad977a7889e22d2dfcc098f9342eacc134c31363df.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/d915555e83e27c4d5f6dcd1badaaed666fa80e5ae11d6d2382e666efe606bd1f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/a189554aa8b3185799fdb5bfb89cc42698c544a1041e65709b0e79d267cabdc5.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/0f310a87cae45484d5da35274ff89463eb966a1aeb32d53a2fb8350cf9d836b2.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/df7598066371b7da446954feb42a1febdb8921cacf436285e85606cae9de4bb5.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ff8d8869f35a9a4243fac1ce8ab5deff7ee161dfc8c2ea1107099ec1cf74e100.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/75d36a907297689726ca96ef721c091c04a879f1f096f503076dd172834a27dc.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/5e6fee09c93c6f1d493bd04dd18cc8043c0b40093d85ed94c2df28ab129b226b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/d7ddd06a2070b76dc05fe12741d7882df5a4312b174a11ce3d98d059fcc17173.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7bcac404ee6981364837ac1a89033184ff65939507a81caa7c43ea52a195e215.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/392ac948386e63063f941449eeb9199c3f1a05959934c47c5987bbf6aa0721a3.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/df13e0aac1211176a1939bf2198f9e0e7dedd1f043875a4093ce0265cd02744e.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/052649971efbb0e18631044219b92ab68f12dc244041042b24203c88a62377b6.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/1e86ba82b4061a7ef799089ce29826fcba0ba07c77aec6638f20e850d1864144.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7fe25319e6b2049b96c6659264568defe6a7e21bb3817685970b3a3aa511d8c8.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/3a66049907f84778aa548c747d9a52c2e67ce880c19fa4b0a8b4e58ae96fd9ef.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/54f622cb04525cc1953cc1ffbe12646be3290de6ca378ce5508869860df761e5.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/6fa117d5fcf115733a154f5d0911ce05b103ea33d5eee65d2b08a83605cf6e80.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/cc1d2b8828dc4dba9f0ea7d980eb8b24d2b0792c3282725552a56f7c8929459f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/9b59194c025f9e6fc5c1d60ee444be69f14546b7efa4389a30ee6db88fbc207f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/8686d00f5e82bb2343d8154fad3d66afca1420c45e4f63fe5decb6b9f5b84d2b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/6b7ac224bb235b03798c358125eadc5d805445744543c368ebc0a4f7bb7a4328.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/dfb89354e0b433989eab276004296575f5b5e3ecb8c700cfcee620765ef0e74d.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ef0656c2dce6c462c2e2591b5c43b76c1fe83ebebbaa778c1194706577c46d5c.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7bfb6c4c45d0dcfbd66456456c5300b3ba83d52f37c5434e3e78baf0b54e5c07.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/c61ee02616c8d1c87be89499cb1ebdcd7267e47e51fa53e10578e8935a8b7aa9.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/f32062ec857d3d40d3a82359511167113065019d09d10755764aec91ba37bb32.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/d678ca3b06ea1872ebb20236ed1099e1b6e1451c51d78ab98d914abead7e4651.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ee4c2e6785e3062be57305190a480ee437f6569471534533dd3524794b125ace.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/9a3ee31c30754a89da9280cbff44440e8e974bfac4c815376a0df768ef926590.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/334ae045a86998d77ed3fca093d7c43dfd5be53f939d156d9e71a885263739c1.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/65b4c081cd081eb8716e435c51abf7882f9aacb47005d77aa336ddf8190f2249.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/e2d38a33de7d378bf8a2989ae6db7b20d9168dd9b4c078225ced7aef9154a370.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/988ece4e5c191b30ff71dd2ce3fa3dc16f22dd3076702c17e9f3373612765c9c.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/272e01e003b0a4ed9b8ebb908d88cf1fbc841f65cf3c5994e99c7e5b10332209.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/eb1fd91a2d9b5feba4504c7ee8182ec680121e83a1571a292d52bf7cac12c396.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ea4967bd3dec3fdcf48ba9682777ae09b1be48ae861a5fb55f8650fccb24aeb5.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/23653a7282567de2cc678619554153f1aff5409061b2a08ffedf208b10c7fd9f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/6e4b9df052f0c4c0b726301c66e4aedc596a01416268857f3742c1eaf6760c64.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7f82912066c187783d04de0b189314fcde9d33208335827a6d0fa8755637a136.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/f07293e9a6dc9a826363cb52fbc0db1f75fbba49814cb626db63affa74dbc9bc.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/46df84d2163240ae59efe0c91b94b3d23018daa816de1d44405275e17b5f4e77.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/1101fd494d1a226a790d5091f04fae9bcab5543eec8c80a0d3dd8b83a8d31c14.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/2f405ef994ff2c7470116d092ec7e9a8833400354479760742e616f800e19831.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/5f1efddc7e6c6bb7984813794cd275f0cf46d2bf598ac16cc7adc05c9878eb22.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/c641b68789fcc05feb518d6ea7dd5ffa1344c124263e67573c86786766547fa8.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/f9b35c5e0adbd9f0084559cd909d57a1dc8928b5c48887a1119d226226664270.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/3ab2ef4b9b5f1900ff51f892d531b2abc539f9acfb728c841f35dab93bde160f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/c92c58cb868b0c698c9e24ea9dfb63f1f4587a04fbc0cc6d495058ebb7534f69.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/46cb9725c59d409c7e7603f9eab6d2dbd3b29e5d4aef2fb154d5ceda40a33f85.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/b4fd15d151bbcf2f299a24ccd2c7e94afae7d6eccf7208f65b06febc5958d95d.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/191e06e43ac8a9618a5c1f10178e7cdf6e609f14dc7ec56be2ea89ac19b5e253.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/69191aa596bfd2633279e0488152f67565ae47bf3e9e728b9c57376bfd2abdc3.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/222870114e13280aa20077b14588e6d2fa8e7a7b347cde4a01553e395fb40a22.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/ba3636d73e375a6f16a878752464adaa57a03614dbb3e2d68e26d08d686262c3.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/b9b7fb42891473d4906c7acb11f8680565eb02eabce71a8645f917bb1375c0d2.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7d62853edb09b73996a0d4bb369067e45fc229926a8961207596a3162941dccd.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/c0bcad354275f905e235af359dd789db4110201a4ef1fd7f8d4aae3563ff06a5.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/66397bf25b427e4d910ca117e3ce8afb8e19012403c7a1716696eca2da261884.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/487b35586c4591772393a2d2f430d00f97c3d36ad8ee7be784f130249cac7c31.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/6b664a4b20fde7754d5448f129532fded9103284aa101b50b79f810246f75a3b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/2752173075a4ef17451a0a3db546956389eff82db209711e4a1fff47e90b6065.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/265252b3db2c2501483502b6aadab3ea891f32cae539b5ccc7ef8295b63f4018.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/b5cc6b97c28bd853ebf7d853a7b19e4b5018c01eae8823ac537800c2cbb06011.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/c9b094709f2b2773b5e5258716df0663b2aee98a6ea47c3cb4040322123cb99c.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/7f158d1bfbafe42c7b3118d2b9ea701bda16df10dbdf9c4f2779ea15595a331f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/518548841153bce3488afa3a36ad6e6cbddb4f1689f5e9366ee80e206b6a1ffe.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/629e460d17bf23cce5d75bbe8672e037db86d8d757cc4efd9a1a0f53d435425b.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/667ddeda218b4f95a47792345550d546e00fe2a52a505437d30608cefd0fc4bd.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/20d9f1018284a761162108e9a82d6a73b1fa8a9fd6866a506db77ed07ec5e578.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/1f35f42d565dd11860e30c41241c78bc5f06d724117bfc83b3784c66d52e332f.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/58cdc6432a1cd95f7f6427744019b59d164384edfc54aa51537d4685f847ba39.0
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/journal
+/data/data/com.google.android.googlequicksearchbox/cache/image_manager_disk_cache/61f774ab3a005d56366b267b08b994e5b035ff8eab1e454f00fb2cf7b356a46f.0
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/prons.cache
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/digest
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/semantic_fst
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/grammar_symbols
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/semantic_symbols
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/metadata
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contacts/v1539635905559/grammar_clg
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/grammar_clg
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/semantic_fst
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/semantic_symbols
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/digest
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/metadata
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/v1536705472984/grammar_symbols
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/hands_free_commands/prons.cache
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names/v1536705480879
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names/v1536705480879/metadata
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names/v1536705480879/SONG_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names/v1536705480879/SONG_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/music_names/v1536705480879/digest
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names/v1539635914600
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names/v1539635914600/CONTACT_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names/v1539635914600/CONTACT_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names/v1539635914600/digest
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/contact_names/v1539635914600/metadata
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names/v1543480552712
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names/v1543480552712/APP_NAME.fst
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names/v1543480552712/digest
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names/v1543480552712/metadata
+/data/data/com.google.android.googlequicksearchbox/cache/g3_grammars/en-US/app_names/v1543480552712/APP_NAME.syms
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/79b5269c206115a4_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/aa9db037f918da1f_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/aebae57f6f7dcdb9_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e446f170a9c613a1_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/2f06680d22ff6fbf_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ffa3f495612db016_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/69c20684e88c955b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ef65bf506ba3e339_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/014821f96953c508_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/1180e087d9bd1160_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3b36cd7b2f6df416_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e5701f55e9ce22c8_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/9ec568d6b3dc0762_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/88f57d1088993219_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/83fd8318538fbe29_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/22930ed83887868c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/333bf7ac47cc9770_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/adfd903f6a8ce876_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/2a1237e13688c120_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3f3f18bf8e704931_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/b8262fc8c9591057_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/59829c5897cb9d93_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/index-dir
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/index-dir/the-real-index
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/feb5af6bca039e09_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/0050e1bcb6d6546c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3a3d22ec4fc7ad21_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/5f269f49d811cd82_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e1cf52389fbebceb_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/359582e09cf26c7a_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/964347070fc23ea0_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/fb7d48b4e068afda_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/a5c586e8f0aeb850_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/37fadb6203e4e379_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/a7c25e80d95ef15d_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/a11922fc39ec0249_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/bebb870e573c852c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/89c95cdfc9b59f48_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/fcb3fff3117a2d12_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/5c48229cf8e35d0b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/55a3abf82b2a626c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/f79ff1a77d9e9492_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ca9ccf019443fb16_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/986246894e9084ec_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e546ff051d5dbafc_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/23b6960b741da560_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/8c9509f47aa07ed8_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/81be3f3a1ebb3222_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/4edb09d9737acff2_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e89950485ea68183_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e40df7fec15afae9_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/cc338158aa28d723_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/4797a2fb8c7eac6b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/411f64d386b7c4fe_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/29f6d5d8b27eb0c5_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e99ae68f3e468751_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/502dafda143b5a74_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d1783d0a170fdb8e_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ac27a389f7bf6b67_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/40300177b5c0050d_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/4a8de756f1428237_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e029cf1b0932611f_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/c69ff5c7e450ab22_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/bdfd0aa008d40005_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/40dd89dd968602d3_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d04eb6456f31d2f7_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ff4e7b79b6327627_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/b136f3771ffb9958_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/207bb56723cc5c3a_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/95035b9448e65cf2_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/73afbe7f6b7a496c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/84b41c998e542199_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d68d127f97a27059_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/037a0f2e4460355f_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/da584b3cb202e078_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/2d6c5245e29028b2_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ca9b25d228896196_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/0e2708cf50936235_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ab39283d30a39dd1_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/f721910d7c288b54_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/e1cd683779c2ea08_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d1a8c9a323296d5b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/4821c08320e603ae_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/01a2afcf422b3b4f_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d41f0a4d475402fd_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/fcacc70d27c27f8b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/f76d072b8c546a89_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/aff6b5b6e20cc2fa_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/8037b4d4c7774071_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/index
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/1e6d9e3ecd002bc9_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3cfe648fbdd026a7_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/ab5d3ea4f0904068_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/9a785469b604c8af_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/472d78242cce2d22_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/503a7645e7f2d973_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/593a42d396c32634_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/b6ee82fb12843073_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3561efa2281c73ed_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/318755c427839e86_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3ef890a79ddb7e0c_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/d9772c6ee701ad39_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/5b3eff799688e021_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/30bb71565ae0cc27_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/54afe61c6fcf0e3f_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/8c9d078e6dbc501d_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/32a4f6fc17306385_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/0111bfd7286ca658_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/55ccaf33bd76fb46_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/65b80b5a552aaeaf_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/30fffcc41f7846bf_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/5377846224f95fc9_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/f9c93b74a177706b_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/94239554b50b59b5_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/14ced047ba93cdd3_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/2ceea49fe8c9e2fe_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/disk_cache/3ec7cdbc127eae35_0
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/version
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/prefs
+/data/data/com.google.android.googlequicksearchbox/cache/cronet-async/prefs/local_prefs.json
+/data/data/com.google.android.googlequicksearchbox/cache/si
+/data/data/com.google.android.googlequicksearchbox/databases
+/data/data/com.google.android.googlequicksearchbox/databases/icing-mdh.db-wal
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement.db-shm
+/data/data/com.google.android.googlequicksearchbox/databases/icing-mdh.db-shm
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement_local.db
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement_local.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement.db-wal
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/databases/google_app_measurement.db
+/data/data/com.google.android.googlequicksearchbox/databases/icing-mdh.db-wipecheck
+/data/data/com.google.android.googlequicksearchbox/databases/launcher.db
+/data/data/com.google.android.googlequicksearchbox/databases/launcher.db-wal
+/data/data/com.google.android.googlequicksearchbox/databases/icing-mdh.db
+/data/data/com.google.android.googlequicksearchbox/databases/launcher.db-shm
+/data/data/com.google.android.googlequicksearchbox/shared_prefs
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/AccountSwitcherDrawerPresenter.Prefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/com.google.android.gms.appid.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/consecutive_crash_stats.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/uncaught_exception_handler_stats.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/VoiceInteractionService.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/interactor_process_uncaught_exception_handler_stats.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/WebViewChromiumPrefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/com.android.launcher3.managedusers.prefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/com.android.launcher3.prefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/GEL.GSAPrefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/com.google.android.gms.measurement.prefs.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/ThrottlingLogger.xml
+/data/data/com.google.android.googlequicksearchbox/shared_prefs/default_process_uncaught_exception_handler_stats.xml
+)F1L3N4M3";
+
+#else
+
+    static const char* kInodeValues = R"1N0D3(
+66323@1117133
+66323@1127134
+66323@1137135
+66323@1137136
+66323@1137137
+)1N0D3";
+
+    const char* kPathNames = R"F1L3N4M3(
+/
+/data/
+/data/data/
+/data/data/file
+/data/data/last_file
+)F1L3N4M3";
+
+#endif
+
+
+    std::vector<std::string> inode_values = ParseLines(kInodeValues);
+    std::vector<std::string> path_names = ParseLines(kPathNames);
+
+    std::vector<Inode> inodes = ParseInodes(inode_values);
+
+    return PathEntryTree{ PathEntry::Zip(inodes, path_names) };
+}
+
+class FakeSystemCall : public SystemCall {
+ public:
+  // stat(2)
+  virtual int stat(const char *pathname, struct stat *statbuf) override {
+    if (pathname == nullptr || statbuf == nullptr) {
+      errno = EINVAL;
+      return -1;
+    }
+
+    std::optional<PathEntry> maybe_path_entry = path_entries_.GetEntryFor(pathname);
+
+    if (!maybe_path_entry) {
+      errno = ENOENT;
+      return -1;
+    }
+
+    memset(statbuf, 0, sizeof(*statbuf));
+
+    Inode inode = maybe_path_entry->inode;
+    statbuf->st_dev = makedev(static_cast<int>(inode.device_major),
+                              static_cast<int>(inode.device_minor));
+    statbuf->st_ino = static_cast<ino_t>(inode.inode);
+
+    return 0;
+  }
+
+  static constexpr bool debug{false};
+
+#define FS_LOG_DEBUG if (debug) LOG(DEBUG)
+
+  // opendir(3)
+  virtual DIR *opendir(const char *name) override {
+
+    FS_LOG_DEBUG << "opendir(" << name << ")";
+
+    std::string name_str{name};
+    if (path_entries_.HasDirectory(name_str)) {
+        CHECK(!state_.open_);
+
+        std::vector<PathEntry> children = path_entries_.OpenDirectory(name_str);
+
+        state_ = State::Open(name_str, std::move(children));
+
+        FS_LOG_DEBUG << "opendir - success, state address: " << &state_;
+
+        return get_state_as_dir();
+    }
+
+    FS_LOG_DEBUG << "opendir - no matching entry, scanned " << path_entries_.size();
+
+    // TODO. errno.
+    errno = EINVAL;
+    return nullptr;
+  }
+
+  // readdir(3)
+  virtual struct dirent *readdir(DIR *dirp) override {
+    DCHECK(dirp != nullptr);
+    // We could also errno=EBADF but this seems more apropro to test.
+
+    State* state = dir_to_state(dirp);
+    (void) state;
+    DCHECK(state != nullptr);
+
+    std::optional<PathEntry> path_entry_opt = state->ReadDir();
+
+    if (!path_entry_opt) {
+      FS_LOG_DEBUG << "readdir(" << &state << ") - no children left ";
+
+      // No more children left. We have exhausted them all.
+      return nullptr;
+    }
+
+    PathEntry path_entry = *path_entry_opt;
+
+    FS_LOG_DEBUG << "readdir(" << &state << ") - called for " << path_entry.path;
+
+    // TODO. impelment this.
+    static struct dirent dir_ent{};
+
+    // Clear it again.
+    memset(&dir_ent, 0, sizeof(dir_ent));
+
+    dir_ent.d_ino = path_entry.inode.inode;
+
+    FS_LOG_DEBUG << "readdir(" << &state << ") - children check" << path_entry.path;
+
+    // Is this a file (no children) or a directory (some children)?
+    //
+    // In reality some directories might be empty too, but lets not worry about it yet.
+    std::vector<PathEntry> children = path_entries_.OpenDirectory(path_entry.path);
+
+    if (children.empty()) {
+      dir_ent.d_type = DT_REG;
+    } else {
+      dir_ent.d_type = DT_DIR;
+    }
+
+    // the d_name must be just the final name component of a path.
+    // Do not include the full path.
+
+    std::string_view name_view = path_entry.path.Name();
+    DCHECK_LT(name_view.size(), sizeof(dir_ent.d_name));
+
+    std::copy(name_view.begin(),
+              name_view.end(),
+              &dir_ent.d_name[0]);
+    dir_ent.d_name[name_view.size()] = '\0';
+
+    FS_LOG_DEBUG << "readdir(" << &state << ") - return , d_name=\"" << dir_ent.d_name << "\""
+                 << ", d_type=" << (dir_ent.d_type == DT_REG ? "DT_REG" : "DT_DIR");
+
+    return &dir_ent;
+  }
+
+  // closedir(3)
+  virtual int closedir(DIR *dirp) override {
+    CHECK(dirp != nullptr);
+    State* state = dir_to_state(dirp);
+    state->Close();
+
+    return 0;
+  }
+
+  FakeSystemCall() {
+    path_entries_ = CreateFakePathEntries();
+  }
+
+ private:
+  struct State {
+    std::string name_;
+    bool open_{false};
+    std::vector<PathEntry> children;
+
+    static State Open(std::string name, std::vector<PathEntry> children) {
+      return State{name, /*open*/true, std::move(children)};
+    }
+
+    std::optional<PathEntry> ReadDir() {
+      if (children.empty()) {
+        return {};
+      }
+
+      PathEntry last = children.back();
+      children.pop_back();
+
+      return { std::move(last) };
+    }
+
+    void Close() {
+      CHECK(open_);
+      open_ = false;
+    }
+  };
+
+  DIR* get_state_as_dir() {
+    return reinterpret_cast<DIR*>(reinterpret_cast<void*>(&state_));
+  }
+
+  State* dir_to_state(DIR* dirp) {
+    return reinterpret_cast<State*>(reinterpret_cast<void*>(dirp));
+  }
+
+  State state_;
+
+  PathEntryTree path_entries_;
+};
+
+class MockSystemCall : public SystemCall {
+ public:
+  INJECT(MockSystemCall()) {
+    // Delegate calls to a fake (see the googlemock CookBook for more details).
+    // https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#delegating-calls-to-a-fake
+    DelegateToFake();
+
+    WorkAroundForNiceMock();
+  }
+
+  ~MockSystemCall() {
+  }
+
+  MOCK_METHOD2(stat, int(const char *, struct stat *));
+  MOCK_METHOD1(opendir, DIR*(const char *));
+  MOCK_METHOD1(readdir, struct dirent*(DIR*));
+  MOCK_METHOD1(closedir, int(DIR*));
+
+  // Delegates the default actions of the methods to a FakeSystemCall object.
+  // This must be called *before* the custom ON_CALL() statements.
+  void DelegateToFake() {
+    ON_CALL(*this, stat(_,_))
+        .WillByDefault(Invoke(&fake_, &FakeSystemCall::stat));
+    ON_CALL(*this, opendir(_))
+        .WillByDefault(Invoke(&fake_, &FakeSystemCall::opendir));
+    ON_CALL(*this, readdir(_))
+        .WillByDefault(Invoke(&fake_, &FakeSystemCall::readdir));
+    ON_CALL(*this, closedir(_))
+        .WillByDefault(Invoke(&fake_, &FakeSystemCall::closedir));
+  }
+
+  void WorkAroundForNiceMock();
+
+ private:
+  FakeSystemCall fake_;
+};
+
+// Don't print any warnings when methods are executed without EXPECT_CALL.
+//using NiceMockSystemCall = NiceMock<MockSystemCall>;
+
+// Can't use NiceMock<MockSystemCall> here, fails with this compilation error
+//
+// external/google-fruit/include/fruit/impl/injection_errors.h:107:3: error: static_assert failed due to requirement 'AlwaysFalse<NiceMock<MockSystemCall> >::value' "C::Inject is a signature, but does not return a C. Maybe the class C has no Inject typedef and inherited the base class' one? If that's not the case, make sure it returns just C, not C* or other types."
+using NiceMockSystemCall = MockSystemCall;
+
+void MockSystemCall::WorkAroundForNiceMock() {
+  // Should be able to use NiceMock instead, but fruit is having problems compiling.
+  EXPECT_CALL(*this, stat).Times(AtLeast(0));
+  EXPECT_CALL(*this, opendir).Times(AtLeast(0));
+  EXPECT_CALL(*this, readdir).Times(AtLeast(0));
+  EXPECT_CALL(*this, closedir).Times(AtLeast(0));
+}
+
+fruit::Component<SearchDirectories, NiceMockSystemCall> getTestComponents() {
+    return fruit::createComponent()
+        .bind<SystemCall, NiceMockSystemCall>();
+}
+
+// TODO: there might be a helper or similar to do this instead.
+template <typename T>
+static std::vector<T> subscribe_drain(std::pair<rxcpp::observable<T>,
+                                                std::unique_ptr<SearchDirectories::RxAnyConnectable>> pair) {
+  rxcpp::observable<T>& obs = pair.first;
+  std::unique_ptr<SearchDirectories::RxAnyConnectable>& connectable_ptr = pair.second;
+
+  std::vector<T> vec;
+
+  obs.subscribe([&vec](auto&& x) {
+    vec.push_back(IORAP_FORWARD_LAMBDA(x));
+  });
+
+  CHECK(connectable_ptr != nullptr);
+
+  // Execute above lambda, blocking until all values are drained.
+  connectable_ptr->connect();
+
+  return vec;
+}
+
+struct SearchDirectoriesParam {
+  std::vector<std::string> root_directories;
+  std::vector<Inode> search_inodes;
+  std::vector<InodeResult> expected_results;
+};
+
+template <typename It>
+std::ostream& iterator_to_stream(std::ostream& os, It begin, It end) {
+  os << "{";
+  while (begin != end) {
+    os << *begin;
+    os << ",";
+
+    ++begin;
+  }
+  os << "}";
+
+  return os;
+}
+
+template <typename T>
+std::ostream& container_to_stream(std::ostream& os, T&& c) {
+  return iterator_to_stream(os, c.begin(), c.end());
+}
+
+std::ostream& operator<<(std::ostream& os, const SearchDirectoriesParam& p) {
+  os << "{";
+  os << "root_directories:";
+  container_to_stream(os, p.root_directories);
+  os << ", ";
+  os << "search_inodes:";
+  container_to_stream(os, p.search_inodes) << ", ";
+  os << "expected_results:";
+  container_to_stream(os, p.expected_results);
+  os << "}";
+  return os;
+}
+
+struct SearchDirectoriesTest :
+    public ::testing::TestWithParam<SearchDirectoriesParam> {
+
+  static void SetUpTestCase() {
+    ConfigureLogging();
+  }
+
+  virtual void SetUp() override {
+    auto pair =
+        search.FindFilenamesFromInodesPair(GetParam().root_directories,
+                                           GetParam().search_inodes,
+                                           SearchMode::kInProcessDirect);
+
+    actual = subscribe_drain(std::move(pair));
+    expected = GetParam().expected_results;
+  }
+
+  virtual void TearDown() override {
+    // TODO.
+  }
+
+ protected:
+  fruit::Injector<SearchDirectories, NiceMockSystemCall> injector{getTestComponents};
+
+  SearchDirectories& search = injector.get<SearchDirectories&>();
+  MockSystemCall& mock_syscall = injector.get<NiceMockSystemCall&>();
+
+  std::vector<InodeResult> actual;
+  std::vector<InodeResult> expected;
+};
+
+TEST_P(SearchDirectoriesTest, ElementsAreArrayMatcher) {
+  EXPECT_THAT(actual, ElementsAreArray(expected));
+}
+
+auto MakeEmptyInodes(std::vector<std::string> root_dirs) {
+  return SearchDirectoriesParam{root_dirs, /*inodes*/{}, /*actual*/{}};
+}
+
+// When are are 0 inodes to search for, the results will be empty.
+INSTANTIATE_TEST_CASE_P(EmptyResults,
+                        SearchDirectoriesTest,
+                        ::testing::Values(
+                            MakeEmptyInodes(/*root_dirs*/{}),
+                            MakeEmptyInodes(/*root_dirs*/{""}),
+                            MakeEmptyInodes(/*root_dirs*/{"/"}),
+                            MakeEmptyInodes(/*root_dirs*/{"/abc"})
+                        ));
+
+
+auto MakeAllFailInodes(std::vector<std::string> root_dirs, std::vector<Inode> inodes) {
+  std::vector<InodeResult> results;
+  for (const Inode& inode : inodes) {
+    results.push_back(InodeResult::makeFailure(inode, InodeResult::kCouldNotFindFilename));
+  }
+
+  return SearchDirectoriesParam{root_dirs, inodes, results};
+}
+
+// TODO: fixme
+
+#if 1
+
+// When none of the inodes can be found, all results will be failing results.
+INSTANTIATE_TEST_CASE_P(AllResultsAreErrorCouldNotFindFilename,
+                        SearchDirectoriesTest,
+                        ::testing::Values(
+                            // TODO: why is empty root dir failing?
+                            // MakeAllFailInodes(/*root_dirs*/{}, {Inode{1,2,3}}),
+                            MakeAllFailInodes(/*root_dirs*/{"/"}, {Inode{1,2,3}}),
+                            MakeAllFailInodes(/*root_dirs*/{"/data"}, {Inode{1,2,3}}),
+                            MakeAllFailInodes(/*root_dirs*/{"/data/data"}, {Inode{1,2,3}})
+                        ));
+
+auto MakeAllPassInodes(std::vector<std::string> root_dirs, std::vector<std::string> inodes, std::vector<std::string> paths) {
+  std::vector<InodeResult> results;
+
+  std::vector<Inode> inodes_actual;
+
+  size_t i = 0;
+  for (const std::string& inode_str : inodes) {
+    Inode inode;
+    std::string error_msg;
+
+    CHECK(Inode::Parse(inode_str, &inode, &error_msg));
+
+    inodes_actual.push_back(inode);
+
+    std::string& path = paths[i];
+    results.push_back(InodeResult::makeSuccess(inode, path));
+
+    ++i;
+  }
+
+  return SearchDirectoriesParam{root_dirs, inodes_actual, results};
+}
+
+// Find all the inodes. Yay.
+INSTANTIATE_TEST_CASE_P(AllResultsAreSuccess,
+                        SearchDirectoriesTest,
+                        ::testing::Values(
+                            MakeAllPassInodes(/*root_dirs*/{"/"}, {"66323@1127133"}, {"/data"})
+                        ));
+
+#endif
