2024-04-24 14:47:33 | 我爱编程网
打开Android手机的USB调试对于使用豌豆夹、调试程序等来说很重要。下面说说如何用代码自动打开USB调试。先分析USB调试的相关
源代码
。
在 packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java 找到关于 USB Debug Enable 的代码:
[java] view plain copy
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0 );
此文件中,将根据用户设置将其值保存到 Settings 数据库中。别处将根据其值动态变化做出相应动作
经搜索,在 frameworks/base/services/java/com/android/server/NotificationManagerService.java 中存在利用该值判断是否在状态栏中进行通知。代码如下:
别处将根据其值动态变化做出相应动作如状态栏消息提示。
[java] view plain copy
void observe() {
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(我爱编程网
Settings.Secure.ADB_ENABLED), false , this );
update();
}
@Override public void onChange( boolean selfChange) {
update();
}
public void update() {
ContentResolver resolver = mContext.getContentResolver();
mAdbEnabled = Settings.Secure.getInt(resolver,
Settings.Secure.ADB_ENABLED, 0 ) != 0 ;
updateAdbNotification();
}
通过分析代码,我们可以实现用程序自动打开usb调试了。
[java] view plain copy
boolean enableAdb = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0) > 0);
if (!enableAdb) {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 1);
}
马上进行运行,会出现异常,通过Logcat可以看到没有权限。android.permission.WRITE_SECURE_SETTINGS是不允许普通程序来执行,必须要有系统的签名或放到
/system/app下。
(1)、在AndroidManifest.xml加上两个权限
[html] view plain copy
可以把程序push到/system/app,并对这个apk加上0644的权限,重启手机,可以发现usb调试自动打开了。
要使用adb 我们首先要有android 的环境,android还需要java的环境首先讲如何配置adb,使adb可以在终端使用,也就是在命令行可以使用,配置环境变量,在计算机右键选择属性,我们会看到如下界面,选择【高级系统设置】,然后点击【环境变量】
下面是我配置的android的环境变量和java的环境变量,大家需要自行配置
配置完成后,我们在终端输入adb命令,会看到adb的相关信息
执行adb devices 命令,我们可以看到当前电脑正在连接调试的手机
首先我们学习下,如何拿adb安装apk到某个设备,假如只连接了一台设备,只需要adb install apk的路径 就可以直接安装成功,假如有多台设备,我们就需要用到-s选项选择设置编号,设备编号通过上面的adb devices可以得到,完整命令 adb -s 设备编号 install apk的路径,具体执行成功示例,如下图展示
卸载的话直接加adb uninstall 包名,就可以直接卸载啦
我爱编程网(https://www.52biancheng.com)小编还为大家带来如何在Java代码中调用adb命令的相关内容。
代码如下:
package com.symbio.ltp.adb;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import com.symbio.ltp.model.ConfigPropertiesData;
import com.symbio.ltp.util.Log;
public class ShellCommand {
private String name;
private Process process;
private BufferedWriter writer;
private BufferedReader reader;
private BufferedReader errorReader;
private List
private String[] returnValue;
public ShellCommand(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Process getProcess() {
return process;
}
public BufferedWriter getOutputWriter() {
return writer;
}
public BufferedReader getInputReader() {
return reader;
}
public BufferedReader getErrorReader() {
return errorReader;
}
public boolean start(String cmd) {
try {
process = Runtime.getRuntime().exec(cmd);
writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
} catch (IOException e) {
Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());
return false;
}
return true;
}
public boolean exec(String cmd) {
String line;
try {
writer.write(cmd + "\n");
writer.flush();
while((line = reader.readLine()) != null) {
Log.debug(line);
if(line.equals(ConfigPropertiesData.ltp_success)) {
return true;
} else if(line.equals(ConfigPropertiesData.ltp_fail)) {
return false;
}
}
} catch (IOException e) {
Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());
return false;
}
return true;
}
public String [] execReturn(String cmd) {
String line;
list = new ArrayList
try {
writer.write(cmd + "\n");
writer.flush();
line = reader.readLine();
while((line = reader.readLine()) != null) {
if(line.length()>0 && !(line.startsWith("#"))){
Log.debug(line);
list.add(line);
if(line.equals(ConfigPropertiesData.ltp_success)) {
break;
} else if(line.equals(ConfigPropertiesData.ltp_fail)) {
break;
}
}
}
int size = list.size();
returnValue = new String[size];
for (int i = 0; i < size; i++) {
returnValue[i] = list.get(i);
}
} catch (IOException e) {
Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());
return null;
}
return returnValue;
}
public void terminate() {
try {
writer.write(0x03);
writer.flush();
} catch (IOException e) {
Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());
}
}
}
如何通过ADB获取安卓设备中正在运行的程序ADB接口的作用主要是让电脑等其它设备控制安卓系统的,所以,称为“中间桥”;不是为安卓自已用的,自已可直接执行称为SHELL,这与ADB无关。所以安卓JAVA不一定有封装的ADB类。电脑上有ADB服务程序,端口5037,它是中间程序,与安卓系统上守护进程(Daemon)通讯。如果要在自已的手机上应该也能执行adb命令,应该直接跟守护进程(Daemon
php如何支持mb_strlen如何使用phpPHP字符串长度计算strlen()函数使用介绍strlen()函数和mb_strlen()函数在PHP中,函数strlen()返回字符串的长度。功能原型如下:复制代码代码如下:(同Internationalorganizations)国际组织strlen(字符串string_input);参数str
ThinkPHP如何使用leftjoin?没用过thinkphp,但是根据一般的框架代码习惯,应该有join,joinleft,joinright,joinouter之类的方法,而不是只有join,另一种可能就是join方法中的某个参数可以用来调整连接方式,比如join('...','left')PHPMYSQLJOIN取出两个表的所有值时发生同名字段赋值重叠,该怎样避免?你可以在查询
如何使用dreamweaver创建php1.在Dreamweaver中,创建一个新的PHP页。选择“文件”>“新建”>“动态”,选择“PHP”,然后单击“创建”。一个PHP空白页将在Dreamweaver中打开。2.为该页面定义记录集。在“绑定”面板(“窗口”>“绑定”)中,单击加号(+)按钮,然后选择“记录集(查询)”,并完成该“记录集”对话框。如果您想自己编
PHP函数分享—100个最常用的PHP函数以下是最常用的前100个PHP函数列表:1.count()2.echo()3.array()4.is_numeric()5.is_array()6.strlen()7.print()8.substr()9.explode()10.implode()...96.file_put_contents()
方程计算器如何使用使用方程计算器可以帮助你解决各种数学方程和算式。具体使用方法可能会因不同的计算器而异,但以下是一般的步骤:打开方程计算器:首先,找到你的计算器,可以是物理计算器或计算器应用程序。在手机、平板电脑或计算机上,你可以使用预装的计算器应用或下载一个专业的计算器应用。选择模式:一些计算器具有不同的模式,如基本模式、科学模式、统计模式等。根据你的需求选择适当的模式。输入方
如何使用php的mail函数可以,但是这要需要smtp.163.com的用户名与密码我给你一个邮件发送类,你可以直接用/*名称:smtpsend.class.php功能:邮件发送类,实现邮件发送功能,可以发送html邮件;可验证用户是否具有发送权限;可实现从任意服务器邮箱发送邮件,并非局限于本机。时间:2008-03author:三生石$smtpserver;S
PHP中使用按位取反(~)函数创建后门PHP中使用按位取反(~)函数创建后门本文将介绍在PHP中如何利用按位取反(~)函数创建后门的原理及方法。首先,我们需要了解PHP的位运算符。在PHP中,按位取反(~)运算符能够将一个整数的二进制位进行反转。如果原数的某位是0,则该位变为1,反之亦然。这个特性在某些场景下可以用来绕过安全机制,创建后门。例如,通过将按位取反运算应用于错误
2025-02-01 20:24:39
2025-02-12 03:21:37
2025-02-10 15:19:48
2025-01-28 17:58:32
2024-11-22 05:08:01
2024-09-10 08:50:00