Android 11 Settings去掉开发者模式功能
创始人
2024-05-25 04:23:09
0

在系统产品开发中,原生系统中,对于可以点击版本号5次就可以打开开发者模式功能,在产品开发中由于产品开发需要不让用户打开开发者模式功能,所以要求去掉开发者模式的功能,这部分就需要在系统Settings中找到相关的功能点去掉就可以了

1.系统Settings去掉开发者模式功能的核心类

packages\apps\Settings\src\com\android\settings\SettingsActivity.java
packages\apps\Settings\src\com\android\settings\deviceinfo\BuildNumberPreferenceController.java

2.系统Settings去掉开发者模式功能的核心功能实现和分析

SettingsActivity.java关于去掉开发者模式选项的二级菜单显示

    @Overrideprotected void onResume() {super.onResume();mDevelopmentSettingsListener = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {updateTilesList();}};LocalBroadcastManager.getInstance(this).registerReceiver(mDevelopmentSettingsListener,new IntentFilter(DevelopmentSettingsEnabler.DEVELOPMENT_SETTINGS_CHANGED_ACTION));registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));updateTilesList();}

通过在SettingsActivity.java中的相关源码发现,在这里注册了监听开发者模式的广播,在收到打开开发者模式的 广播时,会调用updateTilesList();来更新菜单栏关于开发者模式的菜单项

接下来分析下updateTilesList();中有关开发者选项的相关代码

private void updateTilesList() {// Generally the items that are will be changing from these updates will// not be in the top list of tiles, so run it in the background and the// SettingsBaseActivity will pick up on the updates automatically.AsyncTask.execute(() -> doUpdateTilesList());}private void doUpdateTilesList() {PackageManager pm = getPackageManager();final UserManager um = UserManager.get(this);final boolean isAdmin = um.isAdminUser();boolean somethingChanged = false;final String packageName = getPackageName();final StringBuilder changedList = new StringBuilder();somethingChanged = setTileEnabled(changedList,new ComponentName(packageName, WifiSettingsActivity.class.getName()),pm.hasSystemFeature(PackageManager.FEATURE_WIFI), isAdmin) || somethingChanged;somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.BluetoothSettingsActivity.class.getName()),pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)|| somethingChanged;// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise// enable DataPlanUsageSummaryActivity.somethingChanged = setTileEnabled(changedList,new ComponentName(packageName, Settings.DataUsageSummaryActivity.class.getName()),Utils.isBandwidthControlEnabled() /* enabled */,isAdmin) || somethingChanged;somethingChanged = setTileEnabled(changedList,new ComponentName(packageName,Settings.ConnectedDeviceDashboardActivity.class.getName()),!UserManager.isDeviceInDemoMode(this) /* enabled */,isAdmin) || somethingChanged;somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.PowerUsageSummaryActivity.class.getName()),mBatteryPresent, isAdmin) || somethingChanged;somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.DataUsageSummaryActivity.class.getName()),Utils.isBandwidthControlEnabled(), isAdmin)|| somethingChanged;somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.UserSettingsActivity.class.getName()),UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()&& !Utils.isMonkeyRunning(), isAdmin)|| somethingChanged;final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)&& !Utils.isMonkeyRunning();somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.DevelopmentSettingsDashboardActivity.class.getName()),showDev, isAdmin)|| somethingChanged;somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,Settings.WifiDisplaySettingsActivity.class.getName()),WifiDisplaySettings.isAvailable(this), isAdmin)|| somethingChanged;if (UserHandle.MU_ENABLED && !isAdmin) {// When on restricted users, disable all extra categories (but only the settings ones).final List categories = mDashboardFeatureProvider.getAllCategories();synchronized (categories) {for (DashboardCategory category : categories) {final int tileCount = category.getTilesCount();for (int i = 0; i < tileCount; i++) {final ComponentName component = category.getTile(i).getIntent().getComponent();final String name = component.getClassName();final boolean isEnabledForRestricted = ArrayUtils.contains(SettingsGateway.SETTINGS_FOR_RESTRICTED, name);if (packageName.equals(component.getPackageName())&& !isEnabledForRestricted) {somethingChanged =setTileEnabled(changedList, component, false, isAdmin)|| somethingChanged;}}}}}// Final step, refresh categories.if (somethingChanged) {Log.d(LOG_TAG, "Enabled state changed for some tiles, reloading all categories "+ changedList.toString());updateCategories();} else {Log.d(LOG_TAG, "No enabled state changed, skipping updateCategory call");}}

在SettingsActivity.java中的doUpdateTilesList()的代码中,都是关于蓝牙 wifi 开发者模式改变后 对于系统Settings 菜单项更新的相关配置,而在代码中

final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this) && !Utils.isMonkeyRunning();

somethingChanged = setTileEnabled(changedList, new ComponentName(packageName, Settings.DevelopmentSettingsDashboardActivity.class.getName()), showDev, isAdmin) || somethingChanged;

就是关于开发者选项判断是否打开和关闭开发者模式的相关更新代码,而showDev变量关系这 是否显示和隐藏开发者选项的 想要去掉开发者选项就把这个值改为false 就好了 具体修改如下:

final boolean showDev = false/*DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)

&& !Utils.isMonkeyRunning()*/;

BuildNumberPreferenceController.java关于去掉点击打开开发者模式的功能实现

在关于设备的my_device_info.xml的布局文件中,通过代码发现在版本号的连接Controller中 是BuildNumberPreferenceController.java,就是说开发者模式是由BuildNumberPreferenceController.java来负责 管理的 ,接下来分析BuildNumberPreferenceController.java就可以了

   @Overridepublic boolean handlePreferenceTreeClick(Preference preference) {/*if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {return false;}if (Utils.isMonkeyRunning()) {return false;}// Don't enable developer options for secondary non-demo users.if (!(mUm.isAdminUser() || mUm.isDemoUser())) {mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SETTINGS_BUILD_NUMBER_PREF);return false;}// Don't enable developer options until device has been provisionedif (!WizardManagerHelper.isDeviceProvisioned(mContext)) {mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SETTINGS_BUILD_NUMBER_PREF);return false;}if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {if (mUm.isDemoUser()) {// Route to demo device owner to lift the debugging restriction.final ComponentName componentName = Utils.getDeviceOwnerComponent(mContext);if (componentName != null) {final Intent requestDebugFeatures = new Intent().setPackage(componentName.getPackageName()).setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(requestDebugFeatures, 0);if (resolveInfo != null) {mContext.startActivity(requestDebugFeatures);return false;}}}if (mDebuggingFeaturesDisallowedAdmin != null &&!mDebuggingFeaturesDisallowedBySystem) {RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext,mDebuggingFeaturesDisallowedAdmin);}mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SETTINGS_BUILD_NUMBER_PREF);return false;}if (mDevHitCountdown > 0) {mDevHitCountdown--;if (mDevHitCountdown == 0 && !mProcessingLastDevHit) {// Add 1 count back, then start password confirmation flow.mDevHitCountdown++;final ChooseLockSettingsHelper helper =new ChooseLockSettingsHelper(mActivity, mFragment);mProcessingLastDevHit = helper.launchConfirmationActivity(REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,mContext.getString(R.string.unlock_set_unlock_launch_picker_title));if (!mProcessingLastDevHit) {enableDevelopmentSettings();}mMetricsFeatureProvider.action(mMetricsFeatureProvider.getAttribution(mActivity),MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,mFragment.getMetricsCategory(),null,mProcessingLastDevHit ? 0 : 1);} else if (mDevHitCountdown > 0&& mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) {if (mDevHitToast != null) {mDevHitToast.cancel();}mDevHitToast = Toast.makeText(mContext,mContext.getResources().getQuantityString(R.plurals.show_dev_countdown, mDevHitCountdown,mDevHitCountdown),Toast.LENGTH_SHORT);mDevHitToast.show();}mMetricsFeatureProvider.action(mMetricsFeatureProvider.getAttribution(mActivity),MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,mFragment.getMetricsCategory(),null,0);} else if (mDevHitCountdown < 0) {if (mDevHitToast != null) {mDevHitToast.cancel();}mDevHitToast = Toast.makeText(mContext, R.string.show_dev_already,Toast.LENGTH_LONG);mDevHitToast.show();mMetricsFeatureProvider.action(mMetricsFeatureProvider.getAttribution(mActivity),MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,mFragment.getMetricsCategory(),null,1);}*/return true;}

在BuildNumberPreferenceController.java的handlePreferenceTreeClick(Preference preference)中会判断点击次数 当点击次数超过5次时,就会打开开发者模式,所以就需要注释掉这里的所有代码就可以了

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...