2013-01-25 15 views
6

Sto provando a scrivere un'applicazione che deve leggere, modificare e salvare alcune impostazioni in Preferenze condivise di un'altra applicazione (data/data/package_name/shared_prefs/file.xml).Android: modifica SharedPreferences di un'altra app

Questa applicazione non è mia e ho un dispositivo di root per il test.

Quali autorizzazioni Android dovrei aggiungere a manifest e come posso accedere a questo file e modificarlo? So che SharedPreferences sono unici per ogni App/APK, ma ho bisogno di modificarlo in modalità root.

Ho codice per modificare file XML sul sdcard lavorare, ma quando cambio percorso "data/data/package_name/shared_prefs/file.xml" mi dà un'eccezione e il messaggio

android open failed eacces (permission denied) 

C'è un modo per raggiungere questo obiettivo?

+0

è necessario firmare l'app con firma di sistema per ottenere quell'autorizzazione, che non è facilmente disponibile. –

risposta

1

Date un'occhiata a questa risposta:

https://stackoverflow.com/a/13139280/361230

Quando si utilizza su, si avrà l'autorizzazione a modificare quello che vuoi sul filesystem.

Tuttavia, sono d'accordo con Chris sul fatto che non è proprio bello fare ciò che vuoi.

+0

Puoi spiegare, ho solo bisogno di eseguire SU e concedere le autorizzazioni per la mia app o dovrei eseguire un comando speciale nella shell SU per cambiare gli attributi del file? – Wolf6969

+0

@ Wolf6969, a dire il vero, ho letto solo su questa roba per curiosità. Tuttavia, se leggi la risposta a cui mi sono collegato, sembra che una volta eseguita su, l'app inizi a essere eseguita con le autorizzazioni di superutente. Quindi, aggiungi solo la prima riga al tuo codice e in seguito non avrai problemi di autorizzazione. Ci proverò domani, ma perché non provi tu stesso? – Shade

+0

Non sarà così. Avere le autorizzazioni superuser della tua app ti dà la possibilità di eseguire _commands_ come root. L'app è ancora in esecuzione in una sandbox e non sarà possibile accedere a tali shared_prefs con comandi diversi da 'Runtime.exec() 'o altri comandi di sistema. Quello che suggerirei è di usare un comando 'su' per copiare il file in una posizione dove si ha accesso in lettura/scrittura (forse la cartella dei dati dell'app), modificarlo, e quindi usare un altro comando' su' per copiarlo di nuovo e sovrascrivere il file esistente. – cnexus

-1

Non si dovrebbero modificare le preferenze di un'altra app, con o senza radice.

+0

Posso farlo con qualsiasi Explorer con la modalità root, perché non posso farlo dalla mia app? – Wolf6969

0

A meno che tu non sia il proprietario di un'altra applicazione, non dovresti farlo. L'unico modo, senza root, sarebbe renderlo leggibile a livello mondiale, che è ammortizzato e quasi mai usato.

Dubito che qualcuno possa darti una risposta che desideri, a meno che tu non indichi il motivo per cui devi accedere.

+0

non è come se fosse un segreto o qualcosa del genere. Inoltre, molte persone usano root per scopi di modding e simili. – Shade

+0

Ciò non cambia il fatto che si voglia farlo in modo progmedio rispetto a chi lo fa manualmente. – Mgamerz

+0

Quello che intendevo era che ci sono applicazioni che richiedono il funzionamento di root, ma forniscono comunque un vantaggio (piuttosto che farti del male). Molte di queste app che puoi incontrare quando usi una ROM personalizzata sul tuo dispositivo - ad es. app per modificare la barra di navigazione (ICS +). – Shade

8

Per rispondere effettivamente alla domanda, se si dispone di root, è possibile farlo con la riflessione. L'ho fatto su Android 4.1, su altre piattaforme potrebbe funzionare in modo diverso. La cosa buona è che le preferenze condivise non sono accessibili solo dai servizi di sistema, quindi è possibile accedere ai metodi "nascosti" tramite la riflessione. Metti questo in un try-catch:

Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs/package_name_preferences.xml" }); 
proc.waitFor(); 
proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs" }); 
proc.waitFor(); 
proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name" }); 
proc.waitFor(); 

File preffile = new File("/data/data/package_name/shared_prefs/package_name_preferences.xml"); 

Class prefimplclass = Class.forName("android.app.SharedPreferencesImpl"); 

Constructor prefimplconstructor = prefimplclass.getDeclaredConstructor(File.class,int.class); 
prefimplconstructor.setAccessible(true); 

Object prefimpl = prefimplconstructor.newInstance(preffile,Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE); 


Editor editor = (Editor) prefimplclass.getMethod("edit").invoke(prefimpl); 
//put your settings here 
editor.commit(); 
+0

Le modifiche alle autorizzazioni sulle directory potrebbero non essere necessarie, solo sul file delle preferenze effettive. E, naturalmente, questo ha un sacco di problemi di sicurezza, ma presumo che tu sia a conoscenza dei pericoli di root. – azyoot

+0

Dio vi benedica;) –

Problemi correlati