2015-09-14 15 views
10

Nell'istanzaStato di un'attività viene archiviato un numero di serie (bundle.putSerializable). In un rapporto incidente dal Play Store abbiamo visto la seguente analisi dello stack:L'istanza di attività AndroidState viene pulita durante l'aggiornamento dell'app?

Caused by: java.lang.ClassNotFoundException: o.ণ 
at java.lang.Class.classForName(Class.java) 
at java.lang.Class.forName(Class.java:308) 
at android.os.Parcel$2.resolveClass(Parcel.java:2373) 
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) 
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) 
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940) 
at android.os.Parcel.readSerializable(Parcel.java:2381) 

Il nostro codice è offuscato dalla DexGuard. Sembra che Android sia in grado di serializzare la classe ma non di deserializzare la classe.

L'unico motivo per cui attualmente possiamo pensare è un aggiornamento dell'app (tramite de Play Store). Tra la versione la classe è cambiata (a causa di Dexguard) rendendo impossibile la deserializzazione.

Quindi, la mia domanda è: Android pulisce tutte le instanceState di un'app durante l'aggiornamento di un'app o no?

+0

La tua app gestisce qualsiasi tipo speciale di 'Intento', ad es. chiamando o fornendo un "servizio" interno? – JimmyB

+0

Sì, abbiamo un servizio interno avviato con un'intento con i parametri del pacchetto. Tuttavia il problema che descrivo sopra è un problema all'interno di un'attività. – userM1433372

+0

Qualche commento alla risposta? –

risposta

1

Non è necessario includere classi personalizzate nell'istanzaStato salvata se è possibile che tali classi cambino (anche se è solo il nome casuale di DexGuard in giro). Il sistema mantiene alcune informazioni sulle attività recenti e può provare a riutilizzarlo attraverso gli aggiornamenti.

+0

Questa è la tua esperienza o l'hai trovata nella documentazione? – userM1433372

+0

Quindi non dovresti mai usare putSerializable() in un bundle di parametri intent con le tue classi? – userM1433372

+0

"se c'è qualche possibilità che quelle classi cambieranno". Consideralo come un'API esterna della tua app, se la cambi - le cose potrebbero rompersi. L'ho trovato nelle risorse interne, non penso che la documentazione pubblica richiami specificamente questa situazione. –

1

Per quanto ne so, l'unica condizione in base alla quale il sistema ripristina lo stato di un'attività quando è completamente distrutta è quando il sistema ha dovuto distruggere quell'attività per recuperare la memoria di sistema. In tutti gli altri casi (arresto forzato del processo, reinstallazione dell'app, riavvio del dispositivo) lo stato viene perso.

Riguardo la reinstallazione, è necessario considerare che quando si installa una nuova versione dell'app, probabilmente è stata modificata o rimossa una o più attività e lo stato delle vecchie attività non può probabilmente corrispondere allo stato di quelle nuove. . Supponiamo ad esempio che in una singola app Activity, si abbia un TextView con id "@ + id/my_text". Dopo pochi giorni, decidi di rimuovere TextView e assegnare l'id "my_text" a un'altra vista, ad esempio uno Spinner: in che modo il sistema può ripristinare il testo di TextView in uno Spinner?

Problemi correlati