Skip to content

Latest commit

 

History

History
1586 lines (1241 loc) · 113 KB

android.org

File metadata and controls

1586 lines (1241 loc) · 113 KB

Android

ADB

adb help // List all comands

== Adb Server adb kill-server adb start-server

== Adb Reboot adb reboot adb reboot recovery adb reboot-bootloader adb root //restarts adb with root permissions

== Shell adb shell // Open or run commands in a terminal on the host Android device.

== Devices adb usb adb devices //show devices attached adb devices -l //devices (product/model) adb connect ip_address_of_device

== Get device android version adb shell getprop ro.build.version.release

== LogCat adb logcat adb logcat -c // clear // The parameter -c will clear the current logs on the device. adb logcat -d > [path_to_file] // Save the logcat output to a file on the local system. adb bugreport > [path_to_file] // Will dump the whole device information like dumpstate, dumpsys and logcat output.

== Files adb push [source] [destination] // Copy files from your computer to your phone. adb pull [device file location] [local file location] // Copy files from your phone to your computer.

== App install adb -e install path/to/app.apk

-d - directs command to the only connected USB device… -e - directs command to the only running emulator… -s <serial number> … -p <product name or path> … The flag you decide to use has to come before the actual adb command:

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X install -r com.myAppPackage // Install the given app on all connected devices.

== Uninstalling app from device adb uninstall com.myAppPackage adb uninstall <app .apk name> adb uninstall -k <app .apk name> -> “Uninstall .apk withour deleting data”

adb shell pm uninstall com.example.MyApp adb shell pm clear [package] // Deletes all data associated with a package.

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X uninstall com.myAppPackage //Uninstall the given app from all connected devices

== Update app adb install -r yourApp.apk // -r means re-install the app and keep its data on the device. adb install –k <.apk file path on computer>

== Home button adb shell am start -W -c android.intent.category.HOME -a android.intent.action.MAIN

== Activity Manager adb shell am start -a android.intent.action.VIEW adb shell am broadcast -a ‘my_action’

adb shell am start -a android.intent.action.CALL -d tel:+972527300294 // Make a call

// Open send sms screen with phone number and the message: adb shell am start -a android.intent.action.SENDTO -d sms:+972527300294 –es sms_body “Test –ez exit_on_sent false

// Reset permissions adb shell pm reset-permissions -p your.app.package adb shell pm grant [packageName] [ Permission] // Grant a permission to an app. adb shell pm revoke [packageName] [ Permission] // Revoke a permission from an app.

// Emulate device adb shell wm size 2048x1536 adb shell wm density 288 // And reset to default adb shell wm size reset adb shell wm density reset

== Print text adb shell input text ‘Wow, it so cool feature’

== Screenshot adb shell screencap -p /sdcard/screenshot.png

$ adb shell shell@ $ screencap /sdcard/screen.png shell@ $ exit $ adb pull /sdcard/screen.png

— adb shell screenrecord /sdcard/NotAbleToLogin.mp4

$ adb shell shell@ $ screenrecord –verbose /sdcard/demo.mp4 (press Control + C to stop) shell@ $ exit $ adb pull /sdcard/demo.mp4

== Key event adb shell input keyevent 3 // Home btn adb shell input keyevent 4 // Back btn adb shell input keyevent 5 // Call adb shell input keyevent 6 // End call adb shell input keyevent 26 // Turn Android device ON and OFF. It will toggle device to on/off status. adb shell input keyevent 27 // Camera adb shell input keyevent 64 // Open browser adb shell input keyevent 66 // Enter adb shell input keyevent 67 // Delete (backspace) adb shell input keyevent 207 // Contacts adb shell input keyevent 220 / 221 // Brightness down/up adb shell input keyevent 277 / 278 279 / Cut/Copy/Paste

0 –> “KEYCODE_0” 1 –> “KEYCODE_SOFT_LEFT” 2 –> “KEYCODE_SOFT_RIGHT” 3 –> “KEYCODE_HOME” 4 –> “KEYCODE_BACK” 5 –> “KEYCODE_CALL” 6 –> “KEYCODE_ENDCALL” 7 –> “KEYCODE_0” 8 –> “KEYCODE_1” 9 –> “KEYCODE_2” 10 –> “KEYCODE_3” 11 –> “KEYCODE_4” 12 –> “KEYCODE_5” 13 –> “KEYCODE_6” 14 –> “KEYCODE_7” 15 –> “KEYCODE_8” 16 –> “KEYCODE_9” 17 –> “KEYCODE_STAR” 18 –> “KEYCODE_POUND” 19 –> “KEYCODE_DPAD_UP” 20 –> “KEYCODE_DPAD_DOWN” 21 –> “KEYCODE_DPAD_LEFT” 22 –> “KEYCODE_DPAD_RIGHT” 23 –> “KEYCODE_DPAD_CENTER” 24 –> “KEYCODE_VOLUME_UP” 25 –> “KEYCODE_VOLUME_DOWN” 26 –> “KEYCODE_POWER” 27 –> “KEYCODE_CAMERA” 28 –> “KEYCODE_CLEAR” 29 –> “KEYCODE_A” 30 –> “KEYCODE_B” 31 –> “KEYCODE_C” 32 –> “KEYCODE_D” 33 –> “KEYCODE_E” 34 –> “KEYCODE_F” 35 –> “KEYCODE_G” 36 –> “KEYCODE_H” 37 –> “KEYCODE_I” 38 –> “KEYCODE_J” 39 –> “KEYCODE_K” 40 –> “KEYCODE_L” 41 –> “KEYCODE_M” 42 –> “KEYCODE_N” 43 –> “KEYCODE_O” 44 –> “KEYCODE_P” 45 –> “KEYCODE_Q” 46 –> “KEYCODE_R” 47 –> “KEYCODE_S” 48 –> “KEYCODE_T” 49 –> “KEYCODE_U” 50 –> “KEYCODE_V” 51 –> “KEYCODE_W” 52 –> “KEYCODE_X” 53 –> “KEYCODE_Y” 54 –> “KEYCODE_Z” 55 –> “KEYCODE_COMMA” 56 –> “KEYCODE_PERIOD” 57 –> “KEYCODE_ALT_LEFT” 58 –> “KEYCODE_ALT_RIGHT” 59 –> “KEYCODE_SHIFT_LEFT” 60 –> “KEYCODE_SHIFT_RIGHT” 61 –> “KEYCODE_TAB” 62 –> “KEYCODE_SPACE” 63 –> “KEYCODE_SYM” 64 –> “KEYCODE_EXPLORER” 65 –> “KEYCODE_ENVELOPE” 66 –> “KEYCODE_ENTER” 67 –> “KEYCODE_DEL” 68 –> “KEYCODE_GRAVE” 69 –> “KEYCODE_MINUS” 70 –> “KEYCODE_EQUALS” 71 –> “KEYCODE_LEFT_BRACKET” 72 –> “KEYCODE_RIGHT_BRACKET” 73 –> “KEYCODE_BACKSLASH” 74 –> “KEYCODE_SEMICOLON” 75 –> “KEYCODE_APOSTROPHE” 76 –> “KEYCODE_SLASH” 77 –> “KEYCODE_AT” 78 –> “KEYCODE_NUM” 79 –> “KEYCODE_HEADSETHOOK” 80 –> “KEYCODE_FOCUS” 81 –> “KEYCODE_PLUS” 82 –> “KEYCODE_MENU” 83 –> “KEYCODE_NOTIFICATION” 84 –> “KEYCODE_SEARCH” 85 –> “KEYCODE_MEDIA_PLAY_PAUSE” 86 –> “KEYCODE_MEDIA_STOP” 87 –> “KEYCODE_MEDIA_NEXT” 88 –> “KEYCODE_MEDIA_PREVIOUS” 89 –> “KEYCODE_MEDIA_REWIND” 90 –> “KEYCODE_MEDIA_FAST_FORWARD” 91 –> “KEYCODE_MUTE” 92 –> “KEYCODE_PAGE_UP” 93 –> “KEYCODE_PAGE_DOWN” 94 –> “KEYCODE_PICTSYMBOLS” … 122 –> “KEYCODE_MOVE_HOME” 123 –> “KEYCODE_MOVE_END” // https://developer.android.com/reference/android/view/KeyEvent.html

== ShPref

adb shell ‘am broadcast -a org.example.app.sp.PUT –es key key_name –es value “hello world!”’

adb shell ‘am broadcast -a org.example.app.sp.REMOVE –es key key_name’

adb shell ‘am broadcast -a org.example.app.sp.CLEAR –es key key_name’

adb shell ‘am broadcast -a org.example.app.sp.PUT –es name Game –es key level –ei value 10’

adb shell ‘am broadcast -a org.example.app.sp.PUT –es key string –es value “hello world!”’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key boolean –ez value true’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key float –ef value 3.14159’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key int –ei value 2015’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key long –el value 9223372036854775807’

adb shell ‘am broadcast -a org.example.app.sp.CLEAR –ez restart true’

== Monkey adb shell monkey -p com.myAppPackage -v 10000 -s 100 // monkey tool is generating 10.000 random events on the real device

== Paths data/data/<package>/databases (app databases) /data/data/<package>/shared_prefs (shared preferences) /data/app (apk installed by user) /system/app (pre-installed APK files) /mmt/asec (encrypted apps) (App2SD) /mmt/emmc (internal SD Card) /mmt/adcard (external/Internal SD Card) /mmt/adcard/external_sd (external SD Card)

adb shell ls (list directory contents) adb shell ls -s (print size of each file) adb shell ls -R (list subdirectories recursively)

== Device onformation adb get-statе (print device state) adb get-serialno (get the serial number) adb shell dumpsys iphonesybinfo (get the IMEI) adb shell netstat (list TCP connectivity) adb shell pwd (print current working directory) adb shell dumpsys battery (battery status) adb shell pm list features (list phone features) adb shell service list (list all services) adb shell dumpsys activity <package>/<activity> (activity info) adb shell ps (print process status) adb shell wm size (displays the current screen resolution) dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’ (print current app’s opened activity)

== Package info adb shell list packages (list package names) adb shell list packages -r (list package name + path to apks) adb shell list packages -3 (list third party package names) adb shell list packages -s (list only system packages) adb shell list packages -u (list package names + uninstalled) adb shell dumpsys package packages (list info on all apps) adb shell dump <name> (list info on one package) adb shell path <package> (path to the apk file)

==Configure Settings Commands adb shell dumpsys battery set level <n> (change the level from 0 to 100) adb shell dumpsys battery set status<n> (change the level to unknown, charging, discharging, not charging or full) adb shell dumpsys battery reset (reset the battery) adb shell dumpsys battery set usb <n> (change the status of USB connection. ON or OFF) adb shell wm size WxH (sets the resolution to WxH)

== Device Related Commands adb reboot-recovery (reboot device into recovery mode) adb reboot fastboot (reboot device into recovery mode) adb shell screencap -p “/path/to/screenshot.png” (capture screenshot) adb shell screenrecord “/path/to/record.mp4” (record device screen) adb backup -apk -all -f backup.ab (backup settings and apps) adb backup -apk -shared -all -f backup.ab (backup settings, apps and shared storage) adb backup -apk -nosystem -all -f backup.ab (backup only non-system apps) adb restore backup.ab (restore a previous backup) adb shell am start|startservice|broadcast <INTENT>[<COMPONENT>] -a <ACTION> e.g. android.intent.action.VIEW -c <CATEGORY> e.g. android.intent.category.LAUNCHER (start activity intent)

adb shell am start -a android.intent.action.VIEW -d URL (open URL) adb shell am start -t image/* -a android.intent.action.VIEW (opens gallery)

== Logs adb logcat [options] [filter] [filter] (view device log) adb bugreport (print bug reports)

== Other adb backup // Create a full backup of your phone and save to the computer. adb restore // Restore a backup to your phone. adb sideload // Push and flash custom ROMs and zips from your computer.

fastboot devices // Check connection and get basic information about devices connected to the computer. // This is essentially the same command as adb devices from earlier. //However, it works in the bootloader, which ADB does not. Handy for ensuring that you have properly established a connection.


Shared Preferences

adb shell ‘am broadcast -a org.example.app.sp.PUT –es key key_name –es value “hello world!”’

adb shell ‘am broadcast -a org.example.app.sp.REMOVE –es key key_name’

adb shell ‘am broadcast -a org.example.app.sp.CLEAR –es key key_name’

adb shell ‘am broadcast -a org.example.app.sp.PUT –es name Game –es key level –ei value 10’

adb shell ‘am broadcast -a org.example.app.sp.PUT –es key string –es value “hello world!”’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key boolean –ez value true’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key float –ef value 3.14159’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key int –ei value 2015’ adb shell ‘am broadcast -a org.example.app.sp.PUT –es key long –el value 9223372036854775807’

adb shell ‘am broadcast -a org.example.app.sp.CLEAR –ez restart true’


=== Few bash snippets === @Source (https://jonfhancock.com/bash-your-way-to-better-android-development-1169bc3e0424)

=== Using tail -n //Use tail to remove the first line. Actually two lines. The first one is just a newline. The second is “List of devices attached.” $ adb devices | tail -n +2

=== Using cut -sf // Cut the last word and any white space off the end of each line. $ adb devices | tail -n +2 | cut -sf -1

=== Using xargs -I // Given the -I option, xargs will perform an action for each line of text that we feed into it. // We can give the line a variable name to use in commands that xargs can execute. $ adb devices | tail -n +2 | cut -sf -1 | xargs -I X echo X aw yiss

=== Three options below together // Will print android version of all connected devices adb devices | tail -n +2 | cut -sf -1 | xargs -I X adb -s X shell getprop ro.build.version.release

=== Using alias – Example 1 alias tellMeMore=echo tellMeMore “hi there” Output => hi there – Example 2 // Define alias alias apkinstall=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X install -r $1” // And you can use it later apkinstall ~/Downloads/MyAppRelease.apk // Install an apk on all devices – Example 3 alias rmapp=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X uninstall $1” rmapp com.example.myapp // Uninstall a package from all devices – Example 4 alias clearapp=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell pm clear $1” clearapp com.example.myapp // Clear data on all devices (leave installed) – Example 5 alias startintent=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell am start $1” startintent https://twitter.com/JonFHancock // Launch a deep link on all devices

Setting up your .bash_profile Finally, to make this all reusable even after rebooting your computer (aliases only last through the current session), we have to add these to your .bash_profile. You might or might not already have a .bash_profile, so let’s make sure we append to it rather than overwriting it. Just open a terminal, and run the following command

touch .bash_profile && open .bash_profile

This will create it if it doesn’t already exist, and open it in a text editor either way. Now just copy and paste all of the aliases into it, save, and close.

alias startintent=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell am start $1” alias apkinstall=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X install -r $1” alias rmapp=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X uninstall $1” alias clearapp=”adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell pm clear $1”

=============================================================== Sources:

API

Backup

#!/bin/bash
# https://github.com/dwisiswant0/xiaomi-backup/blob/master/backup.sh

PACKAGES=`adb shell pm list packages -f | cut -d ":" -f2`

for package in ${PACKAGES}; do
    apk=`echo ${package} | grep -Eo ".*\.apk"`
    pkg=`echo ${package} | rev | cut -d "=" -f1 | rev`
    [[ ${apk} =~ "/data"* ]] && adb pull "${apk}" "${PWD}/${pkg}.apk"
done

Examples

Froid

Hardware

Learning

Что объединяет удаленного сотрудника, на долю которого выпало много видеозвонков, зарождающуюся звезду YouTube и начинающего стримера? Все они, рано или поздно, осознают неотъемлемую важность повышения качества изображения, которое предоставляется их зрителям. А еще у них наверняка есть какой-нибудь Xiaomi Nano Porridge 10 Pro с довольно неплохой матрицей. И я не исключение, бросив вызов этой проблеме по-программистски и постаравшись обойтись без больших финансовых затрат, решением которой и хочу поделиться с вами. Добро пожаловать под кат!

https://habrastorage.org/getpro/habr/upload_files/3ef/ba1/4aa/3efba14aaa51fc3459658b606dd1edb7.gif

Гифка из интернета

Дано

  • Рабочая машина на Linux
  • Телефон с камерой
  • USB кабель

TL;DR

Идея проста, мы собираемся пробросить поток с камеры телефона на нашу рабочую лошадку и привязать его к виртуальному девайсу, который мы потом сможем выбирать как камеру в приложениях. Для подключения к телефону я буду использовать *adb*, для получения потока видео *scrcpy*, для создания виртуальной камеры в системе *v4l2loopback*

Установка

ADB

Ubuntu/Debian
sudo apt update sudo apt -y install android-tools-adb
Arch
pacman -S android-udev

Scrcpy

Ubuntu/Debian
sudo apt install ffmpeg libsdl2-2.0-0 adb wget \\ gcc git pkg-config meson
                 ninja-build libsdl2-dev \\ libavcodec-dev libavdevice-dev
                 libavformat-dev libavutil-dev \\ libswresample-dev
                 libusb-1.0-0 libusb-1.0-0-dev sudo apt install scrcpy
Arch
pacman -S scrcpy

Возможно, вам понадобится установить/обновить какие-то зависимости. Полную инструкцию можно найти здесь

Установка из репозитория

В том случае, если вы хотите последнюю версию или собранный бинарник оказался с проблемой, которую решили в одном из новых релизов

git clone <https://github.com/Genymobile/scrcpy> cd scrcpy
./install_release.sh

Сборка вручную

Тык

v4l2loopback-utils

Ubuntu/Debian
sudo apt install v4l2loopback-dkms sudo apt install v4l2loopback-utils
Arch
pacman -S v4l2loopback-dkms pacman -S v4l2loopback-utils

Подключаем устройство

  • Включаем на телефоне USB debugging
  • Подключаем телефон к компьютеру по USB и вводим следующую команду и убеждаемся, что он в нашем поле зрения
adb devices

Если вывод из консоли содержит no permissions

adb devices List of devices attached 4df15d6e02a55f15 device ????????????  no
permissions

То идем сюда

Wifi

  • Подключаем телефон к той же сети, в которой находится компьютер
  • Подключаем телефон к компьютеру по USB и вводим
adb tcpip 5555
  • Отключаем телефон от USB
  • Узнаем IP адрес нашего телефона. Например, так Settings  >  About tablet  (or  About phone ) >  Status  >  IP address
  • Подключаемся к телефону по его IP адресу
adb connect device_ip_address:5555
  • Убеждаемся, что телефон подключен
adb devices List of devices attached device_ip_address:5555 device

Для большей информации можно сюда

Создаем виртуальный девайс

sudo modprobe v4l2loopback devices=1 video_nr=22 exclusive_caps=1
card_label="Virtual Webcam"

Это создаст новый видео девайс  /dev/video22 . Вы можете определить номер девайса на ваше усмотрение и вкус.

Смотрим, что наш девайс создался:

v4l2-ctl --list-devices

Магия!

Стартуем scrcpy . Он подключается к единственному подключенному устройству по умолчанию:

scrcpy -m1920 --v4l2-sink=/dev/video22 --video-source=camera --no-audio

Заходим в любое приложение, позволяющее протестировать камеру, и сидим довольные!

Если выдается следующая ошибка:

[server] ERROR: Encoding error: android.media.MediaCodec$CodecException: start
failed WARN: Device disconnected [server] ERROR: Exception on thread
Thread[video,5,main]

Это значит, что вам надо поставить меньшее разрешение. Сделать это можно напрямую через параметр --camera-size=1920x1080 или используя -m / --max-size , например -m1920 , -m1080

Дополнительные настройки
  • Подключиться к телефону по его серийному номеру
--serial=device_serial
  • Убрать открывающееся окно с видео
--no-video-playback
  • Посмотреть доступные камеры:
scrcpy --list-cameras scrcpy --list-camera-sizes
  • Указать, с какой камеры будет браться поток:
--camera-id=0
  • Указать размер выходного потока:
--camera-size=1840x444
-m1920 m1920 m1080
  • Повернуть камеру на определенный угол:
--orientation=90
  • FPS
--camera-fps=60

Libraries

Linux

Linux

Programs

Games

Misc

Proprietary

Emulators

Security

Sites

SSH

SimpleSSHD

Open Settings and configure SSH Path to /storage/emulated/0/.ssh.

Make sure /storage/emulated/0/.ssh/authorized_keys file exists and has public keys.

Tools

Xiaomi

Scripting

Prerequisite

Firstly you need to enable wireless ADB on your Android device.

https://github.com/Genymobile/scrcpy/blob/87da1372380ebddb60e4d89cff9a251c866e21c5/README.md

Alternatively, it is possible to enable the TCP/IP connection manually using adb:

    Plug the device into a USB port on your computer.

    Connect the device to the same Wi-Fi network as your computer.

    Get your device IP address, in Settings → About phone → Status, or by executing this command:

    adb shell ip route | awk '{print $9}'

    Enable adb over TCP/IP on your device: adb tcpip 5555.

    Unplug your device.

    Connect to your device: adb connect DEVICE_IP:5555 (replace DEVICE_IP with the device IP address you found).

    Run scrcpy as usual.

Cheat sheet

Shell-скриптинг в среде Android
Евгений Зобнин	
24.10.2014
8 комментариев
393099
Содержание статьи

    Особенности Android-окружения
    Первый пример
    Автозапуск
    Запуск скриптов до и после установки прошивки
    INFO
    Что еще?
    Вместо выводов

Android основан на ядре Linux, включает в себя набор стандартных UNIX-команд и простой шелл sh. Все это значит, что мы можем не только использовать командную строку для выполнения низкоуровневых операций, но и писать шелл-скрипты, которые будут выполнять функции, недоступные из графического интерфейса. В этой статье мы поговорим о том, что с их помощью можно сделать и зачем все это нужно.

Для прошлого номера журнала я написал статью о Tasker — системе, которая позволяет автоматизировать работу Android и заменить сотни сторонних приложений. К сожалению, Tasker ограничен высокоуровневыми функциями Android и не позволяет выполнять такие низкоуровневые операции, как монтирование файловых систем, изменение параметров ядра, системных переменных или запуск демонов. Зато все это можно сделать с помощью скриптов.

Сразу оговорюсь, что в этой статье речь пойдет о шелл-скриптах в традиционном для Linux понимании, без использования инструментов вроде SL4A, QPython или Roboto. Главное назначение таких скриптов — изменение поведения системы, параметров ядра, работа с демонами (ADB, например) и тому подобное. Скрипты могут стартовать на этапе загрузки ОС, установки новой прошивки, после тапа по кнопке или же по традиции — из терминала.

В статье я расскажу, как писать такие скрипты, как заставить их стартовать автоматически, привязывать к определенному системному событию. В качестве бонуса также объясню, как заставить консоль восстановления (recovery) выполнить необходимые тебе действия перед установкой или сразу после установки новой прошивки. Начинаем.

Особенности Android-окружения

В самой своей основе, там, где нет Java и Dalvik, Android представляет собой минималистичный Linux-дистрибутив со всеми свойственными ему атрибутами: ядром, системой инициализации, набором библиотек, демонов, консольных команд и, конечно же, шеллом. Последний — это не что иное, как mksh из MirBSD, переименованный в sh; простой командный интерпретатор с поддержкой языковых конструкций классического Bourne shell из UNIX и автодополнением по нажатию Tab.

В качестве комплекта базовых UNIX-команд здесь используется toolbox, своего рода урезанная альтернатива BusyBox, которая позволяет вызывать несколько разных команд из одного бинарника (с помощью симлинков). Toolbox включает в себя очень ограниченный набор команд, в котором нет не только grep или sort, но даже cp. Поэтому для полноценной работы со скриптами настоятельно рекомендуется установка BusyBox, благо в маркете полно бесплатных инсталляторов.

Сам шелл располагается не совсем по адресу, поэтому «шибанг» в скриптах будет выглядеть несколько по-иному, а именно #!/system/bin/sh. Зато о расположении бинарников можно не думать вообще, так как в переменной $PATH всегда прописаны правильные значения. Каталогов для поиска команд тут всегда три: /system/bin/, /system/sbin/ и /system/xbin/ для внешних бинарников. Туда обычно устанавливается BusyBox.

Основное назначение скриптинга в Android — работа с ядром и системными утилитами. Ядро тут стандартное и экспортирует все те же интерфейсы /proc и /sys, через которые можно рулить железом и состоянием системы. Плюс есть набор специфичных для Android утилит, которые будут очень полезны при разработке скриптов:

    pm — менеджер пакетов, позволяет устанавливать, удалять и перемещать софт;
    am — менеджер активностей (Activity), может быть использован для запуска приложений;
    dumpsys — дамп в консоль массы различной информации о состоянии системы;
    screencap — утилита для снятия скриншота;
    screenrecord — утилита для записи скринкастов;
    getprop/setprop — команды для чтения и изменения системных переменных;
    start/stop — запуск и остановка системных служб;
    input — позволяет отправлять в текущее окно кей-коды (эмуляция клавиатуры);
    service — утилита для управления Java-сервисами, имеет очень много возможностей;
    svc — позволяет управлять Wi-Fi, USB-подключением и питанием.

Часть вывода команды dumpsys
Часть вывода команды dumpsys
Другие статьи в выпуске:
Хакер #185. Докажи баг!

    Содержание выпуска
    Подписка на «Хакер»-60%


Первый пример

Теперь давайте попробуем написать первый скрипт. Делать это лучше на компе, а еще лучше в Linux или редакторе, который умеет создавать текстовые файлы без символа возврата каретки (который при открытии в Android будет выглядеть как ^M в конце каждой строки). Наш первый скрипт будет состоять всего из двух строк, которые делают бэкап всех установленных приложений на карту памяти. Его код (требует BusyBox):

#!/system/bin/sh

mkdir /sdcard/backup
cp /data/app/*.apk /sdcard/backup

Сохраняем (пусть он называется apk_backup.sh) и перекидываем на смартфон с помощью ADB:

$ adb push apk_backup.sh /sdcard/

Теперь его нужно запустить. Проще всего сделать это с помощью все того же ADB:

$ adb shell sh /sdcard/apk_backup.sh

Примерно таким же образом скрипт можно запустить из консоли на самом смартфоне/планшете:

$ sh /sdcard/apk_backup.sh

Само собой, такой способ не очень удобен. Поэтому нам нужен какой-то быстрый способ запуска скрипта. Наиболее удобное из найденных мной решений — это приложение QuickTerminal. Устанавливаем, запускаем, переходим на вкладку Quick Command, нажимаем кнопку «+», вбиваем имя (произвольное) и команду (sh /sdcard/apk_backup.sh), в поле Output Type выбираем либо Dialog Output, либо Nothing. В первом случае во время выполнения скрипта на экране появится окно с результатом, во втором все пройдет в фоне. Кому что удобнее. Далее сохраняем и получаем кнопку, с помощью которой скрипт можно будет запустить быстро и легко.

Теперь напишем скрипт, который восстановит наш бэкап:

#!/system/bin/sh

for i in /sdcard/backup/*; do
pm install -t -r $i
done

В нем мы задействовали команду pm с опцией install и флагами -t и -r, которые заставляют систему устанавливать приложения, даже если они подписаны тестовым ключом или уже установлены. Также можно использовать флаг -s, который принуждает приложения к установке на карту памяти (если такая возможность есть), или -f — установка во внутреннюю память устройства.
Почти все команды Android имеют подробную справку
Почти все команды Android имеют подробную справку

Имея рут, можно даже сделать бэкап настроек всех приложений с помощью копирования и архивации каталога /data/data/, однако восстановить его будет очень проблематично, так как в Android каждое приложение исполняется от имени созданного специально для него Linux-юзера и хранит настройки внутри каталога, принадлежащего этому пользователю. Проблема здесь в том, что идентификатор Linux-юзера для каждого приложения генерируется динамически, поэтому после восстановления бэкапа в заново установленной системе идентификаторы не будут совпадать и приложения не смогут прочитать свои настройки. Придется вручную выяснять ID юзера для каждого приложения и менять права доступа на каталоги с данными.

С другой стороны, мы можем использовать встроенный в Android Backup Manager, позволяющий сторонним приложениям использовать возможности системы для бэкапа и восстановления приложений и их данных. Управлять им можно из консоли (а значит, и с помощью скриптов), но сам по себе он никакого бэкапа не производит, а возлагает эту работу на сторонние приложения. Helium — одно из таких приложений. Если установить и настроить его, операцию бэкапа и восстановления можно будет заскриптовать. Например, следующий простой скрипт сделает резервную копию всех сторонних приложений:

#!/system/bin/sh
# Получаем список всех сторонних приложений
for i in `pm list packages -e`; do
# Добавляем каждое из них в очередь
bmgr backup ${i:8}
done
# Запускаем операцию бэкапа
bmgr run

Конструкция ${i:8} здесь нужна, чтобы обрезать слово «packages:», которое pm добавляет в начало имени каждого пакета. Чтобы восстановить бэкап, можно использовать либо тот же Helium, либо команду bmgr:

$ bmgr list sets # Получаем список бэкапов
$ bmgr restore <тег> # Восстанавливаем нужный бэкап


Автозапуск

«Это все круто, но скрипты должны запускаться сами», — скажешь ты и будешь абсолютно прав. Без автозапуска от скриптов толку мало, но это легко исправить, если воспользоваться все тем же Tasker. Он умеет запускать любые шелл-команды в ответ на любое событие. Чтобы воспользоваться этой функциональностью, достаточно создать новый профиль, выбрать событие (для бэкапа лучшим событием будет время), затем добавляем действие, выбираем Script -> Run Shell, вбиваем команду (sh /sdcard/script.sh), выбираем, если необходимо, файл для записи результата и включаем профиль.

Другой популярный способ автозапуска — это использование средств автоматического исполнения скриптов при загрузке в сторонних прошивках. Сегодня почти все сколько-нибудь известные кастомные прошивки умеют стартовать скрипты из каталога /system/etc/init.d/, а в стоке такую функциональность можно получить с помощью приложения Universal init.d из маркета. С последним, однако, надо быть осторожным, так как оно запускает скрипты не на раннем этапе загрузки, как это происходит в том же CyanogenMod, а уже после полной загрузки системы.

Итак, что мы можем поместить в автозагрузку? Например, скрипт запуска демона ADB в сетевом режиме:

#!/system/bin/sh
setprop service.adb.tcp.port 5555
stop adbd
start adbd

Для подключения к нему с ПК набираем такую команду:

$ adb connect IP-смартфона

Также мы можем применить некоторые оптимизации подсистемы виртуальной памяти:

#!/system/bin/sh
echo "4096" > /proc/sys/vm/min_free_kbytes
echo "0" > /proc/sys/vm/oom_kill_allocating_task;
echo "0" > /proc/sys/vm/panic_on_oom;
echo "0" > /proc/sys/vm/laptop_mode;
echo "0" > /proc/sys/vm/swappiness
echo "50" > /proc/sys/vm/vfs_cache_pressure
echo "90" > /proc/sys/vm/dirty_ratio
echo "70" > /proc/sys/vm/dirty_background_ratio

Ну или подогнать механизм lowmemorykiller (автоматическое убийство фоновых приложений при нехватке памяти) под наши нужды:

#!/system/bin/sh
echo "2048,3072,6144,15360,17920,20480" > /sys/module/lowmemorykiller/parameters/minfree

Ну и конечно же, автоматический выбор планировщика процессов:

#!/system/bin/sh
echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Все это можно сделать с помощью специализированного софта, но зачем загружать систему дополнительным ПО, которое еще и будет висеть в фоне, когда можно обойтись несколькими простыми скриптами?
Как запустить скрипт с помощью Tasker
Как запустить скрипт с помощью Tasker

Запуск скриптов до и после установки прошивки

Почти каждый, кто устанавливает на свой гаджет стороннюю прошивку, также ставит поверх нее пакет с фирменными приложениями Google (gapps), который включает в себя маркет, YouTube, Gmail и другой софт. Каждый раз, когда происходит обновление прошивки, раздел /system, содержащий ее и gapps, полностью стирается, но приложения Google всегда остаются на месте. Это происходит потому, что, кроме всего прочего, gapps содержит в своем составе специальный скрипт, который размещается в каталоге /system/addon.d/ и запускается консолью восстановления до и после установки прошивки. Этот скрипт делает бэкап и восстановление приложений Google.

Мы можем использовать эту возможность для выполнения наших собственных действий до и после установки прошивки. Вот так, например, выглядит мой скрипт восстановления, который ничего не бэкапит, но подчищает прошивку от мусора сразу после ее установки:

#!/sbin/sh

# Загружаем подсобные функции
. /tmp/backuptool.functions

# Рингтон и звук уведомления, которые должны остаться в системе
RINGTONE=Machina
NOTIFICATION=Argon

case "$1" in
backup)
    # Пусто :)
;;
restore)
    # Рингтоны, уведомления и звук будильника
    cd /system/media/audio/ringtones/
    rm [!${RINGTONE}]*.ogg
    cd /system/media/audio/notifications/
    rm [!${NOTIFICATION}]*.ogg
    rm /system/media/audio/alarms/*

    # Языки синтеза и офлайн-распознавания речи
    rm /system/tts/lang_pico/*
    rm -rf /system/usr/srec/config/*

    # Приложения
    A=/system/app/
    rm $A/Email.apk
    rm $A/Exchange2.apk
    rm $A/LockClock.apk
    rm $A/PicoTts.apk
    rm $A/Term.apk
    rm $A/ThemeChooser.apk
    rm $APPS/WAPPushManager.apk
    rm $A/LiveWallpapers.apk
    rm $A/LiveWallpapersPicker.apk
    rm $A/VisualizationWallpapers.apk
    A=/system/priv-app/
    rm $A/CMUpdater.apk
    rm $A/ThemeManager.apk
;;
pre-backup)
    # ...
;;
post-backup)
    # ...
;;
pre-restore)
    # ...
;;
post-restore)
    # ...
;;
esac

Скрипт удаляет рингтоны, уведомления, движок синтеза речи и несколько приложений. Все эти действия запускаются в ответ на передачу скрипту опции командной строки restore (это делает консоль восстановления после установки прошивки), однако также предусмотрены и варианты обработки таких опций, как backup, pre-backup, post-backup, pre-restore и post-restore. Здесь это просто заглушки, но если бы мы захотели сделать бэкап некоторых файлов и приложений перед установкой прошивки, мы могли бы добавить их в блок backup, как это сделано в скрипте /system/addon.d/70-gapps.sh:

. /tmp/backuptool.functions

list_files() {
cat <<EOF
app/GoogleContactsSyncAdapter.apk
etc/permissions/com.google.android.maps.xml
etc/permissions/com.google.android.media.effects.xml
...
EOF
}
case "$1" in
backup)
    list_files | while read FILE DUMMY; do
    backup_file $S/$FILE
done
;;
...

Этот кусок скрипта прекрасно иллюстрирует, как сделать бэкап файлов. Ключевые элементы здесь: функция listfiles, которая при запуске выводит листинг файлов, и функция backupfile, которая является частью консоли восстановления (определена в файле /tmp/backuptool.functions). Она делает бэкап файлов в цикле.
Содержимое /system/addon.d/ в CyanogenMod 11 на Motorola Defy
Содержимое /system/addon.d/ в CyanogenMod 11 на Motorola Defy


Скрипт бэкапа приложений Google
Скрипт бэкапа приложений Google

INFO

По словам разработчика mksh, изначально пользовательские версии Android-смартфонов вообще не должны были иметь в своем составе шелл, но после выпуска смартфона для разработчиков HTC (T-Mobile) G1 он фактически стал стандартной частью системы.

Версии Android 2.3 и ниже вместо mksh использовали минималистичный шелл ash, который входит в базовый комплект всех BSD-систем.

Чтобы получить одни и те же скрипты на всех устройствах, можно использовать приложение DropSync или FolderSync (автоматическая синхронизация через Dropbox).

Что еще?

С помощью скриптов в Android можно сделать намного больше, чем бэкапы и настройка параметров системы. Вот, например, скрипт, который просыпается каждые десять минут и, если уровень заряда батареи стал меньше 30%, отключает Wi-Fi и Bluetooth:

#!/system/bin/sh

while true; do
if [ `cat /sys/class/power_supply/battery/capacity` -lt 30 ]; then
    svc wifi disable
    service call bluetooth_manager 8
fi
sleep 600
done

Чтобы скрипт работал в фоне, достаточно вызвать его следующим образом:

$ script.sh &

А это скрипт, который позволяет быстро заполнять формы, требующие ввода имэйла и пароля (в приложениях и на веб-сайтах):

#!/system/bin/sh

adb shell input text "user@gmail.com"
adb shell input keyevent 23
adb shell input keyevent 20
adb shell input text "ПАРОЛЬ"
adb shell input keyevent 23
adb shell input keyevent 20

Запускать его можно разными способами. Либо перед запуском приложения, установив задержку:

$ sleep 15; sh /sdcard/script.sh

Либо повесить на какое-то событие Tasker, например на взмах смартфоном. Другой вариант — использовать буфер обмена. В Android, чтобы вставить нужный текст в буфер обмена, достаточно выполнить такую команду:

$ service call clipboard 2 i32 1 i32 1 s16 "Этот текст появится в буфере обмена"

Не ахти как удобно, зато работает. Как мы можем использовать такую функциональность? Например, сделать простенький скрипт clip.sh:

#!/system/bin/sh
service call clipboard 2 i32 1 i32 1 s16 "$1"

Соль в том, что скрипт можно вызывать через удаленный ADB либо вообще поместить в /system/etc/init.d/, заменив $1 на нужный текст. Так нужные нам данные всегда будут под рукой, а бесполезный на смартфоне механизм копирования/вставки получит хоть какое-то назначение. Консольные команды можно использовать и для более высокоуровневых операций, например позвонить по указанному номеру:

$ am start -a android.intent.action.CALL tel:123

Или просто открыть окно номеронабирателя с нужным номером:

$ am start -a android.intent.action.DIAL tel:123

Примерно таким же образом можно отправить SMS:

#!/system/bin/sh
am start -a android.intent.action.SENDTO -d sms:$1 --es sms_body "$2" --ez exit_on_sent true
sleep 1
input keyevent 22
sleep 1
input keyevent 66

Скрипт принимает два аргумента: номер телефона и содержимое SMS. После запуска он откроет окно SMS-приложения, вставит в него нужный текст, а затем нажмет кнопку Enter для отправки, после чего окно закроется.

Другие полезные при скриптинге команды:

    Перезагрузка в режим recovery:

    $ su -c reboot recovery

    Мягкая перезагрузка (без перезапуска ядра):

    $ setprop ctl.stop zygote

    Открыть нужное приложение (в данном примере — «Настройки»):

    $ am start -n com.android.settings/com.android.settings.Settings

    Открыть веб-страницу:

    $ am start -a android.intent.action.VIEW http://www.google.com

    Сообщить приложениям о низком уровне заряда батареи (есть софт, который при этом снижает свою активность):

    $ am broadcast -a android.intent.action.BATTERY_LOW

    Изменить MAC-адрес:

    $ ip link set eth0 address 00:11:22:33:44:55

    Активировать вибратор:

    $ echo 100 > /sys/devices/virtual/timed_output/vibrator/enable

    Включить фонарик:

    $ echo 1 > /sys/devices/platform/flashlight/leds/flashlight/brightness

    Проиграть файл (может не сработать):

    $ stagefright -a -o file.mp3

    Отключить указанное приложение (можно организовать цикл для отключения bloatware по списку):

    $ pm disable com.google.android.calendar

    Получить список приложений, которые имеют уведомления в строке состояния:

    $ dumpsys statusbar | grep StatusBarNotification | awk '{ print $2 }' | cut -d '=' -f2

    Оптимизировать внутренние базы данных с настройками (можно добавить скрипт в автозагрузку, требуется BusyBox):

    #!/system/bin/sh
    for i in `find /data -iname "*.db"`; do
    sqlite3 $i 'VACUUM;'
    done

    Переключить Wi-Fi-тизеринг на основной интерфейс (нужно для обмана операторов, которые ограничивают скорость соединения при раздаче интернета по Wi-Fi):

    $ settings put global tether_dun_required 0

TV

  • enter
    adb shell input keyevent 66
        
  • down
    adb shell input keyevent 20
        

Android Studio

cypherstack/stack_wallet: Stack Wallet, a multicoin, cryptocurrency wallet

Android Studio is the recommended IDE for development, not just for launching on Android devices and emulators but also for Linux desktop development. Install it and configure it as follows:

sudo apt install -y openjdk-11-jdk sudo snap install android-studio –classic

Use Tools > SDK Manager to install the SDK Tools > Android SDK (API 30), SDK Tools > NDK, SDK Tools > Android SDK command line tools, and SDK Tools > CMake

Then install the Flutter plugin and restart the IDE. In Android Studio’s options for the Flutter language, enable auto format on save to match the project’s code style. If you have problems with the Dart SDK, make sure to run `flutter` in a terminal to download it (use `source ~/.bashrc` to update your environment variables if you’re still using the same terminal from which you ran `setup.sh`)

Make a Pixel 4 (API 30) x86\_64 emulator with 2GB of storage space for emulation

Chatgpt

What could be used to automate proprietary apps on Android device?

To automate proprietary apps on an Android device, you can use a mobile automation testing tool that supports Android operating systems. Here are a few options:

Appium: Appium is an open-source mobile automation testing tool that supports both Android and iOS platforms. It uses the WebDriver protocol to automate mobile apps and provides a wide range of automation capabilities such as gesture support, element locating strategies, and multi-platform testing.

UI Automator: UI Automator is an Android testing framework that allows you to perform automated functional testing of user interfaces. It can be used to test the interaction between multiple apps on the device and supports running tests on multiple devices in parallel.

Espresso: Espresso is a testing framework for Android that allows you to write automated UI tests for your app. It is designed to be lightweight, fast, and reliable, and it provides a simple and intuitive API for creating tests.

Robotium: Robotium is an Android testing framework that allows you to write automated UI tests for your app. It provides a simple and intuitive API for creating tests, and it supports a wide range of Android versions and devices.

Selendroid: Selendroid is a testing framework that allows you to automate native and hybrid Android apps. It supports multiple Android versions and devices and provides a wide range of automation capabilities such as element locating strategies, gesture support, and multi-platform testing.

android show what activities launched (debug any application)

To see what activities are launched when an application is running on an Android device, you can use the Android Debug Bridge (ADB) tool that comes with the Android SDK. Here are the steps:

Connect your Android device to your computer using a USB cable and make sure USB debugging is enabled on the device. You can enable USB debugging by going to the Developer options in the device’s Settings app and toggling the “USB debugging” switch.

Open a terminal or command prompt on your computer and navigate to the directory where the ADB tool is located.

Type the following command to start ADB and connect to your device:

adb devices

This will list all the connected Android devices. Make sure your device is listed.

Type the following command to start monitoring the device’s activity:

adb shell “logcat ActivityManager:I *:S”

This will show all the activity manager logs with a priority level of “Info” and suppress all logs with other priority levels.

Launch the application you want to debug on your device.

Check the activity manager logs in the terminal or command prompt window. You should see the activities launched by the application listed in the logs.

Note: The logs may contain a lot of information, so it may be helpful to filter the logs by the application’s package name. You can do this by adding the package name as a filter to the logcat command. For example:

adb shell “logcat ActivityManager:I *:S | grep com.example.app”

This will only show the logs related to the application with the package name “com.example.app”. Replace “com.example.app” with the actual package name of the application you want to debug.

Could I get network traffic from android device, e.g. to reverse API used by application?

Yes, you can capture network traffic from an Android device to reverse engineer the APIs used by an application. One way to do this is to use a network traffic analysis tool, such as Wireshark or Fiddler, and set up a proxy server on your computer to capture the traffic between the device and the application’s server.

Here are the steps to capture network traffic from an Android device using Wireshark:

Connect your Android device to your computer using a USB cable and make sure USB debugging is enabled on the device.

Install and run Wireshark on your computer.

Set up a proxy server on your computer by going to the Wireshark menu, selecting “Edit” -> “Preferences”, and then selecting the “Proxies” tab. Under “HTTP Proxy”, check the “Enabled” box and set the “Proxy server” to “127.0.0.1” and the “Proxy port” to “8888”.

Set up the Android device to use the proxy server by going to the device’s Wi-Fi settings, long-pressing the network you’re connected to, selecting “Modify network”, and then selecting “Advanced options”. Under “Proxy”, select “Manual”, and set the “Proxy hostname” to “127.0.0.1” and the “Proxy port” to “8888”.

Launch the application you want to reverse engineer on your Android device.

In Wireshark, select the network interface that corresponds to the Wi-Fi network you’re connected to and start capturing packets.

Use the application on your device and perform the actions that you want to capture the network traffic for.

Stop the packet capture in Wireshark and filter the captured packets by the IP address of the application’s server. This will show you the network traffic between the application and its server.

Analyze the captured packets to reverse engineer the APIs used by the application.

Note: Some applications may use encrypted traffic, such as HTTPS, which can make it more difficult to analyze the network traffic. In this case, you may need to use additional tools or techniques to decrypt the traffic.