Android系统移植与调试之-------)如何修改Android系统默认显示

本文介绍如何修改Android系统的默认设置,包括开启【开发者选项】、设置【USB调试】、及允许【未知来源】安装应用程序。通过调整系统源代码,实现特定设备(如J5型号)在首次启动时自动启用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统移植与调试之-------)如何修改Android系统默认显示

 

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

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

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

?
1
2
3
4
5
6
7
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变量定义在该方法最开始处

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


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

?
1
2
3
4
5
6
7
8
9
10
11
//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中定义

?
1
2
3
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调试】的逻辑处理。

?
1
2
3
4
5
6
/// 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);

 

?
1
2
3
4
void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {
     switchPreference.setChecked(value);
     mHaveDebugSettings |= value;
}


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

?
1
2
3
4
5
6
7
8
9
10
11
/// 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行附近

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

其中isNonMarketAppsAllowed()方法代码如下

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

setNonMarketAppsAllowed(boolean enabled)方法代码如下

?
1
2
3
4
5
6
7
8
9
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()方法,这样一进入这个界面的话,【未知来源】选项是被勾选的。

?
1
2
3
4
5
6
7
8
9
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的话,还是会弹出窗口要我设置【未知来源】选项,如下所示,因此该方案被放弃。

data-cke-saved-src=/uploadfile/Collfiles/20151116/20151116083442107.png

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

data-cke-saved-src=/uploadfile/Collfiles/20151116/20151116083442108.png

 



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

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

 

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

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


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

?
1
2
3
4
5
6
7
8
//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可以看出来

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值