Share
Embed
How the Command-Line Can Give You Superpowers
I want to show you how the command line can simplify, and even automate some of the things Android developers need to do. Learning how to use command line tools will give you more ways to get your work done.
Using macOS as the platform, I’ll demonstrate real-world examples of how you can generate Java and Kotlin code, edit visual resources, speed up manual testing, enhance pull requests, manipulate JSON files, and more. All from a terminal, without using a GUI!
Presented at Android Summit, 2018-08-16.
Note that the slides don't include the videos/animations.
Video Recording: https://www.youtube.com/watch?v=95s4UM5lezk
Eric Fung
August 16, 2018
Transcript
77 slides
-
How The Command-Line Can Give You Superpowers Eric Fung •
@gnufmuffin Android Summit • 2018-08-16 -
Superpowers, eh? — Learn to type less — Teleport to
your destination — Search haystacks and find needles — Rapidly integrate with remote APIs — Transmogrify bits of data — Control devices telekinetically How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Why should I care? — Gets you results more quickly
— Gives you more ways to solve problems — Makes you more versatile How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Structure — The basics — Typing less — Working with
Finder — Navigation — Searching — I/O — Web — JSON — Image manipulation — Deployment and testing — Code generation How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
The basics • Terminal • Shell • Package manager Image
credit: burst.shopify.com -
Terminal: iTerm2 — Extensive features and customization — Favorites: —
⌘-click to open URLs and files — Highlights all search results — ⌘-; autocompletes from anything on screen How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Shell: bash — macOS default shell — Widely used →
lots of support — May want to install newer version How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Package manager: Homebrew — All kinds of software (e.g. ports
of Linux tools) — Over 4000+ packages — Very easy to use How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Completion — Built-in to bash — Context sensitive — Completes
command names and option names — Completes option values too! How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
adb completion — install — completes with APKs in local
directory — uninstall — completes with installed application IDs — global -s option — completes with serial numbers — shell pm — completes with subcommands — pull — completes from device filesystem How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Demo: adb install completion How The Command-Line Can Give You
Superpowers • Eric Fung • Android Summit 2018 -
Demo: adb uninstall completion How The Command-Line Can Give You
Superpowers • Eric Fung • Android Summit 2018 -
Gradle completion — Knows properties, e.g. - Dorg.gradle.parallel — Fast,
due to task cache — Note: Implicit tasks not completed by default How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Gradle completion How The Command-Line Can Give You Superpowers •
Eric Fung • Android Summit 2018 -
From shell to Finder — open <thing> — Equivalent to
double-clicking on <thing> — open . — Opens Finder with current directory How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
open -a <app> <file> — Open file with a specific
application — Useful if file does not have default handler — Tip: define a function or alias asopen() { open -a "/Applications/Android Studio.app" "$1" } How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
From Finder to shell — Drag-and-drop file(s) onto Terminal —
Pastes their filename(s), space-separated How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Drag files to shell → paste filename How The Command-Line
Can Give You Superpowers • Eric Fung • Android Summit 2018 -
cd 101 — cd app/src/main/res/layout — cd ../../java — Go
to a subdirectory — cd - — Go to previous directory How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
cd with superpowers How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
autojump — Provide fast access to directories further away —
Selects directories based on usage — Caveat: must be visited first How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
autojump — j name — Go to most-used directory containing
name — jc name — Go to a subdirectory containing name — j name <Tab> — Offers choices when there are multiple matches How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
grep with superpowers How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
The Silver Searcher — Much faster — Supports grep options
— Knows about file types — Respects revision control ignores — Sensible defaults How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Search Android documentation offline ag <term> $ANDROID_SDK/docs How The Command-Line
Can Give You Superpowers • Eric Fung • Android Summit 2018 -
I/O 101 — Streams: stdin and stdout — Redirection: >
and < — Pipelines: | How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Working with Clipboard — pbcopy (⌘-C for the shell) —
Reads from stdin, copies to clipboard — pbpaste (⌘-V for the shell) — Copies contents of clipboard, writes to stdout How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Web superpowers How The Command-Line Can Give You Superpowers •
Eric Fung • Android Summit 2018 -
curl — Comprehensive client for working with Internet protocol transfers
— "the number of features will make your head spin!" — Supports HTTP, SMTP, IMAP, RTSP, and lots more — Designed to be unattended How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Debugging endpoints: --include $ curl 'https://search.icons8.com/api/iconsets/v4/search' --include HTTP/2 200 server:
keycdn-engine date: Thu, 09 Aug 2018 19:39:52 GMT content-type: application/json; charset=utf-8 content-length: 96 cache-control: max-age=604800 expires: Thu, 16 Aug 2018 19:39:52 GMT x-cache: HIT x-shield: active x-edge-location: usch access-control-allow-origin: * accept-ranges: bytes How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Displaying fetched images $ curl --header "Authorization: ${KEY}" \ https://img.icons8.com/color/256/puppy
| imgcat — Pipes response through iTerm2's imgcat script How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Debugging Firebase Cloud Messaging — Typically, app server initiates push
— Console can only send notification messages — Can simulate server from command-line — More details in the Firebase docs How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Sending a push notification $ curl \ --header "Authorization: key=${FIREBASE_LEGACY_SERVER_KEY"
\ --header "Content-Type: application/json" \ --data payload.json \ https://fcm.googleapis.com/fcm/send — Legacy server key avoids OAuth complexity How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Visualize superpower How The Command-Line Can Give You Superpowers •
Eric Fung • Android Summit 2018 -
gron — Turns JSON into line-oriented data — Then, search
with tools like ag — Identify individual array elements How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Example gron output How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
Slice and dice superpower How The Command-Line Can Give You
Superpowers • Eric Fung • Android Summit 2018 -
jq — Powerful, flexible processor — Concise syntax — Transform
data you have, to data you want How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Extract values from array of objects $ jq -r '.photos.photo
| .[] | .title' flickr.json AJH-20180814-467-Edit.jpg East Garston series: quintessential English countryside IMG_20180723_215912_323 P1030365.jpg Frankrijk 2018 Shirts on Sale (+6 03 6143 5225)Contact Us 03 6143 5225 https://t.co/dBTffHWW99 Tratamiento Alternativo Para El Colon Irritable How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Filter elements by predicate $ jq -r '[.photos.photo |.[] |select(.id
|tonumber <= 43036557531)]' \ flickr.json [ { "id": "29099232337", "owner": "138111370@N03", "server": "1772", "farm": 2, "title": "AJH-20180814-467-Edit.jpg" … }, … ] How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Compositing images superpower How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
Spot the difference superpower How The Command-Line Can Give You
Superpowers • Eric Fung • Android Summit 2018 -
ImageMagick — Suite of command-line utilities — Create, edit, compose,
or convert bitmaps — Read/write 200 image formats — Handles really large images How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Example: Composite images How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
bash function using IM's montage side_by_side() { montage -background lightgray
-pointsize 60 \ -label '%t' \ $* \ -tile x1 -geometry '+30+30' \ combined.png } — $* is all the function's arguments — -label '%t' is IM syntax defining label from each argument's base filename How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Usage $ side_by_side before.png after.png How The Command-Line Can Give
You Superpowers • Eric Fung • Android Summit 2018 -
Example: Crop multiple density bitmaps How The Command-Line Can Give
You Superpowers • Eric Fung • Android Summit 2018 -
bash loop using IM's convert $ for r in m
h xh xxh xxxh; do \ convert -gravity SouthWest \ -crop 100%x40%+0+0 \ res/drawable-${r}dpi/background.jpg \ res/drawable-${r}dpi/background_out.jpg; \ done — -gravity defines origin — Keep 40% of image in vertical direction How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Example: compare images — Shrink PNGs with pngcrush — Optimize
SVGs with svgo How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
IM's compare $ compare butterfly.png optimized.png \ -compose Src difference.png
How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Install superpower How The Command-Line Can Give You Superpowers •
Eric Fung • Android Summit 2018 -
Installing APKs wirelessly — APKs can be installed over WiFi
(see Google's adb over WiFi) — Process seems cumbersome — Some devices block USB loading (unless you sign up)! How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
qr-filetransfer — Starts a local webserver, with randomized URL hosting
your file — Generates QR code in terminal that points to that URL How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Automation superpower How The Command-Line Can Give You Superpowers •
Eric Fung • Android Summit 2018 -
Automating device input — adb shell input text <text> —
Sends keycodes to device — adb shell input tap <x> <y> — Sends touch events to device How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Example: log in to Slack workspace function slack_workspace_login() { adb
shell input text $1 # workspace adb shell input tap 400 1000 # next sleep 1 adb shell input text $2 # email sleep 1 adb shell input tap 400 1000 # next sleep 1 adb shell input text $3 # password } — Naive, but good enough usually How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Model generation superpower How The Command-Line Can Give You Superpowers
• Eric Fung • Android Summit 2018 -
quicktype: automatic data models — Web app and command-line tool
to generate models from JSON — Rapidly integrate with an unfamiliar API lacking an SDK — Get sample JSON with curl, then paste into website How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Scripting: write code to write code — Use high-level language,
e.g. Python, Ruby — Turn data into code via templates — e.g. CSV to Kotlin enum values — e.g. CSV to bulk Google IAP SKUs How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Summary — Basic command-line setup — How to make the
command-line easier to use — Many specialized tools to help you get stuff done — Development — Design — Debugging How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
End — Contact [email protected] • @gnufmuffin — Work shopify.com/careers —
Blog code.gnufmuffin.com — Slides speakerdeck.com/efung How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Appendix: How to install (1/2) Name What it's for How
to get it1 iTerm2 full-featured terminal https://iterm2.com/ Homebrew package manager https://brew.sh/ bash completion bash completions for macOS builtins ! bash-completion adb completion bash completions for adb envsetup.sh + adb.bash Gradle completion bash completions for Gradle tasks ! gradle-completion autojump navigate directories faster ! autojump The Silver Searcher (ag) fast, intelligent code searcher ! the_silver_searcher curl transfer data with URLs ! curl everything curl book 1 ! denotes Homebrew package name How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018 -
Appendix: How to install (2/2) Name What it's for How
to get it1 gron make JSON line-oriented and searchable ! gron imgcat display inline bitmaps in iTerm2 imgcat jq transform and query JSON ! jq jq manual jq cookbook ImageMagick utilities for image manipulation ! imagemagick usage examples qr-filetransfer transfer local files to device via QR codes github.com/claudiodangelis/qr-filetransfer quicktype generate data classes from JSON app.quicktype.io ! quicktype 1 ! denotes Homebrew package name How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018