diff --git a/apexd/aidl/android/apex/IApexService.aidl b/apexd/aidl/android/apex/IApexService.aidl
index 4d9b5f7..57adcf8 100644
--- a/apexd/aidl/android/apex/IApexService.aidl
+++ b/apexd/aidl/android/apex/IApexService.aidl
@@ -36,9 +36,9 @@
 
    /**
     * Copies the CE apex data directory for the given user to the backup
-    * location, and returns the inode of the snapshot directory.
+    * location.
     */
-   long snapshotCeData(int user_id, int rollback_id, in @utf8InCpp String apex_name);
+   void snapshotCeData(int user_id, int rollback_id, in @utf8InCpp String apex_name);
 
    /**
     * Restores the snapshot of the CE apex data directory for the given user and
@@ -52,6 +52,11 @@
    void destroyDeSnapshots(int rollback_id);
 
    /**
+    * Deletes credential-encrypted snapshots for the given user, for the given rollback id.
+    */
+   void destroyCeSnapshots(int user_id, int rollback_id);
+
+   /**
     * Deletes all credential-encrypted snapshots for the given user, except for
     * those listed in retain_rollback_ids.
     */
diff --git a/apexd/apex_database.cpp b/apexd/apex_database.cpp
index 13a5472..0f9502c 100644
--- a/apexd/apex_database.cpp
+++ b/apexd/apex_database.cpp
@@ -77,12 +77,12 @@
   fs::path DevPath() const { return kDevBlock / name; }
 
   Result<std::string> GetProperty(const std::string& property) const {
-    auto propertyFile = SysPath() / property;
-    std::string propertyValue;
-    if (!ReadFileToString(propertyFile, &propertyValue)) {
+    auto property_file = SysPath() / property;
+    std::string property_value;
+    if (!ReadFileToString(property_file, &property_value)) {
       return ErrnoError() << "Fail to read";
     }
-    return Trim(propertyValue);
+    return Trim(property_value);
   }
 
   std::vector<BlockDevice> GetSlaves() const {
@@ -101,17 +101,17 @@
   }
 };
 
-std::pair<fs::path, fs::path> parseMountInfo(const std::string& mountInfo) {
-  const auto& tokens = Split(mountInfo, " ");
+std::pair<fs::path, fs::path> ParseMountInfo(const std::string& mount_info) {
+  const auto& tokens = Split(mount_info, " ");
   if (tokens.size() < 2) {
     return std::make_pair("", "");
   }
   return std::make_pair(tokens[0], tokens[1]);
 }
 
-std::pair<std::string, int> parseMountPoint(const std::string& mountPoint) {
-  auto packageId = fs::path(mountPoint).filename();
-  auto split = Split(packageId, "@");
+std::pair<std::string, int> ParseMountPoint(const std::string& mount_point) {
+  auto package_id = fs::path(mount_point).filename();
+  auto split = Split(package_id, "@");
   if (split.size() == 2) {
     int version;
     if (!ParseInt(split[1], &version)) {
@@ -119,11 +119,11 @@
     }
     return std::make_pair(split[0], version);
   }
-  return std::make_pair(packageId, -1);
+  return std::make_pair(package_id, -1);
 }
 
-bool isActiveMountPoint(const std::string& mountPoint) {
-  return (mountPoint.find('@') == std::string::npos);
+bool IsActiveMountPoint(const std::string& mount_point) {
+  return (mount_point.find('@') == std::string::npos);
 }
 
 Result<void> PopulateLoopInfo(const BlockDevice& top_device,
@@ -189,17 +189,17 @@
   apex_data->full_path = full_path;
 }
 
-Result<MountedApexData> resolveMountInfo(const BlockDevice& block,
-                                         const std::string& mountPoint) {
-  bool temp_mount = EndsWith(mountPoint, ".tmp");
+Result<MountedApexData> ResolveMountInfo(const BlockDevice& block,
+                                         const std::string& mount_point) {
+  bool temp_mount = EndsWith(mount_point, ".tmp");
   // Now, see if it is dm-verity or loop mounted
   switch (block.GetType()) {
     case LoopDevice: {
-      auto backingFile = block.GetProperty("loop/backing_file");
-      if (!backingFile.ok()) {
-        return backingFile.error();
+      auto backing_file = block.GetProperty("loop/backing_file");
+      if (!backing_file.ok()) {
+        return backing_file.error();
       }
-      auto result = MountedApexData(block.DevPath(), *backingFile, mountPoint,
+      auto result = MountedApexData(block.DevPath(), *backing_file, mount_point,
                                     /* device_name= */ "",
                                     /* hashtree_loop_name= */ "",
                                     /* is_temp_mount */ temp_mount);
@@ -212,7 +212,7 @@
         return name.error();
       }
       MountedApexData result;
-      result.mount_point = mountPoint;
+      result.mount_point = mount_point;
       result.device_name = *name;
       result.is_temp_mount = temp_mount;
       if (auto status = PopulateLoopInfo(block, &result); !status.ok()) {
@@ -253,37 +253,37 @@
 void MountedApexDatabase::PopulateFromMounts() {
   LOG(INFO) << "Populating APEX database from mounts...";
 
-  std::unordered_map<std::string, int> activeVersions;
+  std::unordered_map<std::string, int> active_versions;
 
   std::ifstream mounts("/proc/mounts");
   std::string line;
   while (std::getline(mounts, line)) {
-    auto [block, mountPoint] = parseMountInfo(line);
+    auto [block, mount_point] = ParseMountInfo(line);
     // TODO(b/158469914): distinguish between temp and non-temp mounts
-    if (fs::path(mountPoint).parent_path() != kApexRoot) {
+    if (fs::path(mount_point).parent_path() != kApexRoot) {
       continue;
     }
-    if (isActiveMountPoint(mountPoint)) {
+    if (IsActiveMountPoint(mount_point)) {
       continue;
     }
 
-    auto mountData = resolveMountInfo(BlockDevice(block), mountPoint);
-    if (!mountData.ok()) {
-      LOG(WARNING) << "Can't resolve mount info " << mountData.error();
+    auto mount_data = ResolveMountInfo(BlockDevice(block), mount_point);
+    if (!mount_data.ok()) {
+      LOG(WARNING) << "Can't resolve mount info " << mount_data.error();
       continue;
     }
 
-    auto [package, version] = parseMountPoint(mountPoint);
-    AddMountedApex(package, false, *mountData);
+    auto [package, version] = ParseMountPoint(mount_point);
+    AddMountedApex(package, false, *mount_data);
 
-    auto active = activeVersions[package] < version;
+    auto active = active_versions[package] < version;
     if (active) {
-      activeVersions[package] = version;
-      SetLatest(package, mountData->full_path);
+      active_versions[package] = version;
+      SetLatest(package, mount_data->full_path);
     }
-    LOG(INFO) << "Found " << mountPoint << " backed by"
-              << (mountData->deleted ? " deleted " : " ") << "file "
-              << mountData->full_path;
+    LOG(INFO) << "Found " << mount_point << " backed by"
+              << (mount_data->deleted ? " deleted " : " ") << "file "
+              << mount_data->full_path;
   }
 
   LOG(INFO) << mounted_apexes_.size() << " packages restored.";
diff --git a/apexd/apex_file.cpp b/apexd/apex_file.cpp
index 83264d3..2049ff9 100644
--- a/apexd/apex_file.cpp
+++ b/apexd/apex_file.cpp
@@ -153,7 +153,7 @@
 
 static constexpr int kVbMetaMaxSize = 64 * 1024;
 
-std::string bytes_to_hex(const uint8_t* bytes, size_t bytes_len) {
+std::string BytesToHex(const uint8_t* bytes, size_t bytes_len) {
   std::ostringstream s;
 
   s << std::hex << std::setfill('0');
@@ -163,22 +163,22 @@
   return s.str();
 }
 
-std::string getSalt(const AvbHashtreeDescriptor& desc,
-                    const uint8_t* trailingData) {
-  const uint8_t* desc_salt = trailingData + desc.partition_name_len;
+std::string GetSalt(const AvbHashtreeDescriptor& desc,
+                    const uint8_t* trailing_data) {
+  const uint8_t* desc_salt = trailing_data + desc.partition_name_len;
 
-  return bytes_to_hex(desc_salt, desc.salt_len);
+  return BytesToHex(desc_salt, desc.salt_len);
 }
 
-std::string getDigest(const AvbHashtreeDescriptor& desc,
-                      const uint8_t* trailingData) {
+std::string GetDigest(const AvbHashtreeDescriptor& desc,
+                      const uint8_t* trailing_data) {
   const uint8_t* desc_digest =
-      trailingData + desc.partition_name_len + desc.salt_len;
+      trailing_data + desc.partition_name_len + desc.salt_len;
 
-  return bytes_to_hex(desc_digest, desc.root_digest_len);
+  return BytesToHex(desc_digest, desc.root_digest_len);
 }
 
-Result<std::unique_ptr<AvbFooter>> getAvbFooter(const ApexFile& apex,
+Result<std::unique_ptr<AvbFooter>> GetAvbFooter(const ApexFile& apex,
                                                 const unique_fd& fd) {
   std::array<uint8_t, AVB_FOOTER_SIZE> footer_data;
   auto footer = std::make_unique<AvbFooter>();
@@ -211,7 +211,7 @@
 }
 
 // Verifies correctness of vbmeta and returns public key it was signed with.
-Result<std::span<const uint8_t>> verifyVbMetaSignature(const ApexFile& apex,
+Result<std::span<const uint8_t>> VerifyVbMetaSignature(const ApexFile& apex,
                                                        const uint8_t* data,
                                                        size_t length) {
   const uint8_t* pk;
@@ -240,7 +240,7 @@
   return std::span<const uint8_t>(pk, pk_len);
 }
 
-Result<std::unique_ptr<uint8_t[]>> verifyVbMeta(const ApexFile& apex,
+Result<std::unique_ptr<uint8_t[]>> VerifyVbMeta(const ApexFile& apex,
                                                 const unique_fd& fd,
                                                 const AvbFooter& footer,
                                                 const std::string& public_key) {
@@ -256,7 +256,7 @@
   }
 
   Result<std::span<const uint8_t>> st =
-      verifyVbMetaSignature(apex, vbmeta_buf.get(), footer.vbmeta_size);
+      VerifyVbMetaSignature(apex, vbmeta_buf.get(), footer.vbmeta_size);
   if (!st.ok()) {
     return st.error();
   }
@@ -269,7 +269,7 @@
   return vbmeta_buf;
 }
 
-Result<const AvbHashtreeDescriptor*> findDescriptor(uint8_t* vbmeta_data,
+Result<const AvbHashtreeDescriptor*> FindDescriptor(uint8_t* vbmeta_data,
                                                     size_t vbmeta_size) {
   const AvbDescriptor** descriptors;
   size_t num_descriptors;
@@ -303,62 +303,62 @@
   return Errorf("Couldn't find any AVB hashtree descriptors.");
 }
 
-Result<std::unique_ptr<AvbHashtreeDescriptor>> verifyDescriptor(
+Result<std::unique_ptr<AvbHashtreeDescriptor>> VerifyDescriptor(
     const AvbHashtreeDescriptor* desc) {
-  auto verifiedDesc = std::make_unique<AvbHashtreeDescriptor>();
+  auto verified_desc = std::make_unique<AvbHashtreeDescriptor>();
 
   if (!avb_hashtree_descriptor_validate_and_byteswap(desc,
-                                                     verifiedDesc.get())) {
+                                                     verified_desc.get())) {
     return Errorf("Couldn't validate AvbDescriptor.");
   }
 
-  return verifiedDesc;
+  return verified_desc;
 }
 
 }  // namespace
 
 Result<ApexVerityData> ApexFile::VerifyApexVerity(
     const std::string& public_key) const {
-  ApexVerityData verityData;
+  ApexVerityData verity_data;
 
   unique_fd fd(open(GetPath().c_str(), O_RDONLY | O_CLOEXEC));
   if (fd.get() == -1) {
     return ErrnoError() << "Failed to open " << GetPath();
   }
 
-  Result<std::unique_ptr<AvbFooter>> footer = getAvbFooter(*this, fd);
+  Result<std::unique_ptr<AvbFooter>> footer = GetAvbFooter(*this, fd);
   if (!footer.ok()) {
     return footer.error();
   }
 
   Result<std::unique_ptr<uint8_t[]>> vbmeta_data =
-      verifyVbMeta(*this, fd, **footer, public_key);
+      VerifyVbMeta(*this, fd, **footer, public_key);
   if (!vbmeta_data.ok()) {
     return vbmeta_data.error();
   }
 
   Result<const AvbHashtreeDescriptor*> descriptor =
-      findDescriptor(vbmeta_data->get(), (*footer)->vbmeta_size);
+      FindDescriptor(vbmeta_data->get(), (*footer)->vbmeta_size);
   if (!descriptor.ok()) {
     return descriptor.error();
   }
 
-  Result<std::unique_ptr<AvbHashtreeDescriptor>> verifiedDescriptor =
-      verifyDescriptor(*descriptor);
-  if (!verifiedDescriptor.ok()) {
-    return verifiedDescriptor.error();
+  Result<std::unique_ptr<AvbHashtreeDescriptor>> verified_descriptor =
+      VerifyDescriptor(*descriptor);
+  if (!verified_descriptor.ok()) {
+    return verified_descriptor.error();
   }
-  verityData.desc = std::move(*verifiedDescriptor);
+  verity_data.desc = std::move(*verified_descriptor);
 
   // This area is now safe to access, because we just verified it
-  const uint8_t* trailingData =
+  const uint8_t* trailing_data =
       (const uint8_t*)*descriptor + sizeof(AvbHashtreeDescriptor);
-  verityData.hash_algorithm =
+  verity_data.hash_algorithm =
       reinterpret_cast<const char*>((*descriptor)->hash_algorithm);
-  verityData.salt = getSalt(*verityData.desc, trailingData);
-  verityData.root_digest = getDigest(*verityData.desc, trailingData);
+  verity_data.salt = GetSalt(*verity_data.desc, trailing_data);
+  verity_data.root_digest = GetDigest(*verity_data.desc, trailing_data);
 
-  return verityData;
+  return verity_data;
 }
 
 }  // namespace apex
diff --git a/apexd/apex_file_test.cpp b/apexd/apex_file_test.cpp
index 2cf7d5d..f575434 100644
--- a/apexd/apex_file_test.cpp
+++ b/apexd/apex_file_test.cpp
@@ -27,9 +27,10 @@
 
 #include "apex_file.h"
 
+using android::base::GetExecutableDirectory;
 using android::base::Result;
 
-static std::string testDataDir = android::base::GetExecutableDirectory() + "/";
+static const std::string kTestDataDir = GetExecutableDirectory() + "/";
 
 namespace android {
 namespace apex {
@@ -48,15 +49,15 @@
 INSTANTIATE_TEST_SUITE_P(Apex, ApexFileTest, testing::ValuesIn(kParameters));
 
 TEST_P(ApexFileTest, GetOffsetOfSimplePackage) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_TRUE(apexFile.ok());
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_TRUE(apex_file.ok());
 
   int32_t zip_image_offset;
   size_t zip_image_size;
   {
     ZipArchiveHandle handle;
-    int32_t rc = OpenArchive(filePath.c_str(), &handle);
+    int32_t rc = OpenArchive(file_path.c_str(), &handle);
     ASSERT_EQ(0, rc);
     auto close_guard =
         android::base::make_scope_guard([&handle]() { CloseArchive(handle); });
@@ -71,32 +72,33 @@
     EXPECT_EQ(zip_image_size, entry.compressed_length);
   }
 
-  EXPECT_EQ(zip_image_offset, apexFile->GetImageOffset());
-  EXPECT_EQ(zip_image_size, apexFile->GetImageSize());
+  EXPECT_EQ(zip_image_offset, apex_file->GetImageOffset());
+  EXPECT_EQ(zip_image_size, apex_file->GetImageSize());
 }
 
 TEST(ApexFileTest, GetOffsetMissingFile) {
-  const std::string filePath = testDataDir + "missing.apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_FALSE(apexFile.ok());
-  ASSERT_THAT(apexFile.error().message(),
+  const std::string file_path = kTestDataDir + "missing.apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_FALSE(apex_file.ok());
+  ASSERT_THAT(apex_file.error().message(),
               testing::HasSubstr("Failed to open package"));
 }
 
 TEST_P(ApexFileTest, GetApexManifest) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_RESULT_OK(apexFile);
-  EXPECT_EQ("com.android.apex.test_package", apexFile->GetManifest().name());
-  EXPECT_EQ(1u, apexFile->GetManifest().version());
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_RESULT_OK(apex_file);
+  EXPECT_EQ("com.android.apex.test_package", apex_file->GetManifest().name());
+  EXPECT_EQ(1u, apex_file->GetManifest().version());
 }
 
 TEST_P(ApexFileTest, VerifyApexVerity) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_RESULT_OK(apexFile);
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_RESULT_OK(apex_file);
 
-  auto verity_or = apexFile->VerifyApexVerity(apexFile->GetBundledPublicKey());
+  auto verity_or =
+      apex_file->VerifyApexVerity(apex_file->GetBundledPublicKey());
   ASSERT_RESULT_OK(verity_or);
 
   const ApexVerityData& data = *verity_or;
@@ -105,60 +107,60 @@
                         "50ca7ec8071f49dfa47a243c"),
             data.salt);
 
-  const std::string digestPath =
-      testDataDir + GetParam().prefix + "_digest.txt";
-  std::string rootDigest;
-  ASSERT_TRUE(android::base::ReadFileToString(digestPath, &rootDigest))
-      << "Failed to read " << digestPath;
-  rootDigest = android::base::Trim(rootDigest);
+  const std::string digest_path =
+      kTestDataDir + GetParam().prefix + "_digest.txt";
+  std::string root_digest;
+  ASSERT_TRUE(android::base::ReadFileToString(digest_path, &root_digest))
+      << "Failed to read " << digest_path;
+  root_digest = android::base::Trim(root_digest);
 
-  EXPECT_EQ(std::string(rootDigest), data.root_digest);
+  EXPECT_EQ(std::string(root_digest), data.root_digest);
 }
 
 TEST_P(ApexFileTest, VerifyApexVerityWrongKey) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_RESULT_OK(apexFile);
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_RESULT_OK(apex_file);
 
-  auto verity_or = apexFile->VerifyApexVerity("wrong-key");
+  auto verity_or = apex_file->VerifyApexVerity("wrong-key");
   ASSERT_FALSE(verity_or.ok());
 }
 
 TEST_P(ApexFileTest, GetBundledPublicKey) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_RESULT_OK(apexFile);
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_RESULT_OK(apex_file);
 
-  const std::string keyPath =
-      testDataDir + "apexd_testdata/com.android.apex.test_package.avbpubkey";
-  std::string keyContent;
-  ASSERT_TRUE(android::base::ReadFileToString(keyPath, &keyContent))
-      << "Failed to read " << keyPath;
+  const std::string key_path =
+      kTestDataDir + "apexd_testdata/com.android.apex.test_package.avbpubkey";
+  std::string key_content;
+  ASSERT_TRUE(android::base::ReadFileToString(key_path, &key_content))
+      << "Failed to read " << key_path;
 
-  EXPECT_EQ(keyContent, apexFile->GetBundledPublicKey());
+  EXPECT_EQ(key_content, apex_file->GetBundledPublicKey());
 }
 
 TEST(ApexFileTest, CorrutedApexB146895998) {
-  const std::string apex_path = testDataDir + "corrupted_b146895998.apex";
+  const std::string apex_path = kTestDataDir + "corrupted_b146895998.apex";
   Result<ApexFile> apex = ApexFile::Open(apex_path);
   ASSERT_RESULT_OK(apex);
-  ASSERT_FALSE(apex->VerifyApexVerity("ignored"));
+  ASSERT_FALSE(apex->VerifyApexVerity("ignored").ok());
 }
 
 TEST_P(ApexFileTest, RetrieveFsType) {
-  const std::string filePath = testDataDir + GetParam().prefix + ".apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_TRUE(apexFile.ok());
+  const std::string file_path = kTestDataDir + GetParam().prefix + ".apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_TRUE(apex_file.ok());
 
-  EXPECT_EQ(std::string(GetParam().type), apexFile->GetFsType());
+  EXPECT_EQ(std::string(GetParam().type), apex_file->GetFsType());
 }
 
 TEST(ApexFileTest, OpenInvalidFilesystem) {
-  const std::string filePath =
-      testDataDir + "apex.apexd_test_corrupt_superblock_apex.apex";
-  Result<ApexFile> apexFile = ApexFile::Open(filePath);
-  ASSERT_FALSE(apexFile.ok());
-  ASSERT_THAT(apexFile.error().message(),
+  const std::string file_path =
+      kTestDataDir + "apex.apexd_test_corrupt_superblock_apex.apex";
+  Result<ApexFile> apex_file = ApexFile::Open(file_path);
+  ASSERT_FALSE(apex_file.ok());
+  ASSERT_THAT(apex_file.error().message(),
               testing::HasSubstr("Failed to retrieve filesystem type"));
 }
 
diff --git a/apexd/apex_manifest.cpp b/apexd/apex_manifest.cpp
index 1994633..7bd5913 100644
--- a/apexd/apex_manifest.cpp
+++ b/apexd/apex_manifest.cpp
@@ -46,8 +46,8 @@
   return apex_manifest;
 }
 
-std::string GetPackageId(const ApexManifest& apexManifest) {
-  return apexManifest.name() + "@" + std::to_string(apexManifest.version());
+std::string GetPackageId(const ApexManifest& apex_manifest) {
+  return apex_manifest.name() + "@" + std::to_string(apex_manifest.version());
 }
 
 Result<ApexManifest> ReadManifest(const std::string& path) {
diff --git a/apexd/apex_preinstalled_data.cpp b/apexd/apex_preinstalled_data.cpp
index a7b9f49..4ca8373 100644
--- a/apexd/apex_preinstalled_data.cpp
+++ b/apexd/apex_preinstalled_data.cpp
@@ -21,6 +21,7 @@
 #include <unordered_map>
 
 #include <android-base/file.h>
+#include <android-base/properties.h>
 #include <android-base/result.h>
 #include <android-base/strings.h>
 
@@ -29,6 +30,7 @@
 #include "apexd_utils.h"
 
 using android::base::Error;
+using android::base::GetProperty;
 using android::base::Result;
 
 namespace android {
@@ -60,10 +62,21 @@
     auto it = data_.find(name);
     if (it == data_.end()) {
       data_[name] = apex_data;
+    } else if (it->second.path != apex_data.path) {
+      // Currently, on some -eng builds there are two art apexes on /system
+      // partition. While this issue is not fixed, exempt art apex from the
+      // duplicate check on -eng builds.
+      // TODO(b/176497601): remove this exemption once issue with duplicate art
+      // apex is resolved.
+      std::string build_type = GetProperty("ro.build.type", "");
+      auto level = build_type == "eng" && name == "com.android.art"
+                       ? base::ERROR
+                       : base::FATAL;
+      LOG(level) << "Found two apex packages " << it->second.path << " and "
+                 << apex_data.path << " with the same module name " << name;
     } else if (it->second.public_key != apex_data.public_key) {
-      return Error() << "Key for package " << apex_data.path << " ( " << name
-                     << ") does not match with previously scanned key from "
-                     << it->second.path;
+      LOG(FATAL) << "Public key of apex package " << it->second.path << " ("
+                 << name << ") has unexpectedly changed";
     }
   }
   return {};
diff --git a/apexd/apex_preinstalled_data_test.cpp b/apexd/apex_preinstalled_data_test.cpp
index 8efe68a..a961ed2 100644
--- a/apexd/apex_preinstalled_data_test.cpp
+++ b/apexd/apex_preinstalled_data_test.cpp
@@ -41,7 +41,6 @@
 using android::apex::testing::IsOk;
 using android::base::GetExecutableDirectory;
 using android::base::StringPrintf;
-using ::testing::HasSubstr;
 
 static std::string GetTestDataDir() { return GetExecutableDirectory(); }
 static std::string GetTestFile(const std::string& name) {
@@ -79,6 +78,12 @@
 
   test_fn("apex.apexd_test.apex");
   test_fn("apex.apexd_test_different_app.apex");
+
+  // Check that second call will succeed as well.
+  ASSERT_TRUE(IsOk(instance.Initialize({td.path})));
+
+  test_fn("apex.apexd_test.apex");
+  test_fn("apex.apexd_test_different_app.apex");
 }
 
 TEST(ApexPreinstalledDataTest, InitializeFailureCorruptApex) {
@@ -92,18 +97,52 @@
   ASSERT_FALSE(IsOk(instance.Initialize({td.path})));
 }
 
-TEST(ApexPreinstalledData, InitializeFailureSameNameDifferentKeys) {
+TEST(ApexPreinstalledData, InitializeSameNameDifferentPathAborts) {
   // Prepare test data.
   TemporaryDir td;
   fs::copy(GetTestFile("apex.apexd_test.apex"), td.path);
-  fs::copy(GetTestFile("apex.apexd_test_different_key.apex"), td.path);
+  fs::copy(GetTestFile("apex.apexd_test.apex"),
+           StringPrintf("%s/other.apex", td.path));
+
+  ASSERT_DEATH(
+      {
+        ApexPreinstalledData instance;
+        instance.Initialize({td.path});
+      },
+      "");
+}
+
+TEST(ApexPreinstalledData, InitializePublicKeyUnexpectdlyChangedAborts) {
+  // Prepare test data.
+  TemporaryDir td;
+  fs::copy(GetTestFile("apex.apexd_test.apex"), td.path);
 
   ApexPreinstalledData instance;
-  auto result = instance.Initialize({td.path});
+  ASSERT_TRUE(IsOk(instance.Initialize({td.path})));
 
-  ASSERT_FALSE(IsOk(result));
-  ASSERT_THAT(result.error().message(),
-              HasSubstr("does not match with previously scanned key"));
+  // Check that apex was loaded.
+  auto path = instance.GetPreinstalledPath("com.android.apex.test_package");
+  ASSERT_TRUE(IsOk(path));
+  ASSERT_EQ(StringPrintf("%s/apex.apexd_test.apex", td.path), *path);
+
+  auto public_key = instance.GetPublicKey("com.android.apex.test_package");
+  ASSERT_TRUE(IsOk(public_key));
+
+  // Substitute it with another apex with the same name, but different public
+  // key.
+  fs::copy(GetTestFile("apex.apexd_test_different_key.apex"), *path,
+           fs::copy_options::overwrite_existing);
+
+  {
+    auto apex = ApexFile::Open(*path);
+    ASSERT_TRUE(IsOk(apex));
+    // Check module name hasn't changed.
+    ASSERT_EQ("com.android.apex.test_package", apex->GetManifest().name());
+    // Check public key has changed.
+    ASSERT_NE(*public_key, apex->GetBundledPublicKey());
+  }
+
+  ASSERT_DEATH({ instance.Initialize({td.path}); }, "");
 }
 
 TEST(ApexPreinstalledData, IsPreInstalledApex) {
diff --git a/apexd/apexd.cpp b/apexd/apexd.cpp
index c2439af..98a0d07 100644
--- a/apexd/apexd.cpp
+++ b/apexd/apexd.cpp
@@ -137,14 +137,14 @@
 
 static constexpr const int kNumRetriesWhenCheckpointingEnabled = 1;
 
-bool isBootstrapApex(const ApexFile& apex) {
+bool IsBootstrapApex(const ApexFile& apex) {
   return std::find(kBootstrapApexes.begin(), kBootstrapApexes.end(),
                    apex.GetManifest().name()) != kBootstrapApexes.end();
 }
 
 // Pre-allocate loop devices so that we don't have to wait for them
 // later when actually activating APEXes.
-Result<void> preAllocateLoopDevices() {
+Result<void> PreAllocateLoopDevices() {
   auto scan = FindApexes(kApexPackageBuiltinDirs);
   if (!scan.ok()) {
     return scan.error();
@@ -158,22 +158,22 @@
     }
     size++;
     // bootstrap Apexes may be activated on separate namespaces.
-    if (isBootstrapApex(*apexFile)) {
+    if (IsBootstrapApex(*apexFile)) {
       size++;
     }
   }
 
-  // note: do not call preAllocateLoopDevices() if size == 0.
+  // note: do not call PreAllocateLoopDevices() if size == 0.
   // For devices (e.g. ARC) which doesn't support loop-control
-  // preAllocateLoopDevices() can cause problem when it tries
+  // PreAllocateLoopDevices() can cause problem when it tries
   // to access /dev/loop-control.
   if (size == 0) {
     return {};
   }
-  return loop::preAllocateLoopDevices(size);
+  return loop::PreAllocateLoopDevices(size);
 }
 
-std::unique_ptr<DmTable> createVerityTable(const ApexVerityData& verity_data,
+std::unique_ptr<DmTable> CreateVerityTable(const ApexVerityData& verity_data,
                                            const std::string& block_device,
                                            const std::string& hash_device,
                                            bool restart_on_corruption) {
@@ -257,7 +257,7 @@
   bool cleared_;
 };
 
-Result<DmVerityDevice> createVerityDevice(const std::string& name,
+Result<DmVerityDevice> CreateVerityDevice(const std::string& name,
                                           const DmTable& table) {
   DeviceMapper& dm = DeviceMapper::Instance();
 
@@ -315,7 +315,7 @@
 }
 
 // Reads the entire device to verify the image is authenticatic
-Result<void> readVerityDevice(const std::string& verity_device,
+Result<void> ReadVerityDevice(const std::string& verity_device,
                               uint64_t device_size) {
   static constexpr int kBlockSize = 4096;
   static constexpr size_t kBufSize = 1024 * kBlockSize;
@@ -359,12 +359,12 @@
 }
 
 Result<MountedApexData> MountPackageImpl(const ApexFile& apex,
-                                         const std::string& mountPoint,
+                                         const std::string& mount_point,
                                          const std::string& device_name,
                                          const std::string& hashtree_file,
-                                         bool verifyImage,
-                                         bool tempMount = false) {
-  LOG(VERBOSE) << "Creating mount point: " << mountPoint;
+                                         bool verify_image,
+                                         bool temp_mount = false) {
+  LOG(VERBOSE) << "Creating mount point: " << mount_point;
   // Note: the mount point could exist in case when the APEX was activated
   // during the bootstrap phase (e.g., the runtime or tzdata APEX).
   // Although we have separate mount namespaces to separate the early activated
@@ -373,31 +373,31 @@
   // mounted at / which is (and has to be) a shared mount. Therefore, if apexd
   // finds an empty directory under /apex, it's not a problem and apexd can use
   // it.
-  auto exists = PathExists(mountPoint);
+  auto exists = PathExists(mount_point);
   if (!exists.ok()) {
     return exists.error();
   }
-  if (!*exists && mkdir(mountPoint.c_str(), kMkdirMode) != 0) {
-    return ErrnoError() << "Could not create mount point " << mountPoint;
+  if (!*exists && mkdir(mount_point.c_str(), kMkdirMode) != 0) {
+    return ErrnoError() << "Could not create mount point " << mount_point;
   }
-  auto deleter = [&mountPoint]() {
-    if (rmdir(mountPoint.c_str()) != 0) {
-      PLOG(WARNING) << "Could not rmdir " << mountPoint;
+  auto deleter = [&mount_point]() {
+    if (rmdir(mount_point.c_str()) != 0) {
+      PLOG(WARNING) << "Could not rmdir " << mount_point;
     }
   };
   auto scope_guard = android::base::make_scope_guard(deleter);
-  if (!IsEmptyDirectory(mountPoint)) {
-    return ErrnoError() << mountPoint << " is not empty";
+  if (!IsEmptyDirectory(mount_point)) {
+    return ErrnoError() << mount_point << " is not empty";
   }
 
   const std::string& full_path = apex.GetPath();
 
-  loop::LoopbackDeviceUniqueFd loopbackDevice;
+  loop::LoopbackDeviceUniqueFd loopback_device;
   for (size_t attempts = 1;; ++attempts) {
-    Result<loop::LoopbackDeviceUniqueFd> ret = loop::createLoopDevice(
+    Result<loop::LoopbackDeviceUniqueFd> ret = loop::CreateLoopDevice(
         full_path, apex.GetImageOffset(), apex.GetImageSize());
     if (ret.ok()) {
-      loopbackDevice = std::move(*ret);
+      loopback_device = std::move(*ret);
       break;
     }
     if (attempts >= kLoopDeviceSetupAttempts) {
@@ -405,7 +405,7 @@
                      << ret.error();
     }
   }
-  LOG(VERBOSE) << "Loopback device created: " << loopbackDevice.name;
+  LOG(VERBOSE) << "Loopback device created: " << loopback_device.name;
 
   auto& instance = ApexPreinstalledData::GetInstance();
 
@@ -414,32 +414,32 @@
     return public_key.error();
   }
 
-  auto verityData = apex.VerifyApexVerity(*public_key);
-  if (!verityData.ok()) {
+  auto verity_data = apex.VerifyApexVerity(*public_key);
+  if (!verity_data.ok()) {
     return Error() << "Failed to verify Apex Verity data for " << full_path
-                   << ": " << verityData.error();
+                   << ": " << verity_data.error();
   }
-  std::string blockDevice = loopbackDevice.name;
-  MountedApexData apex_data(loopbackDevice.name, apex.GetPath(), mountPoint,
+  std::string block_device = loopback_device.name;
+  MountedApexData apex_data(loopback_device.name, apex.GetPath(), mount_point,
                             /* device_name = */ "",
                             /* hashtree_loop_name = */ "",
-                            /* is_temp_mount */ tempMount);
+                            /* is_temp_mount */ temp_mount);
 
   // for APEXes in immutable partitions, we don't need to mount them on
   // dm-verity because they are already in the dm-verity protected partition;
   // system. However, note that we don't skip verification to ensure that APEXes
   // are correctly signed.
-  const bool mountOnVerity = !instance.IsPreInstalledApex(apex);
-  DmVerityDevice verityDev;
+  const bool mount_on_verity = !instance.IsPreInstalledApex(apex);
+  DmVerityDevice verity_dev;
   loop::LoopbackDeviceUniqueFd loop_for_hash;
-  if (mountOnVerity) {
-    std::string hash_device = loopbackDevice.name;
-    if (verityData->desc->tree_size == 0) {
-      if (auto st = PrepareHashTree(apex, *verityData, hashtree_file);
+  if (mount_on_verity) {
+    std::string hash_device = loopback_device.name;
+    if (verity_data->desc->tree_size == 0) {
+      if (auto st = PrepareHashTree(apex, *verity_data, hashtree_file);
           !st.ok()) {
         return st.error();
       }
-      auto create_loop_status = loop::createLoopDevice(hashtree_file, 0, 0);
+      auto create_loop_status = loop::CreateLoopDevice(hashtree_file, 0, 0);
       if (!create_loop_status.ok()) {
         return create_loop_status.error();
       }
@@ -447,54 +447,54 @@
       hash_device = loop_for_hash.name;
       apex_data.hashtree_loop_name = hash_device;
     }
-    auto verityTable =
-        createVerityTable(*verityData, loopbackDevice.name, hash_device,
-                          /* restart_on_corruption = */ !verifyImage);
-    Result<DmVerityDevice> verityDevRes =
-        createVerityDevice(device_name, *verityTable);
-    if (!verityDevRes.ok()) {
+    auto verity_table =
+        CreateVerityTable(*verity_data, loopback_device.name, hash_device,
+                          /* restart_on_corruption = */ !verify_image);
+    Result<DmVerityDevice> verity_dev_res =
+        CreateVerityDevice(device_name, *verity_table);
+    if (!verity_dev_res.ok()) {
       return Error() << "Failed to create Apex Verity device " << full_path
-                     << ": " << verityDevRes.error();
+                     << ": " << verity_dev_res.error();
     }
-    verityDev = std::move(*verityDevRes);
+    verity_dev = std::move(*verity_dev_res);
     apex_data.device_name = device_name;
-    blockDevice = verityDev.GetDevPath();
+    block_device = verity_dev.GetDevPath();
 
-    Result<void> readAheadStatus =
-        loop::configureReadAhead(verityDev.GetDevPath());
-    if (!readAheadStatus.ok()) {
-      return readAheadStatus.error();
+    Result<void> read_ahead_status =
+        loop::ConfigureReadAhead(verity_dev.GetDevPath());
+    if (!read_ahead_status.ok()) {
+      return read_ahead_status.error();
     }
   }
   // TODO(b/158467418): consider moving this inside RunVerifyFnInsideTempMount.
-  if (mountOnVerity && verifyImage) {
-    Result<void> verityStatus =
-        readVerityDevice(blockDevice, (*verityData).desc->image_size);
-    if (!verityStatus.ok()) {
-      return verityStatus.error();
+  if (mount_on_verity && verify_image) {
+    Result<void> verity_status =
+        ReadVerityDevice(block_device, (*verity_data).desc->image_size);
+    if (!verity_status.ok()) {
+      return verity_status.error();
     }
   }
 
-  uint32_t mountFlags = MS_NOATIME | MS_NODEV | MS_DIRSYNC | MS_RDONLY;
+  uint32_t mount_flags = MS_NOATIME | MS_NODEV | MS_DIRSYNC | MS_RDONLY;
   if (apex.GetManifest().nocode()) {
-    mountFlags |= MS_NOEXEC;
+    mount_flags |= MS_NOEXEC;
   }
 
-  if (mount(blockDevice.c_str(), mountPoint.c_str(), apex.GetFsType().c_str(),
-            mountFlags, nullptr) == 0) {
+  if (mount(block_device.c_str(), mount_point.c_str(), apex.GetFsType().c_str(),
+            mount_flags, nullptr) == 0) {
     LOG(INFO) << "Successfully mounted package " << full_path << " on "
-              << mountPoint;
-    auto status = VerifyMountedImage(apex, mountPoint);
+              << mount_point;
+    auto status = VerifyMountedImage(apex, mount_point);
     if (!status.ok()) {
-      if (umount2(mountPoint.c_str(), UMOUNT_NOFOLLOW) != 0) {
-        PLOG(ERROR) << "Failed to umount " << mountPoint;
+      if (umount2(mount_point.c_str(), UMOUNT_NOFOLLOW) != 0) {
+        PLOG(ERROR) << "Failed to umount " << mount_point;
       }
       return Error() << "Failed to verify " << full_path << ": "
                      << status.error();
     }
     // Time to accept the temporaries as good.
-    verityDev.Release();
-    loopbackDevice.CloseGood();
+    verity_dev.Release();
+    loopback_device.CloseGood();
     loop_for_hash.CloseGood();
 
     scope_guard.Disable();  // Accept the mount.
@@ -524,7 +524,7 @@
   }
   auto ret =
       MountPackageImpl(apex, mount_point, temp_device_name, hashtree_file,
-                       /* verifyImage = */ true, /* tempMount = */ true);
+                       /* verify_image = */ true, /* temp_mount = */ true);
   if (!ret.ok()) {
     LOG(DEBUG) << "Cleaning up " << hashtree_file;
     if (TEMP_FAILURE_RETRY(unlink(hashtree_file.c_str())) != 0) {
@@ -635,7 +635,7 @@
       std::string mount_point =
           apexd_private::GetPackageTempMountPoint(apex.GetManifest());
       Result<MountedApexData> mount_data =
-          apexd_private::getTempMountedApexData(apex.GetManifest().name());
+          apexd_private::GetTempMountedApexData(apex.GetManifest().name());
       if (!mount_data.ok()) {
         mount_data = VerifyAndTempMountPackage(apex, mount_point);
         if (!mount_data.ok()) {
@@ -723,7 +723,7 @@
   return {};
 }
 
-// A version of apex verification that happens on submitStagedSession.
+// A version of apex verification that happens on SubmitStagedSession.
 // This function contains checks that might be expensive to perform, e.g. temp
 // mounting a package and reading entire dm-verity device, and shouldn't be run
 // during boot.
@@ -740,14 +740,14 @@
 }
 
 template <typename VerifyApexFn>
-Result<std::vector<ApexFile>> verifyPackages(
+Result<std::vector<ApexFile>> VerifyPackages(
     const std::vector<std::string>& paths, const VerifyApexFn& verify_apex_fn) {
   Result<std::vector<ApexFile>> apex_files = OpenApexFiles(paths);
   if (!apex_files.ok()) {
     return apex_files.error();
   }
 
-  LOG(DEBUG) << "verifyPackages() for " << Join(paths, ',');
+  LOG(DEBUG) << "VerifyPackages() for " << Join(paths, ',');
 
   for (const ApexFile& apex_file : *apex_files) {
     Result<void> result = verify_apex_fn(apex_file);
@@ -758,12 +758,12 @@
   return std::move(*apex_files);
 }
 
-Result<ApexFile> verifySessionDir(const int session_id) {
-  std::string sessionDirPath = std::string(kStagedSessionsDir) + "/session_" +
-                               std::to_string(session_id);
-  LOG(INFO) << "Scanning " << sessionDirPath
+Result<ApexFile> VerifySessionDir(const int session_id) {
+  std::string session_dir_path = std::string(kStagedSessionsDir) + "/session_" +
+                                 std::to_string(session_id);
+  LOG(INFO) << "Scanning " << session_dir_path
             << " looking for packages to be validated";
-  Result<std::vector<std::string>> scan = FindApexFilesByName(sessionDirPath);
+  Result<std::vector<std::string>> scan = FindApexFilesByName(session_dir_path);
   if (!scan.ok()) {
     LOG(WARNING) << scan.error();
     return scan.error();
@@ -774,7 +774,7 @@
         "More than one APEX package found in the same session directory.");
   }
 
-  auto verified = verifyPackages(*scan, VerifyPackageInstall);
+  auto verified = VerifyPackages(*scan, VerifyPackageInstall);
   if (!verified.ok()) {
     return verified.error();
   }
@@ -798,7 +798,7 @@
   LOG(DEBUG) << "Initializing  backup of " << kActiveApexPackagesDataDir;
 
   // Previous restore might've delete backups folder.
-  auto create_status = createDirIfNeeded(kApexBackupDir, 0700);
+  auto create_status = CreateDirIfNeeded(kApexBackupDir, 0700);
   if (!create_status.ok()) {
     return Error() << "Backup failed : " << create_status.error();
   }
@@ -935,11 +935,12 @@
 
 }  // namespace
 
-Result<void> MountPackage(const ApexFile& apex, const std::string& mountPoint) {
+Result<void> MountPackage(const ApexFile& apex,
+                          const std::string& mount_point) {
   auto ret =
-      MountPackageImpl(apex, mountPoint, GetPackageId(apex.GetManifest()),
+      MountPackageImpl(apex, mount_point, GetPackageId(apex.GetManifest()),
                        GetHashTreeFileName(apex, /* is_new = */ false),
-                       /* verifyImage = */ false);
+                       /* verify_image = */ false);
   if (!ret.ok()) {
     return ret.error();
   }
@@ -958,7 +959,7 @@
   // If multiple temp mounts exist, ensure that all are unmounted.
   while (!finished_unmounting) {
     Result<MountedApexData> data =
-        apexd_private::getTempMountedApexData(manifest.name());
+        apexd_private::GetTempMountedApexData(manifest.name());
     if (!data.ok()) {
       finished_unmounting = true;
     } else {
@@ -969,7 +970,7 @@
   return {};
 }
 
-Result<MountedApexData> getTempMountedApexData(const std::string& package) {
+Result<MountedApexData> GetTempMountedApexData(const std::string& package) {
   bool found = false;
   Result<MountedApexData> mount_data;
   gMountedApexes.ForallMountedApexes(
@@ -1013,24 +1014,24 @@
 
 }  // namespace apexd_private
 
-Result<void> resumeRevertIfNeeded() {
+Result<void> ResumeRevertIfNeeded() {
   auto sessions =
       ApexSession::GetSessionsInState(SessionState::REVERT_IN_PROGRESS);
   if (sessions.empty()) {
     return {};
   }
-  return revertActiveSessions("");
+  return RevertActiveSessions("");
 }
 
-Result<void> activateSharedLibsPackage(const std::string& mountPoint) {
-  for (const auto& libPath : {"lib", "lib64"}) {
-    std::string apexLibPath = mountPoint + "/" + libPath;
-    auto lib_dir = PathExists(apexLibPath);
+Result<void> ActivateSharedLibsPackage(const std::string& mount_point) {
+  for (const auto& lib_path : {"lib", "lib64"}) {
+    std::string apex_lib_path = mount_point + "/" + lib_path;
+    auto lib_dir = PathExists(apex_lib_path);
     if (!lib_dir.ok() || !*lib_dir) {
       continue;
     }
 
-    auto iter = std::filesystem::directory_iterator(apexLibPath);
+    auto iter = std::filesystem::directory_iterator(apex_lib_path);
     std::error_code ec;
 
     while (iter != std::filesystem::end(iter)) {
@@ -1038,7 +1039,7 @@
       if (!lib_entry.is_directory()) {
         iter = iter.increment(ec);
         if (ec) {
-          return Error() << "Failed to scan " << apexLibPath << " : "
+          return Error() << "Failed to scan " << apex_lib_path << " : "
                          << ec.message();
         }
         continue;
@@ -1046,8 +1047,8 @@
 
       const auto library_name = lib_entry.path().filename();
       const std::string library_symlink_dir =
-          StringPrintf("%s/%s/%s/%s", kApexRoot, kApexSharedLibsSubDir, libPath,
-                       library_name.c_str());
+          StringPrintf("%s/%s/%s/%s", kApexRoot, kApexSharedLibsSubDir,
+                       lib_path, library_name.c_str());
 
       auto symlink_dir = PathExists(library_symlink_dir);
       if (!symlink_dir.ok() || !*symlink_dir) {
@@ -1069,8 +1070,28 @@
 
         auto hash_dir = PathExists(library_symlink_hash);
         if (hash_dir.ok() && *hash_dir) {
-          // TODO(b/161542925) : Handle symlink from different sharedlibs APEX
-          // with same hash value
+          // Compare file size for two library files with same name and hash
+          // value
+          auto existing_file_path =
+              library_symlink_hash + "/" + library_name.string();
+          auto existing_file_size = GetFileSize(existing_file_path);
+          if (!existing_file_size.ok()) {
+            return existing_file_size.error();
+          }
+
+          auto new_file_path =
+              lib_items.path().string() + "/" + library_name.string();
+          auto new_file_size = GetFileSize(new_file_path);
+          if (!new_file_size.ok()) {
+            return new_file_size.error();
+          }
+
+          if (*existing_file_size != *new_file_size) {
+            return Error() << "There are two libraries with same hash and "
+                              "different file size : "
+                           << existing_file_path << " and " << new_file_path;
+          }
+
           inner_iter = inner_iter.increment(ec);
           if (ec) {
             return Error() << "Failed to scan " << lib_entry.path().string()
@@ -1094,7 +1115,7 @@
 
       iter = iter.increment(ec);
       if (ec) {
-        return Error() << "Failed to scan " << apexLibPath << " : "
+        return Error() << "Failed to scan " << apex_lib_path << " : "
                        << ec.message();
       }
     }
@@ -1103,14 +1124,14 @@
   return {};
 }
 
-bool isValidPackageName(const std::string& package_name) {
+bool IsValidPackageName(const std::string& package_name) {
   return kBannedApexName.count(package_name) == 0;
 }
 
-Result<void> activatePackageImpl(const ApexFile& apex_file) {
+Result<void> ActivatePackageImpl(const ApexFile& apex_file) {
   const ApexManifest& manifest = apex_file.GetManifest();
 
-  if (!isValidPackageName(manifest.name())) {
+  if (!IsValidPackageName(manifest.name())) {
     return Errorf("Package name {} is not allowed.", manifest.name());
   }
 
@@ -1124,16 +1145,16 @@
     bool version_found_active = false;
     gMountedApexes.ForallMountedApexes(
         manifest.name(), [&](const MountedApexData& data, bool latest) {
-          Result<ApexFile> otherApex = ApexFile::Open(data.full_path);
-          if (!otherApex.ok()) {
+          Result<ApexFile> other_apex = ApexFile::Open(data.full_path);
+          if (!other_apex.ok()) {
             return;
           }
-          if (static_cast<uint64_t>(otherApex->GetManifest().version()) ==
+          if (static_cast<uint64_t>(other_apex->GetManifest().version()) ==
               new_version) {
             version_found_mounted = true;
             version_found_active = latest;
           }
-          if (static_cast<uint64_t>(otherApex->GetManifest().version()) >
+          if (static_cast<uint64_t>(other_apex->GetManifest().version()) >
               new_version) {
             is_newest_version = false;
           }
@@ -1150,12 +1171,13 @@
     }
   }
 
-  const std::string& mountPoint = apexd_private::GetPackageMountPoint(manifest);
+  const std::string& mount_point =
+      apexd_private::GetPackageMountPoint(manifest);
 
   if (!version_found_mounted) {
-    auto mountStatus = MountPackage(apex_file, mountPoint);
-    if (!mountStatus.ok()) {
-      return mountStatus;
+    auto mount_status = MountPackage(apex_file, mount_point);
+    if (!mount_status.ok()) {
+      return mount_status;
     }
   }
 
@@ -1173,7 +1195,7 @@
     // package provides shared libraries to other APEXs.
     if (is_newest_version) {
       const Result<void>& update_st = apexd_private::BindMount(
-          apexd_private::GetActiveMountPoint(manifest), mountPoint);
+          apexd_private::GetActiveMountPoint(manifest), mount_point);
       mounted_latest = update_st.has_value();
       if (!update_st.ok()) {
         return Error() << "Failed to update package " << manifest.name()
@@ -1187,9 +1209,10 @@
   }
 
   if (manifest.providesharedapexlibs()) {
-    const auto& handleSharedLibsApex = activateSharedLibsPackage(mountPoint);
-    if (!handleSharedLibsApex.ok()) {
-      return handleSharedLibsApex;
+    const auto& handle_shared_libs_apex =
+        ActivateSharedLibsPackage(mount_point);
+    if (!handle_shared_libs_apex.ok()) {
+      return handle_shared_libs_apex;
     }
   }
 
@@ -1199,28 +1222,28 @@
   return {};
 }
 
-Result<void> activatePackage(const std::string& full_path) {
+Result<void> ActivatePackage(const std::string& full_path) {
   LOG(INFO) << "Trying to activate " << full_path;
 
   Result<ApexFile> apex_file = ApexFile::Open(full_path);
   if (!apex_file.ok()) {
     return apex_file.error();
   }
-  return activatePackageImpl(*apex_file);
+  return ActivatePackageImpl(*apex_file);
 }
 
-Result<void> deactivatePackage(const std::string& full_path) {
+Result<void> DeactivatePackage(const std::string& full_path) {
   LOG(INFO) << "Trying to deactivate " << full_path;
 
-  Result<ApexFile> apexFile = ApexFile::Open(full_path);
-  if (!apexFile.ok()) {
-    return apexFile.error();
+  Result<ApexFile> apex_file = ApexFile::Open(full_path);
+  if (!apex_file.ok()) {
+    return apex_file.error();
   }
 
-  return UnmountPackage(*apexFile, /* allow_latest= */ true);
+  return UnmountPackage(*apex_file, /* allow_latest= */ true);
 }
 
-std::vector<ApexFile> getActivePackages() {
+std::vector<ApexFile> GetActivePackages() {
   std::vector<ApexFile> ret;
   gMountedApexes.ForallMountedApexes(
       [&](const std::string&, const MountedApexData& data, bool latest) {
@@ -1228,97 +1251,99 @@
           return;
         }
 
-        Result<ApexFile> apexFile = ApexFile::Open(data.full_path);
-        if (!apexFile.ok()) {
+        Result<ApexFile> apex_file = ApexFile::Open(data.full_path);
+        if (!apex_file.ok()) {
           return;
         }
-        ret.emplace_back(std::move(*apexFile));
+        ret.emplace_back(std::move(*apex_file));
       });
 
   return ret;
 }
 
-Result<void> emitApexInfoList(bool is_bootstrap) {
+Result<void> EmitApexInfoList(bool is_bootstrap) {
   // on a non-updatable device, we don't have APEX database to emit
   if (!android::sysprop::ApexProperties::updatable().value_or(false)) {
     return {};
   }
 
-  std::vector<com::android::apex::ApexInfo> apexInfos;
+  std::vector<com::android::apex::ApexInfo> apex_infos;
 
-  auto convertToAutogen = [&apexInfos](const ApexFile& apex, bool isActive) {
+  auto convert_to_autogen = [&apex_infos](const ApexFile& apex,
+                                          bool is_active) {
     auto& instance = ApexPreinstalledData::GetInstance();
 
-    auto preinstalledPath =
+    auto preinstalled_path =
         instance.GetPreinstalledPath(apex.GetManifest().name());
-    std::optional<std::string> preinstalledModulePath;
-    if (preinstalledPath.ok()) {
-      preinstalledModulePath = *preinstalledPath;
+    std::optional<std::string> preinstalled_module_path;
+    if (preinstalled_path.ok()) {
+      preinstalled_module_path = *preinstalled_path;
     }
-    com::android::apex::ApexInfo apexInfo(
-        apex.GetManifest().name(), apex.GetPath(), preinstalledModulePath,
+    com::android::apex::ApexInfo apex_info(
+        apex.GetManifest().name(), apex.GetPath(), preinstalled_module_path,
         apex.GetManifest().version(), apex.GetManifest().versionname(),
-        instance.IsPreInstalledApex(apex), isActive);
-    apexInfos.emplace_back(apexInfo);
+        instance.IsPreInstalledApex(apex), is_active);
+    apex_infos.emplace_back(apex_info);
   };
 
   // Apexd runs both in "bootstrap" and "default" mount namespace.
   // To expose /apex/apex-info-list.xml separately in each mount namespaces,
   // we write /apex/.<namespace>-apex-info-list .xml file first and then
   // bind mount it to the canonical file (/apex/apex-info-list.xml).
-  const std::string fileName =
+  const std::string file_name =
       fmt::format("{}/.{}-{}", kApexRoot,
                   is_bootstrap ? "bootstrap" : "default", kApexInfoList);
 
   unique_fd fd(TEMP_FAILURE_RETRY(
-      open(fileName.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644)));
+      open(file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644)));
   if (fd.get() == -1) {
-    return ErrnoErrorf("Can't open {}", fileName);
+    return ErrnoErrorf("Can't open {}", file_name);
   }
 
-  const auto& active = getActivePackages();
+  const auto& active = GetActivePackages();
   for (const auto& apex : active) {
-    convertToAutogen(apex, true /* isActive */);
+    convert_to_autogen(apex, true /* is_active */);
   }
   // we skip for non-activated built-in apexes in bootstrap mode
   // in order to avoid boottime increase
   if (!is_bootstrap) {
-    for (const auto& apex : getFactoryPackages()) {
+    for (const auto& apex : GetFactoryPackages()) {
       const auto& same_path = [&apex](const auto& o) {
         return o.GetPath() == apex.GetPath();
       };
       if (std::find_if(active.begin(), active.end(), same_path) ==
           active.end()) {
-        convertToAutogen(apex, false /* isActive */);
+        convert_to_autogen(apex, false /* is_active */);
       }
     }
   }
 
   std::stringstream xml;
-  com::android::apex::ApexInfoList apexInfoList(apexInfos);
-  com::android::apex::write(xml, apexInfoList);
+  com::android::apex::ApexInfoList apex_info_list(apex_infos);
+  com::android::apex::write(xml, apex_info_list);
 
   if (!android::base::WriteStringToFd(xml.str(), fd)) {
-    return ErrnoErrorf("Can't write to {}", fileName);
+    return ErrnoErrorf("Can't write to {}", file_name);
   }
 
   fd.reset();
 
-  const std::string mountPoint = fmt::format("{}/{}", kApexRoot, kApexInfoList);
-  if (access(mountPoint.c_str(), F_OK) != 0) {
-    close(open(mountPoint.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC,
+  const std::string mount_point =
+      fmt::format("{}/{}", kApexRoot, kApexInfoList);
+  if (access(mount_point.c_str(), F_OK) != 0) {
+    close(open(mount_point.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC,
                0644));
   }
-  if (mount(fileName.c_str(), mountPoint.c_str(), nullptr, MS_BIND, nullptr) ==
-      -1) {
-    return ErrnoErrorf("Can't bind mount {} to {}", fileName, mountPoint);
+  if (mount(file_name.c_str(), mount_point.c_str(), nullptr, MS_BIND,
+            nullptr) == -1) {
+    return ErrnoErrorf("Can't bind mount {} to {}", file_name, mount_point);
   }
-  return RestoreconPath(fileName);
+  return RestoreconPath(file_name);
 }
 
 namespace {
 std::unordered_map<std::string, uint64_t> GetActivePackagesMap() {
-  std::vector<ApexFile> active_packages = getActivePackages();
+  std::vector<ApexFile> active_packages = GetActivePackages();
   std::unordered_map<std::string, uint64_t> ret;
   for (const auto& package : active_packages) {
     const ApexManifest& manifest = package.GetManifest();
@@ -1329,7 +1354,7 @@
 
 }  // namespace
 
-std::vector<ApexFile> getFactoryPackages() {
+std::vector<ApexFile> GetFactoryPackages() {
   std::vector<ApexFile> ret;
   for (const auto& dir : kApexPackageBuiltinDirs) {
     auto apex_files = FindApexFilesByName(dir);
@@ -1349,8 +1374,8 @@
   return ret;
 }
 
-Result<ApexFile> getActivePackage(const std::string& packageName) {
-  std::vector<ApexFile> packages = getActivePackages();
+Result<ApexFile> GetActivePackage(const std::string& packageName) {
+  std::vector<ApexFile> packages = GetActivePackages();
   for (ApexFile& apex : packages) {
     if (apex.GetManifest().name() == packageName) {
       return std::move(apex);
@@ -1365,7 +1390,7 @@
  *
  * Returns without error only if session was successfully aborted.
  **/
-Result<void> abortStagedSession(int session_id) {
+Result<void> AbortStagedSession(int session_id) {
   auto session = ApexSession::GetSession(session_id);
   if (!session.ok()) {
     return Error() << "No session found with id " << session_id;
@@ -1426,7 +1451,7 @@
       }
     }
 
-    if (auto res = activatePackageImpl(apex); !res.ok()) {
+    if (auto res = ActivatePackageImpl(apex); !res.ok()) {
       LOG(ERROR) << "Failed to activate " << apex.GetPath() << " : "
                  << res.error();
       failed_cnt++;
@@ -1449,7 +1474,7 @@
 
 }  // namespace
 
-Result<void> scanPackagesDirAndActivate(const char* apex_package_dir) {
+Result<void> ScanPackagesDirAndActivate(const char* apex_package_dir) {
   auto apexes = ScanApexFiles(apex_package_dir);
   if (!apexes.ok()) {
     return apexes.error();
@@ -1461,14 +1486,14 @@
  * Snapshots data from base_dir/apexdata/<apex name> to
  * base_dir/apexrollback/<rollback id>/<apex name>.
  */
-Result<void> snapshotDataDirectory(const std::string& base_dir,
+Result<void> SnapshotDataDirectory(const std::string& base_dir,
                                    const int rollback_id,
                                    const std::string& apex_name,
                                    bool pre_restore = false) {
   auto rollback_path =
       StringPrintf("%s/%s/%d%s", base_dir.c_str(), kApexSnapshotSubDir,
                    rollback_id, pre_restore ? kPreRestoreSuffix : "");
-  const Result<void> result = createDirIfNeeded(rollback_path, 0700);
+  const Result<void> result = CreateDirIfNeeded(rollback_path, 0700);
   if (!result.ok()) {
     return Error() << "Failed to create snapshot directory for rollback "
                    << rollback_id << " : " << result.error();
@@ -1486,7 +1511,7 @@
  * to base_dir/apexdata/<apex name>.
  * Note the snapshot will be deleted after restoration succeeded.
  */
-Result<void> restoreDataDirectory(const std::string& base_dir,
+Result<void> RestoreDataDirectory(const std::string& base_dir,
                                   const int rollback_id,
                                   const std::string& apex_name,
                                   bool pre_restore = false) {
@@ -1510,12 +1535,12 @@
   return {};
 }
 
-void snapshotOrRestoreDeIfNeeded(const std::string& base_dir,
+void SnapshotOrRestoreDeIfNeeded(const std::string& base_dir,
                                  const ApexSession& session) {
   if (session.HasRollbackEnabled()) {
     for (const auto& apex_name : session.GetApexNames()) {
       Result<void> result =
-          snapshotDataDirectory(base_dir, session.GetRollbackId(), apex_name);
+          SnapshotDataDirectory(base_dir, session.GetRollbackId(), apex_name);
       if (!result.ok()) {
         LOG(ERROR) << "Snapshot failed for " << apex_name << ": "
                    << result.error();
@@ -1525,11 +1550,11 @@
     for (const auto& apex_name : session.GetApexNames()) {
       if (!gInFsCheckpointMode) {
         // Snapshot before restore so this rollback can be reverted.
-        snapshotDataDirectory(base_dir, session.GetRollbackId(), apex_name,
+        SnapshotDataDirectory(base_dir, session.GetRollbackId(), apex_name,
                               true /* pre_restore */);
       }
       Result<void> result =
-          restoreDataDirectory(base_dir, session.GetRollbackId(), apex_name);
+          RestoreDataDirectory(base_dir, session.GetRollbackId(), apex_name);
       if (!result.ok()) {
         LOG(ERROR) << "Restore of data failed for " << apex_name << ": "
                    << result.error();
@@ -1538,15 +1563,15 @@
   }
 }
 
-void snapshotOrRestoreDeSysData() {
+void SnapshotOrRestoreDeSysData() {
   auto sessions = ApexSession::GetSessionsInState(SessionState::ACTIVATED);
 
   for (const ApexSession& session : sessions) {
-    snapshotOrRestoreDeIfNeeded(kDeSysDataDir, session);
+    SnapshotOrRestoreDeIfNeeded(kDeSysDataDir, session);
   }
 }
 
-int snapshotOrRestoreDeUserData() {
+int SnapshotOrRestoreDeUserData() {
   auto user_dirs = GetDeUserDirs();
 
   if (!user_dirs.ok()) {
@@ -1558,47 +1583,40 @@
 
   for (const ApexSession& session : sessions) {
     for (const auto& user_dir : *user_dirs) {
-      snapshotOrRestoreDeIfNeeded(user_dir, session);
+      SnapshotOrRestoreDeIfNeeded(user_dir, session);
     }
   }
 
   return 0;
 }
 
-Result<ino_t> snapshotCeData(const int user_id, const int rollback_id,
-                             const std::string& apex_name) {
+Result<void> SnapshotCeData(const int user_id, const int rollback_id,
+                            const std::string& apex_name) {
   auto base_dir = StringPrintf("%s/%d", kCeDataDir, user_id);
-  Result<void> result = snapshotDataDirectory(base_dir, rollback_id, apex_name);
-  if (!result.ok()) {
-    return result.error();
-  }
-  auto ce_snapshot_path =
-      StringPrintf("%s/%s/%d/%s", base_dir.c_str(), kApexSnapshotSubDir,
-                   rollback_id, apex_name.c_str());
-  return get_path_inode(ce_snapshot_path);
+  return SnapshotDataDirectory(base_dir, rollback_id, apex_name);
 }
 
-Result<void> restoreCeData(const int user_id, const int rollback_id,
+Result<void> RestoreCeData(const int user_id, const int rollback_id,
                            const std::string& apex_name) {
   auto base_dir = StringPrintf("%s/%d", kCeDataDir, user_id);
-  return restoreDataDirectory(base_dir, rollback_id, apex_name);
+  return RestoreDataDirectory(base_dir, rollback_id, apex_name);
 }
 
 //  Migrates sessions directory from /data/apex/sessions to
 //  /metadata/apex/sessions, if necessary.
-Result<void> migrateSessionsDirIfNeeded() {
+Result<void> MigrateSessionsDirIfNeeded() {
   return ApexSession::MigrateToMetadataSessionsDir();
 }
 
-Result<void> destroySnapshots(const std::string& base_dir,
+Result<void> DestroySnapshots(const std::string& base_dir,
                               const int rollback_id) {
   auto path = StringPrintf("%s/%s/%d", base_dir.c_str(), kApexSnapshotSubDir,
                            rollback_id);
   return DeleteDir(path);
 }
 
-Result<void> destroyDeSnapshots(const int rollback_id) {
-  destroySnapshots(kDeSysDataDir, rollback_id);
+Result<void> DestroyDeSnapshots(const int rollback_id) {
+  DestroySnapshots(kDeSysDataDir, rollback_id);
 
   auto user_dirs = GetDeUserDirs();
   if (!user_dirs.ok()) {
@@ -1606,22 +1624,28 @@
   }
 
   for (const auto& user_dir : *user_dirs) {
-    destroySnapshots(user_dir, rollback_id);
+    DestroySnapshots(user_dir, rollback_id);
   }
 
   return {};
 }
 
+Result<void> DestroyCeSnapshots(const int user_id, const int rollback_id) {
+  auto path = StringPrintf("%s/%d/%s/%d", kCeDataDir, user_id,
+                           kApexSnapshotSubDir, rollback_id);
+  return DeleteDir(path);
+}
+
 /**
  * Deletes all credential-encrypted snapshots for the given user, except for
  * those listed in retain_rollback_ids.
  */
-Result<void> destroyCeSnapshotsNotSpecified(
+Result<void> DestroyCeSnapshotsNotSpecified(
     int user_id, const std::vector<int>& retain_rollback_ids) {
   auto snapshot_root =
       StringPrintf("%s/%d/%s", kCeDataDir, user_id, kApexSnapshotSubDir);
   auto snapshot_dirs = GetSubdirs(snapshot_root);
-  if (!snapshot_dirs) {
+  if (!snapshot_dirs.ok()) {
     return Error() << "Error reading snapshot dirs " << snapshot_dirs.error();
   }
 
@@ -1633,7 +1657,7 @@
         std::find(retain_rollback_ids.begin(), retain_rollback_ids.end(),
                   snapshot_id) == retain_rollback_ids.end()) {
       Result<void> result = DeleteDir(snapshot_dir);
-      if (!result) {
+      if (!result.ok()) {
         return Error() << "Destroy CE snapshot failed for " << snapshot_dir
                        << " : " << result.error();
       }
@@ -1642,14 +1666,14 @@
   return {};
 }
 
-void restorePreRestoreSnapshotsIfPresent(const std::string& base_dir,
+void RestorePreRestoreSnapshotsIfPresent(const std::string& base_dir,
                                          const ApexSession& session) {
   auto pre_restore_snapshot_path =
       StringPrintf("%s/%s/%d%s", base_dir.c_str(), kApexSnapshotSubDir,
                    session.GetRollbackId(), kPreRestoreSuffix);
   if (PathExists(pre_restore_snapshot_path).ok()) {
     for (const auto& apex_name : session.GetApexNames()) {
-      Result<void> result = restoreDataDirectory(
+      Result<void> result = RestoreDataDirectory(
           base_dir, session.GetRollbackId(), apex_name, true /* pre_restore */);
       if (!result.ok()) {
         LOG(ERROR) << "Restore of pre-restore snapshot failed for " << apex_name
@@ -1665,8 +1689,8 @@
   }
 }
 
-void restoreDePreRestoreSnapshotsIfPresent(const ApexSession& session) {
-  restorePreRestoreSnapshotsIfPresent(kDeSysDataDir, session);
+void RestoreDePreRestoreSnapshotsIfPresent(const ApexSession& session) {
+  RestorePreRestoreSnapshotsIfPresent(kDeSysDataDir, session);
 
   auto user_dirs = GetDeUserDirs();
   if (!user_dirs.ok()) {
@@ -1675,11 +1699,11 @@
   }
 
   for (const auto& user_dir : *user_dirs) {
-    restorePreRestoreSnapshotsIfPresent(user_dir, session);
+    RestorePreRestoreSnapshotsIfPresent(user_dir, session);
   }
 }
 
-void deleteDePreRestoreSnapshots(const std::string& base_dir,
+void DeleteDePreRestoreSnapshots(const std::string& base_dir,
                                  const ApexSession& session) {
   auto pre_restore_snapshot_path =
       StringPrintf("%s/%s/%d%s", base_dir.c_str(), kApexSnapshotSubDir,
@@ -1690,8 +1714,8 @@
   }
 }
 
-void deleteDePreRestoreSnapshots(const ApexSession& session) {
-  deleteDePreRestoreSnapshots(kDeSysDataDir, session);
+void DeleteDePreRestoreSnapshots(const ApexSession& session) {
+  DeleteDePreRestoreSnapshots(kDeSysDataDir, session);
 
   auto user_dirs = GetDeUserDirs();
   if (!user_dirs.ok()) {
@@ -1700,41 +1724,41 @@
   }
 
   for (const auto& user_dir : *user_dirs) {
-    deleteDePreRestoreSnapshots(user_dir, session);
+    DeleteDePreRestoreSnapshots(user_dir, session);
   }
 }
 
-void onBootCompleted() {
-  ApexdLifecycle::getInstance().markBootCompleted();
-  bootCompletedCleanup();
+void OnBootCompleted() {
+  ApexdLifecycle::GetInstance().MarkBootCompleted();
+  BootCompletedCleanup();
 }
 
-void scanStagedSessionsDirAndStage() {
+void ScanStagedSessionsDirAndStage() {
   LOG(INFO) << "Scanning " << ApexSession::GetSessionsDir()
             << " looking for sessions to be activated.";
 
-  auto sessionsToActivate =
+  auto sessions_to_activate =
       ApexSession::GetSessionsInState(SessionState::STAGED);
   if (gSupportsFsCheckpoints) {
     // A session that is in the ACTIVATED state should still be re-activated if
     // fs checkpointing is supported. In this case, a session may be in the
     // ACTIVATED state yet the data/apex/active directory may have been
     // reverted. The session should be reverted in this scenario.
-    auto activatedSessions =
+    auto activated_sessions =
         ApexSession::GetSessionsInState(SessionState::ACTIVATED);
-    sessionsToActivate.insert(sessionsToActivate.end(),
-                              activatedSessions.begin(),
-                              activatedSessions.end());
+    sessions_to_activate.insert(sessions_to_activate.end(),
+                                activated_sessions.begin(),
+                                activated_sessions.end());
   }
 
-  for (auto& session : sessionsToActivate) {
-    auto sessionId = session.GetId();
+  for (auto& session : sessions_to_activate) {
+    auto session_id = session.GetId();
 
     auto session_failed_fn = [&]() {
-      LOG(WARNING) << "Marking session " << sessionId << " as failed.";
+      LOG(WARNING) << "Marking session " << session_id << " as failed.";
       auto st = session.UpdateStateAndCommit(SessionState::ACTIVATION_FAILED);
       if (!st.ok()) {
-        LOG(WARNING) << "Failed to mark session " << sessionId
+        LOG(WARNING) << "Failed to mark session " << session_id
                      << " as failed : " << st.error();
       }
     };
@@ -1746,52 +1770,52 @@
       continue;
     }
 
-    std::vector<std::string> dirsToScan;
+    std::vector<std::string> dirs_to_scan;
     if (session.GetChildSessionIds().empty()) {
-      dirsToScan.push_back(std::string(kStagedSessionsDir) + "/session_" +
-                           std::to_string(sessionId));
+      dirs_to_scan.push_back(std::string(kStagedSessionsDir) + "/session_" +
+                             std::to_string(session_id));
     } else {
-      for (auto childSessionId : session.GetChildSessionIds()) {
-        dirsToScan.push_back(std::string(kStagedSessionsDir) + "/session_" +
-                             std::to_string(childSessionId));
+      for (auto child_session_id : session.GetChildSessionIds()) {
+        dirs_to_scan.push_back(std::string(kStagedSessionsDir) + "/session_" +
+                               std::to_string(child_session_id));
       }
     }
 
     std::vector<std::string> apexes;
-    bool scanSuccessful = true;
-    for (const auto& dirToScan : dirsToScan) {
-      Result<std::vector<std::string>> scan = FindApexFilesByName(dirToScan);
+    bool scan_successful = true;
+    for (const auto& dir_to_scan : dirs_to_scan) {
+      Result<std::vector<std::string>> scan = FindApexFilesByName(dir_to_scan);
       if (!scan.ok()) {
         LOG(WARNING) << scan.error();
-        scanSuccessful = false;
+        scan_successful = false;
         break;
       }
 
       if (scan->size() > 1) {
         LOG(WARNING) << "More than one APEX package found in the same session "
-                     << "directory " << dirToScan << ", skipping activation.";
-        scanSuccessful = false;
+                     << "directory " << dir_to_scan << ", skipping activation.";
+        scan_successful = false;
         break;
       }
 
       if (scan->empty()) {
-        LOG(WARNING) << "No APEX packages found while scanning " << dirToScan
-                     << " session id: " << sessionId << ".";
-        scanSuccessful = false;
+        LOG(WARNING) << "No APEX packages found while scanning " << dir_to_scan
+                     << " session id: " << session_id << ".";
+        scan_successful = false;
         break;
       }
       apexes.push_back(std::move((*scan)[0]));
     }
 
-    if (!scanSuccessful) {
+    if (!scan_successful) {
       continue;
     }
 
     // Run postinstall, if necessary.
-    Result<void> postinstall_status = postinstallPackages(apexes);
+    Result<void> postinstall_status = PostinstallPackages(apexes);
     if (!postinstall_status.ok()) {
       LOG(ERROR) << "Postinstall failed for session "
-                 << std::to_string(sessionId) << ": "
+                 << std::to_string(session_id) << ": "
                  << postinstall_status.error();
       continue;
     }
@@ -1806,7 +1830,7 @@
       session.AddApexName(apex_file->GetManifest().name());
     }
 
-    const Result<void> result = stagePackages(apexes);
+    const Result<void> result = StagePackages(apexes);
     if (!result.ok()) {
       LOG(ERROR) << "Activation failed for packages " << Join(apexes, ',')
                  << ": " << result.error();
@@ -1824,21 +1848,21 @@
   }
 }
 
-Result<void> preinstallPackages(const std::vector<std::string>& paths) {
+Result<void> PreinstallPackages(const std::vector<std::string>& paths) {
   Result<std::vector<ApexFile>> apex_files = OpenApexFiles(paths);
   if (!apex_files.ok()) {
     return apex_files.error();
   }
-  LOG(DEBUG) << "preinstallPackages() for " << Join(paths, ',');
+  LOG(DEBUG) << "PreinstallPackages() for " << Join(paths, ',');
   return PreinstallPackages(*apex_files);
 }
 
-Result<void> postinstallPackages(const std::vector<std::string>& paths) {
+Result<void> PostinstallPackages(const std::vector<std::string>& paths) {
   Result<std::vector<ApexFile>> apex_files = OpenApexFiles(paths);
   if (!apex_files.ok()) {
     return apex_files.error();
   }
-  LOG(DEBUG) << "postinstallPackages() for " << Join(paths, ',');
+  LOG(DEBUG) << "PostinstallPackages() for " << Join(paths, ',');
   return PostinstallPackages(*apex_files);
 }
 
@@ -1851,24 +1875,24 @@
 
 }  // namespace
 
-Result<void> stagePackages(const std::vector<std::string>& tmpPaths) {
-  if (tmpPaths.empty()) {
+Result<void> StagePackages(const std::vector<std::string>& tmp_paths) {
+  if (tmp_paths.empty()) {
     return Errorf("Empty set of inputs");
   }
-  LOG(DEBUG) << "stagePackages() for " << Join(tmpPaths, ',');
+  LOG(DEBUG) << "StagePackages() for " << Join(tmp_paths, ',');
 
   // Note: this function is temporary. As such the code is not optimized, e.g.,
   //       it will open ApexFiles multiple times.
 
   // 1) Verify all packages.
-  auto verify_status = verifyPackages(tmpPaths, VerifyPackageBoot);
+  auto verify_status = VerifyPackages(tmp_paths, VerifyPackageBoot);
   if (!verify_status.ok()) {
     return verify_status.error();
   }
 
   // Make sure that kActiveApexPackagesDataDir exists.
   auto create_dir_status =
-      createDirIfNeeded(std::string(kActiveApexPackagesDataDir), 0755);
+      CreateDirIfNeeded(std::string(kActiveApexPackagesDataDir), 0755);
   if (!create_dir_status.ok()) {
     return create_dir_status.error();
   }
@@ -1893,7 +1917,7 @@
   auto scope_guard = android::base::make_scope_guard(deleter);
 
   std::unordered_set<std::string> staged_packages;
-  for (const std::string& path : tmpPaths) {
+  for (const std::string& path : tmp_paths) {
     Result<ApexFile> apex_file = ApexFile::Open(path);
     if (!apex_file.ok()) {
       return apex_file.error();
@@ -1937,11 +1961,11 @@
   return RemovePreviouslyActiveApexFiles(staged_packages, staged_files);
 }
 
-Result<void> unstagePackages(const std::vector<std::string>& paths) {
+Result<void> UnstagePackages(const std::vector<std::string>& paths) {
   if (paths.empty()) {
     return Errorf("Empty set of inputs");
   }
-  LOG(DEBUG) << "unstagePackages() for " << Join(paths, ',');
+  LOG(DEBUG) << "UnstagePackages() for " << Join(paths, ',');
 
   for (const std::string& path : paths) {
     auto apex = ApexFile::Open(path);
@@ -1971,16 +1995,16 @@
  * Also, we need to put staged sessions in /data/apex/sessions in REVERTED state
  * so that they do not get activated on next reboot.
  */
-Result<void> revertActiveSessions(const std::string& crashing_native_process) {
+Result<void> RevertActiveSessions(const std::string& crashing_native_process) {
   // First check whenever there is anything to revert. If there is none, then
   // fail. This prevents apexd from boot looping a device in case a native
   // process is crashing and there are no apex updates.
-  auto activeSessions = ApexSession::GetActiveSessions();
-  if (activeSessions.empty()) {
+  auto active_sessions = ApexSession::GetActiveSessions();
+  if (active_sessions.empty()) {
     return Error() << "Revert requested, when there are no active sessions.";
   }
 
-  for (auto& session : activeSessions) {
+  for (auto& session : active_sessions) {
     if (!crashing_native_process.empty()) {
       session.SetCrashingNativeProcess(crashing_native_process);
     }
@@ -1993,9 +2017,9 @@
   }
 
   if (!gInFsCheckpointMode) {
-    auto restoreStatus = RestoreActivePackages();
-    if (!restoreStatus.ok()) {
-      for (auto& session : activeSessions) {
+    auto restore_status = RestoreActivePackages();
+    if (!restore_status.ok()) {
+      for (auto& session : active_sessions) {
         auto st = session.UpdateStateAndCommit(SessionState::REVERT_FAILED);
         LOG(DEBUG) << "Marking " << session << " as failed to revert";
         if (!st.ok()) {
@@ -2003,17 +2027,17 @@
                        << " as failed to revert : " << st.error();
         }
       }
-      return restoreStatus;
+      return restore_status;
     }
   } else {
     LOG(INFO) << "Not restoring active packages in checkpoint mode.";
   }
 
-  for (auto& session : activeSessions) {
+  for (auto& session : active_sessions) {
     if (!gInFsCheckpointMode && session.IsRollback()) {
       // If snapshots have already been restored, undo that by restoring the
       // pre-restore snapshot.
-      restoreDePreRestoreSnapshotsIfPresent(session);
+      RestoreDePreRestoreSnapshotsIfPresent(session);
     }
 
     auto status = session.UpdateStateAndCommit(SessionState::REVERTED);
@@ -2026,9 +2050,9 @@
   return {};
 }
 
-Result<void> revertActiveSessionsAndReboot(
+Result<void> RevertActiveSessionsAndReboot(
     const std::string& crashing_native_process) {
-  auto status = revertActiveSessions(crashing_native_process);
+  auto status = RevertActiveSessions(crashing_native_process);
   if (!status.ok()) {
     return status;
   }
@@ -2044,28 +2068,28 @@
   return {};
 }
 
-Result<void> createSharedLibsApexDir() {
+Result<void> CreateSharedLibsApexDir() {
   // Creates /apex/sharedlibs/lib{,64} for SharedLibs APEXes.
-  std::string sharedLibsSubDir =
+  std::string shared_libs_sub_dir =
       StringPrintf("%s/%s", kApexRoot, kApexSharedLibsSubDir);
-  auto dir_exists = PathExists(sharedLibsSubDir);
+  auto dir_exists = PathExists(shared_libs_sub_dir);
   if (!dir_exists.ok() || !*dir_exists) {
     std::error_code error_code;
-    std::filesystem::create_directory(sharedLibsSubDir, error_code);
+    std::filesystem::create_directory(shared_libs_sub_dir, error_code);
     if (error_code) {
-      return Error() << "Failed to create directory " << sharedLibsSubDir
+      return Error() << "Failed to create directory " << shared_libs_sub_dir
                      << ": " << error_code.message();
     }
   }
-  for (const auto& libPath : {"lib", "lib64"}) {
-    std::string apexLibPath =
-        StringPrintf("%s/%s", sharedLibsSubDir.c_str(), libPath);
-    auto lib_dir_exists = PathExists(apexLibPath);
+  for (const auto& lib_path : {"lib", "lib64"}) {
+    std::string apex_lib_path =
+        StringPrintf("%s/%s", shared_libs_sub_dir.c_str(), lib_path);
+    auto lib_dir_exists = PathExists(apex_lib_path);
     if (!lib_dir_exists.ok() || !*lib_dir_exists) {
       std::error_code error_code;
-      std::filesystem::create_directory(apexLibPath, error_code);
+      std::filesystem::create_directory(apex_lib_path, error_code);
       if (error_code) {
-        return Error() << "Failed to create directory " << apexLibPath << ": "
+        return Error() << "Failed to create directory " << apex_lib_path << ": "
                        << error_code.message();
       }
     }
@@ -2074,11 +2098,11 @@
   return {};
 }
 
-int onBootstrap() {
-  Result<void> preAllocate = preAllocateLoopDevices();
-  if (!preAllocate.ok()) {
+int OnBootstrap() {
+  Result<void> pre_allocate = PreAllocateLoopDevices();
+  if (!pre_allocate.ok()) {
     LOG(ERROR) << "Failed to pre-allocate loop devices : "
-               << preAllocate.error();
+               << pre_allocate.error();
   }
 
   ApexPreinstalledData& instance = ApexPreinstalledData::GetInstance();
@@ -2091,7 +2115,7 @@
   }
 
   // Create directories for APEX shared libraries.
-  auto sharedlibs_apex_dir = createSharedLibsApexDir();
+  auto sharedlibs_apex_dir = CreateSharedLibsApexDir();
   if (!sharedlibs_apex_dir.ok()) {
     LOG(ERROR) << sharedlibs_apex_dir.error();
     return 1;
@@ -2108,7 +2132,7 @@
     }
     std::copy_if(std::make_move_iterator(scan->begin()),
                  std::make_move_iterator(scan->end()),
-                 std::back_inserter(bootstrap_apexes), isBootstrapApex);
+                 std::back_inserter(bootstrap_apexes), IsBootstrapApex);
   }
 
   // Now activate bootstrap apexes.
@@ -2117,19 +2141,19 @@
     return 1;
   }
 
-  onAllPackagesActivated(/*is_bootstrap=*/true);
+  OnAllPackagesActivated(/*is_bootstrap=*/true);
   LOG(INFO) << "Bootstrapping done";
   return 0;
 }
 
-Result<void> remountApexFile(const std::string& path) {
-  if (auto ret = deactivatePackage(path); !ret.ok()) {
+Result<void> RemountApexFile(const std::string& path) {
+  if (auto ret = DeactivatePackage(path); !ret.ok()) {
     return ret;
   }
-  return activatePackage(path);
+  return ActivatePackage(path);
 }
 
-void initializeVold(CheckpointInterface* checkpoint_service) {
+void InitializeVold(CheckpointInterface* checkpoint_service) {
   if (checkpoint_service != nullptr) {
     gVoldService = checkpoint_service;
     Result<bool> supports_fs_checkpoints =
@@ -2152,8 +2176,8 @@
   }
 }
 
-void initialize(CheckpointInterface* checkpoint_service) {
-  initializeVold(checkpoint_service);
+void Initialize(CheckpointInterface* checkpoint_service) {
+  InitializeVold(checkpoint_service);
   ApexPreinstalledData& instance = ApexPreinstalledData::GetInstance();
   Result<void> status = instance.Initialize(kApexPackageBuiltinDirs);
   if (!status.ok()) {
@@ -2164,7 +2188,7 @@
   gMountedApexes.PopulateFromMounts();
 }
 
-void onStart() {
+void OnStart() {
   LOG(INFO) << "Marking APEXd as starting";
   if (!android::base::SetProperty(kApexStatusSysprop, kApexStatusStarting)) {
     PLOG(ERROR) << "Failed to set " << kApexStatusSysprop << " to "
@@ -2183,20 +2207,20 @@
       LOG(INFO) << "Exceeded number of session retries ("
                 << kNumRetriesWhenCheckpointingEnabled
                 << "). Starting a revert";
-      revertActiveSessions("");
+      RevertActiveSessions("");
     }
   }
 
   // Create directories for APEX shared libraries.
-  auto sharedlibs_apex_dir = createSharedLibsApexDir();
+  auto sharedlibs_apex_dir = CreateSharedLibsApexDir();
   if (!sharedlibs_apex_dir.ok()) {
     LOG(ERROR) << sharedlibs_apex_dir.error();
   }
 
   // Activate APEXes from /data/apex. If one in the directory is newer than the
   // system one, the new one will eclipse the old one.
-  scanStagedSessionsDirAndStage();
-  auto status = resumeRevertIfNeeded();
+  ScanStagedSessionsDirAndStage();
+  auto status = ResumeRevertIfNeeded();
   if (!status.ok()) {
     LOG(ERROR) << "Failed to resume revert : " << status.error();
   }
@@ -2205,7 +2229,7 @@
   if (auto scan = ScanApexFiles(kActiveApexPackagesDataDir); !scan.ok()) {
     LOG(ERROR) << "Failed to scan packages from " << kActiveApexPackagesDataDir
                << " : " << scan.error();
-    if (auto revert = revertActiveSessionsAndReboot(""); !revert.ok()) {
+    if (auto revert = RevertActiveSessionsAndReboot(""); !revert.ok()) {
       LOG(ERROR) << "Failed to revert : " << revert.error();
     }
   } else {
@@ -2221,10 +2245,18 @@
                  std::back_inserter(data_apex), filter_fn);
   }
 
+  if (data_apex.size() > 0) {
+    Result<void> pre_allocate = loop::PreAllocateLoopDevices(data_apex.size());
+    if (!pre_allocate.ok()) {
+      LOG(ERROR) << "Failed to pre-allocate loop devices : "
+                 << pre_allocate.error();
+    }
+  }
+
   if (auto ret = ActivateApexPackages(data_apex); !ret.ok()) {
     LOG(ERROR) << "Failed to activate packages from "
-               << kActiveApexPackagesDataDir << " : " << status.error();
-    Result<void> revert_status = revertActiveSessionsAndReboot("");
+               << kActiveApexPackagesDataDir << " : " << ret.error();
+    Result<void> revert_status = RevertActiveSessionsAndReboot("");
     if (!revert_status.ok()) {
       LOG(ERROR) << "Failed to revert : " << revert_status.error()
                  << kActiveApexPackagesDataDir << " : " << ret.error();
@@ -2237,7 +2269,7 @@
     if (!scan_status.ok()) {
       LOG(ERROR) << "Failed to scan APEX packages from " << dir << " : "
                  << scan_status.error();
-      if (auto revert = revertActiveSessionsAndReboot(""); !revert.ok()) {
+      if (auto revert = RevertActiveSessionsAndReboot(""); !revert.ok()) {
         LOG(ERROR) << "Failed to revert : " << revert.error();
       }
     }
@@ -2249,11 +2281,11 @@
   }
 
   // Now that APEXes are mounted, snapshot or restore DE_sys data.
-  snapshotOrRestoreDeSysData();
+  SnapshotOrRestoreDeSysData();
 }
 
-void onAllPackagesActivated(bool is_bootstrap) {
-  auto result = emitApexInfoList(is_bootstrap);
+void OnAllPackagesActivated(bool is_bootstrap) {
+  auto result = EmitApexInfoList(is_bootstrap);
   if (!result.ok()) {
     LOG(ERROR) << "cannot emit apex info list: " << result.error();
   }
@@ -2276,7 +2308,7 @@
   }
 }
 
-void onAllPackagesReady() {
+void OnAllPackagesReady() {
   // Set a system property to let other components know that APEXs are
   // correctly mounted and ready to be used. Before using any file from APEXs,
   // they can query this system property to ensure that they are okay to
@@ -2289,7 +2321,7 @@
   }
 }
 
-Result<std::vector<ApexFile>> submitStagedSession(
+Result<std::vector<ApexFile>> SubmitStagedSession(
     const int session_id, const std::vector<int>& child_session_ids,
     const bool has_rollback_enabled, const bool is_rollback,
     const int rollback_id) {
@@ -2314,7 +2346,7 @@
 
   std::vector<ApexFile> ret;
   for (int id_to_scan : ids_to_scan) {
-    auto verified = verifySessionDir(id_to_scan);
+    auto verified = VerifySessionDir(id_to_scan);
     if (!verified.ok()) {
       return verified.error();
     }
@@ -2351,7 +2383,7 @@
   return ret;
 }
 
-Result<void> markStagedSessionReady(const int session_id) {
+Result<void> MarkStagedSessionReady(const int session_id) {
   auto session = ApexSession::GetSession(session_id);
   if (!session.ok()) {
     return session.error();
@@ -2370,7 +2402,7 @@
                  << ". Cannot mark it as ready.";
 }
 
-Result<void> markStagedSessionSuccessful(const int session_id) {
+Result<void> MarkStagedSessionSuccessful(const int session_id) {
   auto session = ApexSession::GetSession(session_id);
   if (!session.ok()) {
     return session.error();
@@ -2386,7 +2418,7 @@
                      << " as successful : " << cleanup_status.error();
     }
     if (session->IsRollback() && !gInFsCheckpointMode) {
-      deleteDePreRestoreSnapshots(*session);
+      DeleteDePreRestoreSnapshots(*session);
     }
     return session->UpdateStateAndCommit(SessionState::SUCCESS);
   } else {
@@ -2467,13 +2499,13 @@
 
 }  // namespace
 
-void bootCompletedCleanup() {
+void BootCompletedCleanup() {
   UnmountDanglingMounts();
   RemoveOrphanedApexes();
   ApexSession::DeleteFinalizedSessions();
 }
 
-int unmountAll() {
+int UnmountAll() {
   gMountedApexes.PopulateFromMounts();
   int ret = 0;
   gMountedApexes.ForallMountedApexes([&](const std::string& /*package*/,
@@ -2499,7 +2531,7 @@
   return ret;
 }
 
-Result<void> remountPackages() {
+Result<void> RemountPackages() {
   std::vector<std::string> apexes;
   gMountedApexes.ForallMountedApexes([&apexes](const std::string& /*package*/,
                                                const MountedApexData& data,
@@ -2513,7 +2545,7 @@
   for (const std::string& apex : apexes) {
     // Since this is only used during development workflow, we are trying to
     // remount as many apexes as possible instead of failing fast.
-    if (auto ret = remountApexFile(apex); !ret) {
+    if (auto ret = RemountApexFile(apex); !ret.ok()) {
       LOG(WARNING) << "Failed to remount " << apex << " : " << ret.error();
       failed.emplace_back(apex);
     }
diff --git a/apexd/apexd.h b/apexd/apexd.h
index dca3efb..bf44e4b 100644
--- a/apexd/apexd.h
+++ b/apexd/apexd.h
@@ -32,96 +32,99 @@
 
 class CheckpointInterface;
 
-android::base::Result<void> resumeRevertIfNeeded();
+android::base::Result<void> ResumeRevertIfNeeded();
 
 // Keep it for now to make otapreopt_chroot keep happy.
 // TODO(b/137086602): remove this function.
-android::base::Result<void> scanPackagesDirAndActivate(
+android::base::Result<void> ScanPackagesDirAndActivate(
     const char* apex_package_dir);
-void scanStagedSessionsDirAndStage();
-android::base::Result<void> preinstallPackages(
+void ScanStagedSessionsDirAndStage();
+android::base::Result<void> PreinstallPackages(
     const std::vector<std::string>& paths) WARN_UNUSED;
-android::base::Result<void> postinstallPackages(
+android::base::Result<void> PostinstallPackages(
     const std::vector<std::string>& paths) WARN_UNUSED;
 
-android::base::Result<void> stagePackages(
+android::base::Result<void> StagePackages(
     const std::vector<std::string>& tmpPaths) WARN_UNUSED;
-android::base::Result<void> unstagePackages(
+android::base::Result<void> UnstagePackages(
     const std::vector<std::string>& paths) WARN_UNUSED;
 
-android::base::Result<std::vector<ApexFile>> submitStagedSession(
+android::base::Result<std::vector<ApexFile>> SubmitStagedSession(
     const int session_id, const std::vector<int>& child_session_ids,
     const bool has_rollback_enabled, const bool is_rollback,
     const int rollback_id) WARN_UNUSED;
-android::base::Result<void> markStagedSessionReady(const int session_id)
+android::base::Result<void> MarkStagedSessionReady(const int session_id)
     WARN_UNUSED;
-android::base::Result<void> markStagedSessionSuccessful(const int session_id)
+android::base::Result<void> MarkStagedSessionSuccessful(const int session_id)
     WARN_UNUSED;
-android::base::Result<void> revertActiveSessions(
+android::base::Result<void> RevertActiveSessions(
     const std::string& crashing_native_process);
-android::base::Result<void> revertActiveSessionsAndReboot(
+android::base::Result<void> RevertActiveSessionsAndReboot(
     const std::string& crashing_native_process);
 
-android::base::Result<void> activatePackage(const std::string& full_path)
+android::base::Result<void> ActivatePackage(const std::string& full_path)
     WARN_UNUSED;
-android::base::Result<void> deactivatePackage(const std::string& full_path)
+android::base::Result<void> DeactivatePackage(const std::string& full_path)
     WARN_UNUSED;
 
-std::vector<ApexFile> getActivePackages();
-android::base::Result<ApexFile> getActivePackage(
+std::vector<ApexFile> GetActivePackages();
+android::base::Result<ApexFile> GetActivePackage(
     const std::string& package_name);
 
-std::vector<ApexFile> getFactoryPackages();
+std::vector<ApexFile> GetFactoryPackages();
 
-android::base::Result<void> abortStagedSession(const int session_id);
-android::base::Result<void> abortActiveSession();
+android::base::Result<void> AbortStagedSession(const int session_id);
+android::base::Result<void> AbortActiveSession();
 
-android::base::Result<ino_t> snapshotCeData(const int user_id,
-                                            const int rollback_id,
-                                            const std::string& apex_name);
-android::base::Result<void> restoreCeData(const int user_id,
+android::base::Result<void> SnapshotCeData(const int user_id,
+                                           const int rollback_id,
+                                           const std::string& apex_name);
+android::base::Result<void> RestoreCeData(const int user_id,
                                           const int rollback_id,
                                           const std::string& apex_name);
-android::base::Result<void> destroyDeSnapshots(const int rollback_id);
-android::base::Result<void> destroyCeSnapshotsNotSpecified(
+
+android::base::Result<void> DestroyDeSnapshots(const int rollback_id);
+android::base::Result<void> DestroyCeSnapshots(const int user_id,
+                                               const int rollback_id);
+android::base::Result<void> DestroyCeSnapshotsNotSpecified(
     int user_id, const std::vector<int>& retain_rollback_ids);
 
-int onBootstrap();
+int OnBootstrap();
 // Sets the values of gVoldService and gInFsCheckpointMode.
-void initializeVold(CheckpointInterface* checkpoint_service);
+void InitializeVold(CheckpointInterface* checkpoint_service);
 // Initializes in-memory state (e.g. pre-installed data, activated apexes).
 // Must be called first before calling any other boot sequence related function.
-void initialize(CheckpointInterface* checkpoint_service);
+void Initialize(CheckpointInterface* checkpoint_service);
 // Migrates sessions from /data/apex/session to /metadata/session.i
 // Must only be called during boot (i.e apexd.status is not "ready" or
 // "activated").
-android::base::Result<void> migrateSessionsDirIfNeeded();
+android::base::Result<void> MigrateSessionsDirIfNeeded();
 // Apex activation logic. Scans staged apex sessions and activates apexes.
 // Must only be called during boot (i.e apexd.status is not "ready" or
 // "activated").
-void onStart();
+void OnStart();
 // Notifies system that apexes are activated by setting apexd.status property to
 // "activated".
 // Must only be called during boot (i.e. apexd.status is not "ready" or
 // "activated").
-void onAllPackagesActivated(bool is_bootstrap);
+void OnAllPackagesActivated(bool is_bootstrap);
 // Notifies system that apexes are ready by setting apexd.status property to
 // "ready".
 // Must only be called during boot (i.e. apexd.status is not "ready" or
 // "activated").
-void onAllPackagesReady();
-void onBootCompleted();
-void bootCompletedCleanup();
-int snapshotOrRestoreDeUserData();
+void OnAllPackagesReady();
+void OnBootCompleted();
+void BootCompletedCleanup();
+int SnapshotOrRestoreDeUserData();
 
-int unmountAll();
+int UnmountAll();
 
 android::base::Result<MountedApexDatabase::MountedApexData>
-getTempMountedApexData(const std::string& package);
+GetTempMountedApexData(const std::string& package);
 
 // Optimistically tries to remount as many APEX packages as possible.
 // For more documentation see corresponding binder call in IApexService.aidl.
-android::base::Result<void> remountPackages();
+android::base::Result<void> RemountPackages();
 
 }  // namespace apex
 }  // namespace android
diff --git a/apexd/apexd_checkpoint.h b/apexd/apexd_checkpoint.h
index 7177c04..2b4c3a1 100644
--- a/apexd/apexd_checkpoint.h
+++ b/apexd/apexd_checkpoint.h
@@ -32,7 +32,7 @@
 
   virtual android::base::Result<bool> NeedsCheckpoint() = 0;
   virtual android::base::Result<bool> NeedsRollback() = 0;
-  virtual android::base::Result<void> StartCheckpoint(int32_t numRetries) = 0;
+  virtual android::base::Result<void> StartCheckpoint(int32_t num_retries) = 0;
 
   virtual android::base::Result<void> AbortChanges(const std::string& msg,
                                                    bool retry) = 0;
diff --git a/apexd/apexd_checkpoint_vold.cpp b/apexd/apexd_checkpoint_vold.cpp
index ca29209..8a8d0ff 100644
--- a/apexd/apexd_checkpoint_vold.cpp
+++ b/apexd/apexd_checkpoint_vold.cpp
@@ -31,11 +31,11 @@
 namespace apex {
 
 Result<VoldCheckpointInterface> VoldCheckpointInterface::Create() {
-  auto voldService =
+  auto vold_service =
       defaultServiceManager()->getService(android::String16("vold"));
-  if (voldService != nullptr) {
+  if (vold_service != nullptr) {
     return VoldCheckpointInterface(
-        android::interface_cast<android::os::IVold>(voldService));
+        android::interface_cast<android::os::IVold>(vold_service));
   }
   return Errorf("Failed to retrieve vold service.");
 }
@@ -91,9 +91,10 @@
   return false;
 }
 
-Result<void> VoldCheckpointInterface::StartCheckpoint(int32_t numRetries) {
+Result<void> VoldCheckpointInterface::StartCheckpoint(int32_t num_retries) {
   if (supports_fs_checkpoints_) {
-    android::binder::Status status = vold_service_->startCheckpoint(numRetries);
+    android::binder::Status status =
+        vold_service_->startCheckpoint(num_retries);
     if (!status.isOk()) {
       return Error() << status.toString8().c_str();
     }
diff --git a/apexd/apexd_checkpoint_vold.h b/apexd/apexd_checkpoint_vold.h
index dbd190d..f547532 100644
--- a/apexd/apexd_checkpoint_vold.h
+++ b/apexd/apexd_checkpoint_vold.h
@@ -44,7 +44,7 @@
   android::base::Result<void> StartCheckpoint(int32_t retry) override;
 
   android::base::Result<void> AbortChanges(const std::string& msg,
-                                           bool numRetries) override;
+                                           bool num_retries) override;
 
   static android::base::Result<VoldCheckpointInterface> Create();
 
diff --git a/apexd/apexd_lifecycle.cpp b/apexd/apexd_lifecycle.cpp
index c44ca5a..84918f9 100644
--- a/apexd/apexd_lifecycle.cpp
+++ b/apexd/apexd_lifecycle.cpp
@@ -30,12 +30,12 @@
 namespace android {
 namespace apex {
 
-bool ApexdLifecycle::isBooting() {
+bool ApexdLifecycle::IsBooting() {
   auto status = GetProperty(kApexStatusSysprop, "");
   return status != kApexStatusReady && status != kApexStatusActivated;
 }
 
-void ApexdLifecycle::waitForBootStatus(
+void ApexdLifecycle::WaitForBootStatus(
     Result<void> (&revert_fn)(const std::string&)) {
   while (!boot_completed_) {
     // Check for change in either crashing property or sys.boot_completed
@@ -66,7 +66,7 @@
   }
 }
 
-void ApexdLifecycle::markBootCompleted() { boot_completed_ = true; }
+void ApexdLifecycle::MarkBootCompleted() { boot_completed_ = true; }
 
 }  // namespace apex
 }  // namespace android
diff --git a/apexd/apexd_lifecycle.h b/apexd/apexd_lifecycle.h
index bab0a05..5a2224f 100644
--- a/apexd/apexd_lifecycle.h
+++ b/apexd/apexd_lifecycle.h
@@ -33,13 +33,13 @@
   ApexdLifecycle& operator=(ApexdLifecycle&&) = delete;
 
  public:
-  static ApexdLifecycle& getInstance() {
+  static ApexdLifecycle& GetInstance() {
     static ApexdLifecycle instance;
     return instance;
   }
-  bool isBooting();
-  void markBootCompleted();
-  void waitForBootStatus(
+  bool IsBooting();
+  void MarkBootCompleted();
+  void WaitForBootStatus(
       android::base::Result<void> (&rollback_fn)(const std::string&));
 };
 }  // namespace apex
diff --git a/apexd/apexd_loop.cpp b/apexd/apexd_loop.cpp
index 4ab4016..8a23fbf 100644
--- a/apexd/apexd_loop.cpp
+++ b/apexd/apexd_loop.cpp
@@ -32,6 +32,7 @@
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
+#include <android-base/parseint.h>
 #include <android-base/properties.h>
 #include <android-base/stringprintf.h>
 #include <android-base/strings.h>
@@ -42,6 +43,7 @@
 using android::base::Basename;
 using android::base::Error;
 using android::base::GetBoolProperty;
+using android::base::ParseUint;
 using android::base::Result;
 using android::base::StartsWith;
 using android::base::StringPrintf;
@@ -83,7 +85,7 @@
   }
 }
 
-Result<void> configureReadAhead(const std::string& device_path) {
+Result<void> ConfigureReadAhead(const std::string& device_path) {
   CHECK(StartsWith(device_path, "/dev/"));
   std::string device_name = Basename(device_path);
 
@@ -103,10 +105,10 @@
   return {};
 }
 
-Result<void> preAllocateLoopDevices(size_t num) {
-  Result<void> loopReady = WaitForFile("/dev/loop-control", 20s);
-  if (!loopReady.ok()) {
-    return loopReady;
+Result<void> PreAllocateLoopDevices(size_t num) {
+  Result<void> loop_ready = WaitForFile("/dev/loop-control", 20s);
+  if (!loop_ready.ok()) {
+    return loop_ready;
   }
   unique_fd ctl_fd(
       TEMP_FAILURE_RETRY(open("/dev/loop-control", O_RDWR | O_CLOEXEC)));
@@ -114,13 +116,30 @@
     return ErrnoError() << "Failed to open loop-control";
   }
 
+  bool found = false;
+  size_t start_id = 0;
+  constexpr const char* kLoopPrefix = "loop";
+  WalkDir("/dev/block", [&](const std::filesystem::directory_entry& entry) {
+    std::string devname = entry.path().filename().string();
+    if (StartsWith(devname, kLoopPrefix)) {
+      size_t id;
+      auto parse_ok = ParseUint(
+          devname.substr(std::char_traits<char>::length(kLoopPrefix)), &id);
+      if (parse_ok && id > start_id) {
+        start_id = id;
+        found = true;
+      }
+    }
+  });
+  if (found) ++start_id;
+
   // Assumption: loop device ID [0..num) is valid.
   // This is because pre-allocation happens during bootstrap.
   // Anyway Kernel pre-allocated loop devices
   // as many as CONFIG_BLK_DEV_LOOP_MIN_COUNT,
   // Within the amount of kernel-pre-allocation,
   // LOOP_CTL_ADD will fail with EEXIST
-  for (size_t id = 0ul; id < num; ++id) {
+  for (size_t id = start_id; id < num + start_id; ++id) {
     int ret = ioctl(ctl_fd.get(), LOOP_CTL_ADD, id);
     if (ret < 0 && errno != EEXIST) {
       return ErrnoError() << "Failed LOOP_CTL_ADD";
@@ -133,17 +152,17 @@
   // just optimistally hope that they are all created when we actually
   // access them for activating APEXes. If the dev nodes are not ready
   // even then, we wait 50ms and warning message will be printed (see below
-  // createLoopDevice()).
+  // CreateLoopDevice()).
   LOG(INFO) << "Pre-allocated " << num << " loopback devices";
   return {};
 }
 
-Result<void> configureLoopDevice(const int device_fd, const std::string& target,
-                                 const int32_t imageOffset,
-                                 const size_t imageSize) {
-  static bool useLoopConfigure;
-  static std::once_flag onceFlag;
-  std::call_once(onceFlag, [&]() {
+Result<void> ConfigureLoopDevice(const int device_fd, const std::string& target,
+                                 const int32_t image_offset,
+                                 const size_t image_size) {
+  static bool use_loop_configure;
+  static std::once_flag once_flag;
+  std::call_once(once_flag, [&]() {
     // LOOP_CONFIGURE is a new ioctl in Linux 5.8 (and backported in Android
     // common) that allows atomically configuring a loop device. It is a lot
     // faster than the traditional LOOP_SET_FD/LOOP_SET_STATUS64 combo, but
@@ -154,7 +173,7 @@
     config.fd = -1;
     if (ioctl(device_fd, LOOP_CONFIGURE, &config) == -1 && errno == EBADF) {
       // If the IOCTL exists, it will fail with EBADF for the -1 fd
-      useLoopConfigure = true;
+      use_loop_configure = true;
     }
   });
 
@@ -188,10 +207,10 @@
   struct loop_info64 li;
   memset(&li, 0, sizeof(li));
   strlcpy((char*)li.lo_crypt_name, kApexLoopIdPrefix, LO_NAME_SIZE);
-  li.lo_offset = imageOffset;
-  li.lo_sizelimit = imageSize;
+  li.lo_offset = image_offset;
+  li.lo_sizelimit = image_size;
 
-  if (useLoopConfigure) {
+  if (use_loop_configure) {
     struct loop_config config;
     memset(&config, 0, sizeof(config));
     li.lo_flags |= LO_FLAGS_DIRECT_IO;
@@ -279,9 +298,9 @@
   return Error() << "Faled to open loopback device " << num;
 }
 
-Result<LoopbackDeviceUniqueFd> createLoopDevice(const std::string& target,
-                                                const int32_t imageOffset,
-                                                const size_t imageSize) {
+Result<LoopbackDeviceUniqueFd> CreateLoopDevice(const std::string& target,
+                                                const int32_t image_offset,
+                                                const size_t image_size) {
   unique_fd ctl_fd(open("/dev/loop-control", O_RDWR | O_CLOEXEC));
   if (ctl_fd.get() == -1) {
     return ErrnoError() << "Failed to open loop-control";
@@ -298,15 +317,15 @@
   }
   CHECK_NE(loop_device->device_fd.get(), -1);
 
-  Result<void> configureStatus = configureLoopDevice(
-      loop_device->device_fd.get(), target, imageOffset, imageSize);
+  Result<void> configureStatus = ConfigureLoopDevice(
+      loop_device->device_fd.get(), target, image_offset, image_size);
   if (!configureStatus.ok()) {
     return configureStatus.error();
   }
 
-  Result<void> readAheadStatus = configureReadAhead(loop_device->name);
-  if (!readAheadStatus.ok()) {
-    return readAheadStatus.error();
+  Result<void> read_ahead_status = ConfigureReadAhead(loop_device->name);
+  if (!read_ahead_status.ok()) {
+    return read_ahead_status.error();
   }
 
   return loop_device;
diff --git a/apexd/apexd_loop.h b/apexd/apexd_loop.h
index 8341675..1dbab21 100644
--- a/apexd/apexd_loop.h
+++ b/apexd/apexd_loop.h
@@ -52,16 +52,16 @@
 
   void CloseGood() { device_fd.reset(-1); }
 
-  int get() { return device_fd.get(); }
+  int Get() { return device_fd.get(); }
 };
 
-android::base::Result<void> configureReadAhead(const std::string& device_path);
+android::base::Result<void> ConfigureReadAhead(const std::string& device_path);
 
-android::base::Result<void> preAllocateLoopDevices(size_t num);
+android::base::Result<void> PreAllocateLoopDevices(size_t num);
 
-android::base::Result<LoopbackDeviceUniqueFd> createLoopDevice(
-    const std::string& target, const int32_t imageOffset,
-    const size_t imageSize);
+android::base::Result<LoopbackDeviceUniqueFd> CreateLoopDevice(
+    const std::string& target, const int32_t image_offset,
+    const size_t image_size);
 
 using DestroyLoopFn =
     std::function<void(const std::string&, const std::string&)>;
diff --git a/apexd/apexd_main.cpp b/apexd/apexd_main.cpp
index 93d0a6f..0f13db1 100644
--- a/apexd/apexd_main.cpp
+++ b/apexd/apexd_main.cpp
@@ -32,7 +32,7 @@
 
 namespace {
 android::apex::ApexdLifecycle& lifecycle =
-    android::apex::ApexdLifecycle::getInstance();
+    android::apex::ApexdLifecycle::GetInstance();
 
 int HandleSubcommand(char** argv) {
   if (strcmp("--pre-install", argv[1]) == 0) {
@@ -47,12 +47,12 @@
 
   if (strcmp("--bootstrap", argv[1]) == 0) {
     LOG(INFO) << "Bootstrap subcommand detected";
-    return android::apex::onBootstrap();
+    return android::apex::OnBootstrap();
   }
 
   if (strcmp("--unmount-all", argv[1]) == 0) {
     LOG(INFO) << "Unmount all subcommand detected";
-    return android::apex::unmountAll();
+    return android::apex::UnmountAll();
   }
 
   if (strcmp("--snapshotde", argv[1]) == 0) {
@@ -65,16 +65,16 @@
       LOG(ERROR) << "Could not retrieve vold service: "
                  << vold_service_st.error();
     } else {
-      android::apex::initializeVold(&*vold_service_st);
+      android::apex::InitializeVold(&*vold_service_st);
     }
 
-    int result = android::apex::snapshotOrRestoreDeUserData();
+    int result = android::apex::SnapshotOrRestoreDeUserData();
 
     if (result == 0) {
       // Notify other components (e.g. init) that all APEXs are ready to be used
       // Note that it's important that the binder service is registered at this
       // point, since other system services might depend on it.
-      android::apex::onAllPackagesReady();
+      android::apex::OnAllPackagesReady();
     }
     return result;
   }
@@ -116,10 +116,10 @@
     LOG(INFO) << "This device does not support updatable APEX. Exiting";
     if (!has_subcommand) {
       // mark apexd as activated so that init can proceed
-      android::apex::onAllPackagesActivated(/*is_bootstrap=*/false);
+      android::apex::OnAllPackagesActivated(/*is_bootstrap=*/false);
     } else if (strcmp("--snapshotde", argv[1]) == 0) {
       // mark apexd as ready
-      android::apex::onAllPackagesReady();
+      android::apex::OnAllPackagesReady();
     }
     return 0;
   }
@@ -137,15 +137,15 @@
   } else {
     vold_service = &*vold_service_st;
   }
-  android::apex::initialize(vold_service);
+  android::apex::Initialize(vold_service);
 
-  bool booting = lifecycle.isBooting();
+  bool booting = lifecycle.IsBooting();
   if (booting) {
-    if (auto res = android::apex::migrateSessionsDirIfNeeded(); !res.ok()) {
+    if (auto res = android::apex::MigrateSessionsDirIfNeeded(); !res.ok()) {
       LOG(ERROR) << "Failed to migrate sessions to /metadata partition : "
                  << res.error();
     }
-    android::apex::onStart();
+    android::apex::OnStart();
   }
   android::apex::binder::CreateAndRegisterService();
   android::apex::binder::StartThreadPool();
@@ -157,8 +157,8 @@
     // themselves should wait for the ready status instead, which is set when
     // the "--snapshotde" subcommand is received and snapshot/restore is
     // complete.
-    android::apex::onAllPackagesActivated(/*is_bootstrap=*/false);
-    lifecycle.waitForBootStatus(android::apex::revertActiveSessionsAndReboot);
+    android::apex::OnAllPackagesActivated(/*is_bootstrap=*/false);
+    lifecycle.WaitForBootStatus(android::apex::RevertActiveSessionsAndReboot);
   }
 
   android::apex::binder::AllowServiceShutdown();
diff --git a/apexd/apexd_private.h b/apexd/apexd_private.h
index 2c11327..23c6267 100644
--- a/apexd/apexd_private.h
+++ b/apexd/apexd_private.h
@@ -40,7 +40,7 @@
 android::base::Result<void> BindMount(const std::string& target,
                                       const std::string& source);
 android::base::Result<MountedApexDatabase::MountedApexData>
-getTempMountedApexData(const std::string& package);
+GetTempMountedApexData(const std::string& package);
 android::base::Result<void> UnmountTempMount(const ApexFile& apex);
 
 }  // namespace apexd_private
diff --git a/apexd/apexd_rollback_utils.h b/apexd/apexd_rollback_utils.h
index 9990be2..afb6275 100644
--- a/apexd/apexd_rollback_utils.h
+++ b/apexd/apexd_rollback_utils.h
@@ -40,7 +40,7 @@
  * path. Note that this will fail if run before APEXes are mounted, due to a
  * dependency on runtime.
  */
-int32_t copy_directory_recursive(const char* from, const char* to) {
+int32_t CopyDirectoryRecursive(const char* from, const char* to) {
   const char* const argv[] = {
       kCpPath,
       "-F", /* delete any existing destination file first
@@ -83,7 +83,7 @@
   };
   auto scope_guard = android::base::make_scope_guard(deleter);
 
-  int rc = copy_directory_recursive(from_path.c_str(), to_path.c_str());
+  int rc = CopyDirectoryRecursive(from_path.c_str(), to_path.c_str());
   if (rc != 0) {
     return Error() << "Failed to copy from [" << from_path << "] to ["
                    << to_path << "]";
diff --git a/apexd/apexd_session.cpp b/apexd/apexd_session.cpp
index 145cd5a..185b0ed 100644
--- a/apexd/apexd_session.cpp
+++ b/apexd/apexd_session.cpp
@@ -76,7 +76,7 @@
   SessionState state;
   // Create session directory
   std::string session_dir = GetSessionsDir() + "/" + std::to_string(session_id);
-  if (auto status = createDirIfNeeded(session_dir, 0700); !status.ok()) {
+  if (auto status = CreateDirIfNeeded(session_dir, 0700); !status.ok()) {
     return status.error();
   }
   state.set_id(session_id);
@@ -86,12 +86,12 @@
 
 Result<ApexSession> ApexSession::GetSessionFromFile(const std::string& path) {
   SessionState state;
-  std::fstream stateFile(path, std::ios::in | std::ios::binary);
-  if (!stateFile) {
+  std::fstream state_file(path, std::ios::in | std::ios::binary);
+  if (!state_file) {
     return Error() << "Failed to open " << path;
   }
 
-  if (!state.ParseFromIstream(&stateFile)) {
+  if (!state.ParseFromIstream(&state_file)) {
     return Error() << "Failed to parse " << path;
   }
 
@@ -108,19 +108,19 @@
 std::vector<ApexSession> ApexSession::GetSessions() {
   std::vector<ApexSession> sessions;
 
-  Result<std::vector<std::string>> sessionPaths = ReadDir(
+  Result<std::vector<std::string>> session_paths = ReadDir(
       GetSessionsDir(), [](const std::filesystem::directory_entry& entry) {
         std::error_code ec;
         return entry.is_directory(ec);
       });
 
-  if (!sessionPaths.ok()) {
+  if (!session_paths.ok()) {
     return sessions;
   }
 
-  for (const std::string& sessionDirPath : *sessionPaths) {
+  for (const std::string& session_dir_path : *session_paths) {
     // Try to read session state
-    auto session = GetSessionFromFile(sessionDirPath + "/" + kStateFileName);
+    auto session = GetSessionFromFile(session_dir_path + "/" + kStateFileName);
     if (!session.ok()) {
       LOG(WARNING) << session.error();
       continue;
@@ -144,13 +144,13 @@
 
 std::vector<ApexSession> ApexSession::GetActiveSessions() {
   auto sessions = GetSessions();
-  std::vector<ApexSession> activeSessions;
+  std::vector<ApexSession> active_sessions;
   for (const ApexSession& session : sessions) {
     if (!session.IsFinalized() && session.GetState() != SessionState::UNKNOWN) {
-      activeSessions.push_back(session);
+      active_sessions.push_back(session);
     }
   }
-  return activeSessions;
+  return active_sessions;
 }
 
 SessionState::State ApexSession::GetState() const { return state_.state(); }
diff --git a/apexd/apexd_session_test.cpp b/apexd/apexd_session_test.cpp
index bec0561..573b4d5 100644
--- a/apexd/apexd_session_test.cpp
+++ b/apexd/apexd_session_test.cpp
@@ -71,7 +71,7 @@
    public:
     TestApexSession(int id, const SessionState::State& state) {
       path_ = "/data/apex/sessions/" + std::to_string(id);
-      if (auto status = createDirIfNeeded(path_, 0700); !status.ok()) {
+      if (auto status = CreateDirIfNeeded(path_, 0700); !status.ok()) {
         ADD_FAILURE() << "Failed to create " << path_ << " : "
                       << status.error();
       }
diff --git a/apexd/apexd_utils.h b/apexd/apexd_utils.h
index e970404..e268f59 100644
--- a/apexd/apexd_utils.h
+++ b/apexd/apexd_utils.h
@@ -18,6 +18,7 @@
 #define ANDROID_APEXD_APEXD_UTILS_H_
 
 #include <chrono>
+#include <cstdint>
 #include <filesystem>
 #include <string>
 #include <thread>
@@ -126,7 +127,7 @@
   return res.ok() && res->empty();
 }
 
-inline Result<void> createDirIfNeeded(const std::string& path, mode_t mode) {
+inline Result<void> CreateDirIfNeeded(const std::string& path, mode_t mode) {
   struct stat stat_data;
 
   if (stat(path.c_str(), &stat_data) != 0) {
@@ -175,16 +176,6 @@
   return {};
 }
 
-inline Result<ino_t> get_path_inode(const std::string& path) {
-  struct stat buf;
-  memset(&buf, 0, sizeof(buf));
-  if (stat(path.c_str(), &buf) != 0) {
-    return ErrnoError() << "Failed to stat " << path;
-  } else {
-    return buf.st_ino;
-  }
-}
-
 inline Result<bool> PathExists(const std::string& path) {
   namespace fs = std::filesystem;
 
@@ -345,6 +336,17 @@
   return {};
 }
 
+inline Result<uintmax_t> GetFileSize(const std::string& file_path) {
+  std::error_code ec;
+  auto value = std::filesystem::file_size(file_path, ec);
+  if (ec) {
+    return Error() << "Failed to get file size of " << file_path << " : "
+                   << ec.message();
+  }
+
+  return value;
+}
+
 }  // namespace apex
 }  // namespace android
 
diff --git a/apexd/apexd_verity.cpp b/apexd/apexd_verity.cpp
index 052550c..e0975e0 100644
--- a/apexd/apexd_verity.cpp
+++ b/apexd/apexd_verity.cpp
@@ -151,7 +151,7 @@
 Result<PrepareHashTreeResult> PrepareHashTree(
     const ApexFile& apex, const ApexVerityData& verity_data,
     const std::string& hashtree_file) {
-  if (auto st = createDirIfNeeded(kApexHashTreeDir, 0700); !st.ok()) {
+  if (auto st = CreateDirIfNeeded(kApexHashTreeDir, 0700); !st.ok()) {
     return st.error();
   }
   bool should_regenerate_hashtree = false;
diff --git a/apexd/apexservice.cpp b/apexd/apexservice.cpp
index 1729bff..c0cb2ff 100644
--- a/apexd/apexservice.cpp
+++ b/apexd/apexservice.cpp
@@ -79,10 +79,10 @@
   BinderStatus getSessions(std::vector<ApexSessionInfo>* aidl_return) override;
   BinderStatus getStagedSessionInfo(
       int session_id, ApexSessionInfo* apex_session_info) override;
-  BinderStatus activatePackage(const std::string& packagePath) override;
-  BinderStatus deactivatePackage(const std::string& packagePath) override;
+  BinderStatus activatePackage(const std::string& package_path) override;
+  BinderStatus deactivatePackage(const std::string& package_path) override;
   BinderStatus getActivePackages(std::vector<ApexInfo>* aidl_return) override;
-  BinderStatus getActivePackage(const std::string& packageName,
+  BinderStatus getActivePackage(const std::string& package_name,
                                 ApexInfo* aidl_return) override;
   BinderStatus getAllPackages(std::vector<ApexInfo>* aidl_return) override;
   BinderStatus preinstallPackages(
@@ -93,11 +93,11 @@
   BinderStatus revertActiveSessions() override;
   BinderStatus resumeRevertIfNeeded() override;
   BinderStatus snapshotCeData(int user_id, int rollback_id,
-                              const std::string& apex_name,
-                              int64_t* _aidl_return) override;
+                              const std::string& apex_name) override;
   BinderStatus restoreCeData(int user_id, int rollback_id,
                              const std::string& apex_name) override;
   BinderStatus destroyDeSnapshots(int rollback_id) override;
+  BinderStatus destroyCeSnapshots(int user_id, int rollback_id) override;
   BinderStatus destroyCeSnapshotsNotSpecified(
       int user_id, const std::vector<int>& retain_rollback_ids) override;
   BinderStatus remountPackages() override;
@@ -124,14 +124,14 @@
 }
 
 BinderStatus ApexService::stagePackages(const std::vector<std::string>& paths) {
-  BinderStatus debugCheck = CheckDebuggable("stagePackages");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+  BinderStatus debug_check = CheckDebuggable("stagePackages");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
   LOG(DEBUG) << "stagePackages() received by ApexService, paths "
              << android::base::Join(paths, ',');
 
-  Result<void> res = ::android::apex::stagePackages(paths);
+  Result<void> res = ::android::apex::StagePackages(paths);
 
   if (res.ok()) {
     return BinderStatus::ok();
@@ -146,7 +146,7 @@
 
 BinderStatus ApexService::unstagePackages(
     const std::vector<std::string>& paths) {
-  Result<void> res = ::android::apex::unstagePackages(paths);
+  Result<void> res = ::android::apex::UnstagePackages(paths);
   if (res.ok()) {
     return BinderStatus::ok();
   }
@@ -164,7 +164,7 @@
              << params.sessionId << " child sessions: ["
              << android::base::Join(params.childSessionIds, ',') << "]";
 
-  Result<std::vector<ApexFile>> packages = ::android::apex::submitStagedSession(
+  Result<std::vector<ApexFile>> packages = ::android::apex::SubmitStagedSession(
       params.sessionId, params.childSessionIds, params.hasRollbackEnabled,
       params.isRollback, params.rollbackId);
   if (!packages.ok()) {
@@ -188,7 +188,7 @@
 BinderStatus ApexService::markStagedSessionReady(int session_id) {
   LOG(DEBUG) << "markStagedSessionReady() received by ApexService, session id "
              << session_id;
-  Result<void> success = ::android::apex::markStagedSessionReady(session_id);
+  Result<void> success = ::android::apex::MarkStagedSessionReady(session_id);
   if (!success.ok()) {
     LOG(ERROR) << "Failed to mark session id " << session_id
                << " as ready: " << success.error();
@@ -203,7 +203,7 @@
   LOG(DEBUG)
       << "markStagedSessionSuccessful() received by ApexService, session id "
       << session_id;
-  Result<void> ret = ::android::apex::markStagedSessionSuccessful(session_id);
+  Result<void> ret = ::android::apex::MarkStagedSessionSuccessful(session_id);
   if (!ret.ok()) {
     LOG(ERROR) << "Failed to mark session " << session_id
                << " as SUCCESS: " << ret.error();
@@ -215,7 +215,7 @@
 }
 
 BinderStatus ApexService::markBootCompleted() {
-  ::android::apex::onBootCompleted();
+  ::android::apex::OnBootCompleted();
   return BinderStatus::ok();
 }
 
@@ -232,7 +232,7 @@
   session_info->isRevertFailed = false;
 }
 
-void convertToApexSessionInfo(const ApexSession& session,
+void ConvertToApexSessionInfo(const ApexSession& session,
                               ApexSessionInfo* session_info) {
   using SessionState = ::apex::proto::SessionState;
 
@@ -272,7 +272,7 @@
   }
 }
 
-static ApexInfo getApexInfo(const ApexFile& package) {
+static ApexInfo GetApexInfo(const ApexFile& package) {
   auto& instance = ApexPreinstalledData::GetInstance();
   ApexInfo out;
   out.moduleName = package.GetManifest().name();
@@ -281,15 +281,15 @@
   out.versionName = package.GetManifest().versionname();
   out.isFactory = instance.IsPreInstalledApex(package);
   out.isActive = false;
-  Result<std::string> preinstalledPath =
+  Result<std::string> preinstalled_path =
       instance.GetPreinstalledPath(package.GetManifest().name());
-  if (preinstalledPath.ok()) {
-    out.preinstalledModulePath = *preinstalledPath;
+  if (preinstalled_path.ok()) {
+    out.preinstalledModulePath = *preinstalled_path;
   }
   return out;
 }
 
-static std::string toString(const ApexInfo& package) {
+static std::string ToString(const ApexInfo& package) {
   std::string msg = StringLog()
                     << "Module: " << package.moduleName
                     << " Version: " << package.versionCode
@@ -305,9 +305,9 @@
     std::vector<ApexSessionInfo>* aidl_return) {
   auto sessions = ApexSession::GetSessions();
   for (const auto& session : sessions) {
-    ApexSessionInfo sessionInfo;
-    convertToApexSessionInfo(session, &sessionInfo);
-    aidl_return->push_back(sessionInfo);
+    ApexSessionInfo session_info;
+    ConvertToApexSessionInfo(session, &session_info);
+    aidl_return->push_back(session_info);
   }
 
   return BinderStatus::ok();
@@ -325,48 +325,48 @@
     return BinderStatus::ok();
   }
 
-  convertToApexSessionInfo(*session, apex_session_info);
+  ConvertToApexSessionInfo(*session, apex_session_info);
 
   return BinderStatus::ok();
 }
 
-BinderStatus ApexService::activatePackage(const std::string& packagePath) {
-  BinderStatus debugCheck = CheckDebuggable("activatePackage");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+BinderStatus ApexService::activatePackage(const std::string& package_path) {
+  BinderStatus debug_check = CheckDebuggable("activatePackage");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
 
   LOG(DEBUG) << "activatePackage() received by ApexService, path "
-             << packagePath;
+             << package_path;
 
-  Result<void> res = ::android::apex::activatePackage(packagePath);
+  Result<void> res = ::android::apex::ActivatePackage(package_path);
 
   if (res.ok()) {
     return BinderStatus::ok();
   }
 
-  LOG(ERROR) << "Failed to activate " << packagePath << ": " << res.error();
+  LOG(ERROR) << "Failed to activate " << package_path << ": " << res.error();
   return BinderStatus::fromExceptionCode(
       BinderStatus::EX_SERVICE_SPECIFIC,
       String8(res.error().message().c_str()));
 }
 
-BinderStatus ApexService::deactivatePackage(const std::string& packagePath) {
-  BinderStatus debugCheck = CheckDebuggable("deactivatePackage");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+BinderStatus ApexService::deactivatePackage(const std::string& package_path) {
+  BinderStatus debug_check = CheckDebuggable("deactivatePackage");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
 
   LOG(DEBUG) << "deactivatePackage() received by ApexService, path "
-             << packagePath;
+             << package_path;
 
-  Result<void> res = ::android::apex::deactivatePackage(packagePath);
+  Result<void> res = ::android::apex::DeactivatePackage(package_path);
 
   if (res.ok()) {
     return BinderStatus::ok();
   }
 
-  LOG(ERROR) << "Failed to deactivate " << packagePath << ": " << res.error();
+  LOG(ERROR) << "Failed to deactivate " << package_path << ": " << res.error();
   return BinderStatus::fromExceptionCode(
       BinderStatus::EX_SERVICE_SPECIFIC,
       String8(res.error().message().c_str()));
@@ -374,31 +374,31 @@
 
 BinderStatus ApexService::getActivePackages(
     std::vector<ApexInfo>* aidl_return) {
-  auto packages = ::android::apex::getActivePackages();
+  auto packages = ::android::apex::GetActivePackages();
   for (const auto& package : packages) {
-    ApexInfo apexInfo = getApexInfo(package);
-    apexInfo.isActive = true;
-    aidl_return->push_back(std::move(apexInfo));
+    ApexInfo apex_info = GetApexInfo(package);
+    apex_info.isActive = true;
+    aidl_return->push_back(std::move(apex_info));
   }
 
   return BinderStatus::ok();
 }
 
-BinderStatus ApexService::getActivePackage(const std::string& packageName,
+BinderStatus ApexService::getActivePackage(const std::string& package_name,
                                            ApexInfo* aidl_return) {
-  Result<ApexFile> apex = ::android::apex::getActivePackage(packageName);
+  Result<ApexFile> apex = ::android::apex::GetActivePackage(package_name);
   if (apex.ok()) {
-    *aidl_return = getApexInfo(*apex);
+    *aidl_return = GetApexInfo(*apex);
     aidl_return->isActive = true;
   }
   return BinderStatus::ok();
 }
 
 BinderStatus ApexService::getAllPackages(std::vector<ApexInfo>* aidl_return) {
-  const auto& active = ::android::apex::getActivePackages();
-  const auto& factory = ::android::apex::getFactoryPackages();
+  const auto& active = ::android::apex::GetActivePackages();
+  const auto& factory = ::android::apex::GetFactoryPackages();
   for (const ApexFile& pkg : active) {
-    ApexInfo apex_info = getApexInfo(pkg);
+    ApexInfo apex_info = GetApexInfo(pkg);
     apex_info.isActive = true;
     aidl_return->push_back(std::move(apex_info));
   }
@@ -407,7 +407,7 @@
       return o.GetPath() == pkg.GetPath();
     };
     if (std::find_if(active.begin(), active.end(), same_path) == active.end()) {
-      aidl_return->push_back(getApexInfo(pkg));
+      aidl_return->push_back(GetApexInfo(pkg));
     }
   }
   return BinderStatus::ok();
@@ -415,12 +415,12 @@
 
 BinderStatus ApexService::preinstallPackages(
     const std::vector<std::string>& paths) {
-  BinderStatus debugCheck = CheckDebuggable("preinstallPackages");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+  BinderStatus debug_check = CheckDebuggable("preinstallPackages");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
 
-  Result<void> res = ::android::apex::preinstallPackages(paths);
+  Result<void> res = ::android::apex::PreinstallPackages(paths);
   if (res.ok()) {
     return BinderStatus::ok();
   }
@@ -434,12 +434,12 @@
 
 BinderStatus ApexService::postinstallPackages(
     const std::vector<std::string>& paths) {
-  BinderStatus debugCheck = CheckDebuggable("postinstallPackages");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+  BinderStatus debug_check = CheckDebuggable("postinstallPackages");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
 
-  Result<void> res = ::android::apex::postinstallPackages(paths);
+  Result<void> res = ::android::apex::PostinstallPackages(paths);
   if (res.ok()) {
     return BinderStatus::ok();
   }
@@ -453,7 +453,7 @@
 
 BinderStatus ApexService::abortStagedSession(int session_id) {
   LOG(DEBUG) << "abortStagedSession() received by ApexService.";
-  Result<void> res = ::android::apex::abortStagedSession(session_id);
+  Result<void> res = ::android::apex::AbortStagedSession(session_id);
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_ILLEGAL_ARGUMENT,
@@ -464,7 +464,7 @@
 
 BinderStatus ApexService::revertActiveSessions() {
   LOG(DEBUG) << "revertActiveSessions() received by ApexService.";
-  Result<void> res = ::android::apex::revertActiveSessions("");
+  Result<void> res = ::android::apex::RevertActiveSessions("");
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_ILLEGAL_ARGUMENT,
@@ -474,13 +474,13 @@
 }
 
 BinderStatus ApexService::resumeRevertIfNeeded() {
-  BinderStatus debugCheck = CheckDebuggable("resumeRevertIfNeeded");
-  if (!debugCheck.isOk()) {
-    return debugCheck;
+  BinderStatus debug_check = CheckDebuggable("resumeRevertIfNeeded");
+  if (!debug_check.isOk()) {
+    return debug_check;
   }
 
   LOG(DEBUG) << "resumeRevertIfNeeded() received by ApexService.";
-  Result<void> res = ::android::apex::resumeRevertIfNeeded();
+  Result<void> res = ::android::apex::ResumeRevertIfNeeded();
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_ILLEGAL_ARGUMENT,
@@ -490,17 +490,15 @@
 }
 
 BinderStatus ApexService::snapshotCeData(int user_id, int rollback_id,
-                                         const std::string& apex_name,
-                                         int64_t* _aidl_return) {
+                                         const std::string& apex_name) {
   LOG(DEBUG) << "snapshotCeData() received by ApexService.";
-  Result<ino_t> res =
-      ::android::apex::snapshotCeData(user_id, rollback_id, apex_name);
+  Result<void> res =
+      ::android::apex::SnapshotCeData(user_id, rollback_id, apex_name);
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_SERVICE_SPECIFIC,
         String8(res.error().message().c_str()));
   }
-  *_aidl_return = static_cast<uint64_t>(*res);
   return BinderStatus::ok();
 }
 
@@ -508,7 +506,7 @@
                                         const std::string& apex_name) {
   LOG(DEBUG) << "restoreCeData() received by ApexService.";
   Result<void> res =
-      ::android::apex::restoreCeData(user_id, rollback_id, apex_name);
+      ::android::apex::RestoreCeData(user_id, rollback_id, apex_name);
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_SERVICE_SPECIFIC,
@@ -519,7 +517,18 @@
 
 BinderStatus ApexService::destroyDeSnapshots(int rollback_id) {
   LOG(DEBUG) << "destroyDeSnapshots() received by ApexService.";
-  Result<void> res = ::android::apex::destroyDeSnapshots(rollback_id);
+  Result<void> res = ::android::apex::DestroyDeSnapshots(rollback_id);
+  if (!res.ok()) {
+    return BinderStatus::fromExceptionCode(
+        BinderStatus::EX_SERVICE_SPECIFIC,
+        String8(res.error().message().c_str()));
+  }
+  return BinderStatus::ok();
+}
+
+BinderStatus ApexService::destroyCeSnapshots(int user_id, int rollback_id) {
+  LOG(DEBUG) << "destroyCeSnapshots() received by ApexService.";
+  Result<void> res = ::android::apex::DestroyCeSnapshots(user_id, rollback_id);
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_SERVICE_SPECIFIC,
@@ -531,7 +540,7 @@
 BinderStatus ApexService::destroyCeSnapshotsNotSpecified(
     int user_id, const std::vector<int>& retain_rollback_ids) {
   LOG(DEBUG) << "destroyCeSnapshotsNotSpecified() received by ApexService.";
-  Result<void> res = ::android::apex::destroyCeSnapshotsNotSpecified(
+  Result<void> res = ::android::apex::DestroyCeSnapshotsNotSpecified(
       user_id, retain_rollback_ids);
   if (!res.ok()) {
     return BinderStatus::fromExceptionCode(
@@ -549,7 +558,7 @@
   if (auto root = CheckCallerIsRoot("remountPackages"); !root.isOk()) {
     return root;
   }
-  if (auto res = ::android::apex::remountPackages(); !res.ok()) {
+  if (auto res = ::android::apex::RemountPackages(); !res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_SERVICE_SPECIFIC,
         String8(res.error().message().c_str()));
@@ -570,7 +579,7 @@
     return root;
   }
   ApexPreinstalledData& instance = ApexPreinstalledData::GetInstance();
-  if (auto res = instance.Initialize(paths); !res) {
+  if (auto res = instance.Initialize(paths); !res.ok()) {
     return BinderStatus::fromExceptionCode(
         BinderStatus::EX_SERVICE_SPECIFIC,
         String8(res.error().message().c_str()));
@@ -590,16 +599,18 @@
       for (int i = 0; i < argc && _aidl_data.dataAvail() > 0; i++) {
         args.add(_aidl_data.readString16());
       }
-      sp<IBinder> unusedCallback;
-      sp<IResultReceiver> resultReceiver;
+      sp<IBinder> unused_callback;
+      sp<IResultReceiver> result_receiver;
       status_t status;
-      if ((status = _aidl_data.readNullableStrongBinder(&unusedCallback)) != OK)
+      if ((status = _aidl_data.readNullableStrongBinder(&unused_callback)) !=
+          OK)
         return status;
-      if ((status = _aidl_data.readNullableStrongBinder(&resultReceiver)) != OK)
+      if ((status = _aidl_data.readNullableStrongBinder(&result_receiver)) !=
+          OK)
         return status;
       status = shellCommand(in, out, err, args);
-      if (resultReceiver != nullptr) {
-        resultReceiver->send(status);
+      if (result_receiver != nullptr) {
+        result_receiver->send(status);
       }
       return OK;
     }
@@ -618,7 +629,7 @@
     return BAD_VALUE;
   } else {
     for (const auto& item : list) {
-      std::string msg = toString(item);
+      std::string msg = ToString(item);
       dprintf(fd, "%s", msg.c_str());
     }
   }
@@ -662,25 +673,25 @@
     }
     log << "ApexService:" << std::endl
         << "  help - display this help" << std::endl
-        << "  stagePackages [packagePath1] ([packagePath2]...) - stage "
+        << "  stagePackages [package_path1] ([package_path2]...) - stage "
            "multiple packages from the given path"
         << std::endl
-        << "  getActivePackage [packageName] - return info for active package "
+        << "  getActivePackage [package_name] - return info for active package "
            "with given name, if present"
         << std::endl
         << "  getAllPackages - return the list of all packages" << std::endl
         << "  getActivePackages - return the list of active packages"
         << std::endl
-        << "  activatePackage [packagePath] - activate package from the "
+        << "  activatePackage [package_path] - activate package from the "
            "given path"
         << std::endl
-        << "  deactivatePackage [packagePath] - deactivate package from the "
+        << "  deactivatePackage [package_path] - deactivate package from the "
            "given path"
         << std::endl
-        << "  preinstallPackages [packagePath1] ([packagePath2]...) - run "
+        << "  preinstallPackages [package_path1] ([package_path2]...) - run "
            "pre-install hooks of the given packages"
         << std::endl
-        << "  postinstallPackages [packagePath1] ([packagePath2]...) - run "
+        << "  postinstallPackages [package_path1] ([package_path2]...) - run "
            "post-install hooks of the given packages"
         << std::endl
         << "  getStagedSessionInfo [sessionId] - displays information about a "
@@ -712,7 +723,7 @@
 
   if (cmd == String16("stagePackages")) {
     if (args.size() < 2) {
-      print_help(err, "stagePackages requires at least one packagePath");
+      print_help(err, "stagePackages requires at least one package_path");
       return BAD_VALUE;
     }
     std::vector<std::string> pkgs;
@@ -738,7 +749,7 @@
     BinderStatus status = getAllPackages(&list);
     if (status.isOk()) {
       for (const auto& item : list) {
-        std::string msg = toString(item);
+        std::string msg = ToString(item);
         dprintf(out, "%s", msg.c_str());
       }
       return OK;
@@ -758,7 +769,7 @@
     BinderStatus status = getActivePackages(&list);
     if (status.isOk()) {
       for (const auto& item : list) {
-        std::string msg = toString(item);
+        std::string msg = ToString(item);
         dprintf(out, "%s", msg.c_str());
       }
       return OK;
@@ -778,7 +789,7 @@
     ApexInfo package;
     BinderStatus status = getActivePackage(String8(args[1]).string(), &package);
     if (status.isOk()) {
-      std::string msg = toString(package);
+      std::string msg = ToString(package);
       dprintf(out, "%s", msg.c_str());
       return OK;
     }
@@ -793,7 +804,7 @@
 
   if (cmd == String16("activatePackage")) {
     if (args.size() != 2) {
-      print_help(err, "activatePackage requires one packagePath");
+      print_help(err, "activatePackage requires one package_path");
       return BAD_VALUE;
     }
     BinderStatus status = activatePackage(String8(args[1]).string());
@@ -808,7 +819,7 @@
 
   if (cmd == String16("deactivatePackage")) {
     if (args.size() != 2) {
-      print_help(err, "deactivatePackage requires one packagePath");
+      print_help(err, "deactivatePackage requires one package_path");
       return BAD_VALUE;
     }
     BinderStatus status = deactivatePackage(String8(args[1]).string());
@@ -881,7 +892,7 @@
     BinderStatus status = submitStagedSession(params, &list);
     if (status.isOk()) {
         for (const auto& item : list.apexInfos) {
-          std::string msg = toString(item);
+          std::string msg = ToString(item);
           dprintf(out, "%s", msg.c_str());
         }
       return OK;
@@ -897,7 +908,7 @@
     if (args.size() < 2) {
       print_help(err,
                  "preinstallPackages/postinstallPackages requires at least"
-                 " one packagePath");
+                 " one package_path");
       return BAD_VALUE;
     }
     std::vector<std::string> pkgs;
@@ -954,15 +965,15 @@
   sp<ProcessState> ps(ProcessState::self());
 
   // Create binder service and register with LazyServiceRegistrar
-  sp<ApexService> apexService = new ApexService();
-  auto lazyRegistrar = LazyServiceRegistrar::getInstance();
-  lazyRegistrar.forcePersist(true);
-  lazyRegistrar.registerService(apexService, kApexServiceName);
+  sp<ApexService> apex_service = new ApexService();
+  auto lazy_registrar = LazyServiceRegistrar::getInstance();
+  lazy_registrar.forcePersist(true);
+  lazy_registrar.registerService(apex_service, kApexServiceName);
 }
 
 void AllowServiceShutdown() {
-  auto lazyRegistrar = LazyServiceRegistrar::getInstance();
-  lazyRegistrar.forcePersist(false);
+  auto lazy_registrar = LazyServiceRegistrar::getInstance();
+  lazy_registrar.forcePersist(false);
 }
 
 void StartThreadPool() {
diff --git a/apexd/apexservice_test.cpp b/apexd/apexservice_test.cpp
index 4549939..1a1a1c1 100644
--- a/apexd/apexservice_test.cpp
+++ b/apexd/apexservice_test.cpp
@@ -849,18 +849,10 @@
   ASSERT_TRUE(
       RegularFileExists("/data/misc_ce/0/apexdata/apex.apexd_test/hello.txt"));
 
-  int64_t result;
-  service_->snapshotCeData(0, 123456, "apex.apexd_test", &result);
+  service_->snapshotCeData(0, 123456, "apex.apexd_test");
 
   ASSERT_TRUE(RegularFileExists(
       "/data/misc_ce/0/apexrollback/123456/apex.apexd_test/hello.txt"));
-
-  // Check that the return value is the inode of the snapshot directory.
-  struct stat buf;
-  memset(&buf, 0, sizeof(buf));
-  ASSERT_EQ(0,
-            stat("/data/misc_ce/0/apexrollback/123456/apex.apexd_test", &buf));
-  ASSERT_EQ(int64_t(buf.st_ino), result);
 }
 
 TEST_F(ApexServiceTest, RestoreCeData) {
@@ -923,6 +915,31 @@
   ASSERT_FALSE(DirExists("/data/misc_de/0/apexrollback/123456"));
 }
 
+TEST_F(ApexServiceTest, DestroyCeSnapshots) {
+  CreateDir("/data/misc_ce/0/apexrollback/123456");
+  CreateDir("/data/misc_ce/0/apexrollback/123456/apex.apexd_test");
+  CreateFile("/data/misc_ce/0/apexrollback/123456/apex.apexd_test/file.txt");
+
+  CreateDir("/data/misc_ce/0/apexrollback/77777");
+  CreateDir("/data/misc_ce/0/apexrollback/77777/apex.apexd_test");
+  CreateFile("/data/misc_ce/0/apexrollback/77777/apex.apexd_test/thing.txt");
+
+  ASSERT_TRUE(RegularFileExists(
+      "/data/misc_ce/0/apexrollback/123456/apex.apexd_test/file.txt"));
+  ASSERT_TRUE(RegularFileExists(
+      "/data/misc_ce/0/apexrollback/77777/apex.apexd_test/thing.txt"));
+
+  android::binder::Status st = service_->destroyCeSnapshots(0, 123456);
+  ASSERT_TRUE(IsOk(st));
+  // Should be OK if the directory doesn't exist.
+  st = service_->destroyCeSnapshots(1, 123456);
+  ASSERT_TRUE(IsOk(st));
+
+  ASSERT_TRUE(RegularFileExists(
+      "/data/misc_ce/0/apexrollback/77777/apex.apexd_test/thing.txt"));
+  ASSERT_FALSE(DirExists("/data/misc_ce/0/apexrollback/123456"));
+}
+
 TEST_F(ApexServiceTest, DestroyCeSnapshotsNotSpecified) {
   CreateDir("/data/misc_ce/0/apexrollback/123456");
   CreateDir("/data/misc_ce/0/apexrollback/123456/apex.apexd_test");
@@ -1388,11 +1405,11 @@
 }
 
 TEST_F(ApexServiceTest, GetFactoryPackages) {
-  Result<std::vector<ApexInfo>> factoryPackages = GetFactoryPackages();
-  ASSERT_TRUE(IsOk(factoryPackages));
-  ASSERT_TRUE(factoryPackages->size() > 0);
+  Result<std::vector<ApexInfo>> factory_packages = GetFactoryPackages();
+  ASSERT_TRUE(IsOk(factory_packages));
+  ASSERT_TRUE(factory_packages->size() > 0);
 
-  for (const ApexInfo& package : *factoryPackages) {
+  for (const ApexInfo& package : *factory_packages) {
     bool is_builtin = false;
     for (const auto& dir : kApexPackageBuiltinDirs) {
       if (StartsWith(package.modulePath, dir)) {
@@ -1404,46 +1421,48 @@
 }
 
 TEST_F(ApexServiceTest, NoPackagesAreBothActiveAndInactive) {
-  Result<std::vector<ApexInfo>> activePackages = GetActivePackages();
-  ASSERT_TRUE(IsOk(activePackages));
-  ASSERT_TRUE(activePackages->size() > 0);
-  Result<std::vector<ApexInfo>> inactivePackages = GetInactivePackages();
-  ASSERT_TRUE(IsOk(inactivePackages));
-  std::vector<std::string> activePackagesStrings =
-      GetPackagesStrings(*activePackages);
-  std::vector<std::string> inactivePackagesStrings =
-      GetPackagesStrings(*inactivePackages);
-  std::sort(activePackagesStrings.begin(), activePackagesStrings.end());
-  std::sort(inactivePackagesStrings.begin(), inactivePackagesStrings.end());
+  Result<std::vector<ApexInfo>> active_packages = GetActivePackages();
+  ASSERT_TRUE(IsOk(active_packages));
+  ASSERT_TRUE(active_packages->size() > 0);
+  Result<std::vector<ApexInfo>> inactive_packages = GetInactivePackages();
+  ASSERT_TRUE(IsOk(inactive_packages));
+  std::vector<std::string> active_packages_strings =
+      GetPackagesStrings(*active_packages);
+  std::vector<std::string> inactive_packages_strings =
+      GetPackagesStrings(*inactive_packages);
+  std::sort(active_packages_strings.begin(), active_packages_strings.end());
+  std::sort(inactive_packages_strings.begin(), inactive_packages_strings.end());
   std::vector<std::string> intersection;
   std::set_intersection(
-      activePackagesStrings.begin(), activePackagesStrings.end(),
-      inactivePackagesStrings.begin(), inactivePackagesStrings.end(),
+      active_packages_strings.begin(), active_packages_strings.end(),
+      inactive_packages_strings.begin(), inactive_packages_strings.end(),
       std::back_inserter(intersection));
   ASSERT_THAT(intersection, SizeIs(0));
 }
 
 TEST_F(ApexServiceTest, GetAllPackages) {
-  Result<std::vector<ApexInfo>> allPackages = GetAllPackages();
-  ASSERT_TRUE(IsOk(allPackages));
-  ASSERT_TRUE(allPackages->size() > 0);
-  Result<std::vector<ApexInfo>> activePackages = GetActivePackages();
-  std::vector<std::string> activeStrings = GetPackagesStrings(*activePackages);
-  Result<std::vector<ApexInfo>> factoryPackages = GetFactoryPackages();
-  std::vector<std::string> factoryStrings =
-      GetPackagesStrings(*factoryPackages);
-  for (ApexInfo& apexInfo : *allPackages) {
-    std::string packageString = GetPackageString(apexInfo);
-    bool shouldBeActive = std::find(activeStrings.begin(), activeStrings.end(),
-                                    packageString) != activeStrings.end();
-    bool shouldBeFactory =
-        std::find(factoryStrings.begin(), factoryStrings.end(),
-                  packageString) != factoryStrings.end();
-    ASSERT_EQ(shouldBeActive, apexInfo.isActive)
-        << packageString << " should " << (shouldBeActive ? "" : "not ")
+  Result<std::vector<ApexInfo>> all_packages = GetAllPackages();
+  ASSERT_TRUE(IsOk(all_packages));
+  ASSERT_TRUE(all_packages->size() > 0);
+  Result<std::vector<ApexInfo>> active_packages = GetActivePackages();
+  std::vector<std::string> active_strings =
+      GetPackagesStrings(*active_packages);
+  Result<std::vector<ApexInfo>> factory_packages = GetFactoryPackages();
+  std::vector<std::string> factory_strings =
+      GetPackagesStrings(*factory_packages);
+  for (ApexInfo& apexInfo : *all_packages) {
+    std::string package_string = GetPackageString(apexInfo);
+    bool should_be_active =
+        std::find(active_strings.begin(), active_strings.end(),
+                  package_string) != active_strings.end();
+    bool should_be_factory =
+        std::find(factory_strings.begin(), factory_strings.end(),
+                  package_string) != factory_strings.end();
+    ASSERT_EQ(should_be_active, apexInfo.isActive)
+        << package_string << " should " << (should_be_active ? "" : "not ")
         << "be active";
-    ASSERT_EQ(shouldBeFactory, apexInfo.isFactory)
-        << packageString << " should " << (shouldBeFactory ? "" : "not ")
+    ASSERT_EQ(should_be_factory, apexInfo.isFactory)
+        << package_string << " should " << (should_be_factory ? "" : "not ")
         << "be factory";
   }
 }
@@ -2094,7 +2113,7 @@
   }
 
   // Make sure /data/apex/backups exists.
-  ASSERT_TRUE(IsOk(createDirIfNeeded(std::string(kApexBackupDir), 0700)));
+  ASSERT_TRUE(IsOk(CreateDirIfNeeded(std::string(kApexBackupDir), 0700)));
   // Create some bogus files in /data/apex/backups.
   std::ofstream old_backup(StringPrintf("%s/file1", kApexBackupDir));
   ASSERT_TRUE(old_backup.good());
@@ -2138,7 +2157,7 @@
 
   // Make sure that /data/apex/active exists and is empty
   ASSERT_TRUE(
-      IsOk(createDirIfNeeded(std::string(kActiveApexPackagesDataDir), 0755)));
+      IsOk(CreateDirIfNeeded(std::string(kActiveApexPackagesDataDir), 0755)));
   auto active_pkgs = ReadEntireDir(kActiveApexPackagesDataDir);
   ASSERT_TRUE(IsOk(active_pkgs));
   ASSERT_EQ(0u, active_pkgs->size());
@@ -2237,7 +2256,7 @@
   void SetUp() override { ApexServiceTest::SetUp(); }
 
   void PrepareBackup(const std::vector<std::string>& pkgs) {
-    ASSERT_TRUE(IsOk(createDirIfNeeded(std::string(kApexBackupDir), 0700)));
+    ASSERT_TRUE(IsOk(CreateDirIfNeeded(std::string(kApexBackupDir), 0700)));
     for (const auto& pkg : pkgs) {
       PrepareTestApexForInstall installer(pkg);
       ASSERT_TRUE(installer.Prepare()) << " failed to prepare " << pkg;
@@ -2451,7 +2470,7 @@
   // TODO(ioffe): this is calling into internals of apexd which makes test quite
   //  britle. With some refactoring we should be able to call binder api, or
   //  make this a unit test of apexd.cpp.
-  Result<void> res = ::android::apex::revertActiveSessions(native_process);
+  Result<void> res = ::android::apex::RevertActiveSessions(native_process);
   session = ApexSession::GetSession(1543);
   ASSERT_EQ(session->GetCrashingNativeProcess(), native_process);
 }
diff --git a/docs/howto.md b/docs/howto.md
index 2c52b3a..d755f8a 100644
--- a/docs/howto.md
+++ b/docs/howto.md
@@ -107,7 +107,7 @@
 Use this when a lib has to be accessed across the APEX boundary, e.g. between
 APEXes or between an APEX and the platform.
 
-### `apex_available`
+### apex_available
 
 Any module that is “included” (not just referenced) in an APEX either via the
 direct dependency or the transitive dependency has to correctly set the
diff --git a/libs/libapexutil/apexutil.cpp b/libs/libapexutil/apexutil.cpp
index e0b0787..6203a3b 100644
--- a/libs/libapexutil/apexutil.cpp
+++ b/libs/libapexutil/apexutil.cpp
@@ -18,6 +18,7 @@
 #include "apexutil.h"
 
 #include <dirent.h>
+#include <string.h>
 
 #include <memory>
 
@@ -67,6 +68,8 @@
       continue;
     if (strchr(entry->d_name, '@') != nullptr)
       continue;
+    if (strcmp(entry->d_name, "sharedlibs") == 0)
+      continue;
     std::string apex_path = apex_root + "/" + entry->d_name;
     auto manifest = ParseApexManifest(apex_path + "/apex_manifest.pb");
     if (manifest.ok()) {
