我已经为Android应用程序开发了一个SDK。我们有很多客户在那里使用这个SDK.Now我已经更新了我的SDK。我正在寻找一种方法,这些更改可以反映在那里的应用程序而不更新那里的应用程序需要紧急帮助。任何帮助将不胜感激。谢谢。
答案 0 :(得分:4)
你可以使用DexLoader类从你的SD卡动态加载一个jar文件...你可以随时更新你的存储......在下面是工作代码..
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);
并且在你的库中文件代码可以是这样的
public class MainActivity {
public void doSomething() {
Log.e(MainActivity .class.getName(), "MainActivity : doSomething() called.");
}}
告诉我你是否需要帮助
答案 1 :(得分:1)
你的情况没有这种方式。但是有一件事可以让它为下次更新启用它。 Android可以使用DexClassLoader动态加载已编译的代码。所以你编译一个新的DEX文件,然后强制你的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) { ... }