修改Android系統屬性SystemProperties.set("sys.powerctl", "shutdown")關機分析

簡介:

        從以前的博文中咱們提到過,關機流程中最後是經過修改Android屬性進行關機操做(SystemProperties.java經過JNI調用訪問系統屬性),固然咱們也能夠經過adb命令修改Android系統屬性執行關機操做,例如adb shell setpro sys.powerctl shutdown,這裏咱們簡單介紹下修改Android屬性關機的原理或流程。java

native_set()<SystemProperties.java>--->SystemProperties_set()<android_os_SystemProperties.cpp>android

這是SystemProperties.java類中設置系統函數的方法。shell

0119     /**
0120      * Set the value for the given key.
0121      * @throws IllegalArgumentException if the key exceeds 32 characters
0122      * @throws IllegalArgumentException if the value exceeds 92 characters
0123      */
0124     public static void set(String key, String val) {
0125         if (key.length() > PROP_NAME_MAX) {
0126             throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
0127         }
0128         if (val != null && val.length() > PROP_VALUE_MAX) {
0129             throw new IllegalArgumentException("val.length > " +
0130                 PROP_VALUE_MAX);
0131         }
0132         native_set(key, val);//SystemProperties.java經過JNI調用訪問系統屬性
0133     }
ide

SystemProperties接口類在初始環境中註冊對應CPP接口android_os_SystemProperties.cpp,實際操做經過JNI調用對應cpp文件,frameworks/base/core/jni/AndroidRuntime.cpp.點擊查看源碼函數

extern int register_android_os_SystemProperties(JNIEnv *env);
frameworks/base/core/jni/android_os_SystemProperties.cpp; 點擊查看完整源碼

0162 static void SystemProperties_set(JNIEnv *env, jobject clazz,
0163                                       jstring keyJ, jstring valJ)
0164 {
0165     int err;
0166     const char* key;
0167     const char* val;
0168 
0169     if (keyJ == NULL) {
0170         jniThrowNullPointerException(env, "key must not be null.");
0171         return ;
0172     }
0173     key = env->GetStringUTFChars(keyJ, NULL);
0174     *從java程序中傳過去的String對象在本地方法中對應的是jstring類型,jstring類型和c中的char*不一樣,若是你直接做爲char*使用的話,就會出錯。所以使用以前須要進行轉換。轉換方式就是GetStringUTFChars(keyJ, NULL)<JNIenv方式>,即將jstring轉換成UTF-8格式的char*。*/spa

0175     if (valJ == NULL) {
0176         val = "";       /* NULL pointer not allowed here */
0177     } else {
0178         val = env->GetStringUTFChars(valJ, NULL);
0179     }
0180 
0181     err = property_set(key, val);
0182 
0183     env->ReleaseStringUTFChars(keyJ, key);
0184     /*釋放指向UTF-8格式的char*的指針*/
0185     if (valJ != NULL) {
0186         env->ReleaseStringUTFChars(valJ, val);
0187     }
0188 
0189     if (err < 0) {
0190         jniThrowException(env, "java/lang/RuntimeException",
0191                           "failed to set system property");
0192     }
0193 }
指針

相關文章
相關標籤/搜索