本文轉載自:http://blog.csdn.net/sinc00/article/details/44957943
在首次使用adb connect,然后adb shell的時候,常常需要點擊彈出的對話框,否則出現
error: device unauthorized. Please check the confirmation dialog on your device.
這種情況在沒有顯示屏的時候或者多人連接時不太方便。這時候想默認授權而不用點擊對話框想要去除彈框。
先了解它的工作原理,以下來自
-------------------------------------以下為轉載--------------------------------------------------------------------------------------------
http://blog.csdn.net/sowhat_ah/article/details/43307907
工作原理是什么?
原來在我們的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命令;
-------------------------------------------------------以上為轉載---------------------------------------------------------------------------------------------------------------
因此,方法一、 根據轉載的文章。在機器上建立/data/misc/adb/adb_keys 以及 在PC上建立adbkey.pub。
方法二、修改framework的代碼,這里重點要說的方法,經過實驗成功。
修改文件 UsbDebuggingActivity.java
@Override
public void onReceive(Context content, Intent intent) {
String action = intent.getAction();
if (!UsbManager.ACTION_USB_STATE.equals(action)) {
return;
}
//: usb show UI
//boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
boolean connected = false; //給connect賦值,關掉UI
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);
}
//<<end
}
}