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