Android系統之路(初識MTK) ------ 默認打開開發者模式默認打開USB調試

原文地址:http://blog.csdn.net/ouyang_peng/article/details/49815865

            今天有個用戶對【設置】有個特殊的要求,即:

1、開機的時候默認顯示【開發者選項】並打開【USB調試】開關    (【Developer options】-->【USB debugging】)

2、開機的時候默認打開【安全】-->【未知來源】的開關    (【Security】--->【Unknown sources】)

 

 

1、首先解決【設置】界面默認顯示【開發者選項】的問題

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

在updateTilesList(List<DashboardCategory> target)方法中,可以找到【開發者選項】相關的代碼:

[java] view plaincopy
  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變量定義在該方法最開始處

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


因此要想特定客戶直接顯示【開發者選項】,則將showDev的值改變即可,代碼如下:

[java] view plaincopy
  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中定義

[java] view plaincopy
  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調試】的邏輯處理。

[java] view plaincopy
  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);  

 

[java] view plaincopy
  1. void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {  
  2.     switchPreference.setChecked(value);  
  3.     mHaveDebugSettings |= value;  
  4. }  


其中mEnableAdb即【USB調試】開關控件。一開始我直接強制的把isChecked變量設置爲true,如下代碼所示

[java] view plaincopy
  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行附近

[java] view plaincopy
  1. mToggleAppInstallation = (SwitchPreference) findPreference(  
  2.                KEY_TOGGLE_INSTALL_APPLICATIONS);  
  3.  mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());  

其中isNonMarketAppsAllowed()方法代碼如下

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

setNonMarketAppsAllowed(boolean enabled)方法代碼如下

[java] view plaincopy
  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()方法,這樣一進入這個界面的話,【未知來源】選項是被勾選的。

[java] view plaincopy
  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中找到一個,當然你也可以自己定義一個這樣的廣播接收者。

[html] view plaincopy
  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)方法中加入以下代碼:

[java] view plaincopy
  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可以看出來

[html] view plaincopy
  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);  


 

[html] view plaincopy
  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了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章