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

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

 

 

时间: 2015-11-13
Tags: android, java

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

三星I9158P如何激活开发者选项?I9158P怎么开启USB调试模式

1.我们要打开这个usb调试 我们需要进入手机到[应用程序].  2.如图所示我们在打开应用了再点击里边的[设定].  3.这样会进入到一个界面我们点击里边的[更多]之后我们再点击[关于设备]如下图所示.   开发者选项?I9158P怎么开启USB调试模式-开发者选项usb调试">      4.再者我们点击下面的[内部版本号]7之后我会看到提示出一个"开发者模式已启用".       5. 好了现在我们返回之后我们会看到上级有一个[开发者选项].     我们现在点击

三星note4如何打开usb调试?note4打开usb调试教程

1.在note4手机界面中点击"设置"再找到里面的"更多" 进入之后会有一个"关于设备" 然后我们再点击它吧. 2.好了现在在我们在进入到"关于设备" 会看到"内部版本号" 之后我们再连续点击"内部版本号" 如果显示了"不需要,开发者模式已启用"后停止. 3.好了然后我们再点击"设置" 你会看到有一个"开发者选项" 现在我们再点

Root精灵ROOT前如何打开USB调试模式

  Android 下打开USB调试模式,根据系统版本不同是有三种不同方法的,方法如下. Android 2.1 ~ 2.3.7 系统下的打开USB调试模式 首先点击桌面上的设置,或者按手机的菜单键,选择设置这项 在设置菜单的应用程序这项里面,就有USB调试的项,打勾即可 Android 4.0 ~ 4.1.2 系统下的打开USB调试模式 同样是点击桌面上的设置,或者按手机的菜单键,选择设置这项 USB调试模式是在 开发人员选项 里的 Android 4.2 ~ 以上 系统下的打开USB调试模式

碗豆夹一直停留在「请打开 USB 调试界面」的解决办法

  当您遇到碗豆夹一直停留在「请打开 USB 调试界面」时请按照以下步骤操作: 首先请判断您是否开启了「USB 调试模式」,判断方法请参考本帖第 3 部分. 如果您已开启了「USB 调试模式」但依旧无法连接豌豆荚, 请您参照下列步骤进行操作. STEP1:在电脑的「设备管理器」中找到「其他设备」,点击该项目后会出现「Android」,右键单击驱动并在弹出菜单中选择「卸载」 STEP2:重启碗豆夹,碗豆夹会重新安装驱动,请您按照豌豆荚的提示进行操作,如果弹出「用户账户控制」界面,请您选择「是」.并

c++-在不打开USB调试的情况下,如何判断出连接到电脑的USB设备是安卓手机?

问题描述 在不打开USB调试的情况下,如何判断出连接到电脑的USB设备是安卓手机? 我已经通过windows的api函数取得了设备的详细信息,但是当中没有安卓设备相关的信息,所以很迷茫,目前能想到的办法只有判断PID和VID,但这个需要建立相当大的对应表,而且需要一直更新,所以觉得不太现实. 不知道各位高人有没有什么更好的办法!!求解答啊,最好用C++啊!!

三星G7109 USB调试选项在哪?G7109 USB调试怎么开启?

1. 因为默认usb调试模式己隐藏了,我们先要打开它再去开启usb模式了,在手机中[应用程序].   2. 选择[设定]之后我们点击进入.   3. 点击[一般]选项卡,如下图所示.   4. 然后我们再在里面找到[关于设备]之后点击进入.   5. 连续点击[内部版本号]7次,直至提示"开发者模式已启用".     6. 之后我们点击左上角的[返回],即可看到"开发者选项",如下图:     这样usb调试就打开了,如果你想隐藏我们需要恢复出厂设置才可以哦点击这里

三星G9009D怎么打开usb调试?G9009D usb调试找不到怎么办?

小编提示你,如果你根本不需要利用像手机助手来安装软件或下载软件我们就不需要打开usb模式了,这个usb调试模式是开发者选项哦. 1. 打开三星S5usb调试模式非常的简单,我们点击手机"应用程序".     2. 在这里找到"设定"点击它(因为我们要找到手机版本).     3.在此会看到有一个"关于设备"了就是它了,点击它.     4. 你在打开设备界面看到一个"内部版本号",我们只要连续点击7次就可以了 "开发

小米4手机无法连接电脑怎么办 小米4打开usb调试教程

1.我们在手机界面找到"设置"按钮,点击打开进入了 2.在打开设置列表中,默认在常用设置,我们点击"全部设置"选项卡,点击"关于手机"项,打开进入细节如图所示. 3.之后在进入到关于手机中点击"版本号",连续点击,此时就会显示已开启"开发者模式"打开,如图所示 4.然后我们再点击"全部设置"中的"开发者选项"打开进入细节如下. 5.在"开发者选项"

Android系统移植与调试之-------&amp;gt;如何修改Android设备添加重启、飞行模式、静音模式等功能(一)

1.首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面  具体的修改内容在下一篇中具体介绍. Android系统移植与调试之------->如何修改Android设备添加重启.飞行模式.静音模式等功能(二) ==================================================================================================   作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!   转载请保留原文地址:h