天道酬勤,学无止境

通过ADB Shell和代码了解命令-Android(Understanding command through adb shell and through code - Android)

问题

我正在尝试将BATTERSTATS权限授予某个应用。 当我从PC上运行命令时-可以正常工作:

adb shell pm grant com.example.sample.myapplication android.permission.BATTERY_STATS

但是从Android应用程序运行pm grant ,相同的pm grant命令不起作用:

java.lang.Process process = Runtime.getRuntime().exec("pm grant com.example.sample.myapplication android.permission.BATTERY_STATS");

要授予此权限是否需要root权限? 如果是这样,为什么不要求将设备植根以通过adb shell运行它呢?

我是Android新手,请更清楚地解释一下内部正在发生什么以及如何进行。

回答1

使用adb shell运行的命令将以shell(UID=2000)用户权限执行。 您通过java代码运行的命令将使用您应用的UID特权执行。 因此有所不同。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 是否可以通过我的android应用程序执行adb命令?(Is it possible to execute adb commands through my android app?)
    问题 谁能说出adb命令是否可以通过我的android应用程序执行。 如果可以执行,那么如何执行呢? 回答1 您可以这样做: Process process = Runtime.getRuntime().exec("your command"); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); 别忘了用try and catch语句将其包围。 编辑: @Phix是正确的,ProcessBuilder会更好用。 回答2 普通的Android应用程序对通过adb启动的进程具有不同的特权,例如,允许通过adb启动的进程捕获屏幕,而普通的应用程序则不允许。 因此,您可以通过Runtime.getRuntime().exec()从您的应用程序执行命令,但是它们的特权不像您从adb shell执行的特权。 回答3 我碰到了这篇文章,正在寻找一个不同的查询,但是我之前在android上专门处理过input ,因此我想对此事进行一些澄清。 之所以 Runtime.getRuntime().exec("adb shell input keyevent 120"); 无法正常运作,是因为您并未移除 adb shell ADB部分仅在您的计算机上使用
  • 在哪里可以找到有关Android“服务呼叫” Shell命令的信息?(Where to find info on Android's “service call” shell command?)
    问题 使用设备上的adb shell或终端仿真器,输入此命令将清除所有通知(需要su ) service call notification 1 这将发送短信(不需要su ) service call isms 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText" 在哪里可以了解有关service call更多信息? 我找到了这个问题,并感谢答案对所有含义的细分。 但是,在哪里可以找到有关notification 2可能试图调用的方法的信息? 正在运行的service call不完整,并打印了此用法: Usage: service [-h|-?] service list service check SERVICE service call SERVICE CODE [i32 INT | s16 STR] ... Options: i32: Write the integer INT into the send parcel. s16: Write the UTF-16 string STR into the send parcel. 我跑service list ,并将它与我的设备包括78个服务回来isms和notification而对于大多数服务将打印的内容似乎是一个命名空间( com.android.internal.telephony
  • 从Android L及更高版本开始,无法再调用setMobileDataEnabled方法(The setMobileDataEnabled method is no longer callable as of Android L and later)
    问题 我已将与setMobileDataEnabled()方法不再可通过反射进行调用的问题记录在Google上的问题78084中。 从Android 2.1(API 7)到Android 4.4(API 19)可以通过反射调用,但是从Android L及更高版本开始,即使使用root用户, setMobileDataEnabled()方法也不能调用。 官方的答复是,此问题为“已关闭”,并且状态设置为“ WorkingAsIntended”。 Google的简单解释是: 私有API是私有的,因为它们不稳定,并且可能会在不通知的情况下消失。 是的,Google,我们知道使用反射来调用隐藏方法的风险-即使在Android出现之前也是如此-但您需要提供更可靠的答案,以获取与setMobileDataEnabled() 。 (如果您对我的决定不满意,请登录78084期,并对其进行尽可能多的注视,以使Google知道他们的做法有误。) 因此,我想问的是:在Android设备上以编程方式启用或禁用移动网络功能时,我们是否走到了尽头? Google采取的这种笨拙的方法在我看来并不理想。 如果您有适用于Android 5.0(Lollipop)及更高版本的解决方法,我很想听听您在此主题中的回答/讨论。 我使用下面的代码查看setMobileDataEnabled()方法是否可用: final
  • 连接多个设备时如何使用ADB Shell? 失败并显示“错误:多个设备和仿真器”(How to use ADB Shell when Multiple Devices are connected? Fails with “error: more than one device and emulator”)
    问题 $ adb --help -s SERIAL use device with given serial (overrides $ANDROID_SERIAL) $ adb devices List of devices attached emulator-5554 device 7f1c864e device $ adb shell -s 7f1c864e error: more than one device and emulator 回答1 在命令之前,请使用-s选项来指定设备,例如: adb -s 7f1c864e shell 另请参见http://developer.android.com/tools/help/adb.html#directingcommands 回答2 adb -d shell (或adb -e shell )。 如果您懒得键​​入完整的ID,此命令将在大多数情况下为您提供帮助。 从http://developer.android.com/tools/help/adb.html#commandsummary: -d将adb命令定向到唯一连接的USB设备。 连接多个USB设备时返回错误。 -e将adb命令定向到唯一正在运行的仿真器。 当多个模拟器正在运行时,返回错误。 回答3 另一个选择是将环境变量ANDROID_SERIAL设置为相关的序列号
  • Understanding command through adb shell and through code - Android
    I am trying to give BATTERSTATS permission to an app. When I run the command from a PC - it works just fine: adb shell pm grant com.example.sample.myapplication android.permission.BATTERY_STATS But the same pm grant command does not work when run from Android app: java.lang.Process process = Runtime.getRuntime().exec("pm grant com.example.sample.myapplication android.permission.BATTERY_STATS"); Does it require root permission to give this permission? If it is so, why it does not require the device to be rooted to run it via adb shell? I am new to Android, please explain a bit more clearly what
  • 为什么在使用adb时拒绝访问数据文件夹?(Why do I get access denied to data folder when using adb?)
    问题 我使用adb和以下命令连接了我的实时设备: C:\>adb -s HT829GZ52000 shell $ ls ls sqlite_stmt_journals cache sdcard etc system sys sbin proc logo.rle init.trout.rc init.rc init.goldfish.rc init default.prop data root dev $ cd data cd data $ ls ls opendir failed, Permission denied 看到访问被拒绝,我感到很惊讶。 为什么我不能使用这样的命令行浏览目录? 如何在手机上获得root访问权限? 回答1 如果要浏览设备上的所有内容,需要记住两件事。 您需要拥有具有root用户访问权限的手机才能浏览Android手机上的数据文件夹。 这意味着您拥有开发人员设备(ADP1或Google I / O的ION),或者找到了一种以其他方式“植根”手机的方法。 您需要以root模式运行ADB,请执行以下操作: adb root 回答2 从API级别8(Android 2.2)开始,对于可调试应用程序(除非要求发布版本,否则该应用程序始终由Android Studio构建),您可以使用shell run-as命令以特定方式运行命令或可执行文件用户
  • Android Studio:如何在运行或调试之前自动卸载APK(或执行adb命令)?(Android Studio : How to uninstall APK (or execute adb command) automatically before Run or Debug?)
    问题 现在,我需要在Android Studio中Run\Debug之前每次都卸载该应用程序。 因为我需要在运行\ debug应用程序之前重新创建数据库。 我知道我可以运行命令 adb uninstall [package_name] 在终端中清除/data/data/[package_name]下的文件。 但是如果我每次都要执行命令,这不是方便的方法。 我希望 adb uninstall 当我单击Run\Debug按钮时,该命令可以自动执行。 回答1 adb uninstall <package_name> 可用于通过PC卸载应用程序。 如果希望每次通过Android Studio启动应用程序时自动发生这种情况,可以执行以下操作: 在Android Studio中,单击“运行”按钮左侧的下拉列表,然后选择“编辑配置...”。 单击Android应用程序下的应用程序,然后在常规标签中,找到标题“启动前” 单击+按钮,选择运行外部工具,然后在弹出窗口中单击+按钮。 输入一些名称(例如adb卸载)和描述,然后在Program:中键入adb ,然后在Parameters:中uninstall <your-package-name> 。 在弹出窗口中单击“确定”时,请确保选择了新项目。 注意:如果您的PATH环境变量中没有adb,请在Program:字段中提供adb的完整路径(例如/
  • 如何从Android设备获取apk文件?(How do I get an apk file from an Android device?)
    问题 如何从Android设备获取apk文件? 或者如何将apk文件从设备传输到系统? 回答1 使用adb。 当设备通过USB连接时,可以使用adb pull将文件从设备复制到系统中。 当然,您还需要正确的权限才能访问文件所在的目录。如果没有,则需要首先对设备进行root用户操作。 如果您发现许多APK都命名为“ base.apk”,则还可以使用此命令将所有APK从您可以访问的电话中拉出,同时将任何“ base.apk”名称重命名为程序包名称。 这也解决了名称后似乎带有随机字符的APK路径的目录找不到问题: for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done 如果收到“ adb:错误:无法统计远程对象”,则表明您没有所需的权限。 我在未扎根的Moto Z2上运行了该程序,并且能够下载除youtube之外我未卸载的所有APK(请参见下文)。 adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills
  • 通过ADB更改设备语言(Change Device language via ADB)
    问题 我想通过亚行更改语言。 我尝试: adb shell setprop persist.sys.language fr;setprop persist.sys.country CA;stop;sleep 5;start 但是我得到了错误: setprop: command not found stop: missing job name Try `stop --help' for more information. start: missing job name Try `start --help' for more information. 怎么了? 我想在物理设备上执行此操作 回答1 您的错误与adb无关。 您只是不了解本地外壳程序如何处理命令。 您正在做的是在本地(在您的PC上)运行以下命令: adb shell setprop persist.sys.language fr setprop persist.sys.country CA stop sleep 5 start 并且您看到的错误消息来自本地外壳程序(即,系统上没有setprop可执行文件,并且start和stop命令具有非可选参数)。 正确的命令是 adb shell "setprop persist.sys.language fr; setprop persist.sys.country CA
  • 如何在Android Studio中使用ADB查看SQLite数据库(How to use ADB in Android Studio to view an SQLite DB)
    问题 我需要查看我的SQLite数据库,但我不知道该怎么做。 我去了http://www.sqlite.org/download.html,并下载了适用于我的OS的命令行外壳程序,但是当我运行程序并键入adb ...我得到了错误。 注意:我使用的是Android Studio,所以我假设不需要安装其他任何东西,因为我记得Android Studio说它具有所需的所有SDK工具。 回答1 最简单的方法:通过ADB Shell连接到Sqlite3 我在Android Studio中没有找到实现此目的的任何方法,但是我使用远程外壳程序访问数据库,而不是每次都提取文件。 在此处找到所有信息:http://developer.android.com/tools/help/sqlite3.html 1-在命令提示符下转到您的platform-tools文件夹 2-输入命令adb devices以获取adb devices列表 C:\Android\adt-bundle-windows-x86_64\sdk\platform-tools>adb devices List of devices attached emulator-xxxx device 3-将外壳连接到设备: C:\Android\adt-bundle-windows-x86_64\sdk\platform-tools>adb
  • 通过Wi-Fi运行/安装/调试Android应用程序?(Run/install/debug Android applications over Wi-Fi?)
    问题 我认为有一种方法可以通过Wi-Fi在开发中测试您的应用程序。 这可能吗? 我很希望能够拆开手机并进行无线开发。 回答1 查看论坛帖子是否可以无root权限远程查看Android屏幕? -发布#9 。 通过USB连接设备并确保调试正常; adb tcpip 5555 。 这使设备开始监听端口5555上的连接。 使用6.0或更高版本的adb shell netcfg或adb shell ifconfig查找设备IP地址; 您可以立即断开USB连接。 adb connect <DEVICE_IP_ADDRESS>:5555 。 这将连接到我们在步骤2上在设备上设置的服务器。 现在,您有了一个可以通过网络进行调试的设备。 要将服务器切换回USB模式,请运行adb usb ,这会将手机上的服务器恢复为USB模式。 如果有多个设备,则可以使用-s选项指定设备: adb -s <DEVICE_IP_ADDRESS>:5555 usb 。 无需root! 要查找设备的IP地址:运行adb shell ,然后运行netcfg 。 您会在那看到它。 要在使用OSX时查找IP地址,请运行命令adb shell ip route 。 警告:启用该选项很危险,即使您处于数据网络中,网络中的任何人都可以通过调试连接到设备。 仅在连接到受信任的Wi-Fi时执行此操作,并记住在完成连接后将其断开连接!
  • ADB命令合集自己记录
    安装配置skd 修改安卓模拟器nox_adb.exe文件 ADB命令 基本命令 查看帮助 adb help 查看版本 adb version 查看adb的连接设备: adb devices 参数 显示列表 无 所有应用 -f 显示应用关联的 apk 文件 -d 只显示 disabled 的应用 -e 只显示 enabled 的应用 -s 只显示系统应用 -3 只显示第三方应用 -i 显示应用的 installer -u 包含已卸载应用 包名包含 字符串 该命令经常出现以下问题: offline —— 表示设备未连接成功或无响应;device —— 设备已连接;no device —— 没有设备/模拟器连接;List of devices attached 设备/模拟器未连接到 adb 或无响应 链接到夜神模拟器 adb connect 127.0.0.1:62001 # 如果连接不到的时候:先找到端口号 adb nodaemon server # 在根据 端口号 找到进程的PID netstat -ano | findstr "5037" # 在进行清除此PID taskkill /pid 22712 -f # 然后调用 重启 或者手动重新联机即可 adb start-server # 或者 adb connect 127.0.0.1:62001 杀进程 adb kill
  • 什么是Android ADB Shell“ dumpsys”工具,其好处是什么?(What's the Android ADB shell “dumpsys” tool and what are its benefits?)
    问题 我正在寻找ADB shell dumpsys命令的完整列表,其中包含所有命令的完整说明。 在哪里可以找到此信息? 回答1 什么是dumpsys及其好处 dumpsys是一个可在设备上运行的android工具,可转储有关系统服务状态的有趣信息。 明显的好处: 可以轻松地以简单的字符串表示形式获取系统信息。 可以使用转储的CPU,RAM,电池,存储统计信息生成漂亮的图表,这将使您能够检查应用程序如何影响整个设备! 我们可以从dumpsys shell命令中检索什么信息以及如何使用它 如果运行dumpsys,您将看到大量的系统信息。 但是您只能使用此大转储的单独部分。 查看dumpsys的所有“子命令”: dumpsys | grep "DUMP OF SERVICE" 输出: DUMP OF SERVICE SurfaceFlinger: DUMP OF SERVICE accessibility: DUMP OF SERVICE account: DUMP OF SERVICE activity: DUMP OF SERVICE alarm: DUMP OF SERVICE appwidget: DUMP OF SERVICE audio: DUMP OF SERVICE backup: DUMP OF SERVICE battery: DUMP OF SERVICE
  • App自动化测试必备之adb使用
    1.1 Adb介绍 adb(android debug bridge)是android sdk自带的一个工具。 Adb是用来连接android设备和PC端的桥梁,通过adb工具,用户可以在PC端对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人员在开发android应用的过程中更快更好的调试apk,因此adb具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能。 adb可以跨平台,也就意味着在不仅在windows,在mac/linux平台都可以来使用adb命令,只需要下载配置对应平台软件包即可。 adb有三大部分组件: 客户端(client) 运行在你自己的电脑上,可以通过shell来调起一个客户端 服务器(server) 运行在电脑的后台,负责管理client和damon进行通信 守护进程(damon) 运行在模拟器或者android设备的后台Adb工具位于SDK目录下的platform-tools目录,有跟adb相关的三个文件: 之前我们在搭建自动化的环境的时候其实就已经将adb部署好了,我们直接在windows的dos环境中使用了(通过在运行输入cmd即可进入),所以接下来我们就开始介绍adb使用方式。 tips:adb都是通过命令来操作android设备的 1.2 Adb常用命令系列 adb
  • 如何通过TCP通过ADB连接到Android? [关闭](How can I connect to Android with ADB over TCP? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 11个月前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我正在尝试在Motorola Droid上调试应用程序,但是在通过USB连接到设备时遇到了一些困难。 我的开发服务器是在Hyper-V中运行的Windows 7 64位VM,因此无法在客户机或主机中通过USB直接连接。 我安装了几个不同的USB-over-TCP TCP解决方案,但是由于ADB监视器反复报告“ devicemonitor未能开始监视”,因此连接似乎出现了问题。 有没有一种方法可以使用网络而不是USB连接或可能的其他可行选择将开发计算机上的客户端直接连接到设备上的守护程序? 回答1 手动处理 从您的设备(如果已植根) 根据xda-developers上的帖子,您可以使用以下命令从设备启用基于Wi-Fi的ADB: su setprop service.adb.tcp.port 5555 stop adbd start adbd 您可以禁用它并返回ADB以使用以下命令在USB上监听 setprop service.adb.tcp.port -1 stop adbd start adbd 在计算机上
  • 如何为Android Shell构建可执行文件(How to build an executable for Android shell)
    问题 有时我需要在设备上运行命令或脚本,但是它们不可用或不存在。 除了可以在Android设备的shell使用的命令以外,我们是否可以向其添加其他命令? 例如,向我的设备添加screenrecord命令(我的设备的Android API低于19),该命令在其上不可用。 我知道如何使用adb shell获取设备上可用命令的列表 adb shell ls /system/bin 但我想添加更多的自定义命令和脚本,以完成一些特殊的工作。 有什么办法吗? 还是不可能? 回答1 答案提供了一系列步骤,可通过Eclipse (已过时)和Android Studio (在撰写本文时为4.1+)为Android shell构建可执行文件。 最后一个包括ndk-build和CMake 。 I.准备源代码 作为示例,请考虑mycommand.c : #include <stdio.h> int main() { printf("My Command!\n"); return 0; } 二。 可执行 Eclipse(可能已过时) 假设在Eclipse设置了NDK位置,请创建一个新的Android Application Project并执行以下步骤。 添加本机支持。 在“ Project Explorer >“ Android Tools >“ Add Native Support >“
  • Android-拉SQlite数据库android设备(Android - Pulling SQlite database android device)
    问题 我到处都看过了,找不到真正的准确答案,也没有找到有关如何执行此操作的教程。 是否有可能以任何方式拉入Android设备的数据库而无需将其root? 我只需要以任何方式提取该数据以便将其收集到我的PC上,那么我该如何执行呢? 我是否需要对应用程序或您知道的任何方法进行重新编程,但是请记住不要生根设备。 谢谢 回答1 实现所需目标的一种常用方法是使用ADB pull命令。 在大多数情况下,我更喜欢的另一种方法是通过代码将数据库复制到SD卡: try { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename"; String backupDBPath = "backupname.db"; File currentDB = new File(currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB)
  • 如何将参数传递给使用Instrumentation命令使用adb shell启动的测试功能(How can I deliver parameters to a test function, that launched using adb shell am Instrumentation command)
    问题 我正在使用Android开发,正在使用工具来测试Phone应用程序。 Instrumentation是用于测试应用程序的Android env。 为此,我使用带有测试用例名称的am命令。 我运行adb,然后输入adb shell,然后在shell中编写am命令。 我希望与此am命令一起提供一个参数。 我的意思是我希望将参数传递给am命令启动的测试。 是否可以 ??? 请帮忙 ? 回答1 您可以将数据uri,mime类型甚至“ extras”传递给am命令。 是[开始|仪器] 我开始[-a <操作>] [-d <数据_uri>] [-t <mime_type>] [-c <类别> [-c <类别>] ...] [-e <附加键> <附加值> [-e <附加键> <附加值> ...] [-n <组件>] [-D] [<uri>] 是仪器[-e <arg_name> <arg_value>] [-p <prof_file>] [-w] <component> 您可以将它们作为“附加”传递,然后获取传递给它的附加项。 您将像这样通过它们: am start -a android.intent.action.VIEW -c android.intent.category.DEFAULT -e foo bar -e bert ernie -n my.package.component
  • 如何在Android模拟器上获得root用户访问权限?(How to get root access on Android emulator? )
    问题 我拥有所有Android SDK版本(从1.5到2.3.3),并且尝试了许多方法来在Android仿真器中扎根。 我不使用任何Android设备,而是在模拟器(AVD)上测试所有内容。 我需要在任何一个Android模拟器中都具有root用户访问权限,才能使用“ iptables”和“ busybox”功能。 要使用iptables,我必须具有root用户访问权限。 Atleast'su'命令应在终端仿真器中执行。 我还安装了z4root应用程序, 但是,这需要很长时间,并且无法生根,并且会卡住。 有人说,如果我们将系统降级到RC30以下,则可以通过root访问。 如果这是真的,那该怎么办呢? 我同时使用Linux和Windows OS。 请有人告诉我任何方法来建立我的模拟器。 回答1 如果您具有具有root用户访问权限的虚拟设备,则应执行以下操作: $ > adb shell generic_x86:/ $ generic_x86:/ $ exit $ > adb root restarting adbd as root $ > adb shell generic_x86:/ # 如果不这样做,您可能会对另一个问题的答案感兴趣,该问题说明了如何创建具有root访问权限,使用Google API(又名Google Play服务)但不使用Google Play应用程序的虚拟设备
  • 从adb shell读取二进制stdout数据?(Read binary stdout data from adb shell?)
    问题 是否可以从adb shell命令读取二进制标准输出? 例如,有关如何使用屏幕截图的所有示例都包括两个步骤: adb shell screencap -p /sdcard/foo.png adb pull /sdcard/foo.png 但是,该服务支持写入标准输出。 例如,您可以执行以下操作: adb shell "screencap -p > /sdcard/foo2.png" adb pull /sdcard/foo2.png 这同样有效。 但是,如何在ADB上读取输出呢? 我想做的是以下几点: adb shell screencap -p > foo3.png 并避免中间写入SD卡。 这会产生一些看起来像一个PNG文件(运行strings foo3.png产生一些与IHDR,IEND等),是大致相同的尺寸,但该文件已损坏,只要图像读者关注。 我也尝试过在Java中使用ddmlib进行此操作,结果是相同的。 我很乐意使用任何必要的库。 我的目标是减少获得捕获的总时间。 在我的设备上,使用两个命令的解决方案,大约需要3秒钟来获取图像。 使用ddmlib和捕获stdout所花费的时间不到900毫秒,但这是行不通的! 是否有可能做到这一点? 编辑:这是两个文件的十六进制转储。 第一个screen.png来自标准输出,已损坏。 第二个是xscreen,它来自两个命令的解决方案