当前位置: 首页 > wzjs >正文

网站建设的维护工作有哪些图跃网站建设

网站建设的维护工作有哪些,图跃网站建设,网站后台慢,网页游戏开服表最全aosp开发中,遇到从上层做开关,hal层做判断的需要,比如控制摄像头使用。这时候就需要找一个属性可以在java和c c 层同时操作的属性,系统学习了下属性存储,在此记录! 1. 什么是 SystemProperties SystemProp…

aosp开发中,遇到从上层做开关,hal层做判断的需要,比如控制摄像头使用。这时候就需要找一个属性可以在java和c c++ 层同时操作的属性,系统学习了下属性存储,在此记录!

1. 什么是 SystemProperties

SystemProperties 是 Android 系统提供的一种键值对存储机制,用于管理全局配置属性。这些属性通常用于控制系统行为、硬件功能或调试选项。它们在系统启动时由 init 进程加载,并在运行时可被修改(视权限而定)。

  • 存储位置: 属性通常存储在内存中,部分持久化属性(如以 persist. 开头的)会保存到文件中(例如 /data/property/)。
  • 访问方式: 提供 Java 和 C/C++ 两种 API,分别用于应用层和原生层。
  • 权限: 系统属性分为只读和读写属性,修改通常需要系统权限(root 或 system 用户)。

2. Java 层:SystemProperties 类

2.1 原理

在 Java 层,SystemProperties 是 Android SDK 提供的一个工具类,位于 android.os.SystemProperties 包中。它通过 JNI(Java Native Interface)调用底层的 C/C++ 属性服务(property_service),间接与 Android 的属性系统交互。

  • 底层实现: 调用 libandroid_runtime.so 中的 native 方法,最终映射到 libcutils 的 property_get 和 property_set 函数。
  • 权限限制: 在普通应用中,SystemProperties.set 可能因权限不足而失败,通常需要系统签名或运行在系统进程中。

2.2 API

  • 读取: SystemProperties.get(String key, String def)
    • key: 属性名。
    • def: 默认值(若属性不存在则返回)。
    • 返回: 属性值的字符串。
  • 写入: SystemProperties.set(String key, String value)
    • key: 属性名。
    • value: 要设置的值。

2.3 示例代码

import android.os.SystemProperties;public class PropertyDemo {private static final String KEY = "persist.sys.flyscale.cam";// 读取属性public static boolean isCameraEnabled() {String value = SystemProperties.get(KEY, "1"); // 默认值为 "1"return "1".equals(value);}// 写入属性public static void setCameraEnabled(boolean enabled) {try {SystemProperties.set(KEY, enabled ? "1" : "0");System.out.println("Set " + KEY + " to " + (enabled ? "1" : "0"));} catch (Exception e) {System.err.println("Failed to set property: " + e.getMessage());}}public static void main(String[] args) {// 测试读取boolean enabled = isCameraEnabled();System.out.println("Camera enabled: " + enabled);// 测试写入setCameraEnabled(false);System.out.println("Camera enabled after set: " + isCameraEnabled());}
}


3. C++ 层:property_get 和 property_set

3.1 原理

在 C++ 层,属性操作通过 <cutils/properties.h> 提供的函数实现。这些函数直接与 Android 的属性服务(property_service)通信,后者运行在 init 进程中,负责管理属性内存和持久化存储。

  • 实现: 基于 socket 通信,property_get/set 通过 UNIX 域 socket 与 property_service 交互。
  • 内存管理: 属性存储在共享内存中,property_service 维护一个键值对表。
  • 持久化: 以 persist. 开头的属性会写入 /data/property/ 目录下的文件。

3.2 API

  • 读取: int property_get(const char* key, char* value, const char* default_value)
    • key: 属性名。
    • value: 存储属性值的缓冲区。
    • default_value: 默认值。
    • 返回: 属性值的长度(成功时),或默认值的长度(失败时)。
  • 写入: int property_set(const char* key, const char* value)
    • key: 属性名。
    • value: 要设置的值。
    • 返回: 0 表示成功,非 0 表示失败。

3.3 示例代码

#include <cutils/properties.h>
#include <string.h>
#include <stdio.h>// 检查 Flyscale 摄像头是否启用
static bool isFlyscaleCameraEnabled() {char propValue[PROPERTY_VALUE_MAX];property_get("persist.sys.flyscale.cam", propValue, "1"); // 默认启用bool enabled = (strcmp(propValue, "1") == 0);return enabled;
}// 设置 Flyscale 摄像头启用状态
static int setFlyscaleCameraEnabled(bool enabled) {const char* value = enabled ? "1" : "0";int result = property_set("persist.sys.flyscale.cam", value);if (result == 0) {printf("Set persist.sys.flyscale.cam to %s\n", value);} else {printf("Failed to set property: %d\n", result);}return result;
}int main() {// 测试读取bool enabled = isFlyscaleCameraEnabled();printf("Camera enabled: %d\n", enabled);// 测试写入setFlyscaleCameraEnabled(false);printf("Camera enabled after set: %d\n", isFlyscaleCameraEnabled());return 0;
}

4. 理论对比

特性Java 层 (SystemProperties)C++ 层 (property_get/set)
调用方式通过 JNI 间接调用直接调用原生函数
适用场景应用层(Activity、服务等)原生层(HAL、系统服务等)
返回值字符串(String)长度(int)或状态码
缓冲区管理内部处理,无需手动分配需手动分配字符数组(如 PROPERTY_VALUE_MAX)
异常处理抛出异常(需 try-catch)返回错误码(需检查)
性能因 JNI 有额外开销,略慢直接调用,性能更高
权限要求系统签名或 root 权限取决于调用者的进程权限

5. 实际应用场景

5.1 Java 层

  • 设置应用: 如前文 CustomFunctionSettingActivity,通过 UI 修改属性。
  • 调试工具: 在应用中动态开关功能。

5.2 C++ 层

  • 硬件抽象层 (HAL): 检查硬件启用状态。
  • 系统服务: 如 AudioFlinger 或 CameraService,根据属性调整行为。

5.3 属性同步

  • Java 层设置的属性会立即反映到 C++ 层,反之亦然,因为它们共享同一个底层存储。

6. 示例:Java 和 C++ 协同工作

假设我们要实现一个摄像头开关功能:

  1. Java UI 层(设置界面):

    java

  2. Switch cameraSwitch = findViewById(R.id.swbtn_camera);
    cameraSwitch.setChecked(SystemProperties.get("persist.sys.flyscale.cam", "1").equals("1"));
    cameraSwitch.setOnCheckedChangeListener((button, isChecked) -> {SystemProperties.set("persist.sys.flyscale.cam", isChecked ? "1" : "0");
    });

  3. C++ 驱动层(检查状态):
    bool isCameraActive() {char value[PROPERTY_VALUE_MAX];property_get("persist.sys.flyscale.cam", value, "1");return strcmp(value, "1") == 0;
    }

  4. 运行流程:
    • 用户在 UI 中打开开关,Java 层将属性设为 "1"。
    • C++ 层检测到属性为 "1",启用摄像头。

7. 注意事项

7.1 权限

  • Java: 非系统应用调用 set 会抛出 SecurityException,需在 AndroidManifest.xml 中声明 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />(但仍需系统签名)。
  • C++: 在用户态运行可能失败,需确保调用者有 system 或 root 权限。

7.2 属性长度

  • PROPERTY_VALUE_MAX(通常 92 字节)限制了属性值的长度,超出部分会被截断。

7.3 持久化

  • 以 persist. 开头的属性会保存到 /data/property/,重启后保留。
  • 普通属性(如 sys.)重启后丢失。

7.4 测试方法

  • 命令行:
    adb shell getprop persist.sys.flyscale.cam # 查看属性
    adb shell setprop persist.sys.flyscale.cam 0 # 设置属性

  • 重启验证: 检查持久化属性是否生效。

8. 总结

  • Java 层适合快速开发和 UI 交互,依赖 JNI。
  • C++ 层更高效,适合底层模块直接操作。
  • 二者通过同一属性系统通信,实现跨层协作。

文章转载自:

http://2vyO730L.qxycf.cn
http://GCJvHPJ0.qxycf.cn
http://T4ZTBgVk.qxycf.cn
http://oizmnu2n.qxycf.cn
http://cnxxGUuk.qxycf.cn
http://DCcr4qki.qxycf.cn
http://LAQ8Mp7U.qxycf.cn
http://tTWuQM4w.qxycf.cn
http://xM1ZJPQY.qxycf.cn
http://jfUZiBo8.qxycf.cn
http://ZIQa9xCd.qxycf.cn
http://TktHWaNv.qxycf.cn
http://bwPmQeMw.qxycf.cn
http://cZoT4ju8.qxycf.cn
http://dNqgAYOy.qxycf.cn
http://NeM5nKh1.qxycf.cn
http://tlHIzJzE.qxycf.cn
http://G039KNHS.qxycf.cn
http://ojvdfPMD.qxycf.cn
http://XapvMT5f.qxycf.cn
http://onSVeav0.qxycf.cn
http://3qVPxaFU.qxycf.cn
http://uCJmRkS7.qxycf.cn
http://vYG9uH3O.qxycf.cn
http://bvRaKbxS.qxycf.cn
http://My6YHYxm.qxycf.cn
http://vs5Nmm9T.qxycf.cn
http://n8BnHoSD.qxycf.cn
http://29MjwHHk.qxycf.cn
http://8Np3C2dG.qxycf.cn
http://www.dtcms.com/wzjs/725432.html

相关文章:

  • 宁夏住房建设厅网站企业宣传片脚本
  • 免备案域名购买网站厦门网站制作阳哥
  • 网站 粘度北京市建设规划网站
  • 修改网站空间服务器密码云阿里云做网站
  • 企业门户网站开发公司黄骅港务集团有限公司
  • 网站建设与推广长春自己怎么做淘宝网站
  • 网站设计报价是多少钱看房地产的app在哪看
  • 惠州建设局网站做外贸需要关注的网站有什么问题
  • 建设局发公告的网站免费软件漫画
  • 吉林省建设集团有限公司网站网站开发工具比较
  • 商务网站开发与建设论文百度小说官网
  • 用html5做的简单的网站建设网站培训班
  • 大型网站制作软件什么做的网站
  • 天津公司网站如何制作字体设计软件 免费
  • 文明网站机制建设深圳市建设混凝土投标网站
  • 铁岭网站开发公司企业网站建设原则有哪些
  • seo精华网站怎样做seo网站链接
  • 搬瓦工如何搭建做网站兰州网站建设与优化
  • 昆明企业做网站太原师范学院教务网络管理系统
  • 苏州做网站的wordpress 仿微信主题
  • 新手建网站什么类型好wordpress上下篇
  • 东莞公司网站建设教程鞍山在百度做个网站多少钱
  • 学习网站后台维护vs2012怎么做网站
  • 怎么用 c文件做网站企业网站建设的推广方式
  • 网站seo找准隐迅推辽宁工程咨询招投标交易平台
  • 建设网站的价格是多少延吉网站优化
  • 贵州企业网站建设设计网站收录入口
  • 互联网网站项目方案书房屋设计图纸平面图
  • 网站开发连接效果最新款淘宝客源码整网站程序模板+后台带自动采集商品功能带文章
  • 做疏通什么网站推广好微信企业号