Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

今天有个用户对【设置】有个特殊的要求,即:

1、开机的时候默认显示【开发者选项】并打开【USB调试】开关    (【Developer options】-->【USB debugging】)

2、开机的时候默认打开【安全】-->【未知来源】的开关    (【Security】--->【Unknown sources】)

1、首先解决【设置】界面默认显示【开发者选项】的问题

查看源代码:packages/apps/Settings/src/com/android/settings/SettingsActivity.java

在updateTilesList(List<DashboardCategory> target)方法中,可以找到【开发者选项】相关的代码:

else if (id == R.id.development_settings) {
                	Log.d(LOG_TAG, "=================oyp K="+showDev);
                    if (!showDev || um.hasUserRestriction(
                            UserManager.DISALLOW_DEBUGGING_FEATURES)) {
                        removeTile = true;
                    }
                } 

其中showDev变量定义在该方法最开始处

 final boolean showDev = mDevelopmentPreferences.getBoolean(
                DevelopmentSettings.PREF_SHOW,
                android.os.Build.TYPE.equals("eng"));

因此要想特定客户直接显示【开发者选项】,则将showDev的值改变即可,代码如下:

        //added by ouyang 2015-11-10  set DevelopmentSettings.PREF_SHOW=true if model is J5
        if (android.os.SystemProperties.isJ5Version()) {
        	SharedPreferences.Editor editor=mDevelopmentPreferences.edit();
            editor.putBoolean(DevelopmentSettings.PREF_SHOW, true);
            editor.commit();
        	Log.d(LOG_TAG, "=================oyp set DevelopmentSettings.PREF_SHOW=true if model is J5 ");
        }
        //added by ouyang 2015-11-10 end
        final boolean showDev = mDevelopmentPreferences.getBoolean(
                DevelopmentSettings.PREF_SHOW,
                android.os.Build.TYPE.equals("eng"));

即在初始化showDev变量之前,将DevelopmentSettings.PREF_SHOW的值设置为true,那么showDev也会是true。这样【开发者选项】就会默认打开。那个判断是J5客户的方法在/frameworks/base/core/java/android/os/SystemProperties.java中定义

	public static boolean isJ5Version(){
		return SystemProperties.get("ro.product.model").contains("J5");
	}

2、解决【开发者选项】-->【USB调试】开关

首先查看packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java

在updateAllOptions()方法中,有关于【USB调试】的逻辑处理。

  /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.
        boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :
                    (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);
        updateSwitchPreference(mEnableAdb, isChecked);
        /// M: update usb preference again
        mExt.customUSBPreference(mEnableAdb);
    void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {
        switchPreference.setChecked(value);
        mHaveDebugSettings |= value;
    }

其中mEnableAdb即【USB调试】开关控件。一开始我直接强制的把isChecked变量设置为true,如下代码所示

/// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.
         boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :
                     (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);
-        //added by ouyang 2015-11-10  set mEnableAdb=true if model is J5
-        if (android.os.SystemProperties.isJ5Version()) {
-               isChecked=true;
-        }
-        //added by ouyang 2015-11-10 end
         updateSwitchPreference(mEnableAdb, isChecked);
         /// M: update usb preference again
         mExt.customUSBPreference(mEnableAdb);

但是这样的话,直接刷机后开机的话还是不能直接连接USB调试,还要重新关闭该开关再打开该开关才能进行USB调试,因此该方案被放弃。

因为是否真正打开【USB调试】功能,是看Settings.Global.ADB_ENABLED这个属性的值是0还是1。因此真正的方法是在一个接受开机广播的广播接收者中将Settings.Global.ADB_ENABLED设置为1。

在下面和【未知来源】一起修改,在第4步骤中解决。

3、解决【安全】-->【未知来源】的开关 默认打开的问题

首先查看packages/apps/Settings/src/com/android/settings/SecuritySettings.java文件,在createPreferenceHierarchy()方法中找到【未知来源】的控件,403行附近

 mToggleAppInstallation = (SwitchPreference) findPreference(
                KEY_TOGGLE_INSTALL_APPLICATIONS);
  mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());

其中isNonMarketAppsAllowed()方法代码如下

  private boolean isNonMarketAppsAllowed() {
        return Settings.Global.getInt(getContentResolver(),
                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
    }

setNonMarketAppsAllowed(boolean enabled)方法代码如下

   private void setNonMarketAppsAllowed(boolean enabled) {
        final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
        if (um.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)) {
            return;
        }
        // Change the system setting
        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,
                                enabled ? 1 : 0);
    }

一开始我在判断isNonMarketAppsAllowed()方法之前,先调用setNonMarketAppsAllowed()方法,这样一进入这个界面的话,【未知来源】选项是被勾选的。

mToggleAppInstallation = (SwitchPreference) findPreference(
                 KEY_TOGGLE_INSTALL_APPLICATIONS);
-
-        //added by ouyang 2015-11-10  setChecked(true) if the model is J5
-        if (android.os.SystemProperties.isJ5Version()) {
-               setNonMarketAppsAllowed(true);
-        }
         mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
-        //added by ouyang 2015-11-10  end

但是,刷完机直接安装一个第三方的apk的话,还是会弹出窗口要我设置【未知来源】选项,如下所示,因此该方案被放弃。

点击【设置】按钮进入到界面是,【未知来源】按钮默认勾选了,这个时候退出去,继续安装apk的话就可以安装了,如下所示:

因为这个添加的代码是在SecuritySettings的createPreferenceHierarchy()方法中,也就是说要进入到该Activity才生效。这样明显没达到目的。

因此要和设置【USB调试】一样,在一个接收开机广播的广播接收者中将Settings.Global.INSTALL_NON_MARKET_APPS设置为1。

4、找Settings里面定义的一个接收开机广播的广播接收者,在AndroidManifest.xml中找到一个,当然你也可以自己定义一个这样的广播接收者。

       <!--  Restore Rotation Receiver -->
        <receiver android:name="com.mediatek.settings.RestoreRotationReceiver">
            <intent-filter>
            	<action android:name="android.intent.action.BOOT_COMPLETED" />
            	<action android:name="android.intent.action.ACTION_BOOT_IPO" />
            </intent-filter>
        </receiver>

因此在packages/apps/Settings/src/com/mediatek/settings/RestoreRotationReceiver.java的onReceive(Context context, Intent intent)方法中加入以下代码:

        //added by ouyang 2015-11-13
        if (android.os.SystemProperties.isJ5Version()) {
        	// 开机启动时,默认设置 [未知来源] 勾选
            Settings.Global.putInt(context.getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,1);
        	// 开机启动时,默认设置 [USB调试] 勾选
            Settings.Global.putInt(context.getContentResolver(),Settings.Global.ADB_ENABLED, 1);
        }
        //added by ouyang 2015-11-13  end

而一开始添加的代码可以注释掉了。通过git diff可以看出来

diff --git a/packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java b/packages/apps/Settings/src/com/android/settings/Devel
index 0a987df..503270a 100755
--- a/packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
+++ b/packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
@@ -508,15 +508,9 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
         final Context context = getActivity();
         final ContentResolver cr = context.getContentResolver();
         mHaveDebugSettings = false;
-
         /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.
         boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :
                     (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);
-        //added by ouyang 2015-11-10  set mEnableAdb=true if model is J5
-        if (android.os.SystemProperties.isJ5Version()) {
-               isChecked=true;
-        }
-        //added by ouyang 2015-11-10 end
         updateSwitchPreference(mEnableAdb, isChecked);
         /// M: update usb preference again
         mExt.customUSBPreference(mEnableAdb);
diff --git a/packages/apps/Settings/src/com/android/settings/SecuritySettings.java b/packages/apps/Settings/src/com/android/settings/Security
index 4de173a..392e6ee 100755
--- a/packages/apps/Settings/src/com/android/settings/SecuritySettings.java
+++ b/packages/apps/Settings/src/com/android/settings/SecuritySettings.java
@@ -402,14 +402,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
                 root.findPreference(KEY_DEVICE_ADMIN_CATEGORY);
         mToggleAppInstallation = (SwitchPreference) findPreference(
                 KEY_TOGGLE_INSTALL_APPLICATIONS);
-
-        //added by ouyang 2015-11-10  setChecked(true) if the model is J5
-        if (android.os.SystemProperties.isJ5Version()) {
-               setNonMarketAppsAllowed(true);
-        }
         mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
-        //added by ouyang 2015-11-10  end
-
         // Side loading of apps.
         // Disable for restricted profiles. For others, check if policy disallows it.
         mToggleAppInstallation.setEnabled(!um.getUserInfo(UserHandle.myUserId()).isRestricted());

这样改为后,编译,刷机后,插上USB数据线就可以开始进行adb调试了,而且可以直接安装未知来源的apk了。

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

====================================================================================

版权声明:本文为欧阳鹏原创文章,欢迎转载,转载请注明出处! http://blog.csdn.net/ouyang_peng

时间: 2024-10-29 19:10:35

Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关的相关文章

Android Setting显示开发者选项的逻辑

默认User版本没有"开发者选项",我们可以通过点击版本号7次来显示开发者模式,今天来看下代码中是如何处理的: 首先是packages/apps/Settings/src/com/android/settings/Settings.java的初始化处理: 布尔值showDev是否默认显示"开发者选项": final boolean showDev = mDevelopmentPreferences.getBoolean( DevelopmentSettings.PR

红米note怎么打开USB调试模式

红米note到货后,打开USB调试模式是一些新手很棘手的问题,所以要手机助手成功识别红米note,你必须打开红米note的USB调试模式.在安卓4.2版本中,系统的USB调试模式不是非常简单地被打开的.红米note采用的就是基于安卓4.2及以上的MIUI操作系统. 方法/步骤 1.在红米note界面中,您会看到桌面中的"设置"图标,点击进入红米note设置界面. 2.在设置界面中点击"全部设置",然后再界面最底端点击"关于手机"选项. 3.在&q

魅族手机打开usb调试后链接不上电脑,解决方法如下

魅族MX系列手机打开usb调试后链接不上电脑, 1.在拨号键盘输入*#*#6961#*#* 2.设置页面->辅助功能 可以看到开发者选项,打开USB调试 3.在电脑端操作如下: 魅族BBS: 请在mac终端执行: $echo 0x2a45 > ~/.android/adb_usb.ini $adb kill-server $adb devices 不出意外应该可以了.这是由于我们14年之后的设备全部更新使用了魅族自己的vid引起的 原文:http://bbs.flyme.cn/thread-1

OPPO A77在哪里打开Usb调试模式的详细流程

在我们使用PC通过数据线链上安卓手机的时候,如果手机没有开启usb开发者调试模式,PC则没办法成功读到我们的手机,这个时候我们需要想办法将手机的usb开发者调试模式开启,下文我们叙述OPPO A77如何开启usb开发者调试模式的教程.接着,在OPPO A77应用程序界面点击设置ICON,进入OPPO A77系统设置界面.接着,点击设置界面上的系统一行,并进入"关于手机"一行.接着找到"版本号"这一行,连续点击"版本号"这一行,直到看出弹出已进入开

OPPO Realme C1在哪里打开USB调试模式的详细教程

每次我们使用pc链上安卓手机的时候,如果手机没有开启USB调试模式,pc则没能成功识别我们的手机,因此我们需要找处理方法将手机的USB调试模式开启,以下资料我们介绍OPPO Realme C1如何开启USB调试模式的步骤.接着,在OPPO Realme C1应用程序界面启动<设置>icon,进入OPPO Realme C1系统<设置>界面.然后,点击设置界面上的"系统"一栏,并进入"关于手机"一栏.接下来找到版本号这一行,连续点击版本号这一行

魅族魅蓝u30详细打开Usb调试模式的方法

在我们使用安卓手机通过数据线连接上pc的时候,或者使用的有些APP比如我们公司营销团队在使用的APP引号精灵,之前的老版本就需要开启USB调试模式下使用,不过,现在新版本不需要了,如果手机没有开启USB调试模式,pc则没法成功读到我们的手机,部分APP也没法正常使用,这时我们需要想方设法将手机的USB调试模式开启,以下内容我们介绍魅族魅蓝u30如何开启USB调试模式的流程. 第一步,在魅族魅蓝u30应用程序界面打开"设置"ICON,进入魅族魅蓝u30系统"设置"界面

OPPO K3在哪里打开USB调试模式的完美方法

当我们使用pc链接安卓手机的时候,如果手机没有开启USB调试模式,pc则无法成功识别我们的手机,这个时候我们需要找解决方法将手机的USB调试模式打开,今天我们介绍OPPO K3如何开启USB调试模式的方法. 第一步,在OPPO K3应用程序界面启动设置icon,进入OPPO K3系统设置界面. 接下来,点击设置界面上的"系统"这一行,并进入关于手机这一行. 然后找到版本号这一行,连续点击版本号这一行,直到看出弹出已进入开发者模式的相关的提示说明. 到这里,重新回到OPPO K3的设置主

OPPO realme 2在哪里打开Usb调试模式的简单步骤

每当我们使用PC通过数据线链接到安卓手机的时候,如果手机没有开启USB调试模式,PC则没能成功识别我们的手机,这时我们需要找解决方法将手机的USB调试模式开启,下文我们记录一下OPPO realme 2如何开启USB调试模式的教程. 接着在OPPO realme 2应用程序界面点中"设置"图标,进入OPPO realme 2系统"设置"界面. 第二步点击设置界面上的系统这行,并进入"关于手机"这行. 接下来找到版本号这行,连续点击版本号这行,直到

OPPO R17在哪里打开usb调试模式的完美流程

就在我们使用pc通过数据线连接上安卓手机的时候,如果手机没有开启usb调试模式,pc则无法成功识别我们的手机,此情况我们需要想方设法将手机的usb调试模式打开,以下资料我们介绍OPPO R17如何开启usb调试模式的流程. 首先,在OPPO R17应用程序界面打开"设置"icon,进入OPPO R17系统"设置"界面. 接着点击设置界面上的系统一栏,并进入"关于手机"一栏. 接下来找到"版本号"这一行,连续点击"版本