System.setProperty vs adb setprop (Android SystemProperties)

在 Android 开发中,经常会遇到两种"属性"设置方式,它们虽然名字相似,但作用域和机制完全不同。

1. System.setProperty (Java System Properties)

这是标准的 Java 机制,用于在 Java 虚拟机 (JVM) 层面设置键值对。

  • 作用域 (Scope) : 仅限于当前进程 (Current Process)。
    • 设置的属性只在当前 App 或当前 Java 进程的内存中有效。
    • 其他 App 或系统进程无法读取到这个值。
  • 生命周期 (Lifecycle) : 非持久化
    • 进程重启后,属性丢失。
  • 访问方式 (Access) :
    • System.setProperty("key", "value"); //设置属性
    • System.getProperty("key");//读取属性
  • 用途 :
    • 用于库的配置(例如配置 Log4j,或者某些 SDK 的初始化参数)。
    • 在同一个进程的不同模块间传递简单的全局配置。

2. adb setprop (Android System Properties)

这是 Android 操作系统特有的属性系统,底层由 init 进程维护,存储在共享内存区域。

  • 作用域 (Scope) : 系统全局 (System-wide)。
    • 一旦设置,系统中的所有进程(只要有权限)都可以读取到这个值。
    • 常用于跨进程通信、系统功能开关、调试标记。
  • 生命周期 (Lifecycle) :
    • 普通属性 : 重启后丢失 (例如 debug., sys., log. 开头的属性)。
    • 持久化属性 : 以 persist. 开头的属性会将值写入磁盘 (/data/property/),重启后依然有效
  • 访问方式 (Access) :
    • 命令行 (ADB):
      • 设置: adb shell setprop <key> <value>
      • 读取: adb shell getprop <key>
    • 代码 (Android):
      • android.os.SystemProperties.get("key", "default");
      • android.os.SystemProperties.set("key", "value"); (通常需要系统权限/Root 权限)
  • 权限 :
    • 读取通常比较宽松。
    • 设置 (set) 通常受到 SELinux 策略的严格限制,普通 App 无法随意 setprop,通常只有系统进程或 Root 后的 Shell 才能设置。

总结对比

特性 System.setProperty (Java) adb setprop (Android SystemProperties)
底层机制 JVM 内存 Map Android OS 共享内存 (Property Service)
作用范围 仅当前进程 全局 (所有进程可见)
持久化 否 (进程重启即失效) persist. 开头可持久化,其他重启失效
权限要求 无 (进程内随意设置) 严格 (设置通常需 System/Root 权限)
典型用途 库配置、进程内全局变量 系统开关、跨进程标志、调试开关

代码示例

Java Property

复制代码
System.setProperty("my.app.debug", "true"); // 设置 
String isDebug = System.getProperty("my.app.debug");// 读取 

Android System Property

复制代码
//命令行设置 (需要权限)
# adb shell setprop log.tag.MyTag true


// 代码读取 
SystemProperties.getBoolean("log.tag.MyTag", false);
相关推荐
Channing Lewis7 小时前
mysql.connector.errors.OperationalError: 1040 (08004): Too many connections
数据库·mysql·adb
Railshiqian7 小时前
通过adb命令获取某个window或View/子View的绘制内容并输出为png图片的方法
android·adb·dump view
XI锐真的烦7 小时前
新手该如何选择 Android 开发框架?
android
weixin_439706257 小时前
Windows MySQL的主从复制配置记录
windows·mysql·adb
走在路上的菜鸟7 小时前
Android学Dart学习笔记第二十六节 并发
android·笔记·学习·flutter
00后程序员张7 小时前
AppStoreInfo.plist 在苹果上架流程中的生成方式和作用
android·小程序·https·uni-app·iphone·webview
成都大菠萝7 小时前
2-2-10 快速掌握Kotlin-out协变
android
成都大菠萝7 小时前
2-2-8 快速掌握Kotlin-vararg关键字与get函数
android
成都大菠萝7 小时前
2-2-7 快速掌握Kotlin-泛型类型约束
android