Autore Topic: [APP] 2G Auto Toggle  (Letto 3916 volte)

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
[APP] 2G Auto Toggle
« il: 13 Giugno 2012, 10:42:18 CEST »
Ciao a tutti!
Avete la connessione dati attiva tutto il giorno e la vostra batteria ne soffre? 2G Auto Toggle fa per voi!
Il concetto è semplice: quando lo schermo si spegne, l'app cambia la vostra rete in 2G per risparmiare batteria, e la riporta in automatica quando lo schermo viene riacceso.
Ma potete personalizzarlo: per esempio, potete disattivare l'app durante le chiamate, o il tethering/hotspot, oppure ritornare in automatico solo allo sblocco dello schermo anzichè all'accensione.
Magari non volete che passi a 2G se lo schermo sta spento per poco tempo? C'è la funzione Timer.
O magari state facendo un download, o ascoltando qualcosa in streaming, e il 2G sarebbe troppo lento? Il filtro app vi permette di disabilitare 2G Auto Toggle quando certe app sono attive.

Vi lascio il link: https://play.google.com/store/apps/details?id=it.abiondo.app.gautotoggle&hl=it

Io sono passato da un 20-30% a fine giornata ad un 50% ;)
Ciao!

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #1 il: 13 Giugno 2012, 10:55:33 CEST »
cavolo, pensavo qualcuno avesse risolto uno dei problemi più importanti del mio cell, ma poi ho letto (Cyanogenmod) e niente...
su android stock ancora nulla... :(
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[APP] 2G Auto Toggle
« Risposta #2 il: 13 Giugno 2012, 10:59:49 CEST »
Giusto per curiosità, come mai necessita della Cyanogenmod?

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:[APP] 2G Auto Toggle
« Risposta #3 il: 13 Giugno 2012, 11:24:35 CEST »
Credo dipenda dal fatto che alcune funzioni (tipo lo switch del 2G/3G, l'attivazione del traffico dati e altre) sono (da sempre o da Froyo/Ginger a seconda della funzione) in classi interne e dunque non utilizzabili se non tramite reflection (rischiando ovviamente che con la release successiva dell'OS non funzioni più nulla, o che le personalizzazioni del produttore modifichino in qualche modo il comportamento standard).

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #4 il: 13 Giugno 2012, 11:29:27 CEST »
Sto lavorando sulle stock, speravo di inserire il supporto in questa versione ma nulla :/
Con la Cyanogenmod (e qualche altra mod) basta fare un broadcast com.android.internal.telephony.MODIFY_NETWORK_MODE per cambiare la modalità di rete. Con la stock bisogna usare le API interne di com.android.internal.telephony, ma richiedono il permesso MODIFY_PHONE_STATE che da gingerbread è stato limitato solo alle applicazioni di sistema. Sono sicuro che qualche workaround c'è, ma devo testarlo accuratamente perchè non voglio che il prossimo update di Android mi rompa l'app. Usare le API interne è semplice e abbastanza sicuro, però devo appunto essere sicuro che rimarranno relativamente stabili.
In ogni caso, il supporto alla stock è una delle mie priorità. Appena trovo un modo funzionante aggiornerò il thread ;)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #5 il: 13 Giugno 2012, 23:15:25 CEST »
Sto lavorando sulle stock, speravo di inserire il supporto in questa versione ma nulla :/
Con la Cyanogenmod (e qualche altra mod) basta fare un broadcast com.android.internal.telephony.MODIFY_NETWORK_MODE per cambiare la modalità di rete. Con la stock bisogna usare le API interne di com.android.internal.telephony, ma richiedono il permesso MODIFY_PHONE_STATE che da gingerbread è stato limitato solo alle applicazioni di sistema. Sono sicuro che qualche workaround c'è, ma devo testarlo accuratamente perchè non voglio che il prossimo update di Android mi rompa l'app. Usare le API interne è semplice e abbastanza sicuro, però devo appunto essere sicuro che rimarranno relativamente stabili.
In ogni caso, il supporto alla stock è una delle mie priorità. Appena trovo un modo funzionante aggiornerò il thread ;)
se ce la farai, sarò il primo a darti 5 stelle! se ti serve un tester su Nexus S stock e ICS e LG Dual Ginger io ci sono :D
Per quando mi riguarda, lo switch sarebbe sensato solo al momento dell'attivazione/disattivazione della connessione dati (o anche tramite widget)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #6 il: 21 Giugno 2012, 23:04:22 CEST »
Per chi fosse interessato ai progressi sulla stock...
Per modificare la modalità usando le API interne ufficiali bisogna innanzitutto ottenere un oggetto com.android.internal.telephony.Phone. Poi bisogna chiamare il suo metodo setPreferredNetworkType.
Il problema però è ottenere l'oggetto Phone. La classe che lo genera è com.android.internal.telephony.PhoneFactory. Il metodo makeDefaultPhone genera l'oggetto Phone che viene poi mantenuto da PhoneFactory. L'oggetto può essere ricavato quando si vuole chiamando il metodo getDefaultPhone.
Ma non è così semplice... makeDefaultPhone memorizza il Looper del thread che lo chiama, e getDefaultPhone ritorna il Phone solo se lo si chiama da quel thread. Siccome è l'applicazione telefono (com.android.phone) a chiamarlo, bisognerebbe far parte del suo processo. PhoneFactory memorizza il Phone in un campo privato (che volendo sarebbe accessibile attraverso reflection), e com.android.phone.PhoneApp espone un metodo getPhone che viene usato da tutto il package dell'app telefono per ottenere un Phone, memorizzato da PhoneApp tramite getDefaultPhone. Il problema è che com.android.phone gira in un altro processo rispetto alla mia app, ossia in un'altra virtual machine Dalvik. Pertanto, anche se provassi ad accedere al Phone tramite reflection su PhoneApp o PhoneFactory, caricherei solo delle classi non inizializzate, perchè le classi caricate di com.android.phone con il Phone creato non fanno parte della mia VM. Ho provato a chiamare makeDefaultPhone per inizializzare la mia PhoneFactory, ma ho bisogno di permessi che non posso avere, e andando a vedere a che profondità arriva nel sistema direi che farebbe casini con l'app telefono.
Quindi in definitiva accedere all'oggetto Phone (mantenuto solo in com.android.phone) è impossibile per via dell'isolamento delle VM.
Ma se si potesse entrare in quella VM?
La mia idea è poco ortodossa ma ho abbastanza esperienza con la modifica di codice in RAM a runtime (e non parlo solo di java...).
Innanzitutto scelgo una funzione bersaglio con le seguenti caratteristiche:
- Deve avere accesso all'oggetto Phone (quindi in com.android.phone)
- Deve essere richiamabile dalla mia app
- Meno è usata, meglio è
Un qualche funzione di TelephonyManager o ITelephony va bene. In pratica creo un binario con l'NDK e la mia app lo fa girare come root quando deve cambiare modalità di rete. Il binario avvia un debugger sulla VM di com.android.phone ed imposta un breakpoint all'inizio della funzione bersaglio. A questo punto manda un segnale (basta una stringa in stdout) alla mia app. Quando l'app riceve il segnale, chiama la funzione, facendo scattare il breakpoint. Il binario sostituisce il bytecode della funzione in RAM con uno che innazitutto controlla se la chiamata viene dalla mia app: se si, prende il Phone e ci chiama sopra setPreferredNetworkType. Se no, esegue il normale codice della funzione. Questo controllo serve per prevenire race conditions (quando un'altra app chiama la funzione mentre il bytecode è modificato). Inoltre il binario rimuove il primo breakpoint e imposta un secondo breakpoint alla fine della funzione. A questo punto fa riprendere l'esecuzione, finchè non scatta il secondo breakpoint. Il bytecode viene ripristinato a quello originale, il secondo breakpoint viene rimosso, e la funzione ritorna.
Se qualcuno ha idee più eleganti si faccia avanti... ma mi sa che giocare a questo livello è l'unica per superare l'isolazione delle VM.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #7 il: 22 Giugno 2012, 14:19:07 CEST »
...
Un qualche funzione di TelephonyManager o ITelephony va bene. In pratica creo un binario con l'NDK e la mia app lo fa girare come root quando deve cambiare modalità di rete. Il binario avvia un debugger sulla VM di com.android.phone ed imposta un breakpoint all'inizio della funzione bersaglio
....

non male come idea e come spiegazione, se non chè, parlando di stock, la parte in grassetto la vedo moooolto dura...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:[APP] 2G Auto Toggle
« Risposta #8 il: 22 Giugno 2012, 14:22:26 CEST »
non male come idea e come spiegazione, se non chè, parlando di stock, la parte in grassetto la vedo moooolto dura...

Sarebbe indirizzato ovviamente solo agli utenti con telefono rootato, ossia tutte le custom ROM oltre alla Cyanogen e a parecchi utenti che usano il root su stock. Sarebbe comunque un passo in avanti.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:[APP] 2G Auto Toggle
« Risposta #9 il: 22 Giugno 2012, 16:01:59 CEST »
Citazione
...Il binario sostituisce il bytecode della funzione in RAM...


Ormai per motivi di performance (da 2x a 5x) tutti i dispositivi Android hanno il JIT (Just In Time compiler) abilitato di default, quindi non puoi modificare i bytecode della VM al runtime, non ci sono. Anche superando da root le varie barriere di protezione, ti troveresti davanti il codice in linguaggio macchina delle CPU sopportate dal JIT di Android che sono: ARM, x86_32 e MIPS.


adb logcat | tee /tmp/logcat | grep TAG