adb 連接時候不彈出授權對話框【轉】


本文轉載自: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
            
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM