1. 程式人生 > >Android user版 設定預設adb 除錯 不提示對話方塊

Android user版 設定預設adb 除錯 不提示對話方塊

用adb除錯android裝置時,首次連線時,會出現一個授權提示:

error: device unauthorized. Please check the confirmation dialog on your device.

工作原理:

原來在我們的PC機(以windows為例)上啟動了adb.exe程序時,adb會在本地生成一對金鑰adbkey(私鑰)與adbkey.pub(公鑰);

根據彈框提示“The computer's RSA key fingerprint is:xxxx”,可以看出是一對RSA演算法的金鑰,其中公鑰是用來發送給手機的;

當你執行“adb shell”時,adb.exe會將當前PC的公鑰(或者公鑰的hash值)(fingerprint)傳送給android裝置;這時,如果android上已經儲存了這臺PC的公鑰,則匹配出對應的公鑰進行認證,建立adb連線;如果android上沒有儲存這臺PC的公鑰,則會彈出提示框,讓你確認是否允許這臺機器進行adb連線,當你點選了允許授權之後,android就會儲存了這臺PC的adbkey.pub(公鑰);

當然手機廠商也有可能會內建一些adbkey.pub(公鑰);

那麼問題來了,這些金鑰在PC與Android上分別儲存在哪裡?

首先PC上,以Windows7為例,當你首次啟動adb.exe時,會在C盤的當前使用者的目錄下生成一個".android"目錄,其中adbkey與adbkey.pub就在這個目錄下;(adb.exe會在啟動時讀取這兩個檔案(沒有就重新生成),所以如果你要是刪除或者修改了這兩個檔案之後,必須要關閉adb.exe程序,重啟之後才能生效;)

其次Android上,PC的公鑰被儲存在一個檔案中"/data/misc/adb/adb_keys";

在知道了adb這種認證的原理之後,你可以在不希望自己android裝置授權任何PC裝置進行adb連結時,清除"/data/misc/adb/adb_keys"檔案;

也可以在沒有螢幕的情況下,讓已經認證過的PC將你PC上的adbkey.pub中的公鑰匯入到android中的"/data/misc/adb/adb_keys"檔案中,或者將已經認證過的PC機上的adbkey與adbkey.pub拷貝到本機上覆蓋你自己的adbkey與adbkey.pub,然後重啟adb.exe,即可執行adb命令;

需求:在使用者版的情況下使用usb 除錯時,不需要彈出對話方塊進行手動允許操作,而自動預設允許操作。

修改方法:

方法一:

1、在/frameworks/base/packages/SystemUI/src/com/android/systemui/usb 該目錄下修改 UsbDebuggingActivity.java

privateclassUsbDisconnectedReceiverextendsBroadcastReceiver{privatefinalActivity mActivity;publicUsbDisconnectedReceiver(Activity activity){ mActivity = activity;}@Overridepublicvoid onReceive(Context content,Intent intent){String action = intent.getAction();if(!UsbManager.ACTION_USB_STATE.equals(action)){return;}boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED,false);//boolean connected = false;//直接關閉對話方塊if(!connected){ mActivity.finish();}/* //直接確認允許通過 //allowUsbDebugging try { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); service.allowUsbDebugging(true, mKey); } catch (Exception e) { Log.e(TAG, "Unable to notify Usb service", e); } */}}

2、在/build/core/main.mk

把 ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0 

修改為

             ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 

方法二:

直接關閉adb的認證機制(google adb secure)user版直接adb 除錯模式

需要修改 /build/core 目錄下的 main.mk

ifeq (true,$(strip $(enable_target_debugging)))# Target is more debuggable and adbd is on by default ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1# Include the debugging/testing OTA keys in this build. INCLUDE_TEST_OTA_KEYS := trueelse# !enable_target_debugging# Target is less debuggable and adbd is off by default#ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0 ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0endif # !enable_target_debugging

根據ro.debuggable = 1 or 0 來設定,1 就是開啟adb, 0 即關閉adb debug.

關閉授權框提示:這個ro.adb.secure=0(0為不顯示信任此電腦,1為顯示信任此電腦)

去掉adb 金鑰校驗:ro.adb.secure=0 不顯示對話方塊

而ro.adb.secure 這個system property 對於adbd 的控制點在/system/core/adb/adb.c 中的 

property_get("ro.adb.secure", value,"0");auth_enabled =!strcmp(value,"1");if(auth_enabled) adb_auth_init();

話外:

修改ro.adb.secure預設值  

android4.4通過一個名為 ro.adb.secure 的常量來控制是否彈出adb debug除錯授權的視窗 
在UsbDeviceManager.java建構函式中有這樣一段程式碼:

boolean secureAdbEnabled =SystemProperties.getBoolean("ro.adb.secure",false);boolean dataEncrypted ="1".equals(SystemProperties.get("vold.decrypt"));if(secureAdbEnabled &&!dataEncrypted){ mDebuggingManager =newUsbDebuggingManager(context);}

可以看到通過ro.adb.secure這個key拿到的boolean值secureAdbEnabled如果是true並且通過vold.decrypt這個key拿到的boolean值dataEncrypted如果是false,那麼就會例項化一個UsbDebuggingManager物件,而UsbDebuggingManager物件就是彈出adb debug授權視窗的一整套流程的入口,至於vold.decrypt常量暫時還沒去研究。 


要注意的是通過ro.adb.secure這個key拿到的boolean值如果是false(有些原始碼平臺預設是false的)那麼就不會進入授權認證流程也就是不會彈出允許USB除錯嗎?的視窗直接就可以進行除錯了而我這邊的需求是要改變這個視窗的樣式和按鈕邏輯所以必須讓它彈出來,如何改變ro.adb.secure的預設值網上也有很多文章: 


http://www.tuicool.com/articles/UBF7ji (開啟與關閉adb 的認證機制),解決這個之後或者你開發的原始碼平臺預設就是開啟的那麼當你插入usb除錯線連線PC與android裝置的時候就會彈出一個視窗,這個視窗的彈出邏輯就是在UsbDebuggingManager.java中。

ro.secure=1  

#賦值為1是開啟安全策略

ro.adb.secure=1  

#賦值為1是開啟adb的安全策略

ro.debuggable=0  

#賦值為0是關閉除錯

service.adb.root=0  

#賦值為0是關閉adb root

Built Type

具體影響

eng

This is the default flavor. A plain "make" is the same as "make eng". droid is an alias for eng. Installs modules tagged with: eng, debug, user, and/or development. Installs non-APK modules that have no tags specified. Installs APKs according to the product definition files, in addition to tagged APKs. ro.secure=0 ro.debuggable=1 ro.kernel.android.checkjni=1 adb is enabled by default.

user

"make user" This is the flavor intended to be the final release bits. Installs modules tagged with user. Installs non-APK modules that have no tags specified. Installs APKs according to the product definition files; tags are ignored for APK modules. ro.secure=1 ro.debuggable=0adb is disabled by default.

userdebug

"make userdebug" The same as user, except: Also installs modules tagged with debug.ro.debuggable=1 adb is enabled by default.

預設即檔ro.secure 為0 時,即開啟root 許可權,為1時再根據ro.debuggable 等選項來確認是否可以用開啟root 許可權。

將ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 改成 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 即可。