Android 使用反射机制获取或设置系统属性(SystemProperties)
16lz
2021-01-23
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属性设置的文件位置,我也不太搞得清楚!网上看了很多,但是发现和我的开发板情况不一样。
共勉:一个人老去的时候,最痛苦的事情不是失败,而是我本可以!
更多相关文章
- Android LayoutInflater加载.xml文件原理分析
- HierarchyView的实现原理和Android设备无法使用HierarchyView的
- ffmpeg入门教程之Android使用FFmpeg so(API文件格式转换)
- Android布局中的android:onClick=“...”属性
- android gridview几个重要属性
- Android-TextView属性ellipsize多行失效的解决思路
- ANDROID对文件的操作
- android ListView的属性
- Android样式基础--属性动画((Property Animation)篇