2015-09-28 5 views
7

Ich habe ein SDK für Android-Anwendungen entwickelt.Wir haben viele Clients mit diesem SDK in Anwendungen.Nun habe ich mein SDK.Ich bin auf der Suche nach einer Möglichkeit, dass diese Änderungen in dort Anwendung widerspiegeln können ohne Aktualisierung dort app auf Spielspeicher. Dringende Hilfe benötigt. Jede Hilfe wird geschätzt. Danke im Voraus.Rolling-up-Update von SDK OTA

Antwort

4

Nun können Sie dynamisch eine JAR-Datei von der SD-Karte mit DexLoader Klasse laden ... die Sie aktualisieren können, wann immer Sie Ihre Speicher want..on ... Code unten arbeitet ..

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); 

und in Ihrer Bibliothek Datei Code kann wie folgt mir

public class MainActivity { 



public void doSomething() { 

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

sagen, wenn Sie Sie Hilfe benötigen

1

gibt es keinen solchen Weg für Ihre Situation. Aber es gibt eine Sache, die Sie tun können, um es für das nächste Update zu aktivieren. Android kann kompilierten Code mit DexClassLoader dynamisch laden. Also kompilieren Sie eine neue DEX-Datei und erzwingen dann das Herunterladen und Verwenden des SDK.

// 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

Can Plädoyer Ich erkläre es ein bisschen mehr. Ich meine, wo und wie dieser Code implementiert wird und wie der Fluss abläuft. funktioniert das über Luft? Vielen Dank im Voraus. – 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 –

Verwandte Themen