需求:在我们开发过程中,如果通过usb线不能调试,那么只能通过局域网adb来调试。
代码路径:
system/core/adb/adb.c
system/core/adb/services.c
external/sepolicy/property_contexts
system/core/init/property_service.c
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java
在adb.c文件中adb_main方法获取该属性的端口值:service.adb.tcp.port
int adb_main(int is_daemon, int server_port)
{
property_get("service.adb.tcp.port", value, "");
if (!value[0]) {
property_get("persist.adb.tcp.port", value, "");
}
if (sscanf(value, "%d", &port) == 1 && port > 0) {
printf("using port=%d\n", port);
local_init(port);
} else if (!usb) {
local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
}
D("adb_main(): pre init_jdwp()\n");
init_jdwp();
D("adb_main(): post init_jdwp()\n");
}
在property_service.c文件中property_perms数组中给该service.adb.tcp.port属性添加权限
struct {
const char *prefix;
unsigned int uid;
unsigned int gid;
} property_perms[] = {
{ "net.rmnet0.", AID_RADIO, 0 },
{ "service.adb.tcp.port", AID_SHELL, 0 },
{ NULL, 0, 0 }
};
在property_service.c文件中restart_tcp_service方法和restart_usb_service方法中
void restart_tcp_service(int fd, void *cookie)
{
char buf[100];
char value[PROPERTY_VALUE_MAX];
int port = (int)cookie;
if (port <= 0) {
snprintf(buf, sizeof(buf), "invalid port\n");
writex(fd, buf, strlen(buf));
adb_close(fd);
return;
}
snprintf(value, sizeof(value), "%d", port);
property_set("service.adb.tcp.port", value);
snprintf(buf, sizeof(buf), "restarting in TCP mode port: %d\n", port);
writex(fd, buf, strlen(buf));
adb_close(fd);
}
void restart_usb_service(int fd, void *cookie)
{
char buf[100];
property_set("service.adb.tcp.port", "0");
snprintf(buf, sizeof(buf), "restarting in USB mode\n");
writex(fd, buf, strlen(buf));
adb_close(fd);
}
在property_contexts文件中service.adb.tcp.port给该属性变量添加selinux权限
debug. u:object_r:shell_prop:s0
log. u:object_r:shell_prop:s0
service.adb.root u:object_r:shell_prop:s0
service.adb.tcp.port u:object_r:shell_prop:s0
在UsbDebuggingActivity.java文件中usb 调试授权默认开启,不弹出对话框选择
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0) {
mDisconnectedReceiver = new UsbDisconnectedReceiver(this);
}
}
使用操作如下所示:
service.adb.tcp.port=5555
adb connect 192.168.0.158:5555