2015-09-28 12 views
7

Opracowałem SDK dla aplikacji Android. Mamy wielu klientów używających tego zestawu SDK w aplikacjach. Teraz zaktualizowałem mój SDK. Szukam sposobu, w jaki te zmiany mogą odzwierciedlić w tej aplikacji bez aktualizowania aplikacji w sklepie Play. Potrzebna pomoc. Każda pomoc zostanie doceniona. Dziękujemy z góry.Wdrażanie aktualizacji SDK OTA

Odpowiedz

4

Cóż można dynamicznie załadować plik jar z karty SD przy użyciu DexLoader klasy ... które można zaktualizować, gdy kiedykolwiek want..on Państwa magazynowanie ... poniżej kod działa ..

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

i biblioteki kodu pliku może być tak

public class MainActivity { 



public void doSomething() { 

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

mi powiedzieć, jeśli potrzebujesz pomocy

1

Nie ma takiego sposobu dla twojej sytuacji. Ale jest jedna rzecz, którą możesz zrobić, aby włączyć ją do następnej aktualizacji. Android może dynamicznie ładować skompilowany kod za pomocą DexClassLoader. Więc skompiluj nowy plik DEX, a następnie zmuś SDK do pobrania i użycia go.

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

Możesz zarzut wyjaśnij to nieco więcej. Chodzi mi o to, gdzie i jak wdrożyć ten kod i jak będzie przebiegał przepływ. czy to zadziała nad powietrzem? Z góry dziękuję. – 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 –

Powiązane problemy