. СНЯТИЕ ГРАФИЧЕСКОГО КЛЮЧА, PIN, FACELOCK
Допустим, ты забыл PIN или не совсем трезвым поставил графический ключ, ну или друзья пошутили и поставили распознавание по лицу… Так вот, если устройство по какой-то причине заблокировано, то блокировку можно снять (при условии включенной отладки по USB) через ту же консоль:
adb shell $ su # cd /data/system # rm *.key
Команда удалит все пароли и графические ключи. Сами файлы в зависимости от прошивки и модели устройства могут быть: gesture.key, password.key, cm_ gesture.key, personalpattern.key, personalbackuppin.key. Также за блокировку от- вечают файлы locksettings.db, locksettings.db-shm, locksettings.db-wal.
[ad name=»Responbl»]После этого достаточно перегрузить устройство и ввести любой ключ, па- роль. Если это не помогает, можно попробовать следующее:
adb shell $ cd /data/data/com.android.providers.settings/databases $ sqlite3 settings.db > update system set value=0 where name='lock_pattern_autolock'; > update system set value=0 where name='lockscreen.
lockedoutpermanently';
СИСТЕМНЫЕ УТИЛИТЫ
Кратко остановлюсь на нескольких полезных командах (работоспособность некоторых, однако, может зависеть от версии прошивки и модели телефона). Изменение DPI. Не требует root и работает на Android 5.0 . Стандартное значение для Nexus 5 — 480. При значении 420 на рабочем столе стокового лаунчера помещается пять иконок в ряд вместо четырех:
$ wm density 420 && adb reboot
Подключение /system в режиме записи. Для части команд, которые меняют системные файлы, необходимо сначала перемонтировать раздел /system на запись. Это необходимо в том числе при удалении системных приложений. Перемонтирование выполняется следующей командой:
$ su # mount -o rw,remount /system
СНЯТИЕ ЛОГОВ
Очень часто, когда для решения проблемы пользователь обращается на форум устройства, там его просят скинуть логи работы телефона или приложения. Отвечают за это две утилиты: logcat и dmesg. Первая позволяет увидеть системные сообщения в реальном времени, а вторая постфактум покажет работу ядра, включая сообщения ошибок ввода-вывода, загрузку драйверов, подключение USB-устройств и так далее. Полный лог можно вывести сразу в файл следующей командой:
adb logcat > logcat.txt
Все события будут записываться непрерывно по мере работы устройства. Остановить запись можно стандартной комбинацией Ctrl C. Однако в лог попадает вся информация, что сильно затрудняет поиск нужной. Поэтому для работы обычно используют набор ключей и фильтров, подходящих к конкретной ситуации.
adb logcat *:E
После этого можно запускать проблемное приложение и смотреть, что именно вызывает ошибку. Также поддерживается вывод информации из альтернативных буферов. Этим способом можно посмотреть, что приложения делают в фоне и, например, какие события происходят после включения экрана:
Продвинутый уровень
В одной из своих статей я показывал, как можно доставать информацию из баз данных различных приложений. Ну а теперь посмотрим, как проделать это прямо из консоли, не качая базы на комп и не устанавливая на устройство просмотрщики баз. Для этого используется команда sqlite3. Выведем на экран историю браузера Chrome:
$ cd /data/data/com.android.chrome $ su # sqlite3 app_chrome/Default/History > .schema urls > select * from urls where url like "%android%";
Чтобы база читалась, необходимо выгрузить браузер из работающих приложений. Прервать выполнение скрипта sqlite можно, нажав Ctrl Z, а выйти — командой .quit. Если в ответ на команду ты получишь ошибку /system/bin/sh: sqlite3: not found, значит, на смартфоне нет sqlite3 и ее придется скачать, заки- нуть в /system/bin и дать файлу все права. Я использую sqlite3, который выта- щил когда-то из Titanium Backup.
Также с помощью sqlite3 можно выдернуть все контакты с телефона. Для этого в консоли на компе должен использоваться шрифт Lucida Console и перед началом выполнения команд необходимо перевести кодировку на UTF-8. Иначе вместо русских букв будут отображаться непонятные символы. Сами команды выглядят так:
chcp 65001 adb shell $ su # cd /data/data/com.android.providers.contacts/databases # sqlite3 contacts2.db
> select t1.raw_contact_id,t1.normalized_number,t2.display_name from phone_lookup as t1, raw_contacts as t2 where t1.raw_contact_id=t2._id Order by display_name;
Если все сделано правильно, то в консоли ты увидишь таблицу с порядковым номером записи, номером телефона и контактами, отсортированными по имени. Для контактов с более одного номера будет несколько записей подряд.
Можно вывести данные не на экран, а сразу в текстовый файл. Для этого команды нужно изменить:
adb shell $ su # cd /data/data/com.android.providers.contacts/databases # sqlite3 contacts2.db "select t1.raw_contact_id,t1.normalized_ number,t2.display_name from phone_lookup as t1, raw_contacts as t2 where t1.raw_contact_id=t2._id;" > /sdcard/contacts.txt
Альтернативный способ вывода контактов в файл — команда, требующая установленного BusyBox:
content query --uri content://contacts/phones --projection number: name --sort "name ASC"| awk -F= '{gsub(/[-() name]/,"",$2); print $2" "$3}' | sed 's/,//g' > /sdcard/contacts.txt
. СНЯТИЕ ГРАФИЧЕСКОГО КЛЮЧА, PIN, FACELOCK
Допустим, ты забыл PIN или не совсем трезвым поставил графический ключ, ну или друзья пошутили и поставили распознавание по лицу… Так вот, если устройство по какой-то причине заблокировано, то блокировку можно снять (при условии включенной отладки по USB) через ту же консоль:
adb shell $ su # cd /data/system # rm *.key
Команда удалит все пароли и графические ключи. Сами файлы в зависимости от прошивки и модели устройства могут быть: gesture.key, password.key, cm_ gesture.key, personalpattern.key, personalbackuppin.key. Также за блокировку от- вечают файлы locksettings.db, locksettings.db-shm, locksettings.db-wal.
[ad name=»Responbl»]После этого достаточно перегрузить устройство и ввести любой ключ, па- роль. Если это не помогает, можно попробовать следующее:
adb shell $ cd /data/data/com.android.providers.settings/databases $ sqlite3 settings.db > update system set value=0 where name='lock_pattern_autolock'; > update system set value=0 where name='lockscreen.
lockedoutpermanently';
Выводы
Как видишь, с помощью ADB можно сделать много интересного. И чем больше пользуешься консолью, тем быстрее можно выполнить некоторые действия без установки дополнительного софта на устройство. Надеюсь, данная статья помогла разобраться с ADB и подтолкнула к чтению документации и поиску новых полезных команд.
Batch script – run command on each file in directory
for /r %%v in (*.xls) do ssconvert "%%v" "%%vx"
a couple have people have asked me to explain this, so:
Part 1: for /r %%v in (*.xls)
This part returns an array of files in the current directory that have the xls
extension. The %%
may look a little curious. This is basically the special %
character from command line as used in %PATH% or %TEMP%. To use it in a batch file we need to escape it like so: %%PATH%%
or %%TEMP%%
. In this case we are simply escaping the temporary variable v
, which will hold our array of filenames.
We are using the /r
switch to search for files recursively, so any matching files in child folders will also be located.
Part 2: do ssconvert "%%v" "%%vx"
This second part is what will get executed once per matching filename, so if the following files were present in the current folder:
c:tempmySheet.xls,
c:tempmySheet_yesterday.xls,
c:tempmySheet_20210902.xls
the following commands would be executed:
ssconvert "c:tempmySheet.xls" "c:tempmySheet.xlsx"
ssconvert "c:tempmySheet_yesterday.xls" "c:tempmySheet_yesterday.xlsx"
ssconvert "c:tempmySheet_20210902.xls" "c:tempmySheet_20210902.xlsx"
Checking if a parameter was passed
This is done with constructs like IF “%~1″==””, which is true if and only if no arguments were passed at all. Note the tilde character which causes any surrounding quotes to be removed from the value of %1; without a tilde you will get unexpected results if that value includes double quotes, including the possibility of syntax errors.
Examples
TASKLIST
The above command will get the list of all the processes running on your local system. Following is a snapshot of the output which is rendered when the above command is run as it is. As you can see from the following output, not only do you get the various processes running on your system, you also get the memory usage of each process.
Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System Idle Process 0 Services 0 4 K System 4 Services 0 272 K smss.exe 344 Services 0 1,040 K csrss.exe 528 Services 0 3,892 K csrss.exe 612 Console 1 41,788 K wininit.exe 620 Services 0 3,528 K winlogon.exe 648 Console 1 5,884 K services.exe 712 Services 0 6,224 K lsass.exe 720 Services 0 9,712 K svchost.exe 788 Services 0 10,048 K svchost.exe 832 Services 0 7,696 K dwm.exe 916 Console 1 117,440 K nvvsvc.exe 932 Services 0 6,692 K nvxdsync.exe 968 Console 1 16,328 K nvvsvc.exe 976 Console 1 12,756 K svchost.exe 1012 Services 0 21,648 K svchost.exe 236 Services 0 33,864 K svchost.exe 480 Services 0 11,152 K svchost.exe 1028 Services 0 11,104 K svchost.exe 1048 Services 0 16,108 K wlanext.exe 1220 Services 0 12,560 K conhost.exe 1228 Services 0 2,588 K svchost.exe 1276 Services 0 13,888 K svchost.exe 1420 Services 0 13,488 K spoolsv.exe 1556 Services 0 9,340 K
tasklist > process.txt
The above command takes the output displayed by tasklist and saves it to the process.txt file.
tasklist /fi "memusage gt 40000"
The above command will only fetch those processes whose memory is greater than 40MB. Following is a sample output that can be rendered.
Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ dwm.exe 916 Console 1 127,912 K explorer.exe 2904 Console 1 125,868 K ServerManager.exe 1836 Console 1 59,796 K WINWORD.EXE 2456 Console 1 144,504 K chrome.exe 4892 Console 1 123,232 K chrome.exe 4976 Console 1 69,412 K chrome.exe 1724 Console 1 76,416 K chrome.exe 3992 Console 1 56,156 K chrome.exe 1168 Console 1 233,628 K chrome.exe 816 Console 1 66,808 K
Executing batch files
Following are the steps to execute a batch file −
Step 1 − Open the command prompt (cmd.exe).
Step 2 − Go to the location where the .bat or .cmd file is stored.
Step 3 − Write the name of the file as shown in the following image and press the Enter button to execute the batch file.
Executing multiple commands from a windows cmd script
I’m trying to write a Windows cmd script to perform several tasks in series.
However, it always stops after the first command in the script.
The command it stops after is a maven build (not sure if that’s relevant).
How do I make it carry on and run each task in turn please?
Installing any software or configuring the registry etc is completely out of the question – it has to work on a vanilla Windows XP installation I’m afraid.
Ideally I’d like the script to abort if any of the commands failed, but that’s a “nice to have”, not essential.
Thanks.
Explanation of the program
Line 1:
For loop in cmd… how to loop a to z (for drive letters)
To loop through all drive letters without explicitly stating them you could use forfiles
(which is delivered with all Windows versions past Vista, I believe) and its capability to expand hex. codes 0xHH
, together with exit
to set the exit code and the hidden variable =ExitCode
to convert the exit code to a hexadecimal value, like in this example code:
@echo off
for /L %%C in (0x41,1,0x5A) do (
cmd /C exit %%C
for /F %%D in ('
forfiles /P "%~dp0." /M "%~nx0" /C "cmd /C echo 0x%%=ExitCode:~-2%%"
') do echo %%D:
)
This is quite slow though, because there are several cmd
instances opened and closed.
To loop through all available drives, including network drives and also such established by subst
, you could use the following code, based on wmic
:
for /F "skip=1" %%C in ('wmic LogicalDisk get DeviceID') do for /F %%D in ("%%C") do echo %%D
To loop through all local drives, you could use the following code, again based on wmic
:
for /F "skip=1" %%C in ('wmic Volume where "DriveLetter is not Null" get DriveLetter') do for /F %%D in ("%%C") do echo %%D
To loop through all local drives, but based on mountvol
, you could use the following code instead:
for /F %%C in ('mountvol ^| find ":"') do echo %%C
Finally, for the sake of completeness, to loop through all drives that have been established by subst
, use the this code:
for /F "delims=" %%C in ('subst') do echo %%C
How do you loop through each line in a text file using a windows batch file?
The accepted answer is good, but has two limitations.
It drops empty lines and lines beginning with ;
To read lines of any content, you need the delayed expansion toggling technic.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
Findstr is used to prefix each line with the line number and a colon, so empty lines aren’t empty anymore.
DelayedExpansion needs to be disabled, when accessing the %%a
parameter, else exclamation marks !
and carets ^
will be lost, as they have special meanings in that mode.
But to remove the line number from the line, the delayed expansion needs to be enabled.set "var=!var:*:=!"
removes all up to the first colon (using delims=:
would remove also all colons at the beginning of a line, not only the one from findstr).
The endlocal disables the delayed expansion again for the next line.
The only limitation is now the line length limit of ~8191, but there seems no way to overcome this.
How to prevent auto-closing of console after the execution of batch file
Easy, add cmd to your last line of bat, BUT! if you reset or clear your system path, you must start your cmd with the full path, like:
%windir%system32cmd.exe
For example, I have a bat file to reset jdk to old version like this:
PATH=C:Program FilesJavajdk1.6.0_45bin;C:apache-ant-1.7.1bin
SET JAVA_HOME=C:Program FilesJavajdk1.6.0_45
%windir%system32cmd.exe
since I reset the system path, I have to run cmd with the full path, or the system can’t find cmd.exe, it will fail to run cmd, and just close the window, and you can’t see the error msg.
Modifying batch files
Following are the steps for modifying an existing batch file.
Step 1 − Open windows explorer.
Step 2 − Go to the location where the .bat or .cmd file is stored.
Step 3 − Right-click the file and choose the “Edit” option from the context menu. The file will open in Notepad for further editing.
Output
The above command produces the following output.
13150 5
Passing command line arguments to r cmd batch
Here’s another way to process command line args, using R CMD BATCH
. My approach, which builds on an earlier answer here, lets you specify arguments at the command line and, in your R script, give some or all of them default values.
Here’s an R file, which I name test.R:
defaults <- list(a=1, b=c(1,1,1)) ## default values of any arguments we might pass
## parse each command arg, loading it into global environment
for (arg in commandArgs(TRUE))
eval(parse(text=arg))
## if any variable named in defaults doesn't exist, then create it
## with value from defaults
for (nm in names(defaults))
assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]))[[1]])
print(a)
print(b)
At the command line, if I type
R CMD BATCH --no-save --no-restore '--args a=2 b=c(2,5,6)' test.R
then within R we’ll have a
= 2
and b
= c(2,5,6)
. But I could, say, omit b
, and add in another argument c
:
R CMD BATCH --no-save --no-restore '--args a=2 c="hello"' test.R
Then in R we’ll have a
= 2
, b
= c(1,1,1)
(the default), and c
= "hello"
.
Finally, for convenience we can wrap the R code in a function, as long as we’re careful about the environment:
## defaults should be either NULL or a named list
parseCommandArgs <- function(defaults=NULL, envir=globalenv()) {
for (arg in commandArgs(TRUE))
eval(parse(text=arg), envir=envir)
for (nm in names(defaults))
assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]), envir=envir)[[1]], pos=envir)
}
## example usage:
parseCommandArgs(list(a=1, b=c(1,1,1)))
Saving batch files
After your batch file is created, the next step is to save your batch file. Batch files have the extension of either .bat or .cmd. Some general rules to keep in mind when naming batch files −
Try to avoid spaces when naming batch files, it sometime creates issues when they are called from other scripts.
Don’t name them after common batch files which are available in the system such as ping.cmd.
The above screenshot shows how to save the batch file. When saving your batch file a few points to keep in mind.
- Remember to put the .bat or .cmd at the end of the file name.
- Choose the “Save as type” option as “All Files”.
- Put the entire file name in quotes “”.
Set command
The other way in which variables can be initialized is via the ‘set’ command. Following is the syntax of the set command.
Substitution of batch parameters
For parameters that represent file names the shell provides lots of functionality related to working with files that is not accessible in any other way. This functionality is accessed with constructs that begin with %~.
For example, to get the size of the file passed in as an argument use
Syntax
START "title" [/D path] [options] "command" [parameters]
Wherein
Windows bat file optional argument parsing
The selected answer works, but it could use some improvement.
My solution relies on the creation of an OPTIONS variable that defines all of the options and their defaults. OPTIONS is also used to test whether a supplied option is valid. A tremendous amount of code is saved by simply storing the option values in variables named the same as the option. The amount of code is constant regardless of how many options are defined; only the OPTIONS definition has to change.
EDIT– Also, the :loop code must change if the number of mandatory positional arguments changes. For example, often times all arguments are named, in which case you want to parse arguments beginning at position 1 instead of 3. So within the :loop, all 3 become 1, and 4 becomes 2.
@echo off
setlocal enableDelayedExpansion
:: Define the option names along with default values, using a <space>
:: delimiter between options. I'm using some generic option names, but
:: normally each option would have a meaningful name.
::
:: Each option has the format -name:[default]
::
:: The option names are NOT case sensitive.
::
:: Options that have a default value expect the subsequent command line
:: argument to contain the value. If the option is not provided then the
:: option is set to the default. If the default contains spaces, contains
:: special characters, or starts with a colon, then it should be enclosed
:: within double quotes. The default can be undefined by specifying the
:: default as empty quotes "".
:: NOTE - defaults cannot contain * or ? with this solution.
::
:: Options that are specified without any default value are simply flags
:: that are either defined or undefined. All flags start out undefined by
:: default and become defined if the option is supplied.
::
:: The order of the definitions is not important.
::
set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"
:: Set the default option values
for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
:: Validate and store the options, one at a time, using a loop.
:: Options start at arg 3 in this example. Each SHIFT is done starting at
:: the first option so required args are preserved.
::
if not "%~3"=="" (
set "test=!options:*%~3:=! "
if "!test!"=="!options! " (
rem No substitution was made so this is an invalid option.
rem Error handling goes here.
rem I will simply echo an error message.
echo Error: Invalid option %~3
) else if "!test:~0,1!"==" " (
rem Set the flag option using the option name.
rem The value doesn't matter, it just needs to be defined.
set "%~3=1"
) else (
rem Set the option value using the option as the name.
rem and the next arg as the value
set "%~3=%~4"
shift /3
)
shift /3
goto :loop
)
:: Now all supplied options are stored in variables whose names are the
:: option names. Missing options have the default value, or are undefined if
:: there is no default.
:: The required args are still available in %1 and %2 (and %0 is also preserved)
:: For this example I will simply echo all the option values,
:: assuming any variable starting with - is an option.
::
set -
:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!
There really isn’t that much code. Most of the code above is comments. Here is the exact same code, without the comments.
@echo off
setlocal enableDelayedExpansion
set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"
for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
set "test=!options:*%~3:=! "
if "!test!"=="!options! " (
echo Error: Invalid option %~3
) else if "!test:~0,1!"==" " (
set "%~3=1"
) else (
set "%~3=%~4"
shift /3
)
shift /3
goto :loop
)
set -
:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!
This solution provides Unix style arguments within a Windows batch. This is not the norm for Windows – batch usually has the options preceding the required arguments and the options are prefixed with /
.
The techniques used in this solution are easily adapted for a Windows style of options.
- The parsing loop always looks for an option at
%1
, and it continues until arg 1 does not begin with/
- Note that SET assignments must be enclosed within quotes if the name begins with
/
.SET /VAR=VALUE
failsSET "/VAR=VALUE"
works. I am already doing this in my solution anyway. - The standard Windows style precludes the possibility of the first required argument value starting with
/
. This limitation can be eliminated by employing an implicitly defined//
option that serves as a signal to exit the option parsing loop. Nothing would be stored for the//
“option”.
Update 2021-12-28: Support for !
in option values
In the code above, each argument is expanded while delayed expansion is enabled, which means that !
are most likely stripped, or else something like !var!
is expanded. In addition, ^
can also be stripped if !
is present. The following small modification to the un-commented code removes the limitation such that !
and ^
are preserved in option values.
@echo off
setlocal enableDelayedExpansion
set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"
for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
set "test=!options:*%~3:=! "
if "!test!"=="!options! " (
echo Error: Invalid option %~3
) else if "!test:~0,1!"==" " (
set "%~3=1"
) else (
setlocal disableDelayedExpansion
set "val=%~4"
call :escapeVal
setlocal enableDelayedExpansion
for /f delims^=^ eol^= %%A in ("!val!") do endlocal&endlocal&set "%~3=%%A" !
shift /3
)
shift /3
goto :loop
)
goto :endArgs
:escapeVal
set "val=%val:^=^^%"
set "val=%val:!=^!%"
exit /b
:endArgs
set -
:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!
Working with numeric values
In batch script, it is also possible to define a variable to hold a numeric value. This can be done by using the /A switch.
The following code shows a simple way in which numeric values can be set with the /A switch.
Мягкая перезагрузка:
$ setprop ctl.restart zygote
Перевод смартфона в режим энергосбережения Doze (Android M ): $ dumpsys battery unplug
$ dumpsys deviceidle step
…повторяем действия, пока не увидим idle. Батарейка в процентах (Android 4.4 ):
$ content insert --uri content://settings/system --bind name:s:status_bar_show_battery_percent --bind value:i:1
Полезные скрипты cmd/bat
Используется для получения имени файла/папки в формате 8.3,
если другими способами не получается удалить/переименовать объект.
Выводит отчет в форматах Plain Text (DirX.txt) и CSV (DirX.csv) рекурсивно для текущего и всех подкаталогов,
начиная с места, откуда батник сам запущен.
Если отчет не был создан, запустите батник правым кликом “От имени Администратора”.
Помните: некоторые объекты с некорректным именем можно удалить/переименовать,
добавив к полному имени файла! префикс \?
например:
Этот способ отключает некоторые ограничения на операции с файловой системой.
Ссылки по теме:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
http://msconfig.ru/threads/flystudi…obrazit-propavshee-soderzhimoe-fleshki.12352/
http://msconfig.ru/threads/vosstanovlenie-dostupa-k-papkam-fajlam-so-specsimvolami-v-imeni.21291/
>>>Посмотреть вложение DirX2.zip<<<
В дополнение:
Исправление проблемы, когда не работает вывод коротких имен файлов Dir /X
Источник: techguy.org
Режим представления коротких имен файлов может быть отключен.
Тогда Вам не удастся получить имя в формате 8.3 командой DIR /X
Проверить это можно, введя команду:
Чтобы снова
включить
этот режим, введите:
1) для XP:
2) для Vista и выше:
Напомню, что данный режим отображает альтернативные имена в формате 8.3 и будет удобен,
когда требуется работать с именами файлов и папок, имеющих:
Для автоматической подстановки и парсинга имен в формате 8.3. можно воспользоваться такой циклической конструкцией:
Здесь я (
имя пользователя:Alex
) перечисляю у себя на рабочем столе (
папкаDesktop
) все файлы (
*
).
Вместо команды
echo
можно подставить любую другую, взаимодействующую с файлом формата 8.3.
Учитывайте, что эта команда выводит в конце 2 лишних строки.
Выводы
Как видишь, с помощью ADB можно сделать много интересного. И чем больше пользуешься консолью, тем быстрее можно выполнить некоторые действия без установки дополнительного софта на устройство. Надеюсь, данная статья помогла разобраться с ADB и подтолкнула к чтению документации и поиску новых полезных команд.