Android System Property分析(2):property_service

本文探讨了Android中的property_service,该服务在init进程中启动。重点讲解了以'persist'开头的属性,这类属性在设置时不仅更新属性值,还会存储到/data/property目录,以确保重启后仍能保持其状态。例如,艺术和Dalvik虚拟机的切换,就需要使用persist.sys.dalvik.vm.lib来持久保存设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    property_service是在init中启动的,

int main(int argc, char **argv){
    property_init();
    property_load_boot_defaults(); // 加载"/default.prop"
    queue_builtin_action(property_service_init_action, "property_service_init");
    // ...
 

void property_init(void){
    init_property_area(); // 开始初始化property内存和workspace
}
static int init_property_area(void) {
    if (property_area_inited)
        return -1;

    if(__system_property_area_init()) // 映射一块内存
        return -1;

    if(init_workspace(&pa_workspace, 0)) // 初始化workspace
        return -1;

    fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);

    property_area_inited = 1; // 初始化完成标记
    return 0;
}
int __system_property_area_init(){
    return map_prop_area_rw();
}
static int map_prop_area_rw(){
    prop_area *pa;
    int fd;
    int ret;

    /* dev is a tmpfs that we can use to carve a shared workspace
   
etc/init.rc: mkdir nuovo 0770 system system mount ext4 /dev/block/mmcblk0p1 /nuovo recovery_main.cpp: if (forbiddenRecoveryByReserveProperty()){ device->RemoveMenuItemForAction(Device::REBOOT_BOOTLOADER); device->RemoveMenuItemForAction(Device::ENTER_FASTBOOT); device->RemoveMenuItemForAction(Device::APPLY_ADB_SIDELOAD); device->RemoveMenuItemForAction(Device::APPLY_SDCARD); device->RemoveMenuItemForAction(Device::WIPE_DATA); device->RemoveMenuItemForAction(Device::WIPE_CACHE); device->RemoveMenuItemForAction(Device::MOUNT_SYSTEM); device->RemoveMenuItemForAction(Device::VIEW_RECOVERY_LOGS); device->RemoveMenuItemForAction(Device::RUN_GRAPHICS_TEST); device->RemoveMenuItemForAction(Device::RUN_LOCALE_TEST); } recovery_utils/include/recovery_utils/roots.h: bool forbiddenRecoveryByReserveProperty(); recovery_utils/roots.cpp: bool forbiddenRecoveryByReserveProperty() { std::string content; std::string reserve2_property_path; //Fstab defFstab; /*if (!ReadDefaultFstab(&defFstab)) { printf("Failed to read default fstab productinfo\n"); return false; }*/ //for (size_t i = 0; i < defFstab.size(); ++i) { //const auto& entry = defFstab[i]; //std::string::size_type pos = entry.blk_device.find("productinfo"); //if ((pos != std::string::npos) && (ensure_path_mounted(entry.mount_point.c_str()) == 0)) { //printf("mount productinfo success,mount point is %s \n", entry.mount_point.c_str()); reserve2_property_path = "/nuovo/productinfo/nuovo_forbidden_recovery.prop"; if (android::base::ReadFileToString(reserve2_property_path, &content) && (content.find("opporeserve.sys.custom.recovery.forbidden=1") != std::string::npos)) { printf("reserve found forbidden recovery prop! \n"); return true; } //break; //} //} printf("no forbidden prop found in reserve!\n"); return false; } services/core/java/com/android/server/am/OomAdjuster.java: if(app.processName!=null && (app.processName.contains("com.oplus.autotest") || app.processName.contains("com.oppo.autotest") || app.processName.contains("com.promobitech.nuovo"))){ app.mState.setCurAdj(ProcessList.FOREGROUND_APP_ADJ); } / services/java/com/android/server/SystemServer.java: t.traceBegin("MakeOplusCustomizeService Ready"); try{ Slog.i(TAG, "OplusCustomizeService Service"); OplusCustomizeService.getInstance().systemReady(); }catch (Throwable e){ reportWtf("starting OplusCustomizeService ready", e); } t.traceEnd();这是Nuovo禁止recovery需求的修改代码,解析一下,如果下载乃dlc需要同样需求怎么实现
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值