diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e29f04caf38..c89445392ac 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -64,6 +64,7 @@
+
1500
+
+
+ - Dalvik
+ - ART
+ - ART (debug)
+
+
+
+
+ - libdvm.so
+ - libart.so
+ - libartd.so
+
+
+
+
+ - Use Dalvik
+ - Use ART
+ - Use ART debug build
+
+
- Never check
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 83951922262..21a4e043dc3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3074,6 +3074,14 @@
Stay awake
Screen will never sleep while charging
+
+
+ Select runtime
+
+ Select runtime
+
+ Reboot to change runtime from %1$s to %2$s?
+
Allow mock locations
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 82657795c7d..eddc4115092 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -37,6 +37,13 @@
android:title="@string/keep_screen_on"
android:summary="@string/keep_screen_on_summary"/>
+
+
validValues = new ArrayList();
+ ArrayList validSummaries = new ArrayList();
+ String[] values = getResources().getStringArray(R.array.select_runtime_values);
+ String[] summaries = getResources().getStringArray(R.array.select_runtime_summaries);
+ for (int i = 0; i < values.length; i++) {
+ String value = values[i];
+ String summary = summaries[i];
+ if (new File("/system/lib/" + value).exists()) {
+ validValues.add(value);
+ validSummaries.add(summary);
+ }
+ }
+ int count = validValues.size();
+ if (count <= 1) {
+ // no choices, so remove preference
+ removePreference(selectRuntime);
+ } else {
+ pref.setEntryValues(validValues.toArray(new String[count]));
+ pref.setEntries(validSummaries.toArray(new String[count]));
+ }
+ }
+
+ private String currentRuntimeValue() {
+ return SystemProperties.get(SELECT_RUNTIME_PROPERTY, VMRuntime.getRuntime().vmLibrary());
+ }
+
+ private void updateRuntimeValue() {
+ ListPreference selectRuntime = (ListPreference) findPreference(SELECT_RUNTIME_KEY);
+ if (selectRuntime != null) {
+ String currentValue = currentRuntimeValue();
+ String[] values = getResources().getStringArray(R.array.select_runtime_values);
+ String[] summaries = getResources().getStringArray(R.array.select_runtime_summaries);
+ int index = 0;
+ for (int i = 0; i < values.length; i++) {
+ if (currentValue.equals(values[i])) {
+ index = i;
+ break;
+ }
+ }
+ selectRuntime.setValue(values[index]);
+ selectRuntime.setSummary(summaries[index]);
+ selectRuntime.setOnPreferenceChangeListener(this);
+ }
+ }
+
private void updateHdcpValues() {
- int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
if (hdcpChecking != null) {
String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY);
String[] values = getResources().getStringArray(R.array.hdcp_checking_values);
String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries);
+ int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
for (int i = 0; i < values.length; i++) {
if (currentValue.equals(values[i])) {
index = i;
@@ -1180,7 +1244,34 @@ public class DevelopmentSettings extends PreferenceFragment
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
+ if (SELECT_RUNTIME_KEY.equals(preference.getKey())) {
+ final String oldRuntimeValue = VMRuntime.getRuntime().vmLibrary();
+ final String newRuntimeValue = newValue.toString();
+ if (!newRuntimeValue.equals(oldRuntimeValue)) {
+ final Context context = getActivity();
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(context.getResources().getString(R.string.select_runtime_warning_message,
+ oldRuntimeValue, newRuntimeValue));
+ builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ SystemProperties.set(SELECT_RUNTIME_PROPERTY, newRuntimeValue);
+ pokeSystemProperties();
+ PowerManager pm = (PowerManager)
+ context.getSystemService(Context.POWER_SERVICE);
+ pm.reboot(null);
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ updateRuntimeValue();
+ }
+ });
+ builder.show();
+ }
+ return true;
+ } else if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString());
updateHdcpValues();
pokeSystemProperties();