android framework 基础篇.系统属性 & 跨进程 API

84 阅读6分钟

📢 1. 职业规划篇

来聊聊安卓职业规划?整机开发大专能做么?

📢 2.基础篇

基础篇.前言

基础篇.编译环境搭建

基础篇.源码目录简介

基础篇.系统 mk_bp 讲解

基础篇.开机动画定制

基础篇.定制桌面壁纸、导航方式

基础篇.系统属性、api 使用

基础篇.名称修改、名词介绍

基础篇.用 bugreport 带你看 Crash 和 ANR

基础篇.Provision 源码分析

 

📢 3. 系统应用篇

系统应用篇.开机向导制作一

系统应用篇.开机向导制作二

系统应用篇.Settings 导航切换分析

系统应用篇.开机向导导航切换一

系统应用篇.开机向导导航切换二

系统应用篇.gms 制作集成

系统应用篇.开机向导适配 GMS

系统应用篇.Launcher3 结构剖析一

系统应用篇.Launcher3 结构剖析二

系统应用篇.Launcher3 结构剖析三

系统应用篇.Launcher3 图标加载流程一

系统应用篇.Launcher3 图标加载流程二

系统应用篇.Launcher3 桌面布局定制

系统应用篇.解密 Partner、google PAI 机制

系统应用篇.Partner 机制预制壁纸、默认布局

系统应用篇.Launcher 双排 Hotseat 定制一

系统应用篇.Launcher 双排 Hotseat 定制二

系统应用篇.Launcher 双排 Hotseat 定制三

系统应用篇.Launcher Taskbar 简介以及调出

系统应用篇.SystemUI 篇_用工具教会你看布局、进程

系统应用篇.SystemUI 结构讲解一

系统应用篇.SystemUI 结构讲解二

系统应用篇.SystemUI 的启动流程

系统应用篇.SystemUI 导航栏创建一

系统应用篇.SystemUI 导航栏创建二

系统应用篇.SystemUI 自定义导航按键

系统应用篇.SystemUI 快捷面板下拉流程

系统应用篇.SystemUI 定制禁用锁屏下拉通知栏

系统应用篇.SystemUI 通知注册流程

系统应用篇.SystemUI 通知发送流程

 

📢 4. 系统篇

系统篇.SystemServer 篇_应用与系统进程间关系

系统篇.SystemServer 简介、自定义 Service 服务一

系统篇.SystemServer 简介、自定义 Service 服务二

系统篇.SystemServer 简介、自定义 Service 服务三

系统篇.SystemServer 简介、自定义 Service 服务四

系统篇.SELinux 问题解决套路一

系统篇.SELinux 问题解决套路二

系统篇.ActivityManagerService 简介

系统篇.WindowManagerService 简介一

系统篇.WindowManagerService 简介二

系统篇.PackageManagerService 简介一

系统篇.PackageManagerService 简介二

系统篇.FW 实战 - Letterbox 定制应用方向一

系统篇.FW 实战 - Letterbox 定制应用方向二

系统篇.分屏流程一

系统篇.分屏流程二

 

📢 5. 性能篇

(省)低内存优化

性能篇 (省). 低内存查杀机制

性能篇 (省).SystemServer 与 LMK 的 socket 通信

性能篇 (省). 内核进程 LMKD

性能篇 (省). 内存分析

性能篇 (省). 内存泄漏定位与解决

(稳)稳定性优化

性能篇 (稳).WatchDog 检测机制一

性能篇 (稳).WatchDog 检测机制二

性能篇 (稳). 深入 Crash 捕获器流程一

性能篇 (稳). 深入 Crash 捕获器流程二

性能篇 (稳). 深入炸弹 ANR 流程一

性能篇 (稳). 深入炸弹 ANR 流程二

(快)开机优化

性能篇 (快). 开机耗时分析

性能篇 (快). 开机耗时优化

性能篇.实战优化方案分享

framework交流,答疑:251662478

 

🔥 深入解析 Android 系统属性 & 跨进程 API:SystemProperties、ContentObserver 的使用

—— 开发 AOSP、定制 ROM 必备技能!

在 Android 系统开发中,我们经常需要在不同进程间传递 系统级配置、设备信息、开关状态 等数据。

Google 提供了 SystemProperties & ContentObserver 作为 跨进程 API,帮助我们 安全、高效地获取 & 监听系统属性

今天,我们就来深入解析 SystemProperties & ContentObserver 的使用场景、代码示例、底层实现原理!🚀


 

🔹 1. 什么是 SystemProperties?

SystemProperties(系统属性) 是 Android 提供的一套 跨进程的 key-value 存储机制,用于存储系统配置参数。

📌 作用:

  • 存储 & 读取 系统级别的配置(如 ro.build.version.sdk 获取 Android 版本号)。
  • 各进程间共享数据(跨进程访问,类似 全局变量)。
  • 用于设备适配(不同机型可以通过 ro.product.device 读取设备信息)。
  • 系统 & 应用控制开关(如 persist.sys.theme_mode 控制深色模式)。

📌 存储位置:

  • Android 系统属性存储在内核共享内存中(基于 property_service)。
  • 读取时,不需要 IPC 通信,非常高效。

 

🔹 2. SystemProperties 代码示例

📌 2.1 读取系统属性

Java 代码:

import android.os.SystemProperties;


public class SystemPropertyDemo {
    public static void main(String[] args) {
        // 读取 Android 版本
        String sdkVersion = SystemProperties.get("ro.build.version.sdk");
        System.out.println("Android SDK Version: " + sdkVersion);


        // 读取设备型号
        String deviceModel = SystemProperties.get("ro.product.model", "Unknown");
        System.out.println("Device Model: " + deviceModel);
    }
}

📌 参数解析:

  • SystemProperties.get("ro.build.version.sdk")
    • 获取 系统 SDK 版本(如 Android 13 返回 33)。
  • SystemProperties.get("ro.product.model", "Unknown")
    • 带默认值,如果属性不存在,返回 "Unknown"

 

📌 2.2 设置系统属性

📌 只能在 system 进程 或 具有 android:sharedUserId="android.uid.system" 权限的 APP 设置系统属性

SystemProperties.set("persist.sys.theme_mode", "dark");

📌 常见属性示例:

属性名称作用
ro.build.version.release获取 Android 版本(如 13)
ro.product.model设备型号
persist.sys.theme_mode主题模式(light / dark)
ro.debuggable设备是否可调试 (1 = 是, 0 = 否)

 

🔹 3. 什么是 ContentObserver?

ContentObserverAndroid 提供的跨进程监听机制,可以监听 数据库、系统设置 变化。

📌 作用:

  • 监听系统属性变化(如 Settings.System.SCREEN_BRIGHTNESS 屏幕亮度变化)。
  • 监听数据库变更(如短信、联系人、WiFi 设置变化)。
  • 监听自定义 ContentProvider 变更(适用于 进程间通信)。

 

🔹 4. ContentObserver 代码示例

📌 4.1 监听系统亮度变化

 

import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
import android.content.Context;


public class BrightnessObserver extends ContentObserver {
    private Context context;


    public BrightnessObserver(Handler handler, Context context) {
        super(handler);
        this.context = context;
    }


    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        try {
            int brightness = Settings.System.getInt(
                context.getContentResolver(),
                Settings.System.SCREEN_BRIGHTNESS
            );
            System.out.println("屏幕亮度变化:" + brightness);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


// 注册监听器
public void registerBrightnessObserver(Context context) {
    Handler handler = new Handler();
    BrightnessObserver observer = new BrightnessObserver(handler, context);
    Uri uri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
    context.getContentResolver().registerContentObserver(uri, false, observer);
}

📌 关键解析:

  • Settings.System.SCREEN_BRIGHTNESS系统亮度设置项
  • context.getContentResolver().registerContentObserver(uri, false, observer)注册监听

 

📌 4.2 监听系统音量变化

 

Uri volumeUri = Settings.System.getUriFor(Settings.System.VOLUME_MUSIC);
context.getContentResolver().registerContentObserver(volumeUri, false, new ContentObserver(new Handler()) {
    @Override
    public void onChange(boolean selfChange) {
        int volume = Settings.System.getInt(context.getContentResolver(), Settings.System.VOLUME_MUSIC, 0);
        System.out.println("系统音量变化:" + volume);
    }
});

 

🔹 5. SystemProperties vs ContentObserver 对比

| 功能 | SystemProperties | ContentObserver | |---|---| | 数据存储位置 | 共享内存 | SQLite、ContentProvider | | 跨进程支持 | ✅ 是 | ✅ 是 | | 是否支持监听 | ❌ 不支持 | ✅ 支持 | | 适用场景 | 获取系统属性 | 监听数据库/设置变更 | | 修改方式 | SystemProperties.set | 通过 Settings.System.put 修改 |


 

🔹 6. SystemProperties & ContentObserver 结合使用

📌 监听 SystemProperties 变化,需要用 ContentObserver

 

Uri uri = Settings.System.getUriFor("persist.sys.theme_mode");
context.getContentResolver().registerContentObserver(uri, false, new ContentObserver(new Handler()) {
    @Override
    public void onChange(boolean selfChange) {
        String themeMode = SystemProperties.get("persist.sys.theme_mode", "light");
        System.out.println("主题模式变更:" + themeMode);
    }
});

 

🔹 7. 总结

  1. SystemProperties 用于 存储 & 读取 系统级别的配置,但 不能监听变化
  2. ContentObserver 可以 监听系统设置、数据库 变化,适用于 动态监控 需求。
  3. SystemProperties + ContentObserver 结合使用,可以实现 系统属性监听,适用于 主题切换、模式变更等场景
  4. 系统级 APP(如 SettingsSystemUI) 广泛使用 SystemProperties 进行 设备适配 & ContentObserver监听系统变化

 

🔥 你学会了吗?欢迎留言交流! 🚀