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 26defaultConfig {applicationId "com.project.liwen"minSdkVersion 21targetSdkVersion 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屬性設置的文件位置,我也不太搞得清楚!網上看了很多,但是發現和我的開發板情況不一樣。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Android 使用反射机制获取或设置系统属性(SystemProperties)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Java代码在应用层获取Androi
- 下一篇: 高通平台android7.1系统显示旋转