摘自 Android中的動態加載機制
>
我主要是想在應用發佈出去之後,根據我後臺的配置讓客戶端動態的加載不同的邏輯代碼,以實現靈活的運營需求
項目需要,主要使用了上述作者的思路之一
開門見山了--
1.實現待會要用的動態代碼部分,項目目錄如下
IDynamic.java
package com.dynamic.interfaces;
public interface IDynamic {
//隨便寫幾個方法作爲測試用
void init();
void printHelloWorld();
String getString();
int getInt();
}
Dynamic.java
package com.dynamic.impl;
import com.dynamic.interfaces.IDynamic;
public class Dynamic implements IDynamic {
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("Dynamic.class --- init");
}
@Override
public void printHelloWorld() {
// TODO Auto-generated method stub
System.out.println("Dynamic.class --- printHelloWorld");
}
@Override
public String getString() {
// TODO Auto-generated method stub
System.out.println("Dynamic.class --- getString");
return "test";
}
@Override
public int getInt() {
// TODO Auto-generated method stub
System.out.println("Dynamic.class --- getInt");
return 888;
}
}
將IDynamic.java和Dynamic.javaf嗯別打成jar包,如圖 :
這樣就會有了dynamic.jar和dynamic_interface.jar兩個jar包,dynamic_interface.jar是待會在android項目裏調用的接口類,可以這麼理解,在android裏其實調用的是接口方法(其實現我們會將其作爲jar包、dex包或者apk包,我這裏用的是jar包,詳細的可以看博主原文),我們在程序運行時根據自己的業務需求動態的去下載不同jar包去執行,這樣就實現了我上述需求
2.加工下jar包
命令
~/software/android-sdk-macosx/build-tools/22.0.1$ ./dx --dex --output=dynamic_tmp.jar dynamic.jar
這裏解釋下,之所以在這個目錄執行,是因爲要用dx命令,我在自己sdk的這個目錄找到了,所以把dynamic.jar拷貝到這個目錄裏執行,這個根據自己實際dx命令所在目錄即可,這命令的目的是將class轉成dex也就是dalvik能執行的東東,android裏用的只能是dex格式
這裏只是簡單的走一遍流程,再者就是提示下小坑,方便大家快速上手,so 我把dynamic_tmp.jar文件push到了/mnt/sdcard/裏以待android動態加載
3.使用
添加接口jar包,記得add到Library哦
private IDynamic iDynamic;//還記得這個嗎,之前寫的那個接口類,也就是上面那個jar包裏的類
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (iDynamic != null) {
iDynamic.printHelloWorld();//好熟悉吧
}
}
});
try {
//動態包文件地址
String dexPath = "/mnt/sdcard/dynamic_tmp.jar";//手動放的文件,實際上可以動態下載
//這裏注意下不要寫錯!!!
//動態包解壓地址
File dexOutputDir = this.getDir("dex", 0);
//加載動態
DexClassLoader dexClassLoader = new DexClassLoader(dexPath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
Class libProviderClazz = dexClassLoader.loadClass("com.dynamic.impl.Dynamic");
iDynamic = (IDynamic) libProviderClazz.newInstance();//創建對象了
if (iDynamic != null) {
iDynamic.init();//調個方法意思意思
}
} catch (Exception e) {
e.printStackTrace();
}
}