系统属性调用评估方法介绍
来源:互联网 发布:开票软件金税盘版升级 编辑:程序博客网 时间:2024/05/22 12:12
1.前言
本文档用来介绍《系统属性调用评估报告》中所使用的方法和技术。
2.PropertiesHelper.apk实现
界面效果如下图:
按下【Get Property】,将开始执行10000次获取Brightness属性的方法,执行完毕后将显示出来执行时间,单位是ms。
按下【Set Property】,将开始执行10000次设置Brightness属性的方法,执行完毕后将显示出来执行时间,单位也是ms。
这个APK实现起来非常简单,只将源码粘贴如下:
PropertiesHelperMainUI.java
package com.eyelike.ph;import com.eyelike.propertyhelper.R;import android.app.Activity;import android.content.ContentResolver;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.provider.Settings;import android.provider.Settings.SettingNotFoundException;import android.util.Log;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class PropertyHelperMainUI extends Activity{ private TextView mGetPropTime; private TextView mSetPropTime; private Button mStartGetPropBtn; private Button mStartSetPropBtn; private Handler mHandler; private Handler mHandler2; WindowManager.LayoutParams params; int mGetPropResult = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_ui); mGetPropTime = (TextView) findViewById(R.id.get_prop_time_result_tv); mSetPropTime = (TextView) findViewById(R.id.set_prop_time_result_tv); mStartGetPropBtn = (Button) findViewById(R.id.start_get_prop_btn); mStartSetPropBtn = (Button) findViewById(R.id.start_set_prop_btn); mHandler = new MyHandler(); mHandler2 = new MyHandler(); mStartGetPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(PropertyHelperMainUI.this, "This will take a little long time.", Toast.LENGTH_SHORT).show(); mStartGetPropBtn.setEnabled(false); //String prop = System.getProperty(); //int prop = SystemProperties.getInt("def_kernel_about_phone"); Thread mThread1 = new Thread(new Runnable() { public void run() { ContentResolver cr = getContentResolver(); int i = 0; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { mGetPropResult = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS); } catch (SettingNotFoundException e) { } ++i; } long mGetTime = System.currentTimeMillis() - mStartTime; Log.e("time", "Time is:" + mGetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "Get"); mBundle.putInt("BRIGHTNESS", mGetPropResult); mBundle.putLong("TIME", mGetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler.sendMessage(mMessage); } }); mThread1.start(); } }); mStartSetPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(PropertyHelperMainUI.this, "This will take a little long time.", Toast.LENGTH_SHORT).show(); mStartSetPropBtn.setEnabled(false); params = getWindow().getAttributes(); params.screenBrightness = 50; //String prop = System.getProperty(); //int prop = SystemProperties.getInt("def_kernel_about_phone"); Thread mThread2 = new Thread(new Runnable() { public void run() { int i = 0; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { getWindow().setAttributes(params); } catch (Exception e) { } ++i; } long mSetTime = System.currentTimeMillis() - mStartTime; Log.e("time", "Time is:" + mSetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "Set"); mBundle.putDouble("PARAMS", params.screenBrightness); mBundle.putLong("TIME", mSetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler2.sendMessage(mMessage); } }); mThread2.start(); } }); } class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle mBundle = (Bundle) msg.obj; String mType = mBundle.getString("TYPE"); int mBrightness = mBundle.getInt("BRIGHTNESS"); double mParams = mBundle.getDouble("PARAMS"); long mTime = mBundle.getLong("TIME"); if (("Get").equals(mType)) { mGetPropTime.setText("Value is: " + mTime + " Brightness is: " + mBrightness); mStartGetPropBtn.setEnabled(true); } if (("Set").equals(mType)) { mSetPropTime.setText("Value is: " + mTime + " Params is: " + mParams); mStartSetPropBtn.setEnabled(true);// ContentResolver cr = getContentResolver();// saveBrightness(cr, 5); } } } /** * 保存亮度设置状态 */ public static void saveBrightness(ContentResolver resolver, int brightness) { Uri uri = android.provider.Settings.System.getUriFor("screen_brightness"); android.provider.Settings.System.putInt(resolver, "screen_brightness", brightness); resolver.notifyChange(uri, null); }}
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.eyelike.propertyhelper" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.eyelike.ph.PropertyHelperMainUI"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" /></manifest>
values/strings.xml
<resources> <string name="app_name">PropertyHelper</string> <string name="start_get_prop">Start get property</string> <string name="start_set_prop">Start set property</string> <string name="get_prop_time">Get Property Time</string> <string name="set_prop_time">Set property Time</string> <string name="warn_msg">Run 10000 times, you need wait for a little long time.</string></resources>
layout/main_ui.xml
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/get_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_prop_time" /> <TextView android:id="@+id/get_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_get_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_get_prop" /> <TextView android:id="@+id/set_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/set_prop_time" /> <TextView android:id="@+id/set_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_set_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_set_prop" /> </LinearLayout></ScrollView>
3.SettingsPropertiesCalculator实现
这部分是通过系统源码环境进行实现的。由于个人对Settings比较熟悉,所以就将功能直接集成在Settings设置中了。其他人也可以直接实现一个类似于Note或者MusicePlayer这样的系统APK应用,主要代码都不需要太多改变。
界面效果如下图:
下面介绍一下改动的地方,也以源码形式粘贴出来。
packages/apps/Settings/Manifest.xml添加如下代码块:
<!-- add by eyelike at 2015-1-27 for PropertiesSettings --> <activity android:name="Settings$PropertiesCalculatorSettingsActivity" android:label="@string/properties_calculator_settings" android:taskAffinity="" android:excludeFromRecents="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.android.settings.SHORTCUT" /> </intent-filter> <meta-data android:name="com.android.settings.FRAGMENT_CLASS" android:value="com.android.settings.PropertiesCalculatorSettings" /> <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID" android:resource="@id/properties_calculator_settings" /> </activity>
packages/apps/Settings/res/xml/settings_headers.xml添加如下代码块:
<!-- Add by eyelike at 2015-1-27 for PropertiesCalculator --> <header android:id="@+id/properties_calculator_settings" android:fragment="com.android.settings.PropertiesCalculatorSettings" android:icon="@drawable/ic_settings_about" android:title="@string/properties_calculator_settings" />
packages/apps/Settings/res/values/strings.xml添加如下代码块:
<!-- add by eyelike at 2015-1-27 for PropertiesCalculator --> <string name="properties_calculator_settings">PropertiesSettings</string> <string name="start_set_prop">Start set property</string> <string name="start_get_prop">Start get property</string> <string name="start_get_int_prop">Start getInt property</string> <string name="start_get_boolean_prop">Start getBoolean property</string> <string name="start_get_long_prop">Start getLong property</string> <string name="set_prop_time">Set property Time</string> <string name="get_prop_time">Get Property Time</string> <string name="get_int_prop_time">GetInt Property Time</string> <string name="get_boolean_prop_time">GetBoolean Property Time</string> <string name="get_long_prop_time">GetLong Property Time</string> <string name="warn_msg">Run 10000 times, you need wait for a little long time.</string>
packages/apps/Settings/res/layout 新建布局文件properties_calculator_ui.xml:
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/set_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/set_prop_time" /> <TextView android:id="@+id/set_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_set_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_set_prop" /> <TextView android:id="@+id/get_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_prop_time" /> <TextView android:id="@+id/get_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_get_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_get_prop" /> <TextView android:id="@+id/get_int_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_int_prop_time" /> <TextView android:id="@+id/get_int_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_get_int_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_get_int_prop" /> <TextView android:id="@+id/get_boolean_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_boolean_prop_time" /> <TextView android:id="@+id/get_boolean_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_get_boolean_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_get_boolean_prop" /> <TextView android:id="@+id/get_long_prop_time_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_long_prop_time" /> <TextView android:id="@+id/get_long_prop_time_result_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/start_get_long_prop_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_get_long_prop" /> </LinearLayout> </ScrollView>
packages/apps/Settings/src/com/android/settings 新建核心代码类PropertiesCalculatorSettings.java:
/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.android.settings;import android.app.Activity;import android.os.Bundle;import android.provider.Settings;import android.util.Log;import android.os.SystemProperties;import android.preference.Preference;import android.content.ContentResolver;import android.os.Handler;import android.os.Message;import android.provider.Settings;import android.provider.Settings.SettingNotFoundException;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import android.view.LayoutInflater;import android.view.ViewGroup;public class PropertiesCalculatorSettings extends SettingsPreferenceFragment { private TextView mGetPropTime; private TextView mSetPropTime; private TextView mGetIntPropTime; private TextView mGetBooleanPropTime; private TextView mGetLongPropTime; private Button mStartGetPropBtn; private Button mStartSetPropBtn; private Button mStartGetIntPropBtn; private Button mStartGetBooleanPropBtn; private Button mStartGetLongPropBtn; private Handler mHandler; private Handler mHandler2; private Handler mHandler3; private Handler mHandler4; private Handler mHandler5; private View mView; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ mView=inflater.inflate(R.layout.properties_calculator_ui, null, false); mGetPropTime = (TextView) mView.findViewById(R.id.get_prop_time_result_tv); mSetPropTime = (TextView) mView.findViewById(R.id.set_prop_time_result_tv); mGetIntPropTime = (TextView) mView.findViewById(R.id.get_int_prop_time_result_tv); mGetBooleanPropTime = (TextView) mView.findViewById(R.id.get_boolean_prop_time_result_tv); mGetLongPropTime = (TextView) mView.findViewById(R.id.get_long_prop_time_result_tv); mStartGetPropBtn = (Button) mView.findViewById(R.id.start_get_prop_btn); mStartSetPropBtn = (Button) mView.findViewById(R.id.start_set_prop_btn); mStartGetIntPropBtn = (Button) mView.findViewById(R.id.start_get_int_prop_btn); mStartGetBooleanPropBtn = (Button) mView.findViewById(R.id.start_get_boolean_prop_btn); mStartGetLongPropBtn = (Button) mView.findViewById(R.id.start_get_long_prop_btn); mHandler = new MyHandler(); mHandler2 = new MyHandler(); mHandler3 = new MyHandler(); mHandler4 = new MyHandler(); mHandler5 = new MyHandler(); mStartGetPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mStartGetPropBtn.setEnabled(false); //String prop = System.getProperty(); //int prop = SystemProperties.getInt("def_kernel_about_phone"); Thread mThread1 = new Thread(new Runnable() { public void run() { ContentResolver cr = getContentResolver(); int i = 0; String mSvn = ""; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { // -2---get(String)--- //int mGetPropResult = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS); mSvn = SystemProperties.get("ro.def.software.svn"); } catch (Exception e) { } ++i; } long mGetTime = System.currentTimeMillis() - mStartTime; Log.e("time", "Time is:" + mGetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "Get"); mBundle.putLong("TIME", mGetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler.sendMessage(mMessage); } }); mThread1.start(); } }); mStartSetPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mStartSetPropBtn.setEnabled(false); //String prop = System.getProperty(); //int prop = SystemProperties.getInt("def_kernel_about_phone"); Thread mThread2 = new Thread(new Runnable() { public void run() { int i = 0; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { // -1---set(String)--- SystemProperties.set("persist.sys.headset_mode", "2"); } catch (Exception e) { } ++i; } long mSetTime = System.currentTimeMillis() - mStartTime; Log.e("ZHAOZHAO", "Time is:" + mSetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "Set"); mBundle.putLong("TIME", mSetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler2.sendMessage(mMessage); } }); mThread2.start(); } }); mStartGetIntPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mStartGetIntPropBtn.setEnabled(false); //String prop = System.getProperty(); //int prop = SystemProperties.getInt("def_kernel_about_phone"); Thread mThread3 = new Thread(new Runnable() { public void run() { int i = 0; int mGuestMode = 0; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { // -3---getInt--- mGuestMode = SystemProperties.getInt("persist.security.guestmode", 0); } catch (Exception e) { } ++i; } long mGetTime = System.currentTimeMillis() - mStartTime; Log.e("ZHAOZHAO", "Time is:" + mGetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "GetInt"); mBundle.putLong("TIME", mGetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler3.sendMessage(mMessage); } }); mThread3.start(); } }); mStartGetBooleanPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mStartGetBooleanPropBtn.setEnabled(false); Thread mThread4 = new Thread(new Runnable() { public void run() { ContentResolver cr = getContentResolver(); int i = 0; boolean mResult = true; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { // -4---getBoolean--- mResult = SystemProperties.getBoolean("ro.settings.seprate", true); } catch (Exception e) { } ++i; } long mGetTime = System.currentTimeMillis() - mStartTime; Log.e("time", "Time is:" + mGetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "GetBoolean"); mBundle.putLong("TIME", mGetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler4.sendMessage(mMessage); } }); mThread4.start(); } }); mStartGetLongPropBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mStartGetLongPropBtn.setEnabled(false); Thread mThread5 = new Thread(new Runnable() { public void run() { int i = 0; long mEcmTimeOut = 0; long mStartTime = System.currentTimeMillis(); while (i < 10000) { try { // -5---getLong--- mEcmTimeOut = SystemProperties.getLong("ro.cdma.ecmexittimer", 300000); } catch (Exception e) { } ++i; } long mGetTime = System.currentTimeMillis() - mStartTime; Log.e("time", "Time is:" + mGetTime); Bundle mBundle = new Bundle(); mBundle.putString("TYPE", "GetLong"); mBundle.putLong("TIME", mGetTime); Message mMessage = new Message(); mMessage.obj = mBundle; mHandler5.sendMessage(mMessage); } }); mThread5.start(); } }); return mView; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle mBundle = (Bundle) msg.obj; String mType = mBundle.getString("TYPE"); long mTime = mBundle.getLong("TIME"); if (("Get").equals(mType)) { mGetPropTime.setText("Value is: " + mTime); mStartGetPropBtn.setEnabled(true); } if (("Set").equals(mType)) { mSetPropTime.setText("Value is: " + mTime); mStartSetPropBtn.setEnabled(true); } if (("GetInt").equals(mType)) { mGetIntPropTime.setText("Value is: " + mTime); mStartGetIntPropBtn.setEnabled(true); } if (("GetBoolean").equals(mType)) { mGetBooleanPropTime.setText("Value is: " + mTime); mStartGetBooleanPropBtn.setEnabled(true); } if (("GetLong").equals(mType)) { mGetLongPropTime.setText("Value is: " + mTime); mStartGetLongPropBtn.setEnabled(true); } } }}
packages/apps/Settings/src/com/settings/Settings.java 中进行代码添加:
//A. // Show only these settings for restricted users private int[] SETTINGS_FOR_RESTRICTED = { R.id.wireless_section, R.id.wifi_settings, R.id.bluetooth_settings, R.id.data_usage_settings, R.id.wireless_settings, R.id.device_section, R.id.sound_settings, R.id.display_settings, R.id.lock_settings, //added by XXX R.id.storage_settings, R.id.application_settings, R.id.battery_settings, R.id.personal_section, R.id.location_settings, R.id.security_settings, R.id.language_settings, R.id.user_settings, R.id.account_settings, R.id.account_add, R.id.system_section, R.id.date_time_settings, R.id.about_settings, R.id.accessibility_settings, R.id.print_settings, R.id.nfc_payment_settings, R.id.home_settings, R.id.audioprofle_settings, R.id.sound_settings, R.id.jrdsound_settings,//add by XXX R.id.power_settings, R.id.hotknot_settings ,R.id.properties_calculator_settings// add by eyelike at 2015-1-27 };//B. private static final String[] ENTRY_FRAGMENTS = { WirelessSettings.class.getName(), WifiSettings.class.getName(), AdvancedWifiSettings.class.getName(), BluetoothSettings.class.getName(), TetherSettings.class.getName(), WifiP2pSettings.class.getName(), VpnSettings.class.getName(), DateTimeSettings.class.getName(), LocalePicker.class.getName(), InputMethodAndLanguageSettings.class.getName(), SpellCheckersSettings.class.getName(), UserDictionaryList.class.getName(), UserDictionarySettings.class.getName(), SoundSettings.class.getName(), JrdSoundSettings.class.getName(),//add by XXX DisplaySettings.class.getName(), DeviceInfoSettings.class.getName(), ManageApplications.class.getName(), ProcessStatsUi.class.getName(), NotificationStation.class.getName(), LocationSettings.class.getName(), SecuritySettings.class.getName(), PrivacySettings.class.getName(), DeviceAdminSettings.class.getName(), AccessibilitySettings.class.getName(), ToggleCaptioningPreferenceFragment.class.getName(), TextToSpeechSettings.class.getName(), Memory.class.getName(), DevelopmentSettings.class.getName(), UsbSettings.class.getName(), AndroidBeam.class.getName(), WifiDisplaySettings.class.getName(), PowerUsageSummary.class.getName(), AccountSyncSettings.class.getName(), CryptKeeperSettings.class.getName(), DataUsageSummary.class.getName(), DreamSettings.class.getName(), UserSettings.class.getName(), NotificationAccessSettings.class.getName(), ManageAccountsSettings.class.getName(), PrintSettingsFragment.class.getName(), PrintJobSettingsFragment.class.getName(), TrustedCredentialsSettings.class.getName(), PaymentSettings.class.getName(), KeyboardLayoutPickerFragment.class.getName(), //M@: SimManagement.class.getName(), SimInfoEditor.class.getName(), //Class name same as Activity name so use full name here com.mediatek.gemini.SimDataRoamingSettings.class.getName(), AudioProfileSettings.class.getName(), Editprofile.class.getName(), HDMISettings.class.getName(), SelectSimCardFragment.class.getName(), UsbSharingChoose.class.getName(), UsbSharingInfo.class.getName(), TetherWifiSettings.class.getName(), DrmSettings.class.getName(), WifiGprsSelector.class.getName(), BeamShareHistory.class.getName(), HotKnotSettings.class.getName(), MasterClear.class.getName(),//add by XXX com.mediatek.gemini.SimRoamingSettings.class.getName()//add by XXX ,PropertiesCalculatorSettings.class.getName()//add by eyelike at 2015-1-27 // };//C. // add by eyelike at 2015-1-27 public static class PropertiesSettingsActivity extends Settings { /* empty */ }
代码添加在A.B.C.三处,分别用add by eyelike注释出来了。
评估报告请见:《系统属性调用评估报告 》
评估数据请见:《系统属性调用评估表》
eyelike@2015-01-28
- 系统属性调用评估方法介绍
- 系统属性调用评估报告
- 系统属性调用评估表
- 系统架构评估中的质量属性+评估方法(SAAM,ATAM)
- 风险分析评估方法介绍
- Android java方法实现调用系统属性
- 评估系统各项性能方法
- 系统吞吐量评估方法(冯凌圣)
- 系统吞吐量评估方法(冯凌圣)
- 系统吞度量评估方法
- 系统吞吐量评估方法(冯凌圣)
- sklearn.metrics中的评估方法介绍
- 机器学习模型评估方法介绍
- 调用 显示控制面板 系统时间日期属性等方法
- Build相关属性和调用系统信息的方法
- Build相关属性和调用系统信息的方法
- Build相关属性和调用系统信息的方法
- Build相关属性和调用系统信息的方法
- PHP基础教程3
- weak和assign的区别
- Things You Should Never Do, Part I
- Avalanche:quand la neige devient dangereuse?
- Android 开源项目浅读-------SwipeMenuListView-重写,第四章,修改适配器
- 系统属性调用评估方法介绍
- xss攻击入门详情
- 107[Leetcode].Binary Tree Level Order Traversal II
- iOS开发之关于Socket通讯方式
- (三) 开始进行Windows应用程序的用户界面开发
- 汽车销售发票扫描识别系统助力汽车业
- C++static关键字
- Emacs Python completer
- java 文件 大小格式化输出