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

來源:互聯網
上載者:User

標籤:android   style   http   io   color   os   ar   使用   java   

簡介:

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

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

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

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     }

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*。*/

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 }




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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.