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();
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

二.获取和设置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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(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'
   ...
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

上面的配置实现默认添加签名文件,需要在自己的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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

猜你喜欢

转载自blog.csdn.net/LoongEmbedded/article/details/81014324
今日推荐