/******************************* 程序功能:解析/debug_ramdisk/mount.cfg配置文件,把文件挂载到tmpfs内存中。避免频繁写入内部存储,提高EMMC使用寿命。 mount.cfg格式如下: /data/user/0/com.ss.android.ugc.aweme.lite/databases/ss_app_log.db /data/user/0/com.ss.android.ugc.aweme.lite/databases/ss_app_log.db-journal ********************************/ #define LOG_TAG "FileInotify" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MOUNT_INFO_DEV "/dev/minfo" #define CMD_BASE 0xCBAABC10 #define FK_IS_GET_POWER2 (CMD_BASE + 12) #define M_IOCTL_MAGIC 0xB3 #define MOUNT_INFO _IOW(M_IOCTL_MAGIC, 0x41, unsigned long) #define MOUNT_CFG "/debug_ramdisk/mount.cfg" //配置文件路径 #define MOUNT_MAX_LINE 64 //最大的挂载数 #define READ_LINE 128 //文件路径缓存大小 struct fileinotify_info{ int containerid; //容器ID char src[MOUNT_MAX_LINE][READ_LINE]; //挂载原路径 char dst[MOUNT_MAX_LINE][READ_LINE]; //挂载目标路径 int flag[MOUNT_MAX_LINE]; //挂载标记,0x00:未挂载,0xAA:已挂载 int line; //挂载文件数量 }__attribute__ ((packed)); #if 0 void createFile(const std::string& path) { namespace fs = std::filesystem; //确保目录存在,如果不存在则创建 fs::create_directories(fs::path(path).parent_path()); //创建文件 std::ofstream file(path); if (file.is_open()) { file.close(); } } #else bool createDirectory(const std::string &path) { size_t pos = 0; std::string currentPath; while ((pos = path.find('/', pos)) != std::string::npos) { currentPath = path.substr(0, pos++); if (currentPath.empty()) continue; // 检查当前目录是否存在 if (mkdir(currentPath.c_str(), 0777) != 0) { if (errno != EEXIST) { // 如果目录不存在且无法创建 return false; } } } // 创建完整路径 if (mkdir(path.c_str(), 0777) != 0 && errno != EEXIST) { return false; } return true; } bool createFile(const std::string &filePath) { // 提取目录路径 size_t lastSlash = filePath.find_last_of('/'); if (lastSlash != std::string::npos) { std::string directory = filePath.substr(0, lastSlash); // 创建目录 if (!createDirectory(directory)) { return false; } } // 创建文件 std::ofstream ofs(filePath); if (!ofs) { return false; } ofs.close(); return true; } #endif int mount_info_init(struct fileinotify_info *info) { const std::string str = "/data_mirror"; int i = 0; std::ifstream file(MOUNT_CFG); if (!file.is_open()) { return 0; } std::string line; while (std::getline(file, line)) { //std::cout << line << std::endl; if(line.size() > 0) { //create file createFile(str + line); //save mount info sprintf(info->dst[i], "%s", line.c_str()); sprintf(info->src[i], "/data_mirror%s", line.c_str()); info->line = i + 1; i++; } } file.close(); return info->line; } int file_exists(const char *filename) { return access(filename, F_OK) == 0; } int main(void) { struct fileinotify_info info; char buf[READ_LINE]; int fd, ret; int line; //selinux prctl(FK_IS_GET_POWER2, 0, 0, 0); //file_exists if(!file_exists(MOUNT_CFG)) goto OUT; //mount info init umask(0000); mount_info_init(&info); //for(int i = 0; i < info.line; i++) //{ // ALOGD("line=%d, src=%s, dst=%s\n", i, info.src[i], info.dst[i]); //} fd = open(MOUNT_INFO_DEV, O_RDWR | O_NONBLOCK | O_NOCTTY); if(fd < 0) { ALOGD("open minfo fail.\n"); return -1; } ret = ioctl(fd, MOUNT_INFO, &info); if(ret != 0) { close(fd); ALOGD("ioctl minfo fail.\n"); return -2; } close(fd); OUT: return 0; }