Wednesday, March 8, 2017

Communicating Linux Chroot to Android

Communicating Linux Chroot to Android


The technique of installing a full Linux distro on your Android phone has been around for a long time. I’ve used it in the past, but for a while didn’t have a phone with a physical keyboard, which made it less useful. Now that I have CM7.1 on my G2 I’ve installed it again. I’m actually using an updated prepackaged version of Ubuntu, which has been fantastic.
However, generally speaking you can run the command line stuff and have it manipulate stuff on the filesystem, but the stuff you run “in Linux” don’t interact with Android. Poking around the other day I noticed that SL4A, the Android scripting system has a “server mode”. Normally the scripts run by SL4A communicate with a generic RPC service which hooks the interpreters back into the Android system. There’s also a mode to just startup the RPC service and bind it to the loopback port or a public interface. And it talks JSON!
So, theoretically, I should be able to startup a SL4A server, run scripts in the Linux environment, and they can send messages to the outside Android system. I needed to test it out of course. If you have SL4A installed you select View from the top level menu, then Interpreters, and then “Start Server” from the menu there, and select “Private” from the context menu that pops up. There should now be a SL4A entry in the dropdown notification area, if you tap on that you can see the running server and it’ll tell you the port. Or, you could just get it from the command line, since thats where we’re going next.
Login via ADB or terminal, or however you prefer. Swap over to Linux, or mount up the unionfs stuff if you’re doing it Saurik’s way. And then you can use anything that can connect to a TCP socket and emit some JSON to send messages. I used netcat for the simplest example:
echo ‘{“id”:1,”method”:”makeToast”,”params”:["The Great HooDoo ..."]}’ | nc 127.0.0.1 38804
And tada! The message shows up on my device:
Really hacky thing to do right now, but it’s interesting in that it would potentially let that stuff running as Linux commands to interact with the rest of the system. Even just being able to deliver local notifications so that you know to check back on something running in terminal to see updates is pretty cool.

Available link for download