2015-09-28 6 views
7

Ho sviluppato un SDK per le applicazioni Android. Abbiamo molti client che utilizzano questo SDK in queste applicazioni. Ora ho aggiornato il mio SDK. Sto cercando un modo in cui questi cambiamenti possano rifletterci senza aggiornare lì app sul Play Store. Aiuto urgente necessario. Qualsiasi aiuto sarà apprezzato.Grazie in anticipo.Aggiornamento di SDK OTA

risposta

4

Ebbene si può caricare dinamicamente un file jar dalla scheda SD utilizzando DexLoader classe ... che è possibile aggiornare quando mai si want..on storage ... sotto è il codice di lavoro ..

final String libPath = Environment.getExternalStorageDirectory() +  "/test.jar"; 
    final File tmpDir = getDir("dex", 0); 

    final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader()); 
    final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("com.test.android.MainActivity"); 

    final Object myInstance = classToLoad.newInstance(); 
    final Method doSomething = classToLoad.getMethod("doSomething"); 



    doSomething.invoke(myInstance); 

e nel codice file di libreria può essere come questo

public class MainActivity { 



public void doSomething() { 

Log.e(MainActivity .class.getName(), "MainActivity : doSomething() called."); 
}} 

dirmi se avete bisogno di assistenza

1

non esiste un modo per la vostra situazione. Ma c'è una cosa che puoi fare per abilitarla per il prossimo aggiornamento. Android può caricare dinamicamente codice compilato con DexClassLoader. Quindi compila un nuovo file DEX, quindi forza l'SDK a scaricarlo e usarlo.

// Internal storage where the DexClassLoader writes the optimized dex file to 
    final File optimizedDexOutputPath = getDir("outdex", Context.MODE_PRIVATE); 
    DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(), 
             optimizedDexOutputPath.getAbsolutePath(), 
             null, 
             getClassLoader()); 
    Class libProviderClazz = null; 
    try { 
     // Load the library. 
     libProviderClazz = 
      cl.loadClass("com.example.dex.lib.LibraryProvider"); 
     // Cast the return object to the library interface so that the 
     // caller can directly invoke methods in the interface. 
     // Alternatively, the caller can invoke methods through reflection, 
     // which is more verbose. 
     LibraryInterface lib = (LibraryInterface) libProviderClazz.newInstance(); 
     lib.showAwesomeToast(this, "hello"); 
    } catch (Exception e) { ... } 
+0

Riesci a richiesta se lo spieghi un po 'di più. Intendo dove e come implementare questo codice e come andrà il flusso. questo funzionerà per via aerea? Grazie in anticipo. – Scorpio

+0

@HarrySharma, https://www.google.com.ua/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=android%20dexclassloader%20example&es_th=1 –