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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.
  2. boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :
  3. (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);
  4. - //added by ouyang 2015-11-10 set mEnableAdb=true if model is J5
  5. - if (android.os.SystemProperties.isJ5Version()) {
  6. - isChecked=true;
  7. - }
  8. - //added by ouyang 2015-11-10 end
  9. updateSwitchPreference(mEnableAdb, isChecked);
  10. /// M: update usb preference again
  11. 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行附近

  1. mToggleAppInstallation = (SwitchPreference) findPreference(
  2. KEY_TOGGLE_INSTALL_APPLICATIONS);
  3. mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());

其中isNonMarketAppsAllowed()方法代码如下

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

setNonMarketAppsAllowed(boolean enabled)方法代码如下

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

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

  1. mToggleAppInstallation = (SwitchPreference) findPreference(
  2. KEY_TOGGLE_INSTALL_APPLICATIONS);
  3. -
  4. - //added by ouyang 2015-11-10 setChecked(true) if the model is J5
  5. - if (android.os.SystemProperties.isJ5Version()) {
  6. - setNonMarketAppsAllowed(true);
  7. - }
  8. mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
  9. - //added by ouyang 2015-11-10 end

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

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

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

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

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

  1. <!-- Restore Rotation Receiver -->
  2. <receiver android:name="com.mediatek.settings.RestoreRotationReceiver">
  3. <intent-filter>
  4. <action android:name="android.intent.action.BOOT_COMPLETED" />
  5. <action android:name="android.intent.action.ACTION_BOOT_IPO" />
  6. </intent-filter>
  7. </receiver>

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

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

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

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

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

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

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

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

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

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

  1. [RK3288][Android6.0] 调试笔记 --- user版本默认显示开发者选项【转】

    本文转载自:https://blog.csdn.net/kris_fei/article/details/70157137 Platform: ROCKCHIPOS: Android 6.0Kerne ...

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

    红米note到货后,打开USB调试模式是一些新手很棘手的问题,所以要手机助手成功识别红米note,你必须打开红米note的USB调试模式.在安卓4.2版本中,系统的USB调试模式不是非常简单地被打开的 ...

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

    每当我们使用PC通过数据线链接到安卓手机的时候,如果手机没有开启USB调试模式,PC则没能成功识别我们的手机,这时我们需要找解决方法将手机的USB调试模式开启,下文我们记录一下OPPO realme ...

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

    当我们使用pc链接安卓手机的时候,如果手机没有开启USB调试模式,pc则无法成功识别我们的手机,这个时候我们需要找解决方法将手机的USB调试模式打开,今天我们介绍OPPO K3如何开启USB调试模式的 ...

  5. OPPO A3在哪里打开usb调试模式的详细教程

    当我们使用电脑通过数据线连接上安卓手机的时候,如果手机没有开启Usb开发者调试模式,电脑则无办法成功读到我们的手机,这时我们需要找方法将手机的Usb开发者调试模式打开,这里我们叙述OPPO A3如何开 ...

  6. OPPO F9 Pro在哪里打开usb调试模式的完美方法

    经常我们使用pc通过数据线连接到安卓手机的时候,如果手机没有开启USB调试模式,pc则没能够成功读到我们的手机,此情况我们需要找处理方法将手机的USB调试模式开启,今天我们介绍OPPO F9 Pro如 ...

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

    当我们使用Pc接通安卓手机的时候,如果手机没有开启USB开发者调试模式,Pc则无法成功读到我们的手机,遇到此种情况我们需要想方设法将手机的USB开发者调试模式打开,以下内容我们讲解OPPO R6007 ...

  8. OPPO R7在哪里打开USB调试模式的详细流程

    在我们使用PC连接安卓手机的时候,如果手机没有开启USB调试模式,PC则没办法成功检测到我们的手机,这时我们需要想办法将手机的USB调试模式打开,如下资料我们介绍OPPO R7如何开启USB调试模式的 ...

  9. OPPO R11s在哪里打开Usb调试模式的简单方法

    就在我们使用pc链接安卓手机的时候,如果手机没有开启usb调试模式,pc则不能够成功读到我们的手机,如果遇到此情况我们需要找方法将手机的usb调试模式打开,本文我们记录一下OPPO R11s如何开启u ...

随机推荐

  1. tcp/ip --- IP路由选择及子网寻址

    IP路由选择 当一个IP数据包准备好了的时候,IP数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来"送货"的呢? 最特殊的情况是目的主机和主机直连 ...

  2. LeetCode 66 Plus One(加一)(vector)

    翻译 给定一个以一系列数字表示的非负数.将其加一并转换成数字. 数字存储的最高位在列的最前面. 原文 Given a non-negative number represented as an arr ...

  3. mac os x 使用scp取代sz rz

    在windows下,能够通过secureCRT的sz来下载文件,而用rz来上传文件.在unix/linux下则不必.由于scp命令能够完毕这项目工作. sz file替代方案为:scp usernam ...

  4. 集成学习1-Boosting

    转自http://blog.csdn.net/lvhao92/article/details/51079018 集成学习大致分为两类,一类串行生成.如Boosting.一类为并行化.如Bagging和 ...

  5. Mysql数据库分库备份,分表备份

    分库备份 #!/bin/sh DBPATH=/server/backup MYUSER=root MYPASS=oldboy123 SOCKET=/data/3306/mysql.sock MYCMD ...

  6. nyoj 1129 Salvation

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1129 题目分析:感觉题目说的不是多么的清晰,看了别人的分析觉得,也就是说在一个方向不能拐 ...

  7. 返回当前文档的文档的url

    HTML DOM referrer 属性 HTML DOM Document 对象 定义和用法 referrer 属性可返回载入当前文档的文档的 URL. 语法 document.referrer 说 ...

  8. codeblocks如何watch数组

    codeblocks13.12+GDB 调试的时候,main传了一个int a[10]给quicksort 但是在quicksort内部,debugger把a看成一个pointer而不是array,所 ...

  9. 源代码分析Fragmentd的BackStack管理过程

    1. Fragment基本使用方法 为了管理Activity中的fragments.须要调用Activity中的getFragmentManager()方法.由于FragmentManager的API ...

  10. Lucene.Net 介绍

    1 lucene简介1.1 什么是lucenepowered by 25175.netLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desk ...