property_get/ property_set/ atoi

本文深入探讨了Android系统中的属性服务工作原理,包括属性的存储、读取和设置方式,以及不同类型的属性如只读属性、持久属性等特性。介绍了如何通过特定API与属性服务进行交互,并说明了属性在系统启动和服务管理中的作用。

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

每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。

 

在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init。“init”守护进程将启动一个属性服务。

 

属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。 客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数是:

int property_get(const char *key, char *value, const char *default_value);

int property_set(const char *key, const char *value);

 

而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。

 

属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,将从以下文件中加载默认属性:

 

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

 

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

 

特别属性 如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

 

如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

 

如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)

 

属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。

 

每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果


atoi:

1 函数名编辑本段

atoi

2 功能编辑本段

  把字符串转换成长整型数

3 语法编辑本段

int atoi(const char *nptr);

4 用法实例编辑本段


int main(void)
{
  int n;
  char *str = "12345.67";
  n = atoi(str);
  printf("string = %s integer = %d\n", str, n);
  return 0;
}

输出:string = 12345.67 integer = 12345

static int media_get_socket(void* handle) { MediaIOPriv* priv = handle; if (!priv || priv->socket <= 0) return -EINVAL; return priv->socket; } /**************************************************************************** * Public Functions ****************************************************************************/ int media_process_command(const char* target, const char* cmd, const char* arg, char* res, int res_len) { return media_proxy(MEDIA_ID_GRAPH, NULL, target, cmd, arg, 0, res, res_len); } void media_graph_dump(const char* options) { media_proxy(MEDIA_ID_GRAPH, NULL, NULL, "dump", options, 0, NULL, 0); } void* media_player_open(const char* params) { return media_open(MEDIA_ID_PLAYER, params); } int media_player_close(void* handle, int pending_stop) { return media_close(handle, pending_stop); } int media_player_set_event_callback(void* handle, void* cookie, media_event_callback event_cb) { return media_set_event_cb(handle, cookie, event_cb); } int media_player_prepare(void* handle, const char* url, const char* options) { return media_prepare(handle, url, options); } int media_player_reset(void* handle) { if (!handle) return -EINVAL; media_close_socket(handle); return media_proxy_once(handle, NULL, "reset", NULL, 0, NULL, 0); } ssize_t media_player_write_data(void* handle, const void* data, size_t len) { return media_process_data(handle, true, (void*)data, len); } int media_player_get_sockaddr(void* handle, struct sockaddr_storage* addr) { return media_get_sockaddr(handle, addr); } void media_player_close_socket(void* handle) { media_close_socket(handle); } int media_player_get_socket(void* handle) { return media_get_socket(handle); } int media_player_start(void* handle) { if (!handle) return -EINVAL; return media_proxy_once(handle, NULL, "start", NULL, 0, NULL, 0); } int media_player_stop(void* handle) { if (!handle) return -EINVAL; media_close_socket(handle); return media_proxy_once(handle, NULL, "stop", NULL, 0, NULL, 0); } int media_player_pause(void* handle) { return media_proxy_once(handle, NULL, "pause", NULL, 0, NULL, 0); } int media_player_seek(void* handle, unsigned int msec) { char tmp[32]; snprintf(tmp, sizeof(tmp), "%u", msec); return media_proxy_once(handle, NULL, "seek", tmp, 0, NULL, 0); } int media_player_set_looping(void* handle, int loop) { char tmp[32]; snprintf(tmp, sizeof(tmp), "%d", loop); return media_proxy_once(handle, NULL, "set_loop", tmp, 0, NULL, 0); } int media_player_is_playing(void* handle) { char tmp[32]; int ret; ret = media_proxy_once(handle, NULL, "get_playing", NULL, 0, tmp, sizeof(tmp)); return ret < 0 ? ret : !!atoi(tmp); } int media_player_get_position(void* handle, unsigned int* msec) { char tmp[32]; int ret; if (!msec) return -EINVAL; ret = media_proxy_once(handle, NULL, "get_position", NULL, 0, tmp, sizeof(tmp)); if (ret >= 0) *msec = strtoul(tmp, NULL, 0); return ret; } int media_player_get_duration(void* handle, unsigned int* msec) { char tmp[32]; int ret; if (!msec) return -EINVAL; ret = media_proxy_once(handle, NULL, "get_duration", NULL, 0, tmp, sizeof(tmp)); if (ret >= 0) *msec = strtoul(tmp, NULL, 0); return ret; } int media_player_get_latency(void* handle, unsigned int* latency) { char tmp[32]; int ret; if (!latency) return -EINVAL; ret = media_proxy_once(handle, NULL, "get_latency", NULL, 0, tmp, sizeof(tmp)); if (ret >= 0) *latency = strtoul(tmp, NULL, 0); return ret; } int media_player_set_volume(void* handle, float volume) { char tmp[32]; snprintf(tmp, sizeof(tmp), "%f", volume); return media_proxy_once(handle, NULL, "volume", tmp, 0, NULL, 0); } int media_player_get_volume(void* handle, float* volume) { char tmp[32]; int ret; if (!volume) return -EINVAL; ret = media_proxy_once(handle, NULL, "get_volume", NULL, 0, tmp, sizeof(tmp)); if (ret >= 0) { sscanf(tmp, "vol:%f", volume); ret = 0; } return ret; } int media_player_set_property(void* handle, const char* target, const char* key, const char* value) { return media_proxy_once(handle, target, key, value, 0, NULL, 0); } int media_player_get_property(void* handle, const char* target, const char* key, char* value, int value_len) { return media_proxy_once(handle, target, key, NULL, 0, value, value_len); } void* media_recorder_open(const char* params) { return media_open(MEDIA_ID_RECORDER, params); } int media_recorder_close(void* handle) { return media_close(handle, 0); } int media_recorder_set_event_callback(void* handle, void* cookie, media_event_callback event_cb) { return media_set_event_cb(handle, cookie, event_cb); } int media_recorder_prepare(void* handle, const char* url, const char* options) { return media_prepare(handle, url, options); } int media_recorder_reset(void* handle) { if (!handle) return -EINVAL; media_close_socket(handle); return media_proxy_once(handle, NULL, "reset", NULL, 0, NULL, 0); } ssize_t media_recorder_read_data(void* handle, void* data, size_t len) { return media_process_data(handle, false, data, len); } int media_recorder_get_sockaddr(void* handle, struct sockaddr_storage* addr) { return media_get_sockaddr(handle, addr); } int media_recorder_get_socket(void* handle) { return media_get_socket(handle); } void media_recorder_close_socket(void* handle) { media_close_socket(handle); } int media_recorder_start(void* handle) { return media_proxy_once(handle, NULL, "start", NULL, 0, NULL, 0); } int media_recorder_pause(void* handle) { return media_proxy_once(handle, NULL, "pause", NULL, 0, NULL, 0); } int media_recorder_stop(void* handle) { if (!handle) return -EINVAL; media_close_socket(handle); return media_proxy_once(handle, NULL, "stop", NULL, 0, NULL, 0); } int media_recorder_set_property(void* handle, const char* target, const char* key, const char* value) { return media_proxy_once(handle, target, key, value, 0, NULL, 0); } int media_recorder_get_property(void* handle, const char* target, const char* key, char* value, int value_len) { return media_proxy_once(handle, target, key, NULL, 0, value, value_len); } int media_recorder_take_picture(char* params, char* filename, size_t number) { int ret = 0; MediaIOPriv* priv; if (!number || number > INT_MAX) return -EINVAL; priv = calloc(1, sizeof(MediaIOPriv)); if (!priv) return -ENOMEM; sem_init(&priv->sem, 0, 0); priv->cookie = media_recorder_start_picture(params, filename, number, media_recorder_take_picture_cb, priv); if (!priv->cookie) { free(priv); return -EINVAL; } sem_wait(&priv->sem); sem_destroy(&priv->sem); ret = priv->result; free(priv); return ret; } void* media_recorder_start_picture(char* params, char* filename, size_t number, media_event_callback event_cb, void* cookie) { char option[32]; void* handle = NULL; int ret; if (!number || number > INT_MAX) return NULL; handle = media_recorder_open(params); if (!handle) return NULL; ret = media_recorder_set_event_callback(handle, cookie, event_cb); if (ret < 0) goto error; snprintf(option, sizeof(option), "total_number=%zu", number); ret = media_recorder_prepare(handle, filename, option); if (ret < 0) goto error; ret = media_recorder_start(handle); if (ret < 0) goto error; return handle; error: media_recorder_close(handle); return NULL; } int media_recorder_finish_picture(void* handle) { return media_recorder_close(handle); }
最新发布
07-11
namespace android::compositionengine::impl { #define HDR_HBM_RENDER_INTENT 257 #define DELAY_FRAMES 30 #define PROFESSIONAL_COLORMODE 0 OplusOutput::OplusOutput(android::compositionengine::impl::Output* output) : mOutput(output), mDisplay(nullptr) { // just regard mDisplay==nullptr as the ScreenCaptureOutput simply. mIsScreenCaptureOutput = true; mOutput->mIsVirtual = true; init(); } OplusOutput::OplusOutput(android::compositionengine::impl::Display* display) : mOutput(display), mDisplay(display) { char value[PROPERTY_VALUE_MAX]; property_get("persist.oplus.display.enable_direct_mode", value, "0"); mDirectModeOn = atoi(value); #ifdef OPLUS_FEATURE_COLOR_MANAGER if (OplusSurfaceFlinger::getInstance()->mColorManagerSupport) { mColorManager = sp<android::ColorManager>::make(display); } #endif #ifdef OPLUS_FEATURE_SCHED_ASSIST mClientFreqLevel = base::GetUintProperty<uint32_t>("debug.sf.client.freq.level", 0); mClientMigrLevel = base::GetUintProperty<uint32_t>("debug.sf.client.migr.level", 0); mEnableClientBoost = (mClientFreqLevel > 0) && (mClientMigrLevel > 0); #endif /* OPLUS_FEATURE_SCHED_ASSIST */ } void OplusOutput::init() { mDebugName = [this] { if (mIsScreenCaptureOutput) { return std::string("screenshot"); } using namespace std::string_literals; std::string name = "Display "s + to_string(mDisplay->getDisplayId().value_or(*DisplayId::fromValue(-1))) + " ("s; if (!mOutput->mIsVirtual) { name += mOutput->mIsInternal ? "internal"s : "external"s; } else { name += "virtual"s; } if (mOutput->mIsPrimary) { name += ", primary"s; } return name + ", \""s + mOutput->getName() + "\")"s; } (); mDisplayType = OPlusLayerUtil::getInstance().getDisplayType(mDebugName); } void OplusOutput::setPowerMode(hardware::graphics::composer::hal::PowerMode mode) { mPowerMode = mode; } void OplusOutput::updateSnapshotByDisplay(sp<android::compositionengine::LayerFE> &layerFE) { auto &snapshot = *layerFE->editSnapshot(); auto &oState = snapshot.oState; auto layerType = oState.layerType; auto oplusFlinger = OplusSurfaceFlinger::getInstance(); const std::string& displayName = mOutput->getName(); #if defined(OPLUS_BUG_STABILITY) && defined(QCOM_ONLY_CHANGES) // wangkaiwen@MULTIMEDIA.DISPLAY.SF, 2023/07/27, Bug Fix: 5853702. if (snapshot.oState.boostGPU && mOutput->mIsPrimary) { oplusFlinger->set_gpu_freq(oplusFlinger->mBoostGPULevel, oplusFlinger->mBoostGPUDuration); snapshot.oState.boostGPU = false; snapshot.oState.boostGPUFinished = true; } #endif /* OPLUS_BUG_STABILITY && QCOM_ONLY_CHANGES */ #if defined (OPLUS_FEATURE_SHARPNESS) && defined(QCOM_ONLY_CHANGES) if (Sharpness::getInstance()->isSupport() && oState.layerClass == VIG_TYPE) { #ifdef OPLUS_FEATURE_EDR if (!EDREngine::getInstance()->needUpdateDimmingParameter(mOutput->getDisplayId())) { snapshot.qtiLayerClass = oState.layerClass; } #else snapshot.qtiLayerClass = oState.layerClass; #endif } #endif /* visible */ // Notice: Never modify snapshot.isVisible from true to false on CE, // which will cause CE can't meet it again, and this layer // will be inVisible FOREVER. if (!snapshot.isVisible) { return; } oState.oplusIsVisible = true; // reset for each display. #ifdef OPLUS_FEATURE_ONSCREENFINGERPRINT oState.oplusIsVisible = FPInstance()->isVisible(&snapshot, mOutput->mIsInternal || mDisplayType.test(eDisplayTypeOlcMedia)); if (!oState.oplusIsVisible) { return; } 解释上述代码的作用
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值