2016-05-05 26 views
6

Sto costruendo un sistema basato su Android che richiede l'invio di dati tramite un protocollo binario. Mi aspetto che ci saranno molte versioni di più protocolli e l'incubo che viene fornito con il loro mantenimento.Do DEX e Dalvik supportano la compatibilità binaria Java?

Mi viene in mente che potrei essere in grado di aggirare gran parte del problema di versione, utilizzando la compatibilità binaria di Java.

Supponiamo che l'applicazione A dipenda dalla libreria L. L contiene una classe C, utilizzata in A, che implementa l'interfaccia I. Costruisco sia L e A, con la definizione I(0) dell'interfaccia I. Installa L(0) e A(0) su un dispositivo. A(0) lega dinamicamente L(0) che fornisce la classe C(0).

Ora estendo l'interfaccia I, aggiungendo, ad esempio, due nuovi metodi. Quando provo a compilare L, la compilazione fallisce, perché C non implementa i nuovi metodi. Correo il L estendendo C quindi implementa i due nuovi metodi. Ora compilo L(1) contro I(1) e lo installo sul dispositivo.

Si noti che, a questo punto, A non verrà compilato con I(1). Tuttavia, se questo fosse Java, il A(0) si collegherà ed eseguirà, correttamente, usando C(1) da L(1).

Questo comportamento (e più) è garantito, per le implementazioni di Java, da JLS Capitolo 13, Compatibilità binaria. Se vale per DEX e Dalvik, allora posso rendere una grande classe di cambiamenti di protocollo completamente invisibili ai loro clienti.

Quindi, la domanda è: DEX e Dalvik aderiscono alle specifiche di compatibilità binaria JLS? In caso contrario, c'è un documento che specifica la compatibilità binaria DEX/Dalvik?

risposta

5

non posso parlare autorevolmente sulle versioni di spedizione correnti del Dalvik VM (o tempi di esecuzione correlati come arte), ma come il progettista del formato .dex, io posso parlare con l'intento:

Non ho intenzione di affermare che ho aderito rigorosamente a qualsiasi specifica nel design del formato .dex. Quello che dirò è che intendevo che il formato fosse un contenitore adatto per la rappresentazione di programmi che erano stati originariamente scritti nel linguaggio di programmazione Java, comprese le preoccupazioni sulla compatibilità cross-code in un ambiente di compilazione ed evoluzione del codice separato.

Detto questo (e come ho sorta implicita) questo è un settore di applicazione che è super facile da sbagliare, e in cui i problemi, spesso nella pratica restare silente per lunghi periodi di tempo proprio perché così pochi programmi in realtà dipendono sul tipo di garanzie che ti interessano.

Quindi, potrebbe non avere importanza ciò che intendevo, così come quello che fanno le VM là fuori nel mondo. Consiglio vivamente di testare esplicitamente i vari scenari di cross-linking e upgrade, su diverse VM diverse in natura. Potresti scoprire che i risultati parlano a seconda di questa funzionalità nel tuo progetto.