Domanda

Sto sviluppando una libreria per Android che richiede aggiornamenti frequenti da un server centrale. Stavo pensando a quanto sarebbe bello se la mia libreria potesse aggiornarsi da sola - o se potessi semplicemente rilasciare una libreria bootstrap che scarica la libreria di destinazione quando l'app è installata.

Vedo questa classe in 1.5 chiamata " DexClassLoader " ma sembra esserci poco prezioso sul web oltre ai documenti API. Qualcuno l'ha usato con successo per lo scenario che ho descritto?

Inoltre, i termini di Android Market consentono una cosa del genere?

È stato utile?

Soluzione

Ho usato con successo DexClassLoader . È importante fornire un dexOutputDir che è effettivamente scrivibile dalla tua app, quindi non / data / dalvik-cache . Altrimenti il ??registro mostrerà una o due righe sull'errore di scrittura, seguito da ClassNotFoundException .

cl = new DexClassLoader("/full/path/com.example.apk",
                        getFilesDir().getAbsolutePath(),// /data/data/foo/files
                        null,  // native lib path, I haven't used this
                        MyClass.class.getClassLoader());
// This doesn't make Class.forName() work, instead I do this:
Class<?> foo = cl.loadClass("com.example.foo");

Per far funzionare Class.forName () , puoi provare Thread.setContextClassLoader () (non l'ho fatto).

Altri suggerimenti

In effetti ciò che vuoi è supportato e funziona. DexClassLoader non funziona come previsto per me, ma il seguente codice funziona bene.

DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk"));
ClassLoader cl = getClassLoader();
Class clazz = df.loadClass("com/my/lib/MyClass", cl);

Per quanto riguarda la domanda del mercato, non vedo alcun problema, ma devi leggere l'EULA per essere sicuro.

DexClassLoader è la risposta giusta. Le applicazioni non dovrebbero mai usare DexFile direttamente (è pensato per essere usato dai caricatori di classi).

È possibile utilizzare l'archiviazione esterna ( / sdcard ) o l'area dati privata dell'app, per il parametro dexOutputDir . Lo spazio di archiviazione esterno è in genere più grande, ma se la scheda viene espulsa, l'app verrà uccisa e, a causa della mancanza di applicazione delle autorizzazioni per i file, è facile per una terza parte sostituire il codice. Ciò può consentire alle app dannose di fare in modo che l'app esegua azioni arbitrarie. (Se vuoi farlo comunque, ottieni il percorso tramite Environment.getExternalStorageDirectory () ; richiede l'autorizzazione WRITE_EXTERNAL_STORAGE .)

L'area dati privata dell'app (ottenere il percorso da Context.getFilesDir () ) è più sicura e ha anche il vantaggio di essere ripulita automaticamente se l'app viene disinstallata. Questo è l'approccio raccomandato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top