[Fire TV Q&A, Help & Troubleshooting] harlekinrains:
Just to show you guys a bit more - this a .xml for Karabiner ( https://pqrs.org/osx/karabiner/ ) that I created a few months ago.

<?xml version="1.0"?>
<root>

<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_enter</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 66 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_back</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 4 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_pause</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 85 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_left</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 21 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_right</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 22 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_up</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 19 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_down</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 20 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_home</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 3 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_menu</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 82 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_kodi</name>
<url type="shell">
<![CDATA[ adb shell monkey -p org.xbmc.kodi -c android.intent.category.LAUNCHER 1 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_firestarter</name>
<url type="shell">
<![CDATA[ adb shell monkey -p de.belu.firestarter -c android.intent.category.LAUNCHER 1 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_a</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 29 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_b</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 30 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_c</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 31 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_d</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 32 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_e</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 33 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_f</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 34 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_g</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 35 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_h</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 36 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_i</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 37 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_j</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 38 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_k</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 39 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_l</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 40 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_m</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 41 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_n</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 42 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_o</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 43 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_p</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 44 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_q</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 45 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_r</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 46 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_s</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 47 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_t</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 48 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_u</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 49 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_v</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 50 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_w</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 51 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_x</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 52 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_y</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 54 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_z</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 53 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_space</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 62 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_0</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 7 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_1</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 8 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_2</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 9 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_3</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 10 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_4</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 11 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_5</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 12 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_6</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 13 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_7</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 14 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_8</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 15 ]]>
</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_SHELL_9</name>
<url type="shell">
<![CDATA[ adb shell input keyevent 16 ]]>
</url>
</vkopenurldef>

<item>
<name>Change Control+Alt+Backspace to Ctrl+Alt+Delete</name>
<identifier>remap.ControlAltBackspace2CtrlAltDelete</identifier>
<autogen>
__KeyToKey__
KeyCode::DELETE, ModifierFlag::COMMAND_L, ModifierFlag::CONTROL_L,
KeyCode::FORWARD_DELETE, ModifierFlag::COMMAND_L, ModifierFlag::CONTROL_L
</autogen>
</item>

<item>
<name>MapFireRemote</name>
<identifier>MapFireRemote</identifier>
<autogen>
__KeyToKey__
KeyCode::RETURN,
KeyCode::VK_OPEN_URL_SHELL_enter
</autogen>
<autogen>
__KeyToKey__
KeyCode::DELETE,
KeyCode::VK_OPEN_URL_SHELL_back
</autogen>
<autogen>
__KeyToKey__
KeyCode::CURSOR_LEFT,
KeyCode::VK_OPEN_URL_SHELL_left
</autogen>
<autogen>
__KeyToKey__
KeyCode::CURSOR_RIGHT,
KeyCode::VK_OPEN_URL_SHELL_right
</autogen>
<autogen>
__KeyToKey__
KeyCode::CURSOR_UP,
KeyCode::VK_OPEN_URL_SHELL_up
</autogen>
<autogen>
__KeyToKey__
KeyCode::CURSOR_DOWN,
KeyCode::VK_OPEN_URL_SHELL_down
</autogen>
<autogen>
__KeyToKey__
KeyCode::DOT,
KeyCode::VK_OPEN_URL_SHELL_kodi
</autogen>
<autogen>
__KeyToKey__
KeyCode::COMMA,
KeyCode::VK_OPEN_URL_SHELL_firestarter
</autogen>
<autogen>
__KeyToKey__
KeyCode::GERMAN_LESS_THAN,
KeyCode::VK_OPEN_URL_SHELL_home
</autogen>
<autogen>
__KeyToKey__
KeyCode::SPACE,
KeyCode::VK_OPEN_URL_SHELL_space
</autogen>
<autogen>
__KeyToKey__
KeyCode::A,
KeyCode::VK_OPEN_URL_SHELL_a
</autogen>
<autogen>
__KeyToKey__
KeyCode::B,
KeyCode::VK_OPEN_URL_SHELL_b
</autogen>
<autogen>
__KeyToKey__
KeyCode::C,
KeyCode::VK_OPEN_URL_SHELL_c
</autogen>
<autogen>
__KeyToKey__
KeyCode::D,
KeyCode::VK_OPEN_URL_SHELL_d
</autogen>
<autogen>
__KeyToKey__
KeyCode::E,
KeyCode::VK_OPEN_URL_SHELL_e
</autogen>
<autogen>
__KeyToKey__
KeyCode::F,
KeyCode::VK_OPEN_URL_SHELL_f
</autogen>
<autogen>
__KeyToKey__
KeyCode::G,
KeyCode::VK_OPEN_URL_SHELL_g
</autogen>
<autogen>
__KeyToKey__
KeyCode::H,
KeyCode::VK_OPEN_URL_SHELL_h
</autogen>
<autogen>
__KeyToKey__
KeyCode::I,
KeyCode::VK_OPEN_URL_SHELL_i
</autogen>
<autogen>
__KeyToKey__
KeyCode::J,
KeyCode::VK_OPEN_URL_SHELL_j
</autogen>
<autogen>
__KeyToKey__
KeyCode::K,
KeyCode::VK_OPEN_URL_SHELL_k
</autogen>
<autogen>
__KeyToKey__
KeyCode::L,
KeyCode::VK_OPEN_URL_SHELL_l
</autogen>
<autogen>
__KeyToKey__
KeyCode::M,
KeyCode::VK_OPEN_URL_SHELL_m
</autogen>
<autogen>
__KeyToKey__
KeyCode::N,
KeyCode::VK_OPEN_URL_SHELL_n
</autogen>
<autogen>
__KeyToKey__
KeyCode::eek:,
KeyCode::VK_OPEN_URL_SHELL_o
</autogen>
<autogen>
__KeyToKey__
KeyCode::P,
KeyCode::VK_OPEN_URL_SHELL_p
</autogen>
<autogen>
__KeyToKey__
KeyCode::Q,
KeyCode::VK_OPEN_URL_SHELL_q
</autogen>
<autogen>
__KeyToKey__
KeyCode::R,
KeyCode::VK_OPEN_URL_SHELL_r
</autogen>
<autogen>
__KeyToKey__
KeyCode::S,
KeyCode::VK_OPEN_URL_SHELL_s
</autogen>
<autogen>
__KeyToKey__
KeyCode::T,
KeyCode::VK_OPEN_URL_SHELL_t
</autogen>
<autogen>
__KeyToKey__
KeyCode::U,
KeyCode::VK_OPEN_URL_SHELL_u
</autogen>
<autogen>
__KeyToKey__
KeyCode::V,
KeyCode::VK_OPEN_URL_SHELL_v
</autogen>
<autogen>
__KeyToKey__
KeyCode::W,
KeyCode::VK_OPEN_URL_SHELL_w
</autogen>
<autogen>
__KeyToKey__
KeyCode::X,
KeyCode::VK_OPEN_URL_SHELL_x
</autogen>
<autogen>
__KeyToKey__
KeyCode::Y,
KeyCode::VK_OPEN_URL_SHELL_y
</autogen>
<autogen>
__KeyToKey__
KeyCode::Z,
KeyCode::VK_OPEN_URL_SHELL_z
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_0,
KeyCode::VK_OPEN_URL_SHELL_0
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_1,
KeyCode::VK_OPEN_URL_SHELL_1
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_2,
KeyCode::VK_OPEN_URL_SHELL_2
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_3,
KeyCode::VK_OPEN_URL_SHELL_3
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_4,
KeyCode::VK_OPEN_URL_SHELL_4
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_5,
KeyCode::VK_OPEN_URL_SHELL_5
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_6,
KeyCode::VK_OPEN_URL_SHELL_6
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_7,
KeyCode::VK_OPEN_URL_SHELL_7
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_8,
KeyCode::VK_OPEN_URL_SHELL_8
</autogen>
<autogen>
__KeyToKey__
KeyCode::KEY_9,
KeyCode::VK_OPEN_URL_SHELL_9
</autogen>

</item>

</root>

And this is the corresponding little Applescript program that is used to trigger it.

tell application "Terminal"
do script "~/Documents/FireRemote/connecth.sh"
end tell

tell application "System Events"
tell application process "Terminal"
set frontmost to true
keystroke "h" using command down
end tell
end tell
do shell script "/bin/sleep 0.5"
tell application "Terminal" to quit
do shell script "/Applications/KeyRemap4MacBook.app/Contents/Applications/KeyRemap4MacBook_cli.app/Contents/MacOS/KeyRemap4MacBook_cli enable MapFireRemote"
tell application "Finder"
with timeout of 7200 seconds
display dialog "Key Remap aktiv" with title "Map Fire Remote" buttons {"Beenden"} default button "Beenden"
if the button returned of the result is "Beenden" then
do shell script "adb disconnect"
do shell script "/Applications/KeyRemap4MacBook.app/Contents/Applications/KeyRemap4MacBook_cli.app/Contents/MacOS/KeyRemap4MacBook_cli disable MapFireRemote"
tell application "System Events"
set p to first process whose frontmost is true
if name of p is "Finder" then
set visible of p to false
end if
end tell
end if
end timeout
end tell

Just to give you an idea of how valuable every little piece of interfacing possibility on those Android devices is. And it had all been realized through adb because it is the only open interface (slightly different use of the word.. ;) ) we have left for two devices still being allowed to talk to each other. And adb actually sucks for sending emulated keyboard inputs.

When you have Teamviewer on your iPad, thats a videofeed, a virtual keyboard and a emulated touchpad, pressed into one app. Talking to a PC. Thats easy. Now - the other way around, not so much. Remember - part of the "streaming paradigm" is - we only want you to be able to touch buttons that show up somewhere on that screen (buy, or skip ad) - and we understand that you want to do this in the highest security environment possible - which is why we dont allow you to be root on your devices anymore. And which is why we cram all the rest in the bluetooth standard interface protocol. ("Nothing more intelligent than a signal any keyboard could send should be able to reach my devices from the unprotected outside, I always say! Just touch on the hermetically sealed screen, that is included - if you want something more to happen.")

Also if you ever replace the home button, we will brick your device with the next firmware update.

Lingering question: At which point does the "smartphone generation" ask for anything more than an app? ;)

(Or a buying recommendation. ;) )