{"id":513129,"date":"2026-04-04T20:47:20","date_gmt":"2026-04-04T20:47:20","guid":{"rendered":"https:\/\/www.newsbeep.com\/uk\/513129\/"},"modified":"2026-04-04T20:47:20","modified_gmt":"2026-04-04T20:47:20","slug":"androids-sideloading-changes-pushed-me-to-build-an-apk-installer","status":"publish","type":"post","link":"https:\/\/www.newsbeep.com\/uk\/513129\/","title":{"rendered":"Android&#8217;s sideloading changes pushed me to build an APK installer"},"content":{"rendered":"<p>I don\u2019t have a problem using ADB via the command line every now and again. But between remembering where I put the executable, opening a terminal window, connecting a device, and pasting in the APK file path, it\u2019s a bit of a chore. Booting up a small app on my PC to handle much of the legwork would be much faster.<\/p>\n<p>Yes, there are already options on the market, such as ADB AppControl, EasyADB, or QuickADB. However, I wanted to build something myself that specifically focuses on the APK installation workflow \u2014 wireless debugging pairing, file\/directory browsing, and bundle unpacking \u2014 rather than a full ADB control suite.<\/p>\n<p>Have you ever use Google&#8217;s ADB tool?<\/p>\n<p>700 votes<\/p>\n<p>I use it fairly often<\/p>\n<p>44%<\/p>\n<p>I&#8217;ve used it one or twice<\/p>\n<p>37%<\/p>\n<p>Never used it<\/p>\n<p>12%<\/p>\n<p>I have no idea what ADB is<\/p>\n<p>7%<\/p>\n<p>While I\u2019m a moderately capable programmer, between work and two kids, I don\u2019t have the time to write an app entirely from scratch. So I thought I\u2019d give AI-assisted \u201cvibe coding\u201d a try. This had the added benefit of letting me try out a new programming language I wasn\u2019t familiar with: Go.<\/p>\n<p>Why Go? It\u2019s a simple language that\u2019s a perfect fit for a compact project like this (no need for Rust), yet it easily compiles into a small, cross-platform executable (sorry, Python). Plus, I wanted to build a cool-looking terminal app using the beautiful <a href=\"https:\/\/github.com\/charmbracelet\/bubbletea\" target=\"_blank\" rel=\"nofollow noopener\">Bubble Tea TUI framework<\/a> that I\u2019d recently come across. With the design in mind, I set off to find an AI agent to help me.<\/p>\n<p>The trials and tribulations of vibe coding<\/p>\n<p><img class=\"e_Wg\" decoding=\"async\" loading=\"lazy\"  title=\"Vibe Coding with OpenCode and VSCode\"  alt=\"Vibe Coding with OpenCode and VSCode\" src=\"https:\/\/www.newsbeep.com\/uk\/wp-content\/uploads\/2026\/04\/Vibe-Coding-with-OpenCode-and-VSCode.jpg\"\/><\/p>\n<p>Robert Triggs \/ Android Authority<\/p>\n<p>I\u2019ve dabbled in <a href=\"https:\/\/www.androidauthority.com\/ways-using-ai-for-hobbies-3624877\/\" rel=\"nofollow noopener\" target=\"_blank\">AI tools<\/a> enough to know that simply asking one to build an application for you is a gamble. Expensive models from Anthropic and OpenAI can one-shot simple tasks, but you often end up in an exhausting back-and-forth to resolve bugs when you let an agent loose on a complex project. To interact with ADB and build a terminal-based UI, I decided I wanted a more hands-on approach.<\/p>\n<p>I wasn\u2019t about to spend hundreds of dollars on Opus 4.6 for this little project. Even with careful planning, there\u2019s always a risk that models get stuck in an expensive build loop or hit an inescapable problem. Instead of asking Claude or Codex to handle the task themselves, I paired my usual IDE with <a href=\"https:\/\/opencode.ai\/\" target=\"_blank\" rel=\"nofollow noopener\">OpenCode<\/a> and its very affordable $10 Go subscription. That gave me access to MiniMax M2.7 and the very impressive GLM 5 to use alongside my slower human brain and keyboard-worn fingers.<\/p>\n<p>I don&#8217;t trust AI to build from scratch, but it&#8217;s a major timesaver to work alongside.<\/p>\n<p>I laid out the bare bones of the structure myself\u2014folders, a few placeholder functions, a .gitignore, and so on\u2014and wrote a quick AGENTS.md to outline the project\u2019s requirements, goals, and coding specifics. Then, rather than asking AI to finish the whole thing, I moved slowly through the phases I knew I\u2019d need: planning, building, reviewing, and tweaking each step along the way. I highly recommend using version control, like Git, so you can undo major AI errors and climb back out of inevitable rabbit holes.<\/p>\n<p>First, I got a basic ADB wrapper working in Go, allowing me to run commands like adb devices to find connected phones and then using adb install to push APKs to them. Next, I expanded the working commands into a basic terminal interface to step through the process. That was pretty simple, but not the most user-friendly experience.<\/p>\n<p>Finally \u2014 and definitely the most arduous part of the back-and-forth \u2014 was setting up the UI flow. It didn\u2019t help that I was learning a new language and framework at the same time, but by instructing the AI agent to expose theming through a configuration file, I was able to make manual tweaks myself. That saved time (and credits) by avoiding the need to burn resources on every small detail.<\/p>\n<p>Does my app actually work?<\/p>\n<p><img class=\"e_Wg\" decoding=\"async\" loading=\"lazy\"  title=\"Android Wireless Debugging Notification\"  alt=\"Android Wireless Debugging Notification\" src=\"https:\/\/www.newsbeep.com\/uk\/wp-content\/uploads\/2026\/04\/Android-Wireless-Debugging-Notification.jpg\"\/><\/p>\n<p>Robert Triggs \/ Android Authority<\/p>\n<p>In the end, the combination of human planning, AI building, and tag-team tweaking produced a solid little app in just three days of off-duty work. I certainly wouldn\u2019t have been able to write the ~3,000 lines of code by myself in that time. Not bad at all for $10, and I have plenty of credits left for another idea.<\/p>\n<p>It\u2019s a compact 7MB executable \u2014 no install required. It can automatically download ADB from Google if you don\u2019t already have it, or use an existing PATH installation. The app launches ADB when needed and shuts it down on exit. You can pair with debuggable Android devices over USB or Wi-Fi, browse files using a built-in file explorer, and install APKs directly. It also supports unpacking and installing app bundles, including APKM, XAPK, and APKS files.<\/p>\n<p>The good news is that I got a working app, and it\u2019s genuinely useful. If there\u2019s one drawback, it\u2019s that I didn\u2019t learn as much Go as I\u2019d initially hoped. By asking AI to solve problems for me, I missed out on deeply learning the language\u2019s syntax and patterns. I\u2019ve picked up some understanding from reviewing the code and following the logic, but without doing much of the problem-solving myself, I still wouldn\u2019t call myself competent in Go.<\/p>\n<p>And that\u2019s the real risk with vibe coding: not fully understanding how the code works. I spotted a couple of harmless bugs and even a zip slip vulnerability while reviewing AI-generated changes, but I can only imagine the risks when building something involving encryption, API keys, or sensitive credentials. My advice to anyone trying vibe coding is to put in the effort to plan and understand not just how your app should work, but also which tools you need, how to manage the project, and what commonly goes wrong. That way, you\u2019re better positioned to verify AI output when it inevitably misses the mark.<\/p>\n<p>If you want to give my app a try, you can find releases and the source code on the <a href=\"https:\/\/github.com\/audioeng89\/tiny_apk_installer\" target=\"_blank\" rel=\"nofollow noopener\">Tiny APK Installer GitHub repo<\/a>. I haven\u2019t had a chance to test the Mac or Linux builds yet, so I\u2019m trusting that Go compiled everything correctly. If you spot any bugs, feel free to open an issue \u2014 and maybe curse AI for making it this easy to build (and break) things.<\/p>\n<p> Don\u2019t want to miss the best from Android Authority?<\/p>\n<p><a href=\"https:\/\/andauth.co\/AAGooglePreferredSource\" class=\"e_Dn\" target=\"_blank\" rel=\"noreferrer nofollow noopener\"><img class=\"e_Wg\" decoding=\"async\" loading=\"lazy\"  title=\"google preferred source badge light@2x\"  alt=\"google preferred source badge light@2x\" src=\"https:\/\/www.newsbeep.com\/uk\/wp-content\/uploads\/2026\/01\/1768240152_738_google_preferred_source_badge_light@2x.png\"\/><img class=\"e_Wg\" decoding=\"async\" loading=\"lazy\"  title=\"google preferred source badge dark@2x\"  alt=\"google preferred source badge dark@2x\" src=\"https:\/\/www.newsbeep.com\/uk\/wp-content\/uploads\/2026\/01\/1768240152_238_google_preferred_source_badge_dark@2x.png\"\/><\/a><\/p>\n<p>Thank you for being part of our community. Read our\u00a0<a class=\"c-link\" href=\"https:\/\/www.androidauthority.com\/android-authority-comment-policy\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" data-stringify-link=\"https:\/\/www.androidauthority.com\/android-authority-comment-policy\/\" data-sk=\"tooltip_parent\">Comment Policy<\/a> before posting.<\/p>\n","protected":false},"excerpt":{"rendered":"I don\u2019t have a problem using ADB via the command line every now and again. But between remembering&hellip;\n","protected":false},"author":2,"featured_media":513130,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[2596,2306,86,56,54,55],"class_list":{"0":"post-513129","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-mobile","8":"tag-android","9":"tag-mobile","10":"tag-technology","11":"tag-uk","12":"tag-united-kingdom","13":"tag-unitedkingdom"},"_links":{"self":[{"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/posts\/513129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/comments?post=513129"}],"version-history":[{"count":0,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/posts\/513129\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/media\/513130"}],"wp:attachment":[{"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/media?parent=513129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/categories?post=513129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.newsbeep.com\/uk\/wp-json\/wp\/v2\/tags?post=513129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}