软件平台:Android11
硬件平台:QCS6125
需求来源:用户通过系统异常崩溃,进入原生Settings页面,通过默认的多击版本号方式打开开发者模式,继而打开adb调试开关,安装三方apk。
对付这种需求本来有多种方案,比如通过PKMS里边加一些签名或者包名校验,防止三方apk后装,之前的博客里有记录过该方法,本篇只针对settings打开开发者模式的方式做复杂化处理,因为这个入口如果完全屏蔽对开发者可能不太友好。
改动如下:
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index c90fe48bc9..0e92930fcc 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -126,6 +126,8 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
private UserHandle mWorkProfileUser;
private int mMetricsCategory;
+ public static boolean isCombinationKey = false;
+
/**
* Instantiate a controller as specified controller type and user-defined key.
* <p/>
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 185c8eaca7..db091b2b83 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -184,7 +184,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
R.plurals.show_dev_countdown, mDevHitCountdown,
mDevHitCountdown),
Toast.LENGTH_SHORT);
- mDevHitToast.show();
+ //mDevHitToast.show();
}
mMetricsFeatureProvider.action(
@@ -199,7 +199,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
}
mDevHitToast = Toast.makeText(mContext, R.string.show_dev_already,
Toast.LENGTH_LONG);
- mDevHitToast.show();
+ //mDevHitToast.show();
mMetricsFeatureProvider.action(
mMetricsFeatureProvider.getAttribution(mActivity),
MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
@@ -230,14 +230,16 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
* Enables development settings. Only call this after confirming password.
*/
private void enableDevelopmentSettings() {
- mDevHitCountdown = 0;
- mProcessingLastDevHit = false;
- DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, true);
- if (mDevHitToast != null) {
- mDevHitToast.cancel();
- }
- mDevHitToast = Toast.makeText(mContext, R.string.show_dev_on,
+ if(isCombinationKey) {
+ mDevHitCountdown = 0;
+ mProcessingLastDevHit = false;
+ DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, true);
+ if (mDevHitToast != null) {
+ mDevHitToast.cancel();
+ }
+ mDevHitToast = Toast.makeText(mContext, R.string.show_dev_on,
Toast.LENGTH_LONG);
- mDevHitToast.show();
+ //mDevHitToast.show();
+ }
}
}
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
index caee987bd6..33478c3327 100755
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
@@ -19,6 +19,7 @@ package com.android.settings.deviceinfo.imei;
import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA;
import android.content.Context;
+import android.os.Handler;
import android.os.UserManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -46,6 +47,7 @@ public class ImeiInfoPreferenceController extends BasePreferenceController {
private final TelephonyManager mTelephonyManager;
private final List<Preference> mPreferenceList = new ArrayList<>();
private Fragment mFragment;
+ private int mDevCount = 0;
public ImeiInfoPreferenceController(Context context, String key) {
super(context, key);
@@ -165,6 +167,15 @@ public class ImeiInfoPreferenceController extends BasePreferenceController {
return true;
}
+ mDevCount++;
+ if (mDevCount == 10) {
+ isCombinationKey = true;
+ mDevCount = 0;
+ new Handler().postDelayed((Runnable) () -> {
+ isCombinationKey = false;
+ }, 30000);
+ }
+
ImeiInfoDialogFragment.show(mFragment, simSlot, preference.getTitle().toString());
return true;
}
这个改动设置一个标志位,在30s内点击相关栏10次才会设置,30s后次数自动清零重新累计,在该标志位设定后,原有的开发者模式多击才会生效,这里只是讲一个方法,具体哪个栏目可以灵活控制。