通过控制ADBD(ADB服务器守护程序进程),我的意思是:配置,停止和启动/ sbin / adbd进程而不使用ADB本身。
前言这个问题:
在一些罕见的Android设备上,不存在触摸屏(智能眼镜等)。但显然,许多应用程序都需要它,因此必须通过软件模拟输入。
最短的解决方案是使用输入命令,但是为了从活动中使用它,需要特殊权限INJECT_EVENTS。
通过使应用程序成为系统应用程序,或者使用ROM源中存在的固件密钥对应用程序进行签名,可以授予此权限。 我的目标设备只需要固件密钥,我将无法获得它。
此时我能想到的单一黑客,就是为了获利,ADB可以使用输入命令而不需要任何东西。
实际上,我可以通过USB手动尝试通过ADB来确认这个黑客可以工作:
1 /打开ADB shell: PC命令:adb shell
2 /配置ABDB打开TCP模式: 在adb shell里面:
setprop service.adb.tcp.port 5555; // Configure
stop adbd; // Restart
start adbd;
adb connect localhost:5555; // Start a client ADB, to the local ADBD server process
3 /来自活动代码:
Runtime.getRuntime().exec(new String[] { "sh", "-c", "adb shell \"input tap 100 200;\";" });
总结一下:Activity可以通过运行rooted命令来生成没有权限的输入事件,该命令启动通过TCP端口在其自己的adbd进程上连接的adb shell。
问题是:它需要手动ADBD配置,ADBD重启,并使设备上的ADB客户端连接到它。
不太好的解决方案:我可以设置持久性ADBD配置以避免重新配置+重启,但这意味着一个巨大的安全漏洞,因为LAN上的任何人都可以在设备上拥有root权限。
通过ADB shell的命令是:setprop persist.adb.tcp.port 5555;
我希望他们的工作的Android活动代码是:
Runtime.getRuntime().exec("setprop service.adb.tcp.port 5555");
Runtime.getRuntime().exec("stop adbd");
Runtime.getRuntime().exec("start adbd");
Thread.sleep(3000);
Runtime.getRuntime().exec("adb connect localhost:5555");
但从我所看到的情况来看,它似乎没有做任何事情。
我还尝试在隐藏的SystemProperties API上使用反射:
static public String getprop(String key){
try { Class c = Class.forName("android.os.SystemProperties");
try { Method method = c.getDeclaredMethod("get", String.class);
try { return (String) method.invoke(null, key);
} catch (IllegalAccessException e) {e.printStackTrace();}
catch (InvocationTargetException e) {e.printStackTrace();}
} catch (NoSuchMethodException e) {e.printStackTrace();}
} catch (ClassNotFoundException e) {e.printStackTrace();}
return null;
}
static public void setprop(String key, String value){
try { Class c = Class.forName("android.os.SystemProperties");
try { Method method = c.getDeclaredMethod("set", String.class, String.class);
try { method.invoke(null, key, value);
} catch (IllegalAccessException e) {e.printStackTrace();}
catch (InvocationTargetException e) {e.printStackTrace();}
} catch (NoSuchMethodException e) {e.printStackTrace();}
} catch (ClassNotFoundException e) {e.printStackTrace();}
}
似乎getprop()按预期工作,但是做setprop()然后getprop()没有显示任何修改。既不执行setprop(),也不执行shell getprop命令。
还有人要读这篇文章! ;) 感谢您的阅读,并非常感谢愿意寻求解决方案的人。