前言
用adb调试android设备的时候,第一次连接的时候会出现一个授权提示:
error: device unauthorized. Please check the confirmation dialog on your device.
这时候在android设备上会出现一个提示框,让用户确认是否允许PC进行调试
那么这个过程中发生了什么呢? 往下看
工作原理
当我们在PC上启动adb进程的时候,adb进程会在本地生成一对秘钥 adbkey 和 adbkey.pub
根据弹框提示 The computer’s RSA key fingerprint is:xxx ,可以看出是一对RSA算法的秘钥,其中公钥是来发送给android设备的.
当你执行 adb shell 的时候,adb进程会将PC上的adbkey.pub发送给android设备;这个时候如果android上已经保存了这台PC的adbkey.pub ,则连接成功,如果没有保存则会出现弹框,当你点击允许之后android设备就会保存PC的 adbkey.pub
adbkey存放位置
- android设备 : /data/misc/adb/adb_keys // 将PC的adbkey.pub 拷贝并且重命名而来
- windows: C:\Users\Administrator\.android\adbkey
- Linux: ~/.android/adbkey
用adbkey进行权限控制
在android设备里面内置一组 adb_keys ,这样用于该adb_keys的PC才能进行调试
需要修改源码:
- frameworks/base/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
case MESSAGE_ADB_CONFIRM: {
if ("trigger_restart_min_framework".equals(
SystemProperties.get("vold.decrypt"))) {
Slog.d(TAG, "Deferring adb confirmation until after vold decrypt");
if (mThread != null) {
mThread.sendResponse("NO");
}
break;
}
// add start
if (1 == SystemProperties.getLong("ro.feat.adb_auth_by_key_only", 0)) {
Slog.e(TAG, "MESSAGE_ADB_CONFIRM:DENY, adbkey error");
break; /*下面的代码不进去直接 break*/
//add end
}
String key = (String)msg.obj;
String fingerprints = getFingerprints(key);
if ("".equals(fingerprints)) {
if (mThread != null) {
mThread.sendResponse("NO");
}
break;
}
mFingerprints = fingerprints;
startConfirmation(key, mFingerprints);
break;
}
-
在device/xxxx/product/system.prop里添加
ro.feat.adb_auth_by_key_only=1
-
在系统跑起来的时候将内置在系统中的adbkey.pub 拷贝为 /data/misc/adb/adb_keys
-
注意权限问题,下面为一个示例
misc_task.sh
# preset adb_keys
if [ -f /system/vendor/res/adb_keys ]; then
if [ ! -d /data/misc/adb ]; then
mkdir /data/misc/adb
chown system.shell /data/misc/adb
busybox chmod 750 /data/misc/adb
busybox chmod g+s /data/misc/adb
fi
cp -f /system/vendor/res/adb_keys /data/misc/adb/
chown system.shell /data/misc/adb/*
chmod 640 /data/misc/adb/*
fi
init.project.rc
##run shell scripts in android
service misc_tasks /system/bin/misc_tasks.sh
class main
user root
group root
oneshot
seclabel u:r:misc_tasks:s0