摘要:一什么是动态加载为什么要动态加载动态加载就是用到的时候再去加载,也叫懒加载,也就意味着用不到的时候是不会去加载的。
一.什么是动态加载?为什么要动态加载?
动态加载就是用到的时候再去加载,也叫懒加载,也就意味着用不到的时候是不会去加载的。
二.编写Demo 1.利用jar,dx 创建dex 1)创建DynamicDex.java,生成DynamicDex.class 2)生成dexjar是JDK提供的,dx是Android SDK提供,只要配置好环境变量,可在任意位置执行
我是在debug中执行,方便使用
jar -cvf cn 生成jar包
dx --dex --output=target.jar source.jar 生成包含dex的jar包
注意:把dex放入assets后,把DynamicDex.java删掉或改名,否则加载的是它,而不是dex中的类
</>复制代码
public class DexUtil {
public static void loadDexClass(final Context context, final String dexName, final Handler handler) {
new AsyncTask() {
@Override
protected String doInBackground(Void... params) {
File cacheFile = getCacheDir(context.getApplicationContext());
String internalPath = cacheFile.getAbsolutePath() + File.separator + dexName;
Log.v("DexUtil", "internalPath = " + internalPath);
File desFile = new File(internalPath);
if (!desFile.exists()) {
try {
if (!desFile.exists()) {
desFile.createNewFile();
copyFiles(context, dexName, desFile);
}
} catch (IOException e) {
e.printStackTrace();
}
}
return internalPath;
}
@Override
protected void onPostExecute(String internalPath) {
super.onPostExecute(internalPath);
File dexOutputDir = context.getDir("dex", 0);
File soOutputDir = context.getDir("lib", 0);
String librarySerachPath = soOutputDir.getAbsolutePath().replace("app_lib", "lib");
Log.v("DexUtil", "librarySerachPath = " + librarySerachPath);
DexClassLoader dexClassLoader = new DexClassLoader(internalPath, dexOutputDir.getAbsolutePath(),
librarySerachPath, context.getClassLoader());//ClassLoader.getSystemClassLoader().getParent());
Message msg = new Message();
msg.obj = dexClassLoader;
handler.sendMessage(msg);
}
}.execute();
}
public static void copyFiles(Context context, String fileName, File desFile) {
InputStream in = null;
OutputStream out = null;
try {
in = context.getApplicationContext().getAssets().open(fileName);
out = new FileOutputStream(desFile.getAbsolutePath());
byte[] bytes = new byte[1024];
int i;
while ((i = in.read(bytes)) != -1) {
out.write(bytes, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static boolean hasExternalStorage() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/**
* 获取缓存路径
*
* @param context
* @return 返回缓存文件路径
*/
public static File getCacheDir(Context context) {
File cache;
if (hasExternalStorage()) {
cache = context.getExternalCacheDir();
} else {
cache = context.getCacheDir();
}
if (!cache.exists())
cache.mkdirs();
return cache;
}
}
Dex加载步骤:
1)把assets中的dex的jar拷贝到met目录下
文件拷贝需要添加权限
</>复制代码
2)利用DexClassLoader加载Dex,把dex放入到相关目录上
注意:文件的拷贝需要放在子线程中运行
3.利用反射加载
</>复制代码
public class MainActivity extends AppCompatActivity {
public static DexClassLoader mapLoader;
TextView tv_hello;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_hello = (TextView) this.findViewById(R.id.tv_hello);
DexUtil.loadDexClass(this, "dex_dynamic.jar", dexHandler);
}
private Handler dexHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mapLoader = (DexClassLoader) msg.obj;
try {
Class DynamicDex_Class = mapLoader.loadClass("cn.liufei.dynamicdex.DynamicDex");
Constructor DynamicDex_Cons = DynamicDex_Class.getConstructor(null);
Object DynamicDex_Obj = DynamicDex_Cons.newInstance();
Method test_meth = DynamicDex_Class.getMethod("test", null);
String result = (String) test_meth.invoke(DynamicDex_Obj, null);
tv_hello.setText(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
};
}
Demo地址:链接: https://pan.baidu.com/s/1kVMQ6jX 密码: i4vp
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70905.html
阅读 2044·2019-08-29 16:27
阅读 1403·2019-08-29 16:14
阅读 3411·2019-08-29 14:18
阅读 3498·2019-08-29 13:56
阅读 1282·2019-08-29 11:13
阅读 2173·2019-08-28 18:19
阅读 3487·2019-08-27 10:57
阅读 2326·2019-08-26 11:39
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要