Android 使用反射机制获取或设置系统属性(SystemProperties)

网上有很多介绍,但是感觉比较混乱!由于自己能力有限,只做一些简单易懂的介绍。

一.获取和设置SystemProperties属性的代码

下面是通过反射来获取和设置系统属性的代码

public final class ReflectUtil {    public static String getProperty(String key, String defaultValue) {        String value = defaultValue;        try {            Class<?> c = Class.forName("android.os.SystemProperties");            Method get = c.getMethod("get", String.class, String.class);            value = (String)(get.invoke(c, key, defaultValue));        } catch (Exception e) {            e.printStackTrace();        }finally {            return value;        }    }    public static void setProperty(String key, String value) {        try {            Class<?> c = Class.forName("android.os.SystemProperties");            Method set = c.getMethod("set", String.class, String.class);            set.invoke(c, key, value);        } catch (Exception e) {            e.printStackTrace();        }    }}

没错就那么简单!但是一般人和一般设备不支持,因为权限问题!后面会说到。

二.获取和设置SystemProperties属性要注意的地方

1.普通市面上的手机,一般没有root权限

即使获取得到,也会有其他问题,所以设置这个系统属性SystemProperties的设备一般是公司自己的主板,或者公司拥有板子Android源码和编译使用权限的。

2.必须要有system和root权限

即使自己的主板,在有root权限下,还有把自己设计的程序添加system权限,才能设置SystemProperties属性。

(1)在AndroidManifest.xml中,在manifest加入android:sharedUserId=”android.uid.system”。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.xxx.liwen"    android:sharedUserId="android.uid.system"    >    ...manifest>

(2)添加了shareUserId之后,我们的程序是不能正常安装到Android设备上的

他会一直提示,要卸载之前的应用之类的语句。

但其实是需要签名的原因!我们需要在Android安装前把签名添加进去才能都正常安装。

手动添加签名文件生成apk是一个方法。

但是最好是使用app中的build.gradle进行设置每次安装的时候添加签名进去。

apply plugin: 'com.android.application'android {    compileSdkVersion 26    defaultConfig {        applicationId "com.project.liwen"        minSdkVersion 21        targetSdkVersion 26    }    //声明签名文件    signingConfigs {        release {            storeFile file("../certificate/xxx.jks") //文件路径            storePassword '文件密码'            keyAlias '作者'            keyPassword '使用密码'        }    }    buildTypes {        //调试模式下,生成的apk添加签名文件        debug {            signingConfig signingConfigs.release        }        //版本模式下,生成的apk添加签名文件        release {                        signingConfig signingConfigs.release           ...        }    }}dependencies {    implementation fileTree(include: ['*.jar'], dir: 'libs')    implementation 'com.android.support:appcompat-v7:26.1.0'   ...}

上面的配置实现默认添加签名文件,需要在自己的app同一级文件目录下添加一个文件夹certificate,然后把签名文件添加进去。

三.获取和设置SystemProperties属性的示例

这里演示设置Android设备启动和关闭WiFi adb功能的代码

wifi adb指的是,该设备设置了时候,可以通过同一个wifi网络来实现电脑对Android设备的adb实现,而不需要用像以前那样使用数据线。

属性persist.adb.tcp.port是控制是否能实现WiFi adb的关键。

这里使用了最开始展示的反射工具类。

 //获取属性,判断设备是否可以实现wifi adb功能  String property = ReflectUtil.getProperty("persist.adb.tcp.port", "0");  Log.i(TAG, "property : " + property);  //设置设备可以使用WiFi adb功能  ReflectUtil.setProperty("persist.adb.tcp.port", "5555");  //关闭设备WiFi adb功能  ReflectUtil.setProperty("persist.adb.tcp.port", "0");

到这里设置SystemProperties的属性的用法已经和大家说的很明白了。

但是关于SystemProperties属性设置的文件位置,我也不太搞得清楚!网上看了很多,但是发现和我的开发板情况不一样。

共勉:一个人老去的时候,最痛苦的事情不是失败,而是我本可以!

更多相关文章

  1. Android LayoutInflater加载.xml文件原理分析
  2. HierarchyView的实现原理和Android设备无法使用HierarchyView的
  3. ffmpeg入门教程之Android使用FFmpeg so(API文件格式转换)
  4. Android布局中的android:onClick=“...”属性
  5. android gridview几个重要属性
  6. Android-TextView属性ellipsize多行失效的解决思路
  7. ANDROID对文件的操作
  8. android ListView的属性
  9. Android样式基础--属性动画((Property Animation)篇

随机推荐

  1. android中http访问总结
  2. Android(安卓)SDK 2.2 下载安装方法
  3. Android(安卓)属性动画 源码解析 深入了
  4. android系统信息(内存、cpu、sd卡、电量、
  5. Android中使用log4j
  6. Android中GridView组件的使用
  7. Android(安卓)事件触发机制
  8. Android热插拔事件处理流程--Vold
  9. 关于Android方法数量限制的问题
  10. Android(安卓)HLS协议相关记录及部分解析