the problem of day is:
when i enable usb reverse tethering adb doesn't not respond anymore, via usb.
so, to have all working (reverse tethering, adb, etc) we need many operations:
1) enable reverse tethering via settings
2) change adb prop to enable tcp
3) start a dhcp request on usb0
4) disable wifi
5) other annoying stuffs?
(and reverse, of course :/)
so, it's time to find an -ultimate- solution.
1) with LLAMA (don't u know LLAMA? know it ! https://market.android.com/details?id=com.kebab.Llama ) i can start a "enable reverse tethering and so others stuff" when i plug the cable (and when certain others conditions are verified - for example: i was in wifi, so i want again connectivity).
2) with irssi connectbot (https://play.google.com/store/apps/details?id=org.woltage.irssiconnectbot) i can start some script which call dhcpd and change adb prop (just a "adb_tcp" script to enable adb over tcp, and "adb_usb" to rechange over usb)
download https://raw.github.com/k0smik0/burt/master/scripts/adb_tcp
#!/system/bin/sh setprop service.adb.tcp.port 5555 stop adbd start adbdand download https://raw.github.com/k0smik0/burt/master/scripts/adb_usb
#!/system/bin/sh setprop service.adb.tcp.port -1 stop adbd start adbd
and "netcfg usb0 dhcp" to start a dhcp request (plz attention you need ROOTED phone in order to execute this last one - in general, a rooted phone is needed for all the tricks, actually...)
3) last thing (but it's the worst problem) is to enable usb tethering, and i don't want to check via settings, so it's time to code some lines.
the idea beyond is just simple:
send a broadcast message and a receiver intercepts it and enables/disables usb tethering.
Below, the receiver:
/** * GPL Copyleft 2012 Massimiliano Leone - maximilianus@gmail.com . */ package net.iubris.burt; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class UsbReverseTetheringIncomingReceiver extends BroadcastReceiver { protected static final String ACTION_START = "net.iubris.burt.START"; protected static final String ACTION_STOP = "net.iubris.burt.STOP"; @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); final Object obj = context.getSystemService(Context.CONNECTIVITY_SERVICE); if (action.equals(ACTION_START)) { actOnTether(obj, "tether"); } else if (action.equals(ACTION_STOP)) { actOnTether(obj, "untether"); } } private final void actOnTether(Object obj, String act) { for (Method m : obj.getClass().getDeclaredMethods()) { if (m.getName().equals(act)) { try { m.invoke(obj, "usb0"); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } }and the relative AndroidManifest.xml with receiver declaration, permissions, etc.
<manifest android:versioncode="1" android:versionname="1.0" package="net.iubris.burt" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minsdkversion="8"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> <application android:debuggable="false" android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".UsbReverseTetheringActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"> <category android:name="android.intent.category.LAUNCHER"/> </action> </intent-filter> </activity> <receiver android:enabled="true" android:name=".UsbReverseTetheringIncomingReceiver"> <intent-filter> <action android:name="net.iubris.burt.START"/> <action android:name="net.iubris.burt.STOP"/> </intent-filter> </receiver> </application> </manifest>ok, there is also an activity, with 2 buttons start/stop.. but just for a visual sample:
actually, into code, the buttons send broadcast "net.iubris.burt.START" and "net.iubris.burt.STOP"
so, in terminal (irssi connectbot? another else?) the commands are just:
am broadcast -a "net.iubris.burt.START" # to enable am broadcast -a "net.iubris.burt.STOP" # to disable
and obviously via adb: "adb shell am broadcast etc."
4) finally, a summa cum laude of all these pieces :
--- open irssi connectbot ---
- create a "local" connection called "start usb reverse tethering" (or as u prefer)
- edit its "post-login automation" with these lines (careful to return or use && !)
am broadcast -a net.iubris.burt.START su -c "netcfg usb0 dhcp" su -c "adb_tcp"adb_tcp (from 1, above) is just a script, so u can replace last line with:
su -c "setprop service.adb.tcp.port 5555 && stop adbd && start adbd"in some terminals (due to kernel/rom version) this last ones is not needed, because adb over usb is working also with usb reverse tethering
--- open Llama ---
- create new event and call "start usb reverse tethering" (or as u want)
- add condition "charging status" as "charging from usb" and other conditions u want it matches (i.e. i have "wifi network connected" = "on" so this switch from wifi to usb r.t. does its jobs because phone is really in a state which we can call "connected")
- add actions: "toggle wifi" as "wifi off" and "run app shortcut" as [irssiconnectbot action], that is the irssiconnectbot local connection u specified above, "start usb reverse tethering" (or name you used for)
5) and to restore ?
--- for irssi-connectbot, a new local connection called "stop usb reverse tethering", where "post-login automation" is:
am broadcast -a net.iubris.burt.STOP su -c "adb_usb" as for "adb_tcp", the "adb_usb" is just these commands: su -c "setprop service.adb.tcp.port -1 && stop adbd && start adbd"
--- and in LLama, an event for "stop usb reverse tethering" can be something like where match condition "charging status" = "using battery" and action "run app shortcut" is irssi-connectbot "stop usb reverse tethering"
finally, the "burt" receiver project on github burt and the builder apk burt.apk
credits to:
http://tjandroid.blogspot.com/2010/12/enabledisable-usb-tethering.html
http://www.apad.tv/apadforum/showthread.php?1280-Solved-system-bin-sh-am-not-found-and-system-bin-sh-pm-not-found