Merge changes I1625d1a6,I2db9cfa2,I59c31318,Ic0ed1a8d,I612374bb into main
* changes:
snapuserd: Move Process ops out of Worker.
snapuserd: Move more fields out of Worker.
snapuserd: Split more methods out of Worker.
snapuserd: Create a ReadWorker class.
snapuserd: Create a MergeWorker class.
diff --git a/debuggerd/rust/tombstoned_client/src/lib.rs b/debuggerd/rust/tombstoned_client/src/lib.rs
index 5c8abef..d1b5e69 100644
--- a/debuggerd/rust/tombstoned_client/src/lib.rs
+++ b/debuggerd/rust/tombstoned_client/src/lib.rs
@@ -39,20 +39,26 @@
}
impl TombstonedConnection {
+ /// # Safety
+ ///
+ /// The file descriptors must be valid and open.
unsafe fn from_raw_fds(
tombstoned_socket: RawFd,
text_output_fd: RawFd,
proto_output_fd: RawFd,
) -> Self {
Self {
- tombstoned_socket: File::from_raw_fd(tombstoned_socket),
+ // SAFETY: The caller guarantees that the file descriptor is valid and open.
+ tombstoned_socket: unsafe { File::from_raw_fd(tombstoned_socket) },
text_output: if text_output_fd >= 0 {
- Some(File::from_raw_fd(text_output_fd))
+ // SAFETY: The caller guarantees that the file descriptor is valid and open.
+ Some(unsafe { File::from_raw_fd(text_output_fd) })
} else {
None
},
proto_output: if proto_output_fd >= 0 {
- Some(File::from_raw_fd(proto_output_fd))
+ // SAFETY: The caller guarantees that the file descriptor is valid and open.
+ Some(unsafe { File::from_raw_fd(proto_output_fd) })
} else {
None
},
@@ -71,6 +77,8 @@
&mut proto_output_fd,
dump_type,
) {
+ // SAFETY: If tombstoned_connect_files returns successfully then they file descriptors
+ // are valid and open.
Ok(unsafe { Self::from_raw_fds(tombstoned_socket, text_output_fd, proto_output_fd) })
} else {
Err(Error)
@@ -146,8 +154,6 @@
.write_all(b"test data")
.expect("Failed to write to text output FD.");
- connection
- .notify_completion()
- .expect("Failed to notify completion.");
+ connection.notify_completion().expect("Failed to notify completion.");
}
}
diff --git a/fs_mgr/Android.bp b/fs_mgr/Android.bp
index bbd068b..0a836e4 100644
--- a/fs_mgr/Android.bp
+++ b/fs_mgr/Android.bp
@@ -49,7 +49,6 @@
sanitize: {
misc_undefined: ["integer"],
},
- local_include_dirs: ["include/"],
cflags: [
"-Wall",
"-Werror",
@@ -60,6 +59,7 @@
name: "libfs_mgr_defaults",
defaults: ["fs_mgr_defaults"],
export_include_dirs: ["include"],
+ local_include_dirs: ["include/"],
include_dirs: ["system/vold"],
cflags: [
"-D_FILE_OFFSET_BITS=64",
@@ -70,8 +70,9 @@
"fs_mgr.cpp",
"fs_mgr_format.cpp",
"fs_mgr_dm_linear.cpp",
- "fs_mgr_overlayfs.cpp",
"fs_mgr_roots.cpp",
+ "fs_mgr_overlayfs_control.cpp",
+ "fs_mgr_overlayfs_mount.cpp",
"fs_mgr_vendor_overlay.cpp",
":libfiemap_srcs",
],
@@ -187,6 +188,7 @@
],
host_supported: true,
defaults: ["fs_mgr_defaults"],
+ local_include_dirs: ["include/"],
srcs: [
"fs_mgr_fstab.cpp",
"fs_mgr_boot_config.cpp",
diff --git a/fs_mgr/fs_mgr_overlayfs.cpp b/fs_mgr/fs_mgr_overlayfs_control.cpp
similarity index 61%
rename from fs_mgr/fs_mgr_overlayfs.cpp
rename to fs_mgr/fs_mgr_overlayfs_control.cpp
index 82a8b8b..69a2ac0 100644
--- a/fs_mgr/fs_mgr_overlayfs.cpp
+++ b/fs_mgr/fs_mgr_overlayfs_control.cpp
@@ -55,8 +55,9 @@
#include <liblp/liblp.h>
#include <storage_literals/storage_literals.h>
+#include "fs_mgr_overlayfs_control.h"
+#include "fs_mgr_overlayfs_mount.h"
#include "fs_mgr_priv.h"
-#include "fs_mgr_priv_overlayfs.h"
#include "libfiemap/utility.h"
using namespace std::literals;
@@ -69,100 +70,18 @@
namespace {
constexpr char kDataScratchSizeMbProp[] = "fs_mgr.overlayfs.data_scratch_size_mb";
-constexpr char kPreferCacheBackingStorageProp[] = "fs_mgr.overlayfs.prefer_cache_backing_storage";
-
-bool fs_mgr_access(const std::string& path) {
- return access(path.c_str(), F_OK) == 0;
-}
-
-const auto kLowerdirOption = "lowerdir=";
-const auto kUpperdirOption = "upperdir=";
-
-bool fs_mgr_in_recovery() {
- // Check the existence of recovery binary instead of using the compile time
- // __ANDROID_RECOVERY__ macro.
- // If BOARD_USES_RECOVERY_AS_BOOT is true, both normal and recovery boot
- // mode would use the same init binary, which would mean during normal boot
- // the '/init' binary is actually a symlink pointing to
- // init_second_stage.recovery, which would be compiled with
- // __ANDROID_RECOVERY__ defined.
- return fs_mgr_access("/system/bin/recovery");
-}
-
-bool fs_mgr_is_dsu_running() {
- // Since android::gsi::CanBootIntoGsi() or android::gsi::MarkSystemAsGsi() is
- // never called in recovery, the return value of android::gsi::IsGsiRunning()
- // is not well-defined. In this case, just return false as being in recovery
- // implies not running a DSU system.
- if (fs_mgr_in_recovery()) return false;
- return android::gsi::IsGsiRunning();
-}
-
-// list of acceptable overlayfs backing storage
-const auto kScratchMountPoint = "/mnt/scratch";
-const auto kCacheMountPoint = "/cache";
-
-bool IsABDevice() {
- return !android::base::GetProperty("ro.boot.slot_suffix", "").empty();
-}
-
-std::vector<const std::string> OverlayMountPoints() {
- // Never fallback to legacy cache mount point if within a DSU system,
- // because running a DSU system implies the device supports dynamic
- // partitions, which means legacy cache mustn't be used.
- if (fs_mgr_is_dsu_running()) {
- return {kScratchMountPoint};
- }
-
- // For non-A/B devices prefer cache backing storage if
- // kPreferCacheBackingStorageProp property set.
- if (!IsABDevice() && android::base::GetBoolProperty(kPreferCacheBackingStorageProp, false) &&
- android::base::GetIntProperty("ro.vendor.api_level", -1) < __ANDROID_API_T__) {
- return {kCacheMountPoint, kScratchMountPoint};
- }
-
- return {kScratchMountPoint, kCacheMountPoint};
-}
// Return true if everything is mounted, but before adb is started. Right
// after 'trigger load_persist_props_action' is done.
-bool fs_mgr_boot_completed() {
+static bool fs_mgr_boot_completed() {
return android::base::GetBoolProperty("ro.persistent_properties.ready", false);
}
-bool fs_mgr_is_dir(const std::string& path) {
- struct stat st;
- return !stat(path.c_str(), &st) && S_ISDIR(st.st_mode);
-}
-
-bool fs_mgr_rw_access(const std::string& path) {
- if (path.empty()) return false;
- return access(path.c_str(), R_OK | W_OK) == 0;
-}
-
-// At less than 1% or 8MB of free space return value of false,
-// means we will try to wrap with overlayfs.
-bool fs_mgr_filesystem_has_space(const std::string& mount_point) {
- // If we have access issues to find out space remaining, return true
- // to prevent us trying to override with overlayfs.
- struct statvfs vst;
- if (statvfs(mount_point.c_str(), &vst)) {
- PLOG(ERROR) << "statvfs " << mount_point;
- return true;
- }
-
- static constexpr int kPercentThreshold = 1; // 1%
- static constexpr unsigned long kSizeThreshold = 8 * 1024 * 1024; // 8MB
-
- return (vst.f_bfree >= (vst.f_blocks * kPercentThreshold / 100)) &&
- (static_cast<uint64_t>(vst.f_bfree) * vst.f_frsize) >= kSizeThreshold;
-}
-
-const auto kPhysicalDevice = "/dev/block/by-name/";
+constexpr auto kPhysicalDevice = "/dev/block/by-name/";
constexpr char kScratchImageMetadata[] = "/metadata/gsi/remount/lp_metadata";
// Note: this is meant only for recovery/first-stage init.
-bool ScratchIsOnData() {
+static bool ScratchIsOnData() {
// The scratch partition of DSU is managed by gsid.
if (fs_mgr_is_dsu_running()) {
return false;
@@ -170,97 +89,7 @@
return fs_mgr_access(kScratchImageMetadata);
}
-bool fs_mgr_update_blk_device(FstabEntry* entry) {
- if (entry->fs_mgr_flags.logical) {
- fs_mgr_update_logical_partition(entry);
- }
- if (fs_mgr_access(entry->blk_device)) {
- return true;
- }
- if (entry->blk_device != "/dev/root") {
- return false;
- }
-
- // special case for system-as-root (taimen and others)
- auto blk_device = std::string(kPhysicalDevice) + "system";
- if (!fs_mgr_access(blk_device)) {
- blk_device += fs_mgr_get_slot_suffix();
- if (!fs_mgr_access(blk_device)) {
- return false;
- }
- }
- entry->blk_device = blk_device;
- return true;
-}
-
-bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev) {
- struct statfs fs;
- if ((statfs((mount_point + "/lost+found").c_str(), &fs) == -1) ||
- (fs.f_type != EXT4_SUPER_MAGIC)) {
- return false;
- }
-
- android::base::unique_fd fd(open(dev.c_str(), O_RDONLY | O_CLOEXEC));
- if (fd < 0) return false;
-
- struct ext4_super_block sb;
- if ((TEMP_FAILURE_RETRY(lseek64(fd, 1024, SEEK_SET)) < 0) ||
- (TEMP_FAILURE_RETRY(read(fd, &sb, sizeof(sb))) < 0)) {
- return false;
- }
-
- struct fs_info info;
- if (ext4_parse_sb(&sb, &info) < 0) return false;
-
- return (info.feat_ro_compat & EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS) != 0;
-}
-
-#define F2FS_SUPER_OFFSET 1024
-#define F2FS_FEATURE_OFFSET 2180
-#define F2FS_FEATURE_RO 0x4000
-bool fs_mgr_is_read_only_f2fs(const std::string& dev) {
- if (!fs_mgr_is_f2fs(dev)) return false;
-
- android::base::unique_fd fd(open(dev.c_str(), O_RDONLY | O_CLOEXEC));
- if (fd < 0) return false;
-
- __le32 feat;
- if ((TEMP_FAILURE_RETRY(lseek64(fd, F2FS_SUPER_OFFSET + F2FS_FEATURE_OFFSET, SEEK_SET)) < 0) ||
- (TEMP_FAILURE_RETRY(read(fd, &feat, sizeof(feat))) < 0)) {
- return false;
- }
-
- return (feat & cpu_to_le32(F2FS_FEATURE_RO)) != 0;
-}
-
-bool fs_mgr_overlayfs_enabled(FstabEntry* entry) {
- // readonly filesystem, can not be mount -o remount,rw
- // for squashfs, erofs or if free space is (near) zero making such a remount
- // virtually useless, or if there are shared blocks that prevent remount,rw
- if (!fs_mgr_filesystem_has_space(entry->mount_point)) {
- return true;
- }
-
- // blk_device needs to be setup so we can check superblock.
- // If we fail here, because during init first stage and have doubts.
- if (!fs_mgr_update_blk_device(entry)) {
- return true;
- }
-
- // f2fs read-only mode doesn't support remount,rw
- if (fs_mgr_is_read_only_f2fs(entry->blk_device)) {
- return true;
- }
-
- // check if ext4 de-dupe
- auto has_shared_blocks = fs_mgr_has_shared_blocks(entry->mount_point, entry->blk_device);
- if (!has_shared_blocks && (entry->mount_point == "/system")) {
- has_shared_blocks = fs_mgr_has_shared_blocks("/", entry->blk_device);
- }
- return has_shared_blocks;
-}
-
-bool fs_mgr_rm_all(const std::string& path, bool* change = nullptr, int level = 0) {
+static bool fs_mgr_rm_all(const std::string& path, bool* change = nullptr, int level = 0) {
std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(path.c_str()), closedir);
if (!dir) {
if (errno == ENOENT) {
@@ -301,96 +130,6 @@
return ret;
}
-const auto kUpperName = "upper";
-const auto kWorkName = "work";
-const auto kOverlayTopDir = "/overlay";
-
-std::string fs_mgr_get_overlayfs_candidate(const std::string& mount_point) {
- if (!fs_mgr_is_dir(mount_point)) return "";
- const auto base = android::base::Basename(mount_point) + "/";
- for (const auto& overlay_mount_point : OverlayMountPoints()) {
- auto dir = overlay_mount_point + kOverlayTopDir + "/" + base;
- auto upper = dir + kUpperName;
- if (!fs_mgr_is_dir(upper)) continue;
- auto work = dir + kWorkName;
- if (!fs_mgr_is_dir(work)) continue;
- if (!fs_mgr_rw_access(work)) continue;
- return dir;
- }
- return "";
-}
-
-static inline bool KernelSupportsUserXattrs() {
- struct utsname uts;
- uname(&uts);
-
- int major, minor;
- if (sscanf(uts.release, "%d.%d", &major, &minor) != 2) {
- return false;
- }
- return major > 5 || (major == 5 && minor >= 15);
-}
-
-const std::string fs_mgr_mount_point(const std::string& mount_point) {
- if ("/"s != mount_point) return mount_point;
- return "/system";
-}
-
-// default options for mount_point, returns empty string for none available.
-std::string fs_mgr_get_overlayfs_options(const FstabEntry& entry) {
- const auto mount_point = fs_mgr_mount_point(entry.mount_point);
- auto candidate = fs_mgr_get_overlayfs_candidate(mount_point);
- if (candidate.empty()) return "";
- auto ret = kLowerdirOption + mount_point + "," + kUpperdirOption + candidate + kUpperName +
- ",workdir=" + candidate + kWorkName;
- if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kOverrideCredsRequired) {
- ret += ",override_creds=off";
- }
- if (KernelSupportsUserXattrs()) {
- ret += ",userxattr";
- }
- for (const auto& flag : android::base::Split(entry.fs_options, ",")) {
- if (android::base::StartsWith(flag, "context=")) {
- ret += "," + flag;
- }
- }
- return ret;
-}
-
-constexpr char kOverlayfsFileContext[] = "u:object_r:overlayfs_file:s0";
-
-class AutoSetFsCreateCon final {
- public:
- AutoSetFsCreateCon() {}
- AutoSetFsCreateCon(const std::string& context) { Set(context); }
- ~AutoSetFsCreateCon() { Restore(); }
-
- bool Ok() const { return ok_; }
- bool Set(const std::string& context) {
- if (setfscreatecon(context.c_str())) {
- PLOG(ERROR) << "setfscreatecon " << context;
- return false;
- }
- ok_ = true;
- return true;
- }
- bool Restore() {
- if (restored_ || !ok_) {
- return true;
- }
- if (setfscreatecon(nullptr)) {
- PLOG(ERROR) << "setfscreatecon null";
- return false;
- }
- restored_ = true;
- return true;
- }
-
- private:
- bool ok_ = false;
- bool restored_ = false;
-};
-
std::string fs_mgr_overlayfs_setup_dir(const std::string& dir) {
auto top = dir + kOverlayTopDir;
@@ -452,15 +191,15 @@
return true;
}
-uint32_t fs_mgr_overlayfs_slot_number() {
+static uint32_t fs_mgr_overlayfs_slot_number() {
return SlotNumberForSlotSuffix(fs_mgr_get_slot_suffix());
}
-std::string fs_mgr_overlayfs_super_device(uint32_t slot_number) {
+static std::string fs_mgr_overlayfs_super_device(uint32_t slot_number) {
return kPhysicalDevice + fs_mgr_get_super_partition_name(slot_number);
}
-bool fs_mgr_overlayfs_has_logical(const Fstab& fstab) {
+static bool fs_mgr_overlayfs_has_logical(const Fstab& fstab) {
for (const auto& entry : fstab) {
if (entry.fs_mgr_flags.logical) {
return true;
@@ -469,18 +208,6 @@
return false;
}
-// Returns true if immediate unmount succeeded and the scratch mount point was
-// removed.
-bool fs_mgr_overlayfs_umount_scratch() {
- if (umount(kScratchMountPoint) != 0) {
- return false;
- }
- if (rmdir(kScratchMountPoint) != 0 && errno != ENOENT) {
- PLOG(ERROR) << "rmdir " << kScratchMountPoint;
- }
- return true;
-}
-
OverlayfsTeardownResult TeardownDataScratch(IImageManager* images,
const std::string& partition_name, bool was_mounted) {
if (!images) {
@@ -619,214 +346,6 @@
return ret;
}
-bool fs_mgr_overlayfs_set_shared_mount(const std::string& mount_point, bool shared_flag) {
- auto ret = mount(nullptr, mount_point.c_str(), nullptr, shared_flag ? MS_SHARED : MS_PRIVATE,
- nullptr);
- if (ret) {
- PERROR << "__mount(target=" << mount_point
- << ",flag=" << (shared_flag ? "MS_SHARED" : "MS_PRIVATE") << ")=" << ret;
- // If "/system" doesn't look like a mountpoint, retry with "/".
- if (errno == EINVAL && mount_point == "/system") {
- return fs_mgr_overlayfs_set_shared_mount("/", shared_flag);
- }
- return false;
- }
- return true;
-}
-
-bool fs_mgr_overlayfs_move_mount(const std::string& source, const std::string& target) {
- auto ret = mount(source.c_str(), target.c_str(), nullptr, MS_MOVE, nullptr);
- if (ret) {
- PERROR << "__mount(source=" << source << ",target=" << target << ",flag=MS_MOVE)=" << ret;
- return false;
- }
- return true;
-}
-
-struct mount_info {
- std::string mount_point;
- bool shared_flag;
-};
-
-std::vector<mount_info> ReadMountinfoFromFile(const std::string& path) {
- std::vector<mount_info> info;
-
- auto file = std::unique_ptr<FILE, decltype(&fclose)>{fopen(path.c_str(), "re"), fclose};
- if (!file) {
- PERROR << __FUNCTION__ << "(): cannot open file: '" << path << "'";
- return info;
- }
-
- ssize_t len;
- size_t alloc_len = 0;
- char* line = nullptr;
- while ((len = getline(&line, &alloc_len, file.get())) != -1) {
- /* if the last character is a newline, shorten the string by 1 byte */
- if (line[len - 1] == '\n') {
- line[len - 1] = '\0';
- }
-
- static constexpr char delim[] = " \t";
- char* save_ptr;
- if (!strtok_r(line, delim, &save_ptr)) {
- LERROR << "Error parsing mount ID";
- break;
- }
- if (!strtok_r(nullptr, delim, &save_ptr)) {
- LERROR << "Error parsing parent ID";
- break;
- }
- if (!strtok_r(nullptr, delim, &save_ptr)) {
- LERROR << "Error parsing mount source";
- break;
- }
- if (!strtok_r(nullptr, delim, &save_ptr)) {
- LERROR << "Error parsing root";
- break;
- }
-
- char* p;
- if (!(p = strtok_r(nullptr, delim, &save_ptr))) {
- LERROR << "Error parsing mount_point";
- break;
- }
- mount_info entry = {p, false};
-
- if (!strtok_r(nullptr, delim, &save_ptr)) {
- LERROR << "Error parsing mount_flags";
- break;
- }
-
- while ((p = strtok_r(nullptr, delim, &save_ptr))) {
- if ((p[0] == '-') && (p[1] == '\0')) break;
- if (android::base::StartsWith(p, "shared:")) entry.shared_flag = true;
- }
- if (!p) {
- LERROR << "Error parsing fields";
- break;
- }
- info.emplace_back(std::move(entry));
- }
-
- free(line);
- if (info.empty()) {
- LERROR << __FUNCTION__ << "(): failed to load mountinfo from : '" << path << "'";
- }
- return info;
-}
-
-bool fs_mgr_overlayfs_mount(const FstabEntry& entry) {
- const auto mount_point = fs_mgr_mount_point(entry.mount_point);
- const auto options = fs_mgr_get_overlayfs_options(entry);
- if (options.empty()) return false;
-
- auto retval = true;
-
- struct move_entry {
- std::string mount_point;
- std::string dir;
- bool shared_flag;
- };
- std::vector<move_entry> move;
- auto parent_private = false;
- auto parent_made_private = false;
- auto dev_private = false;
- auto dev_made_private = false;
- for (auto& entry : ReadMountinfoFromFile("/proc/self/mountinfo")) {
- if ((entry.mount_point == mount_point) && !entry.shared_flag) {
- parent_private = true;
- }
- if ((entry.mount_point == "/dev") && !entry.shared_flag) {
- dev_private = true;
- }
-
- if (!android::base::StartsWith(entry.mount_point, mount_point + "/")) {
- continue;
- }
- if (std::find_if(move.begin(), move.end(), [&entry](const auto& it) {
- return android::base::StartsWith(entry.mount_point, it.mount_point + "/");
- }) != move.end()) {
- continue;
- }
-
- // use as the bound directory in /dev.
- AutoSetFsCreateCon createcon;
- auto new_context = fs_mgr_get_context(entry.mount_point);
- if (new_context.empty() || !createcon.Set(new_context)) {
- continue;
- }
- move_entry new_entry = {std::move(entry.mount_point), "/dev/TemporaryDir-XXXXXX",
- entry.shared_flag};
- const auto target = mkdtemp(new_entry.dir.data());
- if (!createcon.Restore()) {
- return false;
- }
- if (!target) {
- retval = false;
- PERROR << "temporary directory for MS_BIND";
- continue;
- }
-
- if (!parent_private && !parent_made_private) {
- parent_made_private = fs_mgr_overlayfs_set_shared_mount(mount_point, false);
- }
- if (new_entry.shared_flag) {
- new_entry.shared_flag = fs_mgr_overlayfs_set_shared_mount(new_entry.mount_point, false);
- }
- if (!fs_mgr_overlayfs_move_mount(new_entry.mount_point, new_entry.dir)) {
- retval = false;
- if (new_entry.shared_flag) {
- fs_mgr_overlayfs_set_shared_mount(new_entry.mount_point, true);
- }
- continue;
- }
- move.emplace_back(std::move(new_entry));
- }
-
- // hijack __mount() report format to help triage
- auto report = "__mount(source=overlay,target="s + mount_point + ",type=overlay";
- const auto opt_list = android::base::Split(options, ",");
- for (const auto& opt : opt_list) {
- if (android::base::StartsWith(opt, kUpperdirOption)) {
- report = report + "," + opt;
- break;
- }
- }
- report = report + ")=";
-
- auto ret = mount("overlay", mount_point.c_str(), "overlay", MS_RDONLY | MS_NOATIME,
- options.c_str());
- if (ret) {
- retval = false;
- PERROR << report << ret;
- } else {
- LINFO << report << ret;
- }
-
- // Move submounts back.
- for (const auto& entry : move) {
- if (!dev_private && !dev_made_private) {
- dev_made_private = fs_mgr_overlayfs_set_shared_mount("/dev", false);
- }
-
- if (!fs_mgr_overlayfs_move_mount(entry.dir, entry.mount_point)) {
- retval = false;
- } else if (entry.shared_flag &&
- !fs_mgr_overlayfs_set_shared_mount(entry.mount_point, true)) {
- retval = false;
- }
- rmdir(entry.dir.c_str());
- }
- if (dev_made_private) {
- fs_mgr_overlayfs_set_shared_mount("/dev", true);
- }
- if (parent_made_private) {
- fs_mgr_overlayfs_set_shared_mount(mount_point, true);
- }
-
- return retval;
-}
-
// Mount kScratchMountPoint
bool MountScratch(const std::string& device_path, bool readonly = false) {
if (readonly) {
@@ -1010,21 +529,7 @@
auto partition_size =
builder->AllocatableSpace() - builder->UsedSpace() + partition->size();
if ((partition_size > kMinimumSize) || !partition->size()) {
- // Leave some space for free space jitter of a few erase
- // blocks, in case they are needed for any individual updates
- // to any other partition that needs to be flashed while
- // overlayfs is in force. Of course if margin_size is not
- // enough could normally get a flash failure, so
- // ResizePartition() will delete the scratch partition in
- // order to fulfill. Deleting scratch will destroy all of
- // the adb remount overrides :-( .
- auto margin_size = uint64_t(3 * 256 * 1024);
- BlockDeviceInfo info;
- if (builder->GetBlockDeviceInfo(fs_mgr_get_super_partition_name(slot_number), &info)) {
- margin_size = 3 * info.logical_block_size;
- }
- partition_size = std::max(std::min(kMinimumSize, partition_size - margin_size),
- partition_size / 2);
+ partition_size = std::max(std::min(kMinimumSize, partition_size), partition_size / 2);
if (partition_size > partition->size()) {
if (!builder->ResizePartition(partition, partition_size)) {
// Try to free up space by deallocating partitions in the other slot.
@@ -1032,8 +537,8 @@
partition_size =
builder->AllocatableSpace() - builder->UsedSpace() + partition->size();
- partition_size = std::max(std::min(kMinimumSize, partition_size - margin_size),
- partition_size / 2);
+ partition_size =
+ std::max(std::min(kMinimumSize, partition_size), partition_size / 2);
if (!builder->ResizePartition(partition, partition_size)) {
LERROR << "resize " << partition_name;
return false;
@@ -1212,12 +717,6 @@
return MountScratch(scratch_device);
}
-#if ALLOW_ADBD_DISABLE_VERITY
-constexpr bool kAllowOverlayfs = true;
-#else
-constexpr bool kAllowOverlayfs = false;
-#endif
-
// NOTE: OverlayfsSetupAllowed() must be "stricter" than OverlayfsTeardownAllowed().
// Setup is allowed only if teardown is also allowed.
bool OverlayfsSetupAllowed(bool verbose = false) {
@@ -1251,114 +750,6 @@
} // namespace
-bool fs_mgr_wants_overlayfs(FstabEntry* entry) {
- // Don't check entries that are managed by vold.
- if (entry->fs_mgr_flags.vold_managed || entry->fs_mgr_flags.recovery_only) return false;
-
- // *_other doesn't want overlayfs.
- if (entry->fs_mgr_flags.slot_select_other) return false;
-
- // Only concerned with readonly partitions.
- if (!(entry->flags & MS_RDONLY)) return false;
-
- // If unbindable, do not allow overlayfs as this could expose us to
- // security issues. On Android, this could also be used to turn off
- // the ability to overlay an otherwise acceptable filesystem since
- // /system and /vendor are never bound(sic) to.
- if (entry->flags & MS_UNBINDABLE) return false;
-
- if (!fs_mgr_overlayfs_enabled(entry)) return false;
-
- return true;
-}
-
-Fstab fs_mgr_overlayfs_candidate_list(const Fstab& fstab) {
- android::fs_mgr::Fstab mounts;
- if (!android::fs_mgr::ReadFstabFromFile("/proc/mounts", &mounts)) {
- PLOG(ERROR) << "Failed to read /proc/mounts";
- return {};
- }
-
- Fstab candidates;
- for (const auto& entry : fstab) {
- // Filter out partitions whose type doesn't match what's mounted.
- // This avoids spammy behavior on devices which can mount different
- // filesystems for each partition.
- auto proc_mount_point = (entry.mount_point == "/system") ? "/" : entry.mount_point;
- auto mounted = GetEntryForMountPoint(&mounts, proc_mount_point);
- if (!mounted || mounted->fs_type != entry.fs_type) {
- continue;
- }
-
- FstabEntry new_entry = entry;
- if (!fs_mgr_overlayfs_already_mounted(entry.mount_point) &&
- !fs_mgr_wants_overlayfs(&new_entry)) {
- continue;
- }
- auto new_mount_point = fs_mgr_mount_point(entry.mount_point);
- auto duplicate_or_more_specific = false;
- for (auto it = candidates.begin(); it != candidates.end();) {
- auto it_mount_point = fs_mgr_mount_point(it->mount_point);
- if ((it_mount_point == new_mount_point) ||
- (android::base::StartsWith(new_mount_point, it_mount_point + "/"))) {
- duplicate_or_more_specific = true;
- break;
- }
- if (android::base::StartsWith(it_mount_point, new_mount_point + "/")) {
- it = candidates.erase(it);
- } else {
- ++it;
- }
- }
- if (!duplicate_or_more_specific) candidates.emplace_back(std::move(new_entry));
- }
- return candidates;
-}
-
-static void TryMountScratch() {
- // Note we get the boot scratch device here, which means if scratch was
- // just created through ImageManager, this could fail. In practice this
- // should not happen because "remount" detects this scenario (by checking
- // if verity is still disabled, i.e. no reboot occurred), and skips calling
- // fs_mgr_overlayfs_mount_all().
- auto scratch_device = GetBootScratchDevice();
- if (!fs_mgr_rw_access(scratch_device)) {
- return;
- }
- if (!WaitForFile(scratch_device, 10s)) {
- return;
- }
- if (!MountScratch(scratch_device, true /* readonly */)) {
- return;
- }
- auto has_overlayfs_dir = fs_mgr_access(std::string(kScratchMountPoint) + kOverlayTopDir);
- fs_mgr_overlayfs_umount_scratch();
- if (has_overlayfs_dir) {
- MountScratch(scratch_device);
- }
-}
-
-bool fs_mgr_overlayfs_mount_all(Fstab* fstab) {
- if (!OverlayfsSetupAllowed()) {
- return false;
- }
- auto ret = true;
- auto scratch_can_be_mounted = true;
- for (const auto& entry : fs_mgr_overlayfs_candidate_list(*fstab)) {
- if (fs_mgr_is_verity_enabled(entry)) continue;
- auto mount_point = fs_mgr_mount_point(entry.mount_point);
- if (fs_mgr_overlayfs_already_mounted(mount_point)) {
- continue;
- }
- if (scratch_can_be_mounted) {
- scratch_can_be_mounted = false;
- TryMountScratch();
- }
- ret &= fs_mgr_overlayfs_mount(entry);
- }
- return ret;
-}
-
bool fs_mgr_overlayfs_setup(const Fstab& fstab, const char* mount_point, bool* want_reboot,
bool just_disabled_verity) {
if (!OverlayfsSetupAllowed(/*verbose=*/true)) {
@@ -1582,22 +973,6 @@
return rv;
}
-bool fs_mgr_overlayfs_is_setup() {
- if (!OverlayfsSetupAllowed()) {
- return false;
- }
- if (fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false)) return true;
- Fstab fstab;
- if (!ReadDefaultFstab(&fstab)) {
- return false;
- }
- for (const auto& entry : fs_mgr_overlayfs_candidate_list(fstab)) {
- if (fs_mgr_is_verity_enabled(entry)) continue;
- if (fs_mgr_overlayfs_already_mounted(fs_mgr_mount_point(entry.mount_point))) return true;
- }
- return false;
-}
-
namespace android {
namespace fs_mgr {
@@ -1714,23 +1089,3 @@
} // namespace fs_mgr
} // namespace android
-
-bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point, bool overlay_only) {
- Fstab fstab;
- if (!ReadFstabFromFile("/proc/mounts", &fstab)) {
- return false;
- }
- const auto lowerdir = kLowerdirOption + mount_point;
- for (const auto& entry : fstab) {
- if (overlay_only && "overlay" != entry.fs_type && "overlayfs" != entry.fs_type) continue;
- if (mount_point != entry.mount_point) continue;
- if (!overlay_only) return true;
- const auto options = android::base::Split(entry.fs_options, ",");
- for (const auto& opt : options) {
- if (opt == lowerdir) {
- return true;
- }
- }
- }
- return false;
-}
diff --git a/fs_mgr/fs_mgr_overlayfs_control.h b/fs_mgr/fs_mgr_overlayfs_control.h
new file mode 100644
index 0000000..50e83e8
--- /dev/null
+++ b/fs_mgr/fs_mgr_overlayfs_control.h
@@ -0,0 +1,44 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <string>
+
+#include <fstab/fstab.h>
+
+// If "mount_point" is non-null, set up exactly one overlay.
+//
+// If "mount_point" is null, setup any overlays.
+//
+// If |want_reboot| is non-null, and a reboot is needed to apply overlays, then
+// it will be true on return. The caller is responsible for initializing it.
+bool fs_mgr_overlayfs_setup(const android::fs_mgr::Fstab& fstab, const char* mount_point = nullptr,
+ bool* want_reboot = nullptr, bool just_disabled_verity = true);
+
+enum class OverlayfsTeardownResult {
+ Ok,
+ Busy, // Indicates that overlays are still in use.
+ Error
+};
+OverlayfsTeardownResult fs_mgr_overlayfs_teardown(const char* mount_point = nullptr,
+ bool* want_reboot = nullptr);
+
+namespace android {
+namespace fs_mgr {
+
+void CleanupOldScratchFiles();
+
+} // namespace fs_mgr
+} // namespace android
diff --git a/fs_mgr/fs_mgr_overlayfs_mount.cpp b/fs_mgr/fs_mgr_overlayfs_mount.cpp
new file mode 100644
index 0000000..c057c2b
--- /dev/null
+++ b/fs_mgr/fs_mgr_overlayfs_mount.cpp
@@ -0,0 +1,802 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/fs.h>
+#include <selinux/selinux.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mount.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/statvfs.h>
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <sys/vfs.h>
+#include <unistd.h>
+
+#include <algorithm>
+#include <memory>
+#include <optional>
+#include <string>
+#include <vector>
+
+#include <android-base/file.h>
+#include <android-base/macros.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <android-base/unique_fd.h>
+#include <ext4_utils/ext4_utils.h>
+#include <fs_mgr.h>
+#include <fs_mgr/file_wait.h>
+#include <fs_mgr_dm_linear.h>
+#include <fs_mgr_overlayfs.h>
+#include <fstab/fstab.h>
+#include <libdm/dm.h>
+#include <libgsi/libgsi.h>
+#include <storage_literals/storage_literals.h>
+
+#include "fs_mgr_overlayfs_mount.h"
+#include "fs_mgr_priv.h"
+
+using namespace std::literals;
+using namespace android::dm;
+using namespace android::fs_mgr;
+using namespace android::storage_literals;
+
+constexpr char kPreferCacheBackingStorageProp[] = "fs_mgr.overlayfs.prefer_cache_backing_storage";
+
+bool fs_mgr_access(const std::string& path) {
+ return access(path.c_str(), F_OK) == 0;
+}
+
+const auto kLowerdirOption = "lowerdir=";
+const auto kUpperdirOption = "upperdir=";
+
+bool fs_mgr_in_recovery() {
+ // Check the existence of recovery binary instead of using the compile time
+ // __ANDROID_RECOVERY__ macro.
+ // If BOARD_USES_RECOVERY_AS_BOOT is true, both normal and recovery boot
+ // mode would use the same init binary, which would mean during normal boot
+ // the '/init' binary is actually a symlink pointing to
+ // init_second_stage.recovery, which would be compiled with
+ // __ANDROID_RECOVERY__ defined.
+ return fs_mgr_access("/system/bin/recovery");
+}
+
+bool fs_mgr_is_dsu_running() {
+ // Since android::gsi::CanBootIntoGsi() or android::gsi::MarkSystemAsGsi() is
+ // never called in recovery, the return value of android::gsi::IsGsiRunning()
+ // is not well-defined. In this case, just return false as being in recovery
+ // implies not running a DSU system.
+ if (fs_mgr_in_recovery()) return false;
+ return android::gsi::IsGsiRunning();
+}
+
+const auto kCacheMountPoint = "/cache";
+
+static bool IsABDevice() {
+ return !android::base::GetProperty("ro.boot.slot_suffix", "").empty();
+}
+
+std::vector<const std::string> OverlayMountPoints() {
+ // Never fallback to legacy cache mount point if within a DSU system,
+ // because running a DSU system implies the device supports dynamic
+ // partitions, which means legacy cache mustn't be used.
+ if (fs_mgr_is_dsu_running()) {
+ return {kScratchMountPoint};
+ }
+
+ // For non-A/B devices prefer cache backing storage if
+ // kPreferCacheBackingStorageProp property set.
+ if (!IsABDevice() && android::base::GetBoolProperty(kPreferCacheBackingStorageProp, false) &&
+ android::base::GetIntProperty("ro.vendor.api_level", -1) < __ANDROID_API_T__) {
+ return {kCacheMountPoint, kScratchMountPoint};
+ }
+
+ return {kScratchMountPoint, kCacheMountPoint};
+}
+
+static bool fs_mgr_is_dir(const std::string& path) {
+ struct stat st;
+ return !stat(path.c_str(), &st) && S_ISDIR(st.st_mode);
+}
+
+bool fs_mgr_rw_access(const std::string& path) {
+ if (path.empty()) return false;
+ return access(path.c_str(), R_OK | W_OK) == 0;
+}
+
+// At less than 1% or 8MB of free space return value of false,
+// means we will try to wrap with overlayfs.
+bool fs_mgr_filesystem_has_space(const std::string& mount_point) {
+ // If we have access issues to find out space remaining, return true
+ // to prevent us trying to override with overlayfs.
+ struct statvfs vst;
+ if (statvfs(mount_point.c_str(), &vst)) {
+ PLOG(ERROR) << "statvfs " << mount_point;
+ return true;
+ }
+
+ static constexpr int kPercentThreshold = 1; // 1%
+ static constexpr unsigned long kSizeThreshold = 8 * 1024 * 1024; // 8MB
+
+ return (vst.f_bfree >= (vst.f_blocks * kPercentThreshold / 100)) &&
+ (static_cast<uint64_t>(vst.f_bfree) * vst.f_frsize) >= kSizeThreshold;
+}
+
+const auto kPhysicalDevice = "/dev/block/by-name/";
+
+static bool fs_mgr_update_blk_device(FstabEntry* entry) {
+ if (entry->fs_mgr_flags.logical) {
+ fs_mgr_update_logical_partition(entry);
+ }
+ if (fs_mgr_access(entry->blk_device)) {
+ return true;
+ }
+ if (entry->blk_device != "/dev/root") {
+ return false;
+ }
+
+ // special case for system-as-root (taimen and others)
+ auto blk_device = std::string(kPhysicalDevice) + "system";
+ if (!fs_mgr_access(blk_device)) {
+ blk_device += fs_mgr_get_slot_suffix();
+ if (!fs_mgr_access(blk_device)) {
+ return false;
+ }
+ }
+ entry->blk_device = blk_device;
+ return true;
+}
+
+static bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev) {
+ struct statfs fs;
+ if ((statfs((mount_point + "/lost+found").c_str(), &fs) == -1) ||
+ (fs.f_type != EXT4_SUPER_MAGIC)) {
+ return false;
+ }
+
+ android::base::unique_fd fd(open(dev.c_str(), O_RDONLY | O_CLOEXEC));
+ if (fd < 0) return false;
+
+ struct ext4_super_block sb;
+ if ((TEMP_FAILURE_RETRY(lseek64(fd, 1024, SEEK_SET)) < 0) ||
+ (TEMP_FAILURE_RETRY(read(fd, &sb, sizeof(sb))) < 0)) {
+ return false;
+ }
+
+ struct fs_info info;
+ if (ext4_parse_sb(&sb, &info) < 0) return false;
+
+ return (info.feat_ro_compat & EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS) != 0;
+}
+
+#define F2FS_SUPER_OFFSET 1024
+#define F2FS_FEATURE_OFFSET 2180
+#define F2FS_FEATURE_RO 0x4000
+static bool fs_mgr_is_read_only_f2fs(const std::string& dev) {
+ if (!fs_mgr_is_f2fs(dev)) return false;
+
+ android::base::unique_fd fd(open(dev.c_str(), O_RDONLY | O_CLOEXEC));
+ if (fd < 0) return false;
+
+ __le32 feat;
+ if ((TEMP_FAILURE_RETRY(lseek64(fd, F2FS_SUPER_OFFSET + F2FS_FEATURE_OFFSET, SEEK_SET)) < 0) ||
+ (TEMP_FAILURE_RETRY(read(fd, &feat, sizeof(feat))) < 0)) {
+ return false;
+ }
+
+ return (feat & cpu_to_le32(F2FS_FEATURE_RO)) != 0;
+}
+
+static bool fs_mgr_overlayfs_enabled(FstabEntry* entry) {
+ // readonly filesystem, can not be mount -o remount,rw
+ // for squashfs, erofs or if free space is (near) zero making such a remount
+ // virtually useless, or if there are shared blocks that prevent remount,rw
+ if (!fs_mgr_filesystem_has_space(entry->mount_point)) {
+ return true;
+ }
+
+ // blk_device needs to be setup so we can check superblock.
+ // If we fail here, because during init first stage and have doubts.
+ if (!fs_mgr_update_blk_device(entry)) {
+ return true;
+ }
+
+ // f2fs read-only mode doesn't support remount,rw
+ if (fs_mgr_is_read_only_f2fs(entry->blk_device)) {
+ return true;
+ }
+
+ // check if ext4 de-dupe
+ auto has_shared_blocks = fs_mgr_has_shared_blocks(entry->mount_point, entry->blk_device);
+ if (!has_shared_blocks && (entry->mount_point == "/system")) {
+ has_shared_blocks = fs_mgr_has_shared_blocks("/", entry->blk_device);
+ }
+ return has_shared_blocks;
+}
+
+static std::string fs_mgr_get_overlayfs_candidate(const std::string& mount_point) {
+ if (!fs_mgr_is_dir(mount_point)) return "";
+ const auto base = android::base::Basename(mount_point) + "/";
+ for (const auto& overlay_mount_point : OverlayMountPoints()) {
+ auto dir = overlay_mount_point + kOverlayTopDir + "/" + base;
+ auto upper = dir + kUpperName;
+ if (!fs_mgr_is_dir(upper)) continue;
+ auto work = dir + kWorkName;
+ if (!fs_mgr_is_dir(work)) continue;
+ if (!fs_mgr_rw_access(work)) continue;
+ return dir;
+ }
+ return "";
+}
+
+static inline bool KernelSupportsUserXattrs() {
+ struct utsname uts;
+ uname(&uts);
+
+ int major, minor;
+ if (sscanf(uts.release, "%d.%d", &major, &minor) != 2) {
+ return false;
+ }
+ return major > 5 || (major == 5 && minor >= 15);
+}
+
+const std::string fs_mgr_mount_point(const std::string& mount_point) {
+ if ("/"s != mount_point) return mount_point;
+ return "/system";
+}
+
+// default options for mount_point, returns empty string for none available.
+static std::string fs_mgr_get_overlayfs_options(const FstabEntry& entry) {
+ const auto mount_point = fs_mgr_mount_point(entry.mount_point);
+ auto candidate = fs_mgr_get_overlayfs_candidate(mount_point);
+ if (candidate.empty()) return "";
+ auto ret = kLowerdirOption + mount_point + "," + kUpperdirOption + candidate + kUpperName +
+ ",workdir=" + candidate + kWorkName;
+ if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kOverrideCredsRequired) {
+ ret += ",override_creds=off";
+ }
+ if (KernelSupportsUserXattrs()) {
+ ret += ",userxattr";
+ }
+ for (const auto& flag : android::base::Split(entry.fs_options, ",")) {
+ if (android::base::StartsWith(flag, "context=")) {
+ ret += "," + flag;
+ }
+ }
+ return ret;
+}
+
+bool AutoSetFsCreateCon::Set(const std::string& context) {
+ if (setfscreatecon(context.c_str())) {
+ PLOG(ERROR) << "setfscreatecon " << context;
+ return false;
+ }
+ ok_ = true;
+ return true;
+}
+
+bool AutoSetFsCreateCon::Restore() {
+ if (restored_ || !ok_) {
+ return true;
+ }
+ if (setfscreatecon(nullptr)) {
+ PLOG(ERROR) << "setfscreatecon null";
+ return false;
+ }
+ restored_ = true;
+ return true;
+}
+
+// Returns true if immediate unmount succeeded and the scratch mount point was
+// removed.
+bool fs_mgr_overlayfs_umount_scratch() {
+ if (umount(kScratchMountPoint) != 0) {
+ return false;
+ }
+ if (rmdir(kScratchMountPoint) != 0 && errno != ENOENT) {
+ PLOG(ERROR) << "rmdir " << kScratchMountPoint;
+ }
+ return true;
+}
+
+static bool fs_mgr_overlayfs_set_shared_mount(const std::string& mount_point, bool shared_flag) {
+ auto ret = mount(nullptr, mount_point.c_str(), nullptr, shared_flag ? MS_SHARED : MS_PRIVATE,
+ nullptr);
+ if (ret) {
+ PERROR << "__mount(target=" << mount_point
+ << ",flag=" << (shared_flag ? "MS_SHARED" : "MS_PRIVATE") << ")=" << ret;
+ // If "/system" doesn't look like a mountpoint, retry with "/".
+ if (errno == EINVAL && mount_point == "/system") {
+ return fs_mgr_overlayfs_set_shared_mount("/", shared_flag);
+ }
+ return false;
+ }
+ return true;
+}
+
+static bool fs_mgr_overlayfs_move_mount(const std::string& source, const std::string& target) {
+ auto ret = mount(source.c_str(), target.c_str(), nullptr, MS_MOVE, nullptr);
+ if (ret) {
+ PERROR << "__mount(source=" << source << ",target=" << target << ",flag=MS_MOVE)=" << ret;
+ return false;
+ }
+ return true;
+}
+
+struct mount_info {
+ std::string mount_point;
+ bool shared_flag;
+};
+
+static std::vector<mount_info> ReadMountinfoFromFile(const std::string& path) {
+ std::vector<mount_info> info;
+
+ auto file = std::unique_ptr<FILE, decltype(&fclose)>{fopen(path.c_str(), "re"), fclose};
+ if (!file) {
+ PERROR << __FUNCTION__ << "(): cannot open file: '" << path << "'";
+ return info;
+ }
+
+ ssize_t len;
+ size_t alloc_len = 0;
+ char* line = nullptr;
+ while ((len = getline(&line, &alloc_len, file.get())) != -1) {
+ /* if the last character is a newline, shorten the string by 1 byte */
+ if (line[len - 1] == '\n') {
+ line[len - 1] = '\0';
+ }
+
+ static constexpr char delim[] = " \t";
+ char* save_ptr;
+ if (!strtok_r(line, delim, &save_ptr)) {
+ LERROR << "Error parsing mount ID";
+ break;
+ }
+ if (!strtok_r(nullptr, delim, &save_ptr)) {
+ LERROR << "Error parsing parent ID";
+ break;
+ }
+ if (!strtok_r(nullptr, delim, &save_ptr)) {
+ LERROR << "Error parsing mount source";
+ break;
+ }
+ if (!strtok_r(nullptr, delim, &save_ptr)) {
+ LERROR << "Error parsing root";
+ break;
+ }
+
+ char* p;
+ if (!(p = strtok_r(nullptr, delim, &save_ptr))) {
+ LERROR << "Error parsing mount_point";
+ break;
+ }
+ mount_info entry = {p, false};
+
+ if (!strtok_r(nullptr, delim, &save_ptr)) {
+ LERROR << "Error parsing mount_flags";
+ break;
+ }
+
+ while ((p = strtok_r(nullptr, delim, &save_ptr))) {
+ if ((p[0] == '-') && (p[1] == '\0')) break;
+ if (android::base::StartsWith(p, "shared:")) entry.shared_flag = true;
+ }
+ if (!p) {
+ LERROR << "Error parsing fields";
+ break;
+ }
+ info.emplace_back(std::move(entry));
+ }
+
+ free(line);
+ if (info.empty()) {
+ LERROR << __FUNCTION__ << "(): failed to load mountinfo from : '" << path << "'";
+ }
+ return info;
+}
+
+static bool fs_mgr_overlayfs_mount(const FstabEntry& entry) {
+ const auto mount_point = fs_mgr_mount_point(entry.mount_point);
+ const auto options = fs_mgr_get_overlayfs_options(entry);
+ if (options.empty()) return false;
+
+ auto retval = true;
+
+ struct move_entry {
+ std::string mount_point;
+ std::string dir;
+ bool shared_flag;
+ };
+ std::vector<move_entry> move;
+ auto parent_private = false;
+ auto parent_made_private = false;
+ auto dev_private = false;
+ auto dev_made_private = false;
+ for (auto& entry : ReadMountinfoFromFile("/proc/self/mountinfo")) {
+ if ((entry.mount_point == mount_point) && !entry.shared_flag) {
+ parent_private = true;
+ }
+ if ((entry.mount_point == "/dev") && !entry.shared_flag) {
+ dev_private = true;
+ }
+
+ if (!android::base::StartsWith(entry.mount_point, mount_point + "/")) {
+ continue;
+ }
+ if (std::find_if(move.begin(), move.end(), [&entry](const auto& it) {
+ return android::base::StartsWith(entry.mount_point, it.mount_point + "/");
+ }) != move.end()) {
+ continue;
+ }
+
+ // use as the bound directory in /dev.
+ AutoSetFsCreateCon createcon;
+ auto new_context = fs_mgr_get_context(entry.mount_point);
+ if (new_context.empty() || !createcon.Set(new_context)) {
+ continue;
+ }
+ move_entry new_entry = {std::move(entry.mount_point), "/dev/TemporaryDir-XXXXXX",
+ entry.shared_flag};
+ const auto target = mkdtemp(new_entry.dir.data());
+ if (!createcon.Restore()) {
+ return false;
+ }
+ if (!target) {
+ retval = false;
+ PERROR << "temporary directory for MS_BIND";
+ continue;
+ }
+
+ if (!parent_private && !parent_made_private) {
+ parent_made_private = fs_mgr_overlayfs_set_shared_mount(mount_point, false);
+ }
+ if (new_entry.shared_flag) {
+ new_entry.shared_flag = fs_mgr_overlayfs_set_shared_mount(new_entry.mount_point, false);
+ }
+ if (!fs_mgr_overlayfs_move_mount(new_entry.mount_point, new_entry.dir)) {
+ retval = false;
+ if (new_entry.shared_flag) {
+ fs_mgr_overlayfs_set_shared_mount(new_entry.mount_point, true);
+ }
+ continue;
+ }
+ move.emplace_back(std::move(new_entry));
+ }
+
+ // hijack __mount() report format to help triage
+ auto report = "__mount(source=overlay,target="s + mount_point + ",type=overlay";
+ const auto opt_list = android::base::Split(options, ",");
+ for (const auto& opt : opt_list) {
+ if (android::base::StartsWith(opt, kUpperdirOption)) {
+ report = report + "," + opt;
+ break;
+ }
+ }
+ report = report + ")=";
+
+ auto ret = mount("overlay", mount_point.c_str(), "overlay", MS_RDONLY | MS_NOATIME,
+ options.c_str());
+ if (ret) {
+ retval = false;
+ PERROR << report << ret;
+ } else {
+ LINFO << report << ret;
+ }
+
+ // Move submounts back.
+ for (const auto& entry : move) {
+ if (!dev_private && !dev_made_private) {
+ dev_made_private = fs_mgr_overlayfs_set_shared_mount("/dev", false);
+ }
+
+ if (!fs_mgr_overlayfs_move_mount(entry.dir, entry.mount_point)) {
+ retval = false;
+ } else if (entry.shared_flag &&
+ !fs_mgr_overlayfs_set_shared_mount(entry.mount_point, true)) {
+ retval = false;
+ }
+ rmdir(entry.dir.c_str());
+ }
+ if (dev_made_private) {
+ fs_mgr_overlayfs_set_shared_mount("/dev", true);
+ }
+ if (parent_made_private) {
+ fs_mgr_overlayfs_set_shared_mount(mount_point, true);
+ }
+
+ return retval;
+}
+
+// Mount kScratchMountPoint
+static bool MountScratch(const std::string& device_path, bool readonly = false) {
+ if (readonly) {
+ if (!fs_mgr_access(device_path)) {
+ LOG(ERROR) << "Path does not exist: " << device_path;
+ return false;
+ }
+ } else if (!fs_mgr_rw_access(device_path)) {
+ LOG(ERROR) << "Path does not exist or is not readwrite: " << device_path;
+ return false;
+ }
+
+ std::vector<const char*> filesystem_candidates;
+ if (fs_mgr_is_f2fs(device_path)) {
+ filesystem_candidates = {"f2fs", "ext4"};
+ } else if (fs_mgr_is_ext4(device_path)) {
+ filesystem_candidates = {"ext4", "f2fs"};
+ } else {
+ LOG(ERROR) << "Scratch partition is not f2fs or ext4";
+ return false;
+ }
+
+ AutoSetFsCreateCon createcon(kOverlayfsFileContext);
+ if (!createcon.Ok()) {
+ return false;
+ }
+ if (mkdir(kScratchMountPoint, 0755) && (errno != EEXIST)) {
+ PERROR << "create " << kScratchMountPoint;
+ return false;
+ }
+
+ FstabEntry entry;
+ entry.blk_device = device_path;
+ entry.mount_point = kScratchMountPoint;
+ entry.flags = MS_NOATIME | MS_RDONLY;
+ if (!readonly) {
+ entry.flags &= ~MS_RDONLY;
+ entry.flags |= MS_SYNCHRONOUS;
+ entry.fs_options = "nodiscard";
+ fs_mgr_set_blk_ro(device_path, false);
+ }
+ // check_fs requires apex runtime library
+ if (fs_mgr_overlayfs_already_mounted("/data", false)) {
+ entry.fs_mgr_flags.check = true;
+ }
+ bool mounted = false;
+ for (auto fs_type : filesystem_candidates) {
+ entry.fs_type = fs_type;
+ if (fs_mgr_do_mount_one(entry) == 0) {
+ mounted = true;
+ break;
+ }
+ }
+ if (!createcon.Restore()) {
+ return false;
+ }
+ if (!mounted) {
+ rmdir(kScratchMountPoint);
+ return false;
+ }
+ return true;
+}
+
+const std::string kMkF2fs("/system/bin/make_f2fs");
+const std::string kMkExt4("/system/bin/mke2fs");
+
+// Note: The scratch partition of DSU is managed by gsid, and should be initialized during
+// first-stage-mount. Just check if the DM device for DSU scratch partition is created or not.
+static std::string GetDsuScratchDevice() {
+ auto& dm = DeviceMapper::Instance();
+ std::string device;
+ if (dm.GetState(android::gsi::kDsuScratch) != DmDeviceState::INVALID &&
+ dm.GetDmDevicePathByName(android::gsi::kDsuScratch, &device)) {
+ return device;
+ }
+ return "";
+}
+
+// This returns the scratch device that was detected during early boot (first-
+// stage init). If the device was created later, for example during setup for
+// the adb remount command, it can return an empty string since it does not
+// query ImageManager. (Note that ImageManager in first-stage init will always
+// use device-mapper, since /data is not available to use loop devices.)
+static std::string GetBootScratchDevice() {
+ // Note: fs_mgr_is_dsu_running() always returns false in recovery or fastbootd.
+ if (fs_mgr_is_dsu_running()) {
+ return GetDsuScratchDevice();
+ }
+
+ auto& dm = DeviceMapper::Instance();
+
+ // If there is a scratch partition allocated in /data or on super, we
+ // automatically prioritize that over super_other or system_other.
+ // Some devices, for example, have a write-protected eMMC and the
+ // super partition cannot be used even if it exists.
+ std::string device;
+ auto partition_name = android::base::Basename(kScratchMountPoint);
+ if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
+ dm.GetDmDevicePathByName(partition_name, &device)) {
+ return device;
+ }
+
+ return "";
+}
+
+// NOTE: OverlayfsSetupAllowed() must be "stricter" than OverlayfsTeardownAllowed().
+// Setup is allowed only if teardown is also allowed.
+bool OverlayfsSetupAllowed(bool verbose = false) {
+ if (!kAllowOverlayfs) {
+ if (verbose) {
+ LOG(ERROR) << "Overlayfs remounts can only be used in debuggable builds";
+ }
+ return false;
+ }
+ // Check mandatory kernel patches.
+ if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) {
+ if (verbose) {
+ LOG(ERROR) << "Kernel does not support overlayfs";
+ }
+ return false;
+ }
+ // in recovery or fastbootd, not allowed!
+ if (fs_mgr_in_recovery()) {
+ if (verbose) {
+ LOG(ERROR) << "Unsupported overlayfs setup from recovery";
+ }
+ return false;
+ }
+ return true;
+}
+
+bool fs_mgr_wants_overlayfs(FstabEntry* entry) {
+ // Don't check entries that are managed by vold.
+ if (entry->fs_mgr_flags.vold_managed || entry->fs_mgr_flags.recovery_only) return false;
+
+ // *_other doesn't want overlayfs.
+ if (entry->fs_mgr_flags.slot_select_other) return false;
+
+ // Only concerned with readonly partitions.
+ if (!(entry->flags & MS_RDONLY)) return false;
+
+ // If unbindable, do not allow overlayfs as this could expose us to
+ // security issues. On Android, this could also be used to turn off
+ // the ability to overlay an otherwise acceptable filesystem since
+ // /system and /vendor are never bound(sic) to.
+ if (entry->flags & MS_UNBINDABLE) return false;
+
+ if (!fs_mgr_overlayfs_enabled(entry)) return false;
+
+ return true;
+}
+
+Fstab fs_mgr_overlayfs_candidate_list(const Fstab& fstab) {
+ android::fs_mgr::Fstab mounts;
+ if (!android::fs_mgr::ReadFstabFromFile("/proc/mounts", &mounts)) {
+ PLOG(ERROR) << "Failed to read /proc/mounts";
+ return {};
+ }
+
+ Fstab candidates;
+ for (const auto& entry : fstab) {
+ // Filter out partitions whose type doesn't match what's mounted.
+ // This avoids spammy behavior on devices which can mount different
+ // filesystems for each partition.
+ auto proc_mount_point = (entry.mount_point == "/system") ? "/" : entry.mount_point;
+ auto mounted = GetEntryForMountPoint(&mounts, proc_mount_point);
+ if (!mounted || mounted->fs_type != entry.fs_type) {
+ continue;
+ }
+
+ FstabEntry new_entry = entry;
+ if (!fs_mgr_overlayfs_already_mounted(entry.mount_point) &&
+ !fs_mgr_wants_overlayfs(&new_entry)) {
+ continue;
+ }
+ auto new_mount_point = fs_mgr_mount_point(entry.mount_point);
+ auto duplicate_or_more_specific = false;
+ for (auto it = candidates.begin(); it != candidates.end();) {
+ auto it_mount_point = fs_mgr_mount_point(it->mount_point);
+ if ((it_mount_point == new_mount_point) ||
+ (android::base::StartsWith(new_mount_point, it_mount_point + "/"))) {
+ duplicate_or_more_specific = true;
+ break;
+ }
+ if (android::base::StartsWith(it_mount_point, new_mount_point + "/")) {
+ it = candidates.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ if (!duplicate_or_more_specific) candidates.emplace_back(std::move(new_entry));
+ }
+ return candidates;
+}
+
+static void TryMountScratch() {
+ // Note we get the boot scratch device here, which means if scratch was
+ // just created through ImageManager, this could fail. In practice this
+ // should not happen because "remount" detects this scenario (by checking
+ // if verity is still disabled, i.e. no reboot occurred), and skips calling
+ // fs_mgr_overlayfs_mount_all().
+ auto scratch_device = GetBootScratchDevice();
+ if (!fs_mgr_rw_access(scratch_device)) {
+ return;
+ }
+ if (!WaitForFile(scratch_device, 10s)) {
+ return;
+ }
+ if (!MountScratch(scratch_device, true /* readonly */)) {
+ return;
+ }
+ auto has_overlayfs_dir = fs_mgr_access(std::string(kScratchMountPoint) + kOverlayTopDir);
+ fs_mgr_overlayfs_umount_scratch();
+ if (has_overlayfs_dir) {
+ MountScratch(scratch_device);
+ }
+}
+
+bool fs_mgr_overlayfs_mount_all(Fstab* fstab) {
+ if (!OverlayfsSetupAllowed()) {
+ return false;
+ }
+ auto ret = true;
+ auto scratch_can_be_mounted = true;
+ for (const auto& entry : fs_mgr_overlayfs_candidate_list(*fstab)) {
+ if (fs_mgr_is_verity_enabled(entry)) continue;
+ auto mount_point = fs_mgr_mount_point(entry.mount_point);
+ if (fs_mgr_overlayfs_already_mounted(mount_point)) {
+ continue;
+ }
+ if (scratch_can_be_mounted) {
+ scratch_can_be_mounted = false;
+ TryMountScratch();
+ }
+ ret &= fs_mgr_overlayfs_mount(entry);
+ }
+ return ret;
+}
+
+bool fs_mgr_overlayfs_is_setup() {
+ if (!OverlayfsSetupAllowed()) {
+ return false;
+ }
+ if (fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false)) return true;
+ Fstab fstab;
+ if (!ReadDefaultFstab(&fstab)) {
+ return false;
+ }
+ for (const auto& entry : fs_mgr_overlayfs_candidate_list(fstab)) {
+ if (fs_mgr_is_verity_enabled(entry)) continue;
+ if (fs_mgr_overlayfs_already_mounted(fs_mgr_mount_point(entry.mount_point))) return true;
+ }
+ return false;
+}
+
+bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point, bool overlay_only) {
+ Fstab fstab;
+ if (!ReadFstabFromFile("/proc/mounts", &fstab)) {
+ return false;
+ }
+ const auto lowerdir = kLowerdirOption + mount_point;
+ for (const auto& entry : fstab) {
+ if (overlay_only && "overlay" != entry.fs_type && "overlayfs" != entry.fs_type) continue;
+ if (mount_point != entry.mount_point) continue;
+ if (!overlay_only) return true;
+ const auto options = android::base::Split(entry.fs_options, ",");
+ for (const auto& opt : options) {
+ if (opt == lowerdir) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
diff --git a/fs_mgr/fs_mgr_overlayfs_mount.h b/fs_mgr/fs_mgr_overlayfs_mount.h
new file mode 100644
index 0000000..ae3ea84
--- /dev/null
+++ b/fs_mgr/fs_mgr_overlayfs_mount.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+
+#include <fstab/fstab.h>
+
+bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point, bool overlay_only = true);
+bool fs_mgr_wants_overlayfs(android::fs_mgr::FstabEntry* entry);
+android::fs_mgr::Fstab fs_mgr_overlayfs_candidate_list(const android::fs_mgr::Fstab& fstab);
+
+#if ALLOW_ADBD_DISABLE_VERITY
+constexpr bool kAllowOverlayfs = true;
+#else
+constexpr bool kAllowOverlayfs = false;
+#endif
+
+class AutoSetFsCreateCon final {
+ public:
+ AutoSetFsCreateCon() {}
+ AutoSetFsCreateCon(const std::string& context) { Set(context); }
+ ~AutoSetFsCreateCon() { Restore(); }
+
+ bool Ok() const { return ok_; }
+ bool Set(const std::string& context);
+ bool Restore();
+
+ private:
+ bool ok_ = false;
+ bool restored_ = false;
+};
+
+constexpr auto kScratchMountPoint = "/mnt/scratch";
+constexpr char kOverlayfsFileContext[] = "u:object_r:overlayfs_file:s0";
+
+constexpr auto kUpperName = "upper";
+constexpr auto kWorkName = "work";
+constexpr auto kOverlayTopDir = "/overlay";
+
+bool fs_mgr_is_dsu_running();
+bool fs_mgr_in_recovery();
+bool fs_mgr_access(const std::string& path);
+bool fs_mgr_rw_access(const std::string& path);
+bool fs_mgr_filesystem_has_space(const std::string& mount_point);
+const std::string fs_mgr_mount_point(const std::string& mount_point);
+bool fs_mgr_overlayfs_umount_scratch();
+std::vector<const std::string> OverlayMountPoints();
diff --git a/fs_mgr/fs_mgr_priv_overlayfs.h b/fs_mgr/fs_mgr_priv_overlayfs.h
deleted file mode 100644
index 2033701..0000000
--- a/fs_mgr/fs_mgr_priv_overlayfs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <string>
-
-#include <fstab/fstab.h>
-
-bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point, bool overlay_only = true);
-bool fs_mgr_wants_overlayfs(android::fs_mgr::FstabEntry* entry);
-android::fs_mgr::Fstab fs_mgr_overlayfs_candidate_list(const android::fs_mgr::Fstab& fstab);
-
-// If "mount_point" is non-null, set up exactly one overlay.
-// If "mount_point" is null, setup any overlays.
-//
-// If |want_reboot| is non-null, and a reboot is needed to apply overlays, then
-// it will be true on return. The caller is responsible for initializing it.
-bool fs_mgr_overlayfs_setup(const android::fs_mgr::Fstab& fstab, const char* mount_point = nullptr,
- bool* want_reboot = nullptr, bool just_disabled_verity = true);
-
-enum class OverlayfsTeardownResult {
- Ok,
- Busy, // Indicates that overlays are still in use.
- Error
-};
-OverlayfsTeardownResult fs_mgr_overlayfs_teardown(const char* mount_point = nullptr,
- bool* want_reboot = nullptr);
-
-namespace android {
-namespace fs_mgr {
-
-void CleanupOldScratchFiles();
-
-} // namespace fs_mgr
-} // namespace android
diff --git a/fs_mgr/fs_mgr_remount.cpp b/fs_mgr/fs_mgr_remount.cpp
index 5a9f391..4c45828 100644
--- a/fs_mgr/fs_mgr_remount.cpp
+++ b/fs_mgr/fs_mgr_remount.cpp
@@ -43,7 +43,8 @@
#include <libavb_user/libavb_user.h>
#include <libgsi/libgsid.h>
-#include "fs_mgr_priv_overlayfs.h"
+#include "fs_mgr_overlayfs_control.h"
+#include "fs_mgr_overlayfs_mount.h"
using namespace std::literals;
using android::fs_mgr::Fstab;
diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp
index 9d1ce7d..8f35381 100644
--- a/fs_mgr/libsnapshot/Android.bp
+++ b/fs_mgr/libsnapshot/Android.bp
@@ -166,7 +166,6 @@
header_libs: [
"libupdate_engine_headers",
],
- export_include_dirs: ["include"],
}
cc_library_static {
@@ -184,6 +183,7 @@
"libsnapshot_cow/writer_base.cpp",
"libsnapshot_cow/writer_v2.cpp",
],
+ export_include_dirs: ["include"],
host_supported: true,
recovery_available: true,
ramdisk_available: true,
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index fbea79b..09d35cf 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -2490,9 +2490,6 @@
}
created_devices.EmplaceBack<AutoUnmapDevice>(&dm_, name);
- remaining_time = GetRemainingTime(params.timeout_ms, begin);
- if (remaining_time.count() < 0) return false;
-
cow_device = new_cow_device;
}
@@ -2507,6 +2504,9 @@
// the user-space will not start the merge. We have to explicitly inform the
// daemon to resume the merge. Check ProcessUpdateState() call stack.
if (!UpdateUsesUserSnapshots(lock)) {
+ remaining_time = GetRemainingTime(params.timeout_ms, begin);
+ if (remaining_time.count() < 0) return false;
+
std::string path;
if (!MapSnapshot(lock, params.GetPartitionName(), base_device, cow_device, remaining_time,
&path)) {
diff --git a/fs_mgr/libsnapshot/snapuserd/Android.bp b/fs_mgr/libsnapshot/snapuserd/Android.bp
index 78a3b9b..a9b96e2 100644
--- a/fs_mgr/libsnapshot/snapuserd/Android.bp
+++ b/fs_mgr/libsnapshot/snapuserd/Android.bp
@@ -57,6 +57,7 @@
defaults: [
"fs_mgr_defaults",
],
+ local_include_dirs: ["include/"],
srcs: [
"dm-snapshot-merge/snapuserd.cpp",
"dm-snapshot-merge/snapuserd_worker.cpp",
diff --git a/libcutils/Android.bp b/libcutils/Android.bp
index 0b5c125..92486e3 100644
--- a/libcutils/Android.bp
+++ b/libcutils/Android.bp
@@ -219,11 +219,19 @@
exclude_srcs: [
"qtaguid.cpp",
],
+ header_abi_checker: {
+ enabled: true,
+ ref_dump_dirs: ["abi-dumps"],
+ },
},
product: {
exclude_srcs: [
"qtaguid.cpp",
],
+ header_abi_checker: {
+ enabled: true,
+ ref_dump_dirs: ["abi-dumps"],
+ },
},
},
diff --git a/libcutils/abi-dumps/arm64/source-based/libcutils.so.lsdump b/libcutils/abi-dumps/arm64/source-based/libcutils.so.lsdump
new file mode 100644
index 0000000..333e61c
--- /dev/null
+++ b/libcutils/abi-dumps/arm64/source-based/libcutils.so.lsdump
@@ -0,0 +1,2690 @@
+{
+ "array_types" :
+ [
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIA0_i",
+ "name" : "int[0]",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIA0_i",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ }
+ ],
+ "builtin_types" :
+ [
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIa",
+ "name" : "signed char",
+ "referenced_type" : "_ZTIa",
+ "self_type" : "_ZTIa",
+ "size" : 1
+ },
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIb",
+ "name" : "bool",
+ "referenced_type" : "_ZTIb",
+ "self_type" : "_ZTIb",
+ "size" : 1
+ },
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIc",
+ "name" : "char",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIc",
+ "size" : 1
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIf",
+ "name" : "float",
+ "referenced_type" : "_ZTIf",
+ "self_type" : "_ZTIf",
+ "size" : 4
+ },
+ {
+ "alignment" : 4,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIi",
+ "name" : "int",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIi",
+ "size" : 4
+ },
+ {
+ "alignment" : 4,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIj",
+ "name" : "unsigned int",
+ "referenced_type" : "_ZTIj",
+ "self_type" : "_ZTIj",
+ "size" : 4
+ },
+ {
+ "alignment" : 8,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIl",
+ "name" : "long",
+ "referenced_type" : "_ZTIl",
+ "self_type" : "_ZTIl",
+ "size" : 8
+ },
+ {
+ "alignment" : 8,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIm",
+ "name" : "unsigned long",
+ "referenced_type" : "_ZTIm",
+ "self_type" : "_ZTIm",
+ "size" : 8
+ },
+ {
+ "linker_set_key" : "_ZTIv",
+ "name" : "void",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIv"
+ }
+ ],
+ "elf_functions" :
+ [
+ {
+ "name" : "_Z23socket_make_sockaddr_unPKciP11sockaddr_unPj"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZN7android4base4TrimIRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEES8_OT_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE4syncEv"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE6setbufEPcl"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekposENS_4fposI9mbstate_tEEj"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE8overflowEi"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9pbackfailEi"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9underflowEv"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC2Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED0Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED2Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__16vectorI5EntryNS_9allocatorIS1_EEE24__emplace_back_slow_pathIJS1_EEEvDpOT_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__17getlineIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_istreamIT_T0_EES9_RNS_12basic_stringIS6_S7_T1_EES6_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc"
+ },
+ {
+ "name" : "android_get_control_file"
+ },
+ {
+ "name" : "android_get_control_socket"
+ },
+ {
+ "name" : "android_get_ioprio"
+ },
+ {
+ "name" : "android_reboot"
+ },
+ {
+ "name" : "android_set_ioprio"
+ },
+ {
+ "name" : "ashmem_create_region"
+ },
+ {
+ "name" : "ashmem_get_size_region"
+ },
+ {
+ "name" : "ashmem_pin_region"
+ },
+ {
+ "name" : "ashmem_set_prot_region"
+ },
+ {
+ "name" : "ashmem_unpin_region"
+ },
+ {
+ "name" : "ashmem_valid"
+ },
+ {
+ "name" : "atrace_async_begin_body"
+ },
+ {
+ "name" : "atrace_async_end_body"
+ },
+ {
+ "name" : "atrace_async_for_track_begin_body"
+ },
+ {
+ "name" : "atrace_async_for_track_end_body"
+ },
+ {
+ "name" : "atrace_begin_body"
+ },
+ {
+ "name" : "atrace_end_body"
+ },
+ {
+ "name" : "atrace_get_enabled_tags"
+ },
+ {
+ "name" : "atrace_init"
+ },
+ {
+ "name" : "atrace_instant_body"
+ },
+ {
+ "name" : "atrace_instant_for_track_body"
+ },
+ {
+ "name" : "atrace_int64_body"
+ },
+ {
+ "name" : "atrace_int_body"
+ },
+ {
+ "name" : "atrace_set_tracing_enabled"
+ },
+ {
+ "name" : "atrace_setup"
+ },
+ {
+ "name" : "atrace_update_tags"
+ },
+ {
+ "name" : "canned_fs_config"
+ },
+ {
+ "name" : "config_bool"
+ },
+ {
+ "name" : "config_find"
+ },
+ {
+ "name" : "config_free"
+ },
+ {
+ "name" : "config_load"
+ },
+ {
+ "name" : "config_load_file"
+ },
+ {
+ "name" : "config_node"
+ },
+ {
+ "name" : "config_set"
+ },
+ {
+ "name" : "config_str"
+ },
+ {
+ "name" : "fs_config"
+ },
+ {
+ "name" : "fs_mkdirs"
+ },
+ {
+ "name" : "fs_prepare_dir"
+ },
+ {
+ "name" : "fs_prepare_dir_strict"
+ },
+ {
+ "name" : "fs_prepare_file_strict"
+ },
+ {
+ "name" : "fs_read_atomic_int"
+ },
+ {
+ "name" : "fs_write_atomic_int"
+ },
+ {
+ "name" : "hashmapCreate"
+ },
+ {
+ "name" : "hashmapForEach"
+ },
+ {
+ "name" : "hashmapFree"
+ },
+ {
+ "name" : "hashmapGet"
+ },
+ {
+ "name" : "hashmapHash"
+ },
+ {
+ "name" : "hashmapLock"
+ },
+ {
+ "name" : "hashmapPut"
+ },
+ {
+ "name" : "hashmapRemove"
+ },
+ {
+ "name" : "hashmapUnlock"
+ },
+ {
+ "name" : "klog_set_level"
+ },
+ {
+ "name" : "klog_write"
+ },
+ {
+ "name" : "klog_writev"
+ },
+ {
+ "name" : "load_canned_fs_config"
+ },
+ {
+ "name" : "load_file"
+ },
+ {
+ "name" : "multiuser_convert_sdk_sandbox_to_app_uid"
+ },
+ {
+ "name" : "multiuser_get_app_id"
+ },
+ {
+ "name" : "multiuser_get_cache_gid"
+ },
+ {
+ "name" : "multiuser_get_ext_cache_gid"
+ },
+ {
+ "name" : "multiuser_get_ext_gid"
+ },
+ {
+ "name" : "multiuser_get_sdk_sandbox_uid"
+ },
+ {
+ "name" : "multiuser_get_shared_app_gid"
+ },
+ {
+ "name" : "multiuser_get_shared_gid"
+ },
+ {
+ "name" : "multiuser_get_uid"
+ },
+ {
+ "name" : "multiuser_get_user_id"
+ },
+ {
+ "name" : "native_handle_clone"
+ },
+ {
+ "name" : "native_handle_close"
+ },
+ {
+ "name" : "native_handle_close_with_tag"
+ },
+ {
+ "name" : "native_handle_create"
+ },
+ {
+ "name" : "native_handle_delete"
+ },
+ {
+ "name" : "native_handle_init"
+ },
+ {
+ "name" : "native_handle_set_fdsan_tag"
+ },
+ {
+ "name" : "native_handle_unset_fdsan_tag"
+ },
+ {
+ "name" : "partition_wiped"
+ },
+ {
+ "name" : "property_get"
+ },
+ {
+ "name" : "property_get_bool"
+ },
+ {
+ "name" : "property_get_int32"
+ },
+ {
+ "name" : "property_get_int64"
+ },
+ {
+ "name" : "property_list"
+ },
+ {
+ "name" : "property_set"
+ },
+ {
+ "name" : "record_stream_free"
+ },
+ {
+ "name" : "record_stream_get_next"
+ },
+ {
+ "name" : "record_stream_new"
+ },
+ {
+ "name" : "socket_close"
+ },
+ {
+ "name" : "socket_get_local_port"
+ },
+ {
+ "name" : "socket_inaddr_any_server"
+ },
+ {
+ "name" : "socket_local_client"
+ },
+ {
+ "name" : "socket_local_client_connect"
+ },
+ {
+ "name" : "socket_local_server"
+ },
+ {
+ "name" : "socket_local_server_bind"
+ },
+ {
+ "name" : "socket_network_client"
+ },
+ {
+ "name" : "socket_network_client_timeout"
+ },
+ {
+ "name" : "socket_send_buffers"
+ },
+ {
+ "name" : "str_parms_add_float"
+ },
+ {
+ "name" : "str_parms_add_int"
+ },
+ {
+ "name" : "str_parms_add_str"
+ },
+ {
+ "name" : "str_parms_create"
+ },
+ {
+ "name" : "str_parms_create_str"
+ },
+ {
+ "name" : "str_parms_del"
+ },
+ {
+ "name" : "str_parms_destroy"
+ },
+ {
+ "name" : "str_parms_dump"
+ },
+ {
+ "name" : "str_parms_get_float"
+ },
+ {
+ "name" : "str_parms_get_int"
+ },
+ {
+ "name" : "str_parms_get_str"
+ },
+ {
+ "name" : "str_parms_has_key"
+ },
+ {
+ "name" : "str_parms_to_str"
+ },
+ {
+ "name" : "uevent_kernel_multicast_recv"
+ },
+ {
+ "name" : "uevent_kernel_multicast_uid_recv"
+ },
+ {
+ "name" : "uevent_kernel_recv"
+ },
+ {
+ "name" : "uevent_open_socket"
+ }
+ ],
+ "elf_objects" :
+ [
+ {
+ "binding" : "weak",
+ "name" : "_ZTCNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTTNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTVNSt3__113basic_filebufIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTVNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "name" : "atrace_enabled_tags"
+ },
+ {
+ "name" : "atrace_is_ready"
+ },
+ {
+ "name" : "atrace_marker_fd"
+ }
+ ],
+ "enum_types" :
+ [
+ {
+ "alignment" : 4,
+ "enum_fields" :
+ [
+ {
+ "enum_field_value" : 0,
+ "name" : "IoSchedClass_NONE"
+ },
+ {
+ "enum_field_value" : 1,
+ "name" : "IoSchedClass_RT"
+ },
+ {
+ "enum_field_value" : 2,
+ "name" : "IoSchedClass_BE"
+ },
+ {
+ "enum_field_value" : 3,
+ "name" : "IoSchedClass_IDLE"
+ }
+ ],
+ "linker_set_key" : "_ZTI12IoSchedClass",
+ "name" : "IoSchedClass",
+ "referenced_type" : "_ZTI12IoSchedClass",
+ "self_type" : "_ZTI12IoSchedClass",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h",
+ "underlying_type" : "_ZTIj"
+ }
+ ],
+ "function_types" :
+ [
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFbPvS_E",
+ "name" : "bool (void *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFbPvS_E",
+ "return_type" : "_ZTIb",
+ "self_type" : "_ZTIFbPvS_E",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFbPvS_S_E",
+ "name" : "bool (void *, void *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFbPvS_S_E",
+ "return_type" : "_ZTIb",
+ "self_type" : "_ZTIFbPvS_S_E",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFiPvE",
+ "name" : "int (void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFiPvE",
+ "return_type" : "_ZTIi",
+ "self_type" : "_ZTIFiPvE",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFvPKcS0_PvE",
+ "name" : "void (const char *, const char *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFvPKcS0_PvE",
+ "return_type" : "_ZTIv",
+ "self_type" : "_ZTIFvPKcS0_PvE",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ }
+ ],
+ "functions" :
+ [
+ {
+ "function_name" : "android_get_control_file",
+ "linker_set_key" : "android_get_control_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/android_get_control_file.h"
+ },
+ {
+ "function_name" : "android_get_control_socket",
+ "linker_set_key" : "android_get_control_socket",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "android_get_ioprio",
+ "linker_set_key" : "android_get_ioprio",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIP12IoSchedClass"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "function_name" : "android_reboot",
+ "linker_set_key" : "android_reboot",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/android_reboot.h"
+ },
+ {
+ "function_name" : "android_set_ioprio",
+ "linker_set_key" : "android_set_ioprio",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTI12IoSchedClass"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "function_name" : "ashmem_create_region",
+ "linker_set_key" : "ashmem_create_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_get_size_region",
+ "linker_set_key" : "ashmem_get_size_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_pin_region",
+ "linker_set_key" : "ashmem_pin_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_set_prot_region",
+ "linker_set_key" : "ashmem_set_prot_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_unpin_region",
+ "linker_set_key" : "ashmem_unpin_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_valid",
+ "linker_set_key" : "ashmem_valid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "atrace_async_begin_body",
+ "linker_set_key" : "atrace_async_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_end_body",
+ "linker_set_key" : "atrace_async_end_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_for_track_begin_body",
+ "linker_set_key" : "atrace_async_for_track_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_for_track_end_body",
+ "linker_set_key" : "atrace_async_for_track_end_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_begin_body",
+ "linker_set_key" : "atrace_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_end_body",
+ "linker_set_key" : "atrace_end_body",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_get_enabled_tags",
+ "linker_set_key" : "atrace_get_enabled_tags",
+ "return_type" : "_ZTIm",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_init",
+ "linker_set_key" : "atrace_init",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_instant_body",
+ "linker_set_key" : "atrace_instant_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_instant_for_track_body",
+ "linker_set_key" : "atrace_instant_for_track_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_int64_body",
+ "linker_set_key" : "atrace_int64_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIl"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_int_body",
+ "linker_set_key" : "atrace_int_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_set_tracing_enabled",
+ "linker_set_key" : "atrace_set_tracing_enabled",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIb"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_setup",
+ "linker_set_key" : "atrace_setup",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_update_tags",
+ "linker_set_key" : "atrace_update_tags",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "canned_fs_config",
+ "linker_set_key" : "canned_fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPm"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/private/canned_fs_config.h"
+ },
+ {
+ "function_name" : "config_bool",
+ "linker_set_key" : "config_bool",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_find",
+ "linker_set_key" : "config_find",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP5cnode",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_free",
+ "linker_set_key" : "config_free",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_load",
+ "linker_set_key" : "config_load",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_load_file",
+ "linker_set_key" : "config_load_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_node",
+ "linker_set_key" : "config_node",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP5cnode",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_set",
+ "linker_set_key" : "config_set",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_str",
+ "linker_set_key" : "config_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIPKc",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "fs_config",
+ "linker_set_key" : "fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPm"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/private/fs_config.h"
+ },
+ {
+ "function_name" : "fs_mkdirs",
+ "linker_set_key" : "fs_mkdirs",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_dir",
+ "linker_set_key" : "fs_prepare_dir",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_dir_strict",
+ "linker_set_key" : "fs_prepare_dir_strict",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_file_strict",
+ "linker_set_key" : "fs_prepare_file_strict",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_read_atomic_int",
+ "linker_set_key" : "fs_read_atomic_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_write_atomic_int",
+ "linker_set_key" : "fs_write_atomic_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "hashmapCreate",
+ "linker_set_key" : "hashmapCreate",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIm"
+ },
+ {
+ "referenced_type" : "_ZTIPFiPvE"
+ },
+ {
+ "referenced_type" : "_ZTIPFbPvS_E"
+ }
+ ],
+ "return_type" : "_ZTIP7Hashmap",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapForEach",
+ "linker_set_key" : "hashmapForEach",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPFbPvS_S_E"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapFree",
+ "linker_set_key" : "hashmapFree",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapGet",
+ "linker_set_key" : "hashmapGet",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapHash",
+ "linker_set_key" : "hashmapHash",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapLock",
+ "linker_set_key" : "hashmapLock",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapPut",
+ "linker_set_key" : "hashmapPut",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapRemove",
+ "linker_set_key" : "hashmapRemove",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapUnlock",
+ "linker_set_key" : "hashmapUnlock",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "klog_set_level",
+ "linker_set_key" : "klog_set_level",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "klog_write",
+ "linker_set_key" : "klog_write",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "klog_writev",
+ "linker_set_key" : "klog_writev",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPK5iovec"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "load_canned_fs_config",
+ "linker_set_key" : "load_canned_fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/private/canned_fs_config.h"
+ },
+ {
+ "function_name" : "load_file",
+ "linker_set_key" : "load_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ },
+ {
+ "function_name" : "multiuser_convert_sdk_sandbox_to_app_uid",
+ "linker_set_key" : "multiuser_convert_sdk_sandbox_to_app_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_app_id",
+ "linker_set_key" : "multiuser_get_app_id",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_cache_gid",
+ "linker_set_key" : "multiuser_get_cache_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_ext_cache_gid",
+ "linker_set_key" : "multiuser_get_ext_cache_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_ext_gid",
+ "linker_set_key" : "multiuser_get_ext_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_sdk_sandbox_uid",
+ "linker_set_key" : "multiuser_get_sdk_sandbox_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_shared_app_gid",
+ "linker_set_key" : "multiuser_get_shared_app_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_shared_gid",
+ "linker_set_key" : "multiuser_get_shared_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_uid",
+ "linker_set_key" : "multiuser_get_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_user_id",
+ "linker_set_key" : "multiuser_get_user_id",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "native_handle_clone",
+ "linker_set_key" : "native_handle_clone",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_close",
+ "linker_set_key" : "native_handle_close",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_close_with_tag",
+ "linker_set_key" : "native_handle_close_with_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_create",
+ "linker_set_key" : "native_handle_create",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_delete",
+ "linker_set_key" : "native_handle_delete",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_init",
+ "linker_set_key" : "native_handle_init",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_set_fdsan_tag",
+ "linker_set_key" : "native_handle_set_fdsan_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_unset_fdsan_tag",
+ "linker_set_key" : "native_handle_unset_fdsan_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "partition_wiped",
+ "linker_set_key" : "partition_wiped",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/partition_utils.h"
+ },
+ {
+ "function_name" : "property_get",
+ "linker_set_key" : "property_get",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_bool",
+ "linker_set_key" : "property_get_bool",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIa"
+ }
+ ],
+ "return_type" : "_ZTIa",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_int32",
+ "linker_set_key" : "property_get_int32",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_int64",
+ "linker_set_key" : "property_get_int64",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIl"
+ }
+ ],
+ "return_type" : "_ZTIl",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_list",
+ "linker_set_key" : "property_list",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPFvPKcS0_PvE"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_set",
+ "linker_set_key" : "property_set",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "record_stream_free",
+ "linker_set_key" : "record_stream_free",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP12RecordStream"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "record_stream_get_next",
+ "linker_set_key" : "record_stream_get_next",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP12RecordStream"
+ },
+ {
+ "referenced_type" : "_ZTIPPv"
+ },
+ {
+ "referenced_type" : "_ZTIPm"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "record_stream_new",
+ "linker_set_key" : "record_stream_new",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIP12RecordStream",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "socket_close",
+ "linker_set_key" : "socket_close",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_get_local_port",
+ "linker_set_key" : "socket_get_local_port",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_inaddr_any_server",
+ "linker_set_key" : "socket_inaddr_any_server",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_client",
+ "linker_set_key" : "socket_local_client",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_client_connect",
+ "linker_set_key" : "socket_local_client_connect",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_server",
+ "linker_set_key" : "socket_local_server",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_server_bind",
+ "linker_set_key" : "socket_local_server_bind",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_network_client",
+ "linker_set_key" : "socket_network_client",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_network_client_timeout",
+ "linker_set_key" : "socket_network_client_timeout",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_send_buffers",
+ "linker_set_key" : "socket_send_buffers",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPK22cutils_socket_buffer_t"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIl",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "str_parms_add_float",
+ "linker_set_key" : "str_parms_add_float",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIf"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_add_int",
+ "linker_set_key" : "str_parms_add_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_add_str",
+ "linker_set_key" : "str_parms_add_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_create",
+ "linker_set_key" : "str_parms_create",
+ "return_type" : "_ZTIP9str_parms",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_create_str",
+ "linker_set_key" : "str_parms_create_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP9str_parms",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_del",
+ "linker_set_key" : "str_parms_del",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_destroy",
+ "linker_set_key" : "str_parms_destroy",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_dump",
+ "linker_set_key" : "str_parms_dump",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_float",
+ "linker_set_key" : "str_parms_get_float",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPf"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_int",
+ "linker_set_key" : "str_parms_get_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_str",
+ "linker_set_key" : "str_parms_get_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_has_key",
+ "linker_set_key" : "str_parms_has_key",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_to_str",
+ "linker_set_key" : "str_parms_to_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIPc",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "uevent_kernel_multicast_recv",
+ "linker_set_key" : "uevent_kernel_multicast_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "return_type" : "_ZTIl",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_kernel_multicast_uid_recv",
+ "linker_set_key" : "uevent_kernel_multicast_uid_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIl",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_kernel_recv",
+ "linker_set_key" : "uevent_kernel_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIm"
+ },
+ {
+ "referenced_type" : "_ZTIb"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIl",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_open_socket",
+ "linker_set_key" : "uevent_open_socket",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIb"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ }
+ ],
+ "global_vars" :
+ [
+ {
+ "linker_set_key" : "atrace_enabled_tags",
+ "name" : "atrace_enabled_tags",
+ "referenced_type" : "_ZTIm",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "linker_set_key" : "atrace_is_ready",
+ "name" : "atrace_is_ready",
+ "referenced_type" : "_ZTINSt3__16atomicIbEE",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "linker_set_key" : "atrace_marker_fd",
+ "name" : "atrace_marker_fd",
+ "referenced_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ }
+ ],
+ "lvalue_reference_types" : [],
+ "pointer_types" :
+ [
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP12IoSchedClass",
+ "name" : "IoSchedClass *",
+ "referenced_type" : "_ZTI12IoSchedClass",
+ "self_type" : "_ZTIP12IoSchedClass",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP12RecordStream",
+ "name" : "RecordStream *",
+ "referenced_type" : "_ZTI12RecordStream",
+ "self_type" : "_ZTIP12RecordStream",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP13native_handle",
+ "name" : "native_handle *",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTIP13native_handle",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP5cnode",
+ "name" : "cnode *",
+ "referenced_type" : "_ZTI5cnode",
+ "self_type" : "_ZTIP5cnode",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP7Hashmap",
+ "name" : "Hashmap *",
+ "referenced_type" : "_ZTI7Hashmap",
+ "self_type" : "_ZTIP7Hashmap",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIP9str_parms",
+ "name" : "str_parms *",
+ "referenced_type" : "_ZTI9str_parms",
+ "self_type" : "_ZTIP9str_parms",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPFbPvS_E",
+ "name" : "bool (*)(void *, void *)",
+ "referenced_type" : "_ZTIFbPvS_E",
+ "self_type" : "_ZTIPFbPvS_E",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPFbPvS_S_E",
+ "name" : "bool (*)(void *, void *, void *)",
+ "referenced_type" : "_ZTIFbPvS_S_E",
+ "self_type" : "_ZTIPFbPvS_S_E",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPFiPvE",
+ "name" : "int (*)(void *)",
+ "referenced_type" : "_ZTIFiPvE",
+ "self_type" : "_ZTIPFiPvE",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPFvPKcS0_PvE",
+ "name" : "void (*)(const char *, const char *, void *)",
+ "referenced_type" : "_ZTIFvPKcS0_PvE",
+ "self_type" : "_ZTIPFvPKcS0_PvE",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPK13native_handle",
+ "name" : "const native_handle *",
+ "referenced_type" : "_ZTIK13native_handle",
+ "self_type" : "_ZTIPK13native_handle",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPK22cutils_socket_buffer_t",
+ "name" : "const cutils_socket_buffer_t *",
+ "referenced_type" : "_ZTIK22cutils_socket_buffer_t",
+ "self_type" : "_ZTIPK22cutils_socket_buffer_t",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPK5iovec",
+ "name" : "const iovec *",
+ "referenced_type" : "_ZTIK5iovec",
+ "self_type" : "_ZTIPK5iovec",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPKc",
+ "name" : "const char *",
+ "referenced_type" : "_ZTIKc",
+ "self_type" : "_ZTIPKc",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPKv",
+ "name" : "const void *",
+ "referenced_type" : "_ZTIKv",
+ "self_type" : "_ZTIPKv",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPPv",
+ "name" : "void **",
+ "referenced_type" : "_ZTIPv",
+ "self_type" : "_ZTIPPv",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPc",
+ "name" : "char *",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIPc",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPf",
+ "name" : "float *",
+ "referenced_type" : "_ZTIf",
+ "self_type" : "_ZTIPf",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPi",
+ "name" : "int *",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIPi",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPj",
+ "name" : "unsigned int *",
+ "referenced_type" : "_ZTIj",
+ "self_type" : "_ZTIPj",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPm",
+ "name" : "unsigned long *",
+ "referenced_type" : "_ZTIm",
+ "self_type" : "_ZTIPm",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "alignment" : 8,
+ "linker_set_key" : "_ZTIPv",
+ "name" : "void *",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIPv",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ }
+ ],
+ "qualified_types" :
+ [
+ {
+ "alignment" : 4,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK13native_handle",
+ "name" : "const native_handle",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTIK13native_handle",
+ "size" : 12,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 8,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK22cutils_socket_buffer_t",
+ "name" : "const cutils_socket_buffer_t",
+ "referenced_type" : "_ZTI22cutils_socket_buffer_t",
+ "self_type" : "_ZTIK22cutils_socket_buffer_t",
+ "size" : 16,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 8,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK5iovec",
+ "name" : "const iovec",
+ "referenced_type" : "_ZTI5iovec",
+ "self_type" : "_ZTIK5iovec",
+ "size" : 16,
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "alignment" : 1,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIKc",
+ "name" : "const char",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIKc",
+ "size" : 1,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "is_const" : true,
+ "linker_set_key" : "_ZTIKv",
+ "name" : "const void",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIKv",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ }
+ ],
+ "record_types" :
+ [
+ {
+ "alignment" : 4,
+ "fields" :
+ [
+ {
+ "field_name" : "version",
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "numFds",
+ "field_offset" : 32,
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "numInts",
+ "field_offset" : 64,
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "data",
+ "field_offset" : 96,
+ "referenced_type" : "_ZTIA0_i"
+ }
+ ],
+ "linker_set_key" : "_ZTI13native_handle",
+ "name" : "native_handle",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTI13native_handle",
+ "size" : 12,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 8,
+ "fields" :
+ [
+ {
+ "field_name" : "data",
+ "referenced_type" : "_ZTIPKv"
+ },
+ {
+ "field_name" : "length",
+ "field_offset" : 64,
+ "referenced_type" : "_ZTIm"
+ }
+ ],
+ "linker_set_key" : "_ZTI22cutils_socket_buffer_t",
+ "name" : "cutils_socket_buffer_t",
+ "referenced_type" : "_ZTI22cutils_socket_buffer_t",
+ "self_type" : "_ZTI22cutils_socket_buffer_t",
+ "size" : 16,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 8,
+ "fields" :
+ [
+ {
+ "field_name" : "next",
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "first_child",
+ "field_offset" : 64,
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "last_child",
+ "field_offset" : 128,
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "name",
+ "field_offset" : 192,
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "field_name" : "value",
+ "field_offset" : 256,
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "linker_set_key" : "_ZTI5cnode",
+ "name" : "cnode",
+ "referenced_type" : "_ZTI5cnode",
+ "self_type" : "_ZTI5cnode",
+ "size" : 40,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ }
+ ],
+ "rvalue_reference_types" : []
+}
diff --git a/libcutils/abi-dumps/arm_arm64/source-based/libcutils.so.lsdump b/libcutils/abi-dumps/arm_arm64/source-based/libcutils.so.lsdump
new file mode 100644
index 0000000..f612fb9
--- /dev/null
+++ b/libcutils/abi-dumps/arm_arm64/source-based/libcutils.so.lsdump
@@ -0,0 +1,2700 @@
+{
+ "array_types" :
+ [
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIA0_i",
+ "name" : "int[0]",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIA0_i",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ }
+ ],
+ "builtin_types" :
+ [
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIa",
+ "name" : "signed char",
+ "referenced_type" : "_ZTIa",
+ "self_type" : "_ZTIa",
+ "size" : 1
+ },
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIb",
+ "name" : "bool",
+ "referenced_type" : "_ZTIb",
+ "self_type" : "_ZTIb",
+ "size" : 1
+ },
+ {
+ "alignment" : 1,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIc",
+ "name" : "char",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIc",
+ "size" : 1
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIf",
+ "name" : "float",
+ "referenced_type" : "_ZTIf",
+ "self_type" : "_ZTIf",
+ "size" : 4
+ },
+ {
+ "alignment" : 4,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIi",
+ "name" : "int",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIi",
+ "size" : 4
+ },
+ {
+ "alignment" : 4,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIj",
+ "name" : "unsigned int",
+ "referenced_type" : "_ZTIj",
+ "self_type" : "_ZTIj",
+ "size" : 4
+ },
+ {
+ "alignment" : 2,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIt",
+ "name" : "unsigned short",
+ "referenced_type" : "_ZTIt",
+ "self_type" : "_ZTIt",
+ "size" : 2
+ },
+ {
+ "linker_set_key" : "_ZTIv",
+ "name" : "void",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIv"
+ },
+ {
+ "alignment" : 8,
+ "is_integral" : true,
+ "linker_set_key" : "_ZTIx",
+ "name" : "long long",
+ "referenced_type" : "_ZTIx",
+ "self_type" : "_ZTIx",
+ "size" : 8
+ },
+ {
+ "alignment" : 8,
+ "is_integral" : true,
+ "is_unsigned" : true,
+ "linker_set_key" : "_ZTIy",
+ "name" : "unsigned long long",
+ "referenced_type" : "_ZTIy",
+ "self_type" : "_ZTIy",
+ "size" : 8
+ }
+ ],
+ "elf_functions" :
+ [
+ {
+ "name" : "_Z23socket_make_sockaddr_unPKciP11sockaddr_unPi"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZN7android4base4TrimIRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEES8_OT_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE4syncEv"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE6setbufEPci"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekposENS_4fposI9mbstate_tEEj"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE8overflowEi"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9pbackfailEi"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9underflowEv"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC2Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED0Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED2Ev"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__16vectorI5EntryNS_9allocatorIS1_EEE24__emplace_back_slow_pathIJS1_EEEvDpOT_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__17getlineIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_istreamIT_T0_EES9_RNS_12basic_stringIS6_S7_T1_EES6_"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc"
+ },
+ {
+ "name" : "android_get_control_file"
+ },
+ {
+ "name" : "android_get_control_socket"
+ },
+ {
+ "name" : "android_get_ioprio"
+ },
+ {
+ "name" : "android_reboot"
+ },
+ {
+ "name" : "android_set_ioprio"
+ },
+ {
+ "name" : "ashmem_create_region"
+ },
+ {
+ "name" : "ashmem_get_size_region"
+ },
+ {
+ "name" : "ashmem_pin_region"
+ },
+ {
+ "name" : "ashmem_set_prot_region"
+ },
+ {
+ "name" : "ashmem_unpin_region"
+ },
+ {
+ "name" : "ashmem_valid"
+ },
+ {
+ "name" : "atrace_async_begin_body"
+ },
+ {
+ "name" : "atrace_async_end_body"
+ },
+ {
+ "name" : "atrace_async_for_track_begin_body"
+ },
+ {
+ "name" : "atrace_async_for_track_end_body"
+ },
+ {
+ "name" : "atrace_begin_body"
+ },
+ {
+ "name" : "atrace_end_body"
+ },
+ {
+ "name" : "atrace_get_enabled_tags"
+ },
+ {
+ "name" : "atrace_init"
+ },
+ {
+ "name" : "atrace_instant_body"
+ },
+ {
+ "name" : "atrace_instant_for_track_body"
+ },
+ {
+ "name" : "atrace_int64_body"
+ },
+ {
+ "name" : "atrace_int_body"
+ },
+ {
+ "name" : "atrace_set_tracing_enabled"
+ },
+ {
+ "name" : "atrace_setup"
+ },
+ {
+ "name" : "atrace_update_tags"
+ },
+ {
+ "name" : "canned_fs_config"
+ },
+ {
+ "name" : "config_bool"
+ },
+ {
+ "name" : "config_find"
+ },
+ {
+ "name" : "config_free"
+ },
+ {
+ "name" : "config_load"
+ },
+ {
+ "name" : "config_load_file"
+ },
+ {
+ "name" : "config_node"
+ },
+ {
+ "name" : "config_set"
+ },
+ {
+ "name" : "config_str"
+ },
+ {
+ "name" : "fs_config"
+ },
+ {
+ "name" : "fs_mkdirs"
+ },
+ {
+ "name" : "fs_prepare_dir"
+ },
+ {
+ "name" : "fs_prepare_dir_strict"
+ },
+ {
+ "name" : "fs_prepare_file_strict"
+ },
+ {
+ "name" : "fs_read_atomic_int"
+ },
+ {
+ "name" : "fs_write_atomic_int"
+ },
+ {
+ "name" : "hashmapCreate"
+ },
+ {
+ "name" : "hashmapForEach"
+ },
+ {
+ "name" : "hashmapFree"
+ },
+ {
+ "name" : "hashmapGet"
+ },
+ {
+ "name" : "hashmapHash"
+ },
+ {
+ "name" : "hashmapLock"
+ },
+ {
+ "name" : "hashmapPut"
+ },
+ {
+ "name" : "hashmapRemove"
+ },
+ {
+ "name" : "hashmapUnlock"
+ },
+ {
+ "name" : "klog_set_level"
+ },
+ {
+ "name" : "klog_write"
+ },
+ {
+ "name" : "klog_writev"
+ },
+ {
+ "name" : "load_canned_fs_config"
+ },
+ {
+ "name" : "load_file"
+ },
+ {
+ "name" : "multiuser_convert_sdk_sandbox_to_app_uid"
+ },
+ {
+ "name" : "multiuser_get_app_id"
+ },
+ {
+ "name" : "multiuser_get_cache_gid"
+ },
+ {
+ "name" : "multiuser_get_ext_cache_gid"
+ },
+ {
+ "name" : "multiuser_get_ext_gid"
+ },
+ {
+ "name" : "multiuser_get_sdk_sandbox_uid"
+ },
+ {
+ "name" : "multiuser_get_shared_app_gid"
+ },
+ {
+ "name" : "multiuser_get_shared_gid"
+ },
+ {
+ "name" : "multiuser_get_uid"
+ },
+ {
+ "name" : "multiuser_get_user_id"
+ },
+ {
+ "name" : "native_handle_clone"
+ },
+ {
+ "name" : "native_handle_close"
+ },
+ {
+ "name" : "native_handle_close_with_tag"
+ },
+ {
+ "name" : "native_handle_create"
+ },
+ {
+ "name" : "native_handle_delete"
+ },
+ {
+ "name" : "native_handle_init"
+ },
+ {
+ "name" : "native_handle_set_fdsan_tag"
+ },
+ {
+ "name" : "native_handle_unset_fdsan_tag"
+ },
+ {
+ "name" : "partition_wiped"
+ },
+ {
+ "name" : "property_get"
+ },
+ {
+ "name" : "property_get_bool"
+ },
+ {
+ "name" : "property_get_int32"
+ },
+ {
+ "name" : "property_get_int64"
+ },
+ {
+ "name" : "property_list"
+ },
+ {
+ "name" : "property_set"
+ },
+ {
+ "name" : "record_stream_free"
+ },
+ {
+ "name" : "record_stream_get_next"
+ },
+ {
+ "name" : "record_stream_new"
+ },
+ {
+ "name" : "socket_close"
+ },
+ {
+ "name" : "socket_get_local_port"
+ },
+ {
+ "name" : "socket_inaddr_any_server"
+ },
+ {
+ "name" : "socket_local_client"
+ },
+ {
+ "name" : "socket_local_client_connect"
+ },
+ {
+ "name" : "socket_local_server"
+ },
+ {
+ "name" : "socket_local_server_bind"
+ },
+ {
+ "name" : "socket_network_client"
+ },
+ {
+ "name" : "socket_network_client_timeout"
+ },
+ {
+ "name" : "socket_send_buffers"
+ },
+ {
+ "name" : "str_parms_add_float"
+ },
+ {
+ "name" : "str_parms_add_int"
+ },
+ {
+ "name" : "str_parms_add_str"
+ },
+ {
+ "name" : "str_parms_create"
+ },
+ {
+ "name" : "str_parms_create_str"
+ },
+ {
+ "name" : "str_parms_del"
+ },
+ {
+ "name" : "str_parms_destroy"
+ },
+ {
+ "name" : "str_parms_dump"
+ },
+ {
+ "name" : "str_parms_get_float"
+ },
+ {
+ "name" : "str_parms_get_int"
+ },
+ {
+ "name" : "str_parms_get_str"
+ },
+ {
+ "name" : "str_parms_has_key"
+ },
+ {
+ "name" : "str_parms_to_str"
+ },
+ {
+ "name" : "uevent_kernel_multicast_recv"
+ },
+ {
+ "name" : "uevent_kernel_multicast_uid_recv"
+ },
+ {
+ "name" : "uevent_kernel_recv"
+ },
+ {
+ "name" : "uevent_open_socket"
+ }
+ ],
+ "elf_objects" :
+ [
+ {
+ "binding" : "weak",
+ "name" : "_ZTCNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTTNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTVNSt3__113basic_filebufIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "binding" : "weak",
+ "name" : "_ZTVNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE"
+ },
+ {
+ "name" : "atrace_enabled_tags"
+ },
+ {
+ "name" : "atrace_is_ready"
+ },
+ {
+ "name" : "atrace_marker_fd"
+ }
+ ],
+ "enum_types" :
+ [
+ {
+ "alignment" : 4,
+ "enum_fields" :
+ [
+ {
+ "enum_field_value" : 0,
+ "name" : "IoSchedClass_NONE"
+ },
+ {
+ "enum_field_value" : 1,
+ "name" : "IoSchedClass_RT"
+ },
+ {
+ "enum_field_value" : 2,
+ "name" : "IoSchedClass_BE"
+ },
+ {
+ "enum_field_value" : 3,
+ "name" : "IoSchedClass_IDLE"
+ }
+ ],
+ "linker_set_key" : "_ZTI12IoSchedClass",
+ "name" : "IoSchedClass",
+ "referenced_type" : "_ZTI12IoSchedClass",
+ "self_type" : "_ZTI12IoSchedClass",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h",
+ "underlying_type" : "_ZTIj"
+ }
+ ],
+ "function_types" :
+ [
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFbPvS_E",
+ "name" : "bool (void *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFbPvS_E",
+ "return_type" : "_ZTIb",
+ "self_type" : "_ZTIFbPvS_E",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFbPvS_S_E",
+ "name" : "bool (void *, void *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFbPvS_S_E",
+ "return_type" : "_ZTIb",
+ "self_type" : "_ZTIFbPvS_S_E",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFiPvE",
+ "name" : "int (void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFiPvE",
+ "return_type" : "_ZTIi",
+ "self_type" : "_ZTIFiPvE",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIFvPKcS0_PvE",
+ "name" : "void (const char *, const char *, void *)",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "referenced_type" : "_ZTIFvPKcS0_PvE",
+ "return_type" : "_ZTIv",
+ "self_type" : "_ZTIFvPKcS0_PvE",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ }
+ ],
+ "functions" :
+ [
+ {
+ "function_name" : "android_get_control_file",
+ "linker_set_key" : "android_get_control_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/android_get_control_file.h"
+ },
+ {
+ "function_name" : "android_get_control_socket",
+ "linker_set_key" : "android_get_control_socket",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "android_get_ioprio",
+ "linker_set_key" : "android_get_ioprio",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIP12IoSchedClass"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "function_name" : "android_reboot",
+ "linker_set_key" : "android_reboot",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/android_reboot.h"
+ },
+ {
+ "function_name" : "android_set_ioprio",
+ "linker_set_key" : "android_set_ioprio",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTI12IoSchedClass"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "function_name" : "ashmem_create_region",
+ "linker_set_key" : "ashmem_create_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_get_size_region",
+ "linker_set_key" : "ashmem_get_size_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_pin_region",
+ "linker_set_key" : "ashmem_pin_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_set_prot_region",
+ "linker_set_key" : "ashmem_set_prot_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_unpin_region",
+ "linker_set_key" : "ashmem_unpin_region",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "ashmem_valid",
+ "linker_set_key" : "ashmem_valid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/ashmem.h"
+ },
+ {
+ "function_name" : "atrace_async_begin_body",
+ "linker_set_key" : "atrace_async_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_end_body",
+ "linker_set_key" : "atrace_async_end_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_for_track_begin_body",
+ "linker_set_key" : "atrace_async_for_track_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_async_for_track_end_body",
+ "linker_set_key" : "atrace_async_for_track_end_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_begin_body",
+ "linker_set_key" : "atrace_begin_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_end_body",
+ "linker_set_key" : "atrace_end_body",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_get_enabled_tags",
+ "linker_set_key" : "atrace_get_enabled_tags",
+ "return_type" : "_ZTIy",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_init",
+ "linker_set_key" : "atrace_init",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_instant_body",
+ "linker_set_key" : "atrace_instant_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_instant_for_track_body",
+ "linker_set_key" : "atrace_instant_for_track_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_int64_body",
+ "linker_set_key" : "atrace_int64_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIx"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_int_body",
+ "linker_set_key" : "atrace_int_body",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_set_tracing_enabled",
+ "linker_set_key" : "atrace_set_tracing_enabled",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIb"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_setup",
+ "linker_set_key" : "atrace_setup",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "atrace_update_tags",
+ "linker_set_key" : "atrace_update_tags",
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "function_name" : "canned_fs_config",
+ "linker_set_key" : "canned_fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPy"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/private/canned_fs_config.h"
+ },
+ {
+ "function_name" : "config_bool",
+ "linker_set_key" : "config_bool",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_find",
+ "linker_set_key" : "config_find",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP5cnode",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_free",
+ "linker_set_key" : "config_free",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_load",
+ "linker_set_key" : "config_load",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_load_file",
+ "linker_set_key" : "config_load_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_node",
+ "linker_set_key" : "config_node",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP5cnode",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_set",
+ "linker_set_key" : "config_set",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "config_str",
+ "linker_set_key" : "config_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIPKc",
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "function_name" : "fs_config",
+ "linker_set_key" : "fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ },
+ {
+ "referenced_type" : "_ZTIPy"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/private/fs_config.h"
+ },
+ {
+ "function_name" : "fs_mkdirs",
+ "linker_set_key" : "fs_mkdirs",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIt"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_dir",
+ "linker_set_key" : "fs_prepare_dir",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIt"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_dir_strict",
+ "linker_set_key" : "fs_prepare_dir_strict",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIt"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_prepare_file_strict",
+ "linker_set_key" : "fs_prepare_file_strict",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIt"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_read_atomic_int",
+ "linker_set_key" : "fs_read_atomic_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "fs_write_atomic_int",
+ "linker_set_key" : "fs_write_atomic_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/fs.h"
+ },
+ {
+ "function_name" : "hashmapCreate",
+ "linker_set_key" : "hashmapCreate",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIPFiPvE"
+ },
+ {
+ "referenced_type" : "_ZTIPFbPvS_E"
+ }
+ ],
+ "return_type" : "_ZTIP7Hashmap",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapForEach",
+ "linker_set_key" : "hashmapForEach",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPFbPvS_S_E"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapFree",
+ "linker_set_key" : "hashmapFree",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapGet",
+ "linker_set_key" : "hashmapGet",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapHash",
+ "linker_set_key" : "hashmapHash",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapLock",
+ "linker_set_key" : "hashmapLock",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapPut",
+ "linker_set_key" : "hashmapPut",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapRemove",
+ "linker_set_key" : "hashmapRemove",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "hashmapUnlock",
+ "linker_set_key" : "hashmapUnlock",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP7Hashmap"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "function_name" : "klog_set_level",
+ "linker_set_key" : "klog_set_level",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "klog_write",
+ "linker_set_key" : "klog_write",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "klog_writev",
+ "linker_set_key" : "klog_writev",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPK5iovec"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "function_name" : "load_canned_fs_config",
+ "linker_set_key" : "load_canned_fs_config",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/private/canned_fs_config.h"
+ },
+ {
+ "function_name" : "load_file",
+ "linker_set_key" : "load_file",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIPv",
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ },
+ {
+ "function_name" : "multiuser_convert_sdk_sandbox_to_app_uid",
+ "linker_set_key" : "multiuser_convert_sdk_sandbox_to_app_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_app_id",
+ "linker_set_key" : "multiuser_get_app_id",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_cache_gid",
+ "linker_set_key" : "multiuser_get_cache_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_ext_cache_gid",
+ "linker_set_key" : "multiuser_get_ext_cache_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_ext_gid",
+ "linker_set_key" : "multiuser_get_ext_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_sdk_sandbox_uid",
+ "linker_set_key" : "multiuser_get_sdk_sandbox_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_shared_app_gid",
+ "linker_set_key" : "multiuser_get_shared_app_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_shared_gid",
+ "linker_set_key" : "multiuser_get_shared_gid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_uid",
+ "linker_set_key" : "multiuser_get_uid",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "multiuser_get_user_id",
+ "linker_set_key" : "multiuser_get_user_id",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIj",
+ "source_file" : "system/core/libcutils/include/cutils/multiuser.h"
+ },
+ {
+ "function_name" : "native_handle_clone",
+ "linker_set_key" : "native_handle_clone",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_close",
+ "linker_set_key" : "native_handle_close",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_close_with_tag",
+ "linker_set_key" : "native_handle_close_with_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_create",
+ "linker_set_key" : "native_handle_create",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_delete",
+ "linker_set_key" : "native_handle_delete",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_init",
+ "linker_set_key" : "native_handle_init",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIP13native_handle",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_set_fdsan_tag",
+ "linker_set_key" : "native_handle_set_fdsan_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "native_handle_unset_fdsan_tag",
+ "linker_set_key" : "native_handle_unset_fdsan_tag",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPK13native_handle"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "function_name" : "partition_wiped",
+ "linker_set_key" : "partition_wiped",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/partition_utils.h"
+ },
+ {
+ "function_name" : "property_get",
+ "linker_set_key" : "property_get",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_bool",
+ "linker_set_key" : "property_get_bool",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIa"
+ }
+ ],
+ "return_type" : "_ZTIa",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_int32",
+ "linker_set_key" : "property_get_int32",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_get_int64",
+ "linker_set_key" : "property_get_int64",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIx"
+ }
+ ],
+ "return_type" : "_ZTIx",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_list",
+ "linker_set_key" : "property_list",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPFvPKcS0_PvE"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "property_set",
+ "linker_set_key" : "property_set",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "function_name" : "record_stream_free",
+ "linker_set_key" : "record_stream_free",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP12RecordStream"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "record_stream_get_next",
+ "linker_set_key" : "record_stream_get_next",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP12RecordStream"
+ },
+ {
+ "referenced_type" : "_ZTIPPv"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "record_stream_new",
+ "linker_set_key" : "record_stream_new",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIP12RecordStream",
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "function_name" : "socket_close",
+ "linker_set_key" : "socket_close",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_get_local_port",
+ "linker_set_key" : "socket_get_local_port",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_inaddr_any_server",
+ "linker_set_key" : "socket_inaddr_any_server",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_client",
+ "linker_set_key" : "socket_local_client",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_client_connect",
+ "linker_set_key" : "socket_local_client_connect",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_server",
+ "linker_set_key" : "socket_local_server",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_local_server_bind",
+ "linker_set_key" : "socket_local_server_bind",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_network_client",
+ "linker_set_key" : "socket_network_client",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_network_client_timeout",
+ "linker_set_key" : "socket_network_client_timeout",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "socket_send_buffers",
+ "linker_set_key" : "socket_send_buffers",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPK22cutils_socket_buffer_t"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "function_name" : "str_parms_add_float",
+ "linker_set_key" : "str_parms_add_float",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIf"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_add_int",
+ "linker_set_key" : "str_parms_add_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_add_str",
+ "linker_set_key" : "str_parms_add_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_create",
+ "linker_set_key" : "str_parms_create",
+ "return_type" : "_ZTIP9str_parms",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_create_str",
+ "linker_set_key" : "str_parms_create_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIP9str_parms",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_del",
+ "linker_set_key" : "str_parms_del",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_destroy",
+ "linker_set_key" : "str_parms_destroy",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_dump",
+ "linker_set_key" : "str_parms_dump",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIv",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_float",
+ "linker_set_key" : "str_parms_get_float",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPf"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_int",
+ "linker_set_key" : "str_parms_get_int",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_get_str",
+ "linker_set_key" : "str_parms_get_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "referenced_type" : "_ZTIPc"
+ },
+ {
+ "referenced_type" : "_ZTIi"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_has_key",
+ "linker_set_key" : "str_parms_has_key",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ },
+ {
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "str_parms_to_str",
+ "linker_set_key" : "str_parms_to_str",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIP9str_parms"
+ }
+ ],
+ "return_type" : "_ZTIPc",
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "function_name" : "uevent_kernel_multicast_recv",
+ "linker_set_key" : "uevent_kernel_multicast_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_kernel_multicast_uid_recv",
+ "linker_set_key" : "uevent_kernel_multicast_uid_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_kernel_recv",
+ "linker_set_key" : "uevent_kernel_recv",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIPv"
+ },
+ {
+ "referenced_type" : "_ZTIj"
+ },
+ {
+ "referenced_type" : "_ZTIb"
+ },
+ {
+ "referenced_type" : "_ZTIPj"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ },
+ {
+ "function_name" : "uevent_open_socket",
+ "linker_set_key" : "uevent_open_socket",
+ "parameters" :
+ [
+ {
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "referenced_type" : "_ZTIb"
+ }
+ ],
+ "return_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/uevent.h"
+ }
+ ],
+ "global_vars" :
+ [
+ {
+ "linker_set_key" : "atrace_enabled_tags",
+ "name" : "atrace_enabled_tags",
+ "referenced_type" : "_ZTIy",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "linker_set_key" : "atrace_is_ready",
+ "name" : "atrace_is_ready",
+ "referenced_type" : "_ZTINSt3__16atomicIbEE",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ },
+ {
+ "linker_set_key" : "atrace_marker_fd",
+ "name" : "atrace_marker_fd",
+ "referenced_type" : "_ZTIi",
+ "source_file" : "system/core/libcutils/include/cutils/trace.h"
+ }
+ ],
+ "lvalue_reference_types" : [],
+ "pointer_types" :
+ [
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP12IoSchedClass",
+ "name" : "IoSchedClass *",
+ "referenced_type" : "_ZTI12IoSchedClass",
+ "self_type" : "_ZTIP12IoSchedClass",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP12RecordStream",
+ "name" : "RecordStream *",
+ "referenced_type" : "_ZTI12RecordStream",
+ "self_type" : "_ZTIP12RecordStream",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP13native_handle",
+ "name" : "native_handle *",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTIP13native_handle",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP5cnode",
+ "name" : "cnode *",
+ "referenced_type" : "_ZTI5cnode",
+ "self_type" : "_ZTIP5cnode",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP7Hashmap",
+ "name" : "Hashmap *",
+ "referenced_type" : "_ZTI7Hashmap",
+ "self_type" : "_ZTIP7Hashmap",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIP9str_parms",
+ "name" : "str_parms *",
+ "referenced_type" : "_ZTI9str_parms",
+ "self_type" : "_ZTIP9str_parms",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPFbPvS_E",
+ "name" : "bool (*)(void *, void *)",
+ "referenced_type" : "_ZTIFbPvS_E",
+ "self_type" : "_ZTIPFbPvS_E",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPFbPvS_S_E",
+ "name" : "bool (*)(void *, void *, void *)",
+ "referenced_type" : "_ZTIFbPvS_S_E",
+ "self_type" : "_ZTIPFbPvS_S_E",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPFiPvE",
+ "name" : "int (*)(void *)",
+ "referenced_type" : "_ZTIFiPvE",
+ "self_type" : "_ZTIPFiPvE",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/hashmap.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPFvPKcS0_PvE",
+ "name" : "void (*)(const char *, const char *, void *)",
+ "referenced_type" : "_ZTIFvPKcS0_PvE",
+ "self_type" : "_ZTIPFvPKcS0_PvE",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/properties.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPK13native_handle",
+ "name" : "const native_handle *",
+ "referenced_type" : "_ZTIK13native_handle",
+ "self_type" : "_ZTIPK13native_handle",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPK22cutils_socket_buffer_t",
+ "name" : "const cutils_socket_buffer_t *",
+ "referenced_type" : "_ZTIK22cutils_socket_buffer_t",
+ "self_type" : "_ZTIPK22cutils_socket_buffer_t",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPK5iovec",
+ "name" : "const iovec *",
+ "referenced_type" : "_ZTIK5iovec",
+ "self_type" : "_ZTIPK5iovec",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPKc",
+ "name" : "const char *",
+ "referenced_type" : "_ZTIKc",
+ "self_type" : "_ZTIPKc",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPKv",
+ "name" : "const void *",
+ "referenced_type" : "_ZTIKv",
+ "self_type" : "_ZTIPKv",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPPv",
+ "name" : "void **",
+ "referenced_type" : "_ZTIPv",
+ "self_type" : "_ZTIPPv",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/record_stream.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPc",
+ "name" : "char *",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIPc",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPf",
+ "name" : "float *",
+ "referenced_type" : "_ZTIf",
+ "self_type" : "_ZTIPf",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/str_parms.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPi",
+ "name" : "int *",
+ "referenced_type" : "_ZTIi",
+ "self_type" : "_ZTIPi",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/iosched_policy.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPj",
+ "name" : "unsigned int *",
+ "referenced_type" : "_ZTIj",
+ "self_type" : "_ZTIPj",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPv",
+ "name" : "void *",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIPv",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/cutils/misc.h"
+ },
+ {
+ "alignment" : 4,
+ "linker_set_key" : "_ZTIPy",
+ "name" : "unsigned long long *",
+ "referenced_type" : "_ZTIy",
+ "self_type" : "_ZTIPy",
+ "size" : 4,
+ "source_file" : "system/core/libcutils/include/private/canned_fs_config.h"
+ }
+ ],
+ "qualified_types" :
+ [
+ {
+ "alignment" : 4,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK13native_handle",
+ "name" : "const native_handle",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTIK13native_handle",
+ "size" : 12,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 4,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK22cutils_socket_buffer_t",
+ "name" : "const cutils_socket_buffer_t",
+ "referenced_type" : "_ZTI22cutils_socket_buffer_t",
+ "self_type" : "_ZTIK22cutils_socket_buffer_t",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 4,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIK5iovec",
+ "name" : "const iovec",
+ "referenced_type" : "_ZTI5iovec",
+ "self_type" : "_ZTIK5iovec",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/klog.h"
+ },
+ {
+ "alignment" : 1,
+ "is_const" : true,
+ "linker_set_key" : "_ZTIKc",
+ "name" : "const char",
+ "referenced_type" : "_ZTIc",
+ "self_type" : "_ZTIKc",
+ "size" : 1,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ },
+ {
+ "is_const" : true,
+ "linker_set_key" : "_ZTIKv",
+ "name" : "const void",
+ "referenced_type" : "_ZTIv",
+ "self_type" : "_ZTIKv",
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ }
+ ],
+ "record_types" :
+ [
+ {
+ "alignment" : 4,
+ "fields" :
+ [
+ {
+ "field_name" : "version",
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "numFds",
+ "field_offset" : 32,
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "numInts",
+ "field_offset" : 64,
+ "referenced_type" : "_ZTIi"
+ },
+ {
+ "field_name" : "data",
+ "field_offset" : 96,
+ "referenced_type" : "_ZTIA0_i"
+ }
+ ],
+ "linker_set_key" : "_ZTI13native_handle",
+ "name" : "native_handle",
+ "referenced_type" : "_ZTI13native_handle",
+ "self_type" : "_ZTI13native_handle",
+ "size" : 12,
+ "source_file" : "system/core/libcutils/include/cutils/native_handle.h"
+ },
+ {
+ "alignment" : 4,
+ "fields" :
+ [
+ {
+ "field_name" : "data",
+ "referenced_type" : "_ZTIPKv"
+ },
+ {
+ "field_name" : "length",
+ "field_offset" : 32,
+ "referenced_type" : "_ZTIj"
+ }
+ ],
+ "linker_set_key" : "_ZTI22cutils_socket_buffer_t",
+ "name" : "cutils_socket_buffer_t",
+ "referenced_type" : "_ZTI22cutils_socket_buffer_t",
+ "self_type" : "_ZTI22cutils_socket_buffer_t",
+ "size" : 8,
+ "source_file" : "system/core/libcutils/include/cutils/sockets.h"
+ },
+ {
+ "alignment" : 4,
+ "fields" :
+ [
+ {
+ "field_name" : "next",
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "first_child",
+ "field_offset" : 32,
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "last_child",
+ "field_offset" : 64,
+ "referenced_type" : "_ZTIP5cnode"
+ },
+ {
+ "field_name" : "name",
+ "field_offset" : 96,
+ "referenced_type" : "_ZTIPKc"
+ },
+ {
+ "field_name" : "value",
+ "field_offset" : 128,
+ "referenced_type" : "_ZTIPKc"
+ }
+ ],
+ "linker_set_key" : "_ZTI5cnode",
+ "name" : "cnode",
+ "referenced_type" : "_ZTI5cnode",
+ "self_type" : "_ZTI5cnode",
+ "size" : 20,
+ "source_file" : "system/core/libcutils/include/cutils/config_utils.h"
+ }
+ ],
+ "rvalue_reference_types" : []
+}
diff --git a/libutils/Unicode.cpp b/libutils/Unicode.cpp
index 3ffcf7e..364a177 100644
--- a/libutils/Unicode.cpp
+++ b/libutils/Unicode.cpp
@@ -280,158 +280,181 @@
: 0);
}
+// is_any_surrogate() returns true if w is either a high or low surrogate
+static constexpr bool is_any_surrogate(char16_t w) {
+ return (w & 0xf800) == 0xd800;
+}
+
+// is_surrogate_pair() returns true if w1 and w2 form a valid surrogate pair
+static constexpr bool is_surrogate_pair(char16_t w1, char16_t w2) {
+ return ((w1 & 0xfc00) == 0xd800) && ((w2 & 0xfc00) == 0xdc00);
+}
+
+// TODO: currently utf16_to_utf8_length() returns -1 if src_len == 0,
+// which is inconsistent with utf8_to_utf16_length(), here we keep the
+// current behavior as intended not to break compatibility
+ssize_t utf16_to_utf8_length(const char16_t *src, size_t src_len)
+{
+ if (src == nullptr || src_len == 0)
+ return -1;
+
+ const char16_t* const end = src + src_len;
+ const char16_t* in = src;
+ size_t utf8_len = 0;
+
+ while (in < end) {
+ char16_t w = *in++;
+ if (LIKELY(w < 0x0080)) {
+ utf8_len += 1;
+ continue;
+ }
+ if (LIKELY(w < 0x0800)) {
+ utf8_len += 2;
+ continue;
+ }
+ if (LIKELY(!is_any_surrogate(w))) {
+ utf8_len += 3;
+ continue;
+ }
+ if (in < end && is_surrogate_pair(w, *in)) {
+ utf8_len += 4;
+ in++;
+ continue;
+ }
+ /* skip if at the end of the string or invalid surrogate pair */
+ }
+ return (in == end && utf8_len < SSIZE_MAX) ? utf8_len : -1;
+}
+
void utf16_to_utf8(const char16_t* src, size_t src_len, char* dst, size_t dst_len)
{
if (src == nullptr || src_len == 0 || dst == nullptr) {
return;
}
- const char16_t* cur_utf16 = src;
- const char16_t* const end_utf16 = src + src_len;
- char *cur = dst;
- while (cur_utf16 < end_utf16) {
- char32_t utf32;
- // surrogate pairs
- if((*cur_utf16 & 0xFC00) == 0xD800 && (cur_utf16 + 1) < end_utf16
- && (*(cur_utf16 + 1) & 0xFC00) == 0xDC00) {
- utf32 = (*cur_utf16++ - 0xD800) << 10;
- utf32 |= *cur_utf16++ - 0xDC00;
- utf32 += 0x10000;
- } else {
- utf32 = (char32_t) *cur_utf16++;
+ const char16_t* in = src;
+ const char16_t* const in_end = src + src_len;
+ char* out = dst;
+ const char* const out_end = dst + dst_len;
+ char16_t w2;
+
+ auto err_out = [&out, &out_end, &dst_len]() {
+ LOG_ALWAYS_FATAL_IF(out >= out_end,
+ "target utf8 string size %zu too short", dst_len);
+ };
+
+ while (in < in_end) {
+ char16_t w = *in++;
+ if (LIKELY(w < 0x0080)) {
+ if (out + 1 > out_end)
+ return err_out();
+ *out++ = (char)(w & 0xff);
+ continue;
}
- const size_t len = utf32_codepoint_utf8_length(utf32);
- LOG_ALWAYS_FATAL_IF(dst_len < len, "%zu < %zu", dst_len, len);
- utf32_codepoint_to_utf8((uint8_t*)cur, utf32, len);
- cur += len;
- dst_len -= len;
+ if (LIKELY(w < 0x0800)) {
+ if (out + 2 > out_end)
+ return err_out();
+ *out++ = (char)(0xc0 | ((w >> 6) & 0x1f));
+ *out++ = (char)(0x80 | ((w >> 0) & 0x3f));
+ continue;
+ }
+ if (LIKELY(!is_any_surrogate(w))) {
+ if (out + 3 > out_end)
+ return err_out();
+ *out++ = (char)(0xe0 | ((w >> 12) & 0xf));
+ *out++ = (char)(0x80 | ((w >> 6) & 0x3f));
+ *out++ = (char)(0x80 | ((w >> 0) & 0x3f));
+ continue;
+ }
+ /* surrogate pair */
+ if (in < in_end && (w2 = *in, is_surrogate_pair(w, w2))) {
+ if (out + 4 > out_end)
+ return err_out();
+ char32_t dw = (char32_t)(0x10000 + ((w - 0xd800) << 10) + (w2 - 0xdc00));
+ *out++ = (char)(0xf0 | ((dw >> 18) & 0x07));
+ *out++ = (char)(0x80 | ((dw >> 12) & 0x3f));
+ *out++ = (char)(0x80 | ((dw >> 6) & 0x3f));
+ *out++ = (char)(0x80 | ((dw >> 0) & 0x3f));
+ in++;
+ }
+ /* We reach here in two cases:
+ * 1) (in == in_end), which means end of the input string
+ * 2) (w2 & 0xfc00) != 0xdc00, which means invalid surrogate pair
+ * In either case, we intentionally do nothing and skip
+ */
}
- LOG_ALWAYS_FATAL_IF(dst_len < 1, "%zu < 1", dst_len);
- *cur = '\0';
+ *out = '\0';
+ return;
}
// --------------------------------------------------------------------------
// UTF-8
// --------------------------------------------------------------------------
-ssize_t utf16_to_utf8_length(const char16_t *src, size_t src_len)
-{
- if (src == nullptr || src_len == 0) {
- return -1;
- }
-
- size_t ret = 0;
- const char16_t* const end = src + src_len;
- while (src < end) {
- size_t char_len;
- if ((*src & 0xFC00) == 0xD800 && (src + 1) < end
- && (*(src + 1) & 0xFC00) == 0xDC00) {
- // surrogate pairs are always 4 bytes.
- char_len = 4;
- src += 2;
- } else {
- char_len = utf32_codepoint_utf8_length((char32_t)*src++);
- }
- if (SSIZE_MAX - char_len < ret) {
- // If this happens, we would overflow the ssize_t type when
- // returning from this function, so we cannot express how
- // long this string is in an ssize_t.
- android_errorWriteLog(0x534e4554, "37723026");
- return -1;
- }
- ret += char_len;
- }
- return ret;
+static char32_t utf8_4b_to_utf32(uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4) {
+ return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
}
-/**
- * Returns 1-4 based on the number of leading bits.
- *
- * 1111 -> 4
- * 1110 -> 3
- * 110x -> 2
- * 10xx -> 1
- * 0xxx -> 1
- */
-static inline size_t utf8_codepoint_len(uint8_t ch)
-{
- return ((0xe5000000 >> ((ch >> 3) & 0x1e)) & 3) + 1;
-}
-
-static inline void utf8_shift_and_mask(uint32_t* codePoint, const uint8_t byte)
-{
- *codePoint <<= 6;
- *codePoint |= 0x3F & byte;
-}
-
-static inline uint32_t utf8_to_utf32_codepoint(const uint8_t *src, size_t length)
-{
- uint32_t unicode;
-
- switch (length)
- {
- case 1:
- return src[0];
- case 2:
- unicode = src[0] & 0x1f;
- utf8_shift_and_mask(&unicode, src[1]);
- return unicode;
- case 3:
- unicode = src[0] & 0x0f;
- utf8_shift_and_mask(&unicode, src[1]);
- utf8_shift_and_mask(&unicode, src[2]);
- return unicode;
- case 4:
- unicode = src[0] & 0x07;
- utf8_shift_and_mask(&unicode, src[1]);
- utf8_shift_and_mask(&unicode, src[2]);
- utf8_shift_and_mask(&unicode, src[3]);
- return unicode;
- default:
- return 0xffff;
- }
-
- //printf("Char at %p: len=%d, utf-16=%p\n", src, length, (void*)result);
-}
+// TODO: current behavior of converting UTF8 to UTF-16 has a few issues below
+//
+// 1. invalid trailing bytes (i.e. not b'10xxxxxx) are treated as valid trailing
+// bytes and follows normal conversion rules
+// 2. invalid leading byte (b'10xxxxxx) is treated as a valid single UTF-8 byte
+// 3. invalid leading byte (b'11111xxx) is treated as a valid leading byte
+// (same as b'11110xxx) for a 4-byte UTF-8 sequence
+// 4. an invalid 4-byte UTF-8 sequence that translates to a codepoint < U+10000
+// will be converted as a valid UTF-16 character
+//
+// We keep the current behavior as is but with warnings logged, so as not to
+// break compatibility. However, this needs to be addressed later.
ssize_t utf8_to_utf16_length(const uint8_t* u8str, size_t u8len, bool overreadIsFatal)
{
- const uint8_t* const u8end = u8str + u8len;
- const uint8_t* u8cur = u8str;
-
- /* Validate that the UTF-8 is the correct len */
- size_t u16measuredLen = 0;
- while (u8cur < u8end) {
- u16measuredLen++;
- int u8charLen = utf8_codepoint_len(*u8cur);
- // Malformed utf8, some characters are beyond the end.
- // Cases:
- // If u8charLen == 1, this becomes u8cur >= u8end, which cannot happen as u8cur < u8end,
- // then this condition fail and we continue, as expected.
- // If u8charLen == 2, this becomes u8cur + 1 >= u8end, which fails only if
- // u8cur == u8end - 1, that is, there was only one remaining character to read but we need
- // 2 of them. This condition holds and we return -1, as expected.
- if (u8cur + u8charLen - 1 >= u8end) {
- if (overreadIsFatal) {
- LOG_ALWAYS_FATAL("Attempt to overread computing length of utf8 string");
- } else {
- return -1;
- }
- }
- uint32_t codepoint = utf8_to_utf32_codepoint(u8cur, u8charLen);
- if (codepoint > 0xFFFF) u16measuredLen++; // this will be a surrogate pair in utf16
- u8cur += u8charLen;
- }
-
- /**
- * Make sure that we ended where we thought we would and the output UTF-16
- * will be exactly how long we were told it would be.
- */
- if (u8cur != u8end) {
+ if (u8str == nullptr)
return -1;
- }
- return u16measuredLen;
+ const uint8_t* const in_end = u8str + u8len;
+ const uint8_t* in = u8str;
+ size_t utf16_len = 0;
+
+ while (in < in_end) {
+ uint8_t c = *in;
+ utf16_len++;
+ if (LIKELY((c & 0x80) == 0)) {
+ in++;
+ continue;
+ }
+ if (UNLIKELY(c < 0xc0)) {
+ ALOGW("Invalid UTF-8 leading byte: 0x%02x", c);
+ in++;
+ continue;
+ }
+ if (LIKELY(c < 0xe0)) {
+ in += 2;
+ continue;
+ }
+ if (LIKELY(c < 0xf0)) {
+ in += 3;
+ continue;
+ } else {
+ uint8_t c2, c3, c4;
+ if (UNLIKELY(c >= 0xf8)) {
+ ALOGW("Invalid UTF-8 leading byte: 0x%02x", c);
+ }
+ c2 = in[1]; c3 = in[2]; c4 = in[3];
+ if (utf8_4b_to_utf32(c, c2, c3, c4) >= 0x10000) {
+ utf16_len++;
+ }
+ in += 4;
+ continue;
+ }
+ }
+ if (in == in_end) {
+ return utf16_len < SSIZE_MAX ? utf16_len : -1;
+ }
+ if (overreadIsFatal)
+ LOG_ALWAYS_FATAL("Attempt to overread computing length of utf8 string");
+ return -1;
}
char16_t* utf8_to_utf16(const uint8_t* u8str, size_t u8len, char16_t* u16str, size_t u16len) {
@@ -444,38 +467,75 @@
char16_t* utf8_to_utf16_no_null_terminator(
const uint8_t* src, size_t srcLen, char16_t* dst, size_t dstLen) {
- if (dstLen == 0) {
+ if (src == nullptr || srcLen == 0 || dstLen == 0) {
return dst;
}
// A value > SSIZE_MAX is probably a negative value returned as an error and casted.
LOG_ALWAYS_FATAL_IF(dstLen > SSIZE_MAX, "dstLen is %zu", dstLen);
- const uint8_t* const u8end = src + srcLen;
- const uint8_t* u8cur = src;
- const char16_t* const u16end = dst + dstLen;
- char16_t* u16cur = dst;
- while (u8cur < u8end && u16cur < u16end) {
- size_t u8len = utf8_codepoint_len(*u8cur);
- uint32_t codepoint = utf8_to_utf32_codepoint(u8cur, u8len);
+ const uint8_t* const in_end = src + srcLen;
+ const uint8_t* in = src;
+ const char16_t* const out_end = dst + dstLen;
+ char16_t* out = dst;
+ uint8_t c, c2, c3, c4;
+ char32_t w;
- // Convert the UTF32 codepoint to one or more UTF16 codepoints
- if (codepoint <= 0xFFFF) {
- // Single UTF16 character
- *u16cur++ = (char16_t) codepoint;
- } else {
- // Multiple UTF16 characters with surrogates
- codepoint = codepoint - 0x10000;
- *u16cur++ = (char16_t) ((codepoint >> 10) + 0xD800);
- if (u16cur >= u16end) {
- // Ooops... not enough room for this surrogate pair.
- return u16cur-1;
- }
- *u16cur++ = (char16_t) ((codepoint & 0x3FF) + 0xDC00);
+ auto err_in = [&c, &out]() {
+ ALOGW("Unended UTF-8 byte: 0x%02x", c);
+ return out;
+ };
+
+ while (in < in_end && out < out_end) {
+ c = *in++;
+ if (LIKELY((c & 0x80) == 0)) {
+ *out++ = (char16_t)(c);
+ continue;
}
-
- u8cur += u8len;
+ if (UNLIKELY(c < 0xc0)) {
+ ALOGW("Invalid UTF-8 leading byte: 0x%02x", c);
+ *out++ = (char16_t)(c);
+ continue;
+ }
+ if (LIKELY(c < 0xe0)) {
+ if (UNLIKELY(in + 1 > in_end)) {
+ return err_in();
+ }
+ c2 = *in++;
+ *out++ = (char16_t)(((c & 0x1f) << 6) | (c2 & 0x3f));
+ continue;
+ }
+ if (LIKELY(c < 0xf0)) {
+ if (UNLIKELY(in + 2 > in_end)) {
+ return err_in();
+ }
+ c2 = *in++; c3 = *in++;
+ *out++ = (char16_t)(((c & 0x0f) << 12) |
+ ((c2 & 0x3f) << 6) | (c3 & 0x3f));
+ continue;
+ } else {
+ if (UNLIKELY(in + 3 > in_end)) {
+ return err_in();
+ }
+ if (UNLIKELY(c >= 0xf8)) {
+ ALOGW("Invalid UTF-8 leading byte: 0x%02x", c);
+ }
+ // Multiple UTF16 characters with surrogates
+ c2 = *in++; c3 = *in++; c4 = *in++;
+ w = utf8_4b_to_utf32(c, c2, c3, c4);
+ if (UNLIKELY(w < 0x10000)) {
+ *out++ = (char16_t)(w);
+ } else {
+ if (UNLIKELY(out + 2 > out_end)) {
+ // Ooops.... not enough room for this surrogate pair.
+ return out;
+ }
+ *out++ = (char16_t)(((w - 0x10000) >> 10) + 0xd800);
+ *out++ = (char16_t)(((w - 0x10000) & 0x3ff) + 0xdc00);
+ }
+ continue;
+ }
}
- return u16cur;
+ return out;
}
}
diff --git a/rootdir/init.rc b/rootdir/init.rc
index 4f3959f..907f46e 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -604,8 +604,8 @@
chmod 0700 /metadata/vold
mkdir /metadata/password_slots 0771 root system
mkdir /metadata/bootstat 0750 system log
- mkdir /metadata/ota 0700 root system
- mkdir /metadata/ota/snapshots 0700 root system
+ mkdir /metadata/ota 0750 root system
+ mkdir /metadata/ota/snapshots 0750 root system
mkdir /metadata/userspacereboot 0770 root system
mkdir /metadata/watchdog 0770 root system
@@ -1059,7 +1059,7 @@
on zygote-start
wait_for_prop odsign.verification.done 1
# A/B update verifier that marks a successful boot.
- exec_start update_verifier_nonencrypted
+ exec_start update_verifier
start statsd
start netd
start zygote