android基于类装载器DexClassloader设计“插件框架”

  1. //dex解压后的目录,注意,这个用宿主程序的目录,android中只允许程序读取写自己

  2. //目录下的文件

  3. String dexOutputDir = getApplicationInfo().dataDir;

  4. //native代码的目录

  5. String libPath = actInfo.applicationInfo.nativeLibraryDir;

  6. //创建类加载器,把dex加载到虚拟机中

  7. DexClassLoader calssLoader = new DexClassLoader(apkPath, dexOutputDir, libPath,

  8. this.getClass().getClassLoader());

  9. //利用反射调用插件包内的类的方法

  10. try {

  11. Class<?> clazz = calssLoader.loadClass(pacageName+“.Plugin1”);

  12. CommonInterface obj = (CommonInterface)clazz.newInstance();

  13. int ret = obj.function1(1, 13);

  14. Log.i(“Host”, "return result is " + ret);

  15. } catch (ClassNotFoundException e) {

  16. e.printStackTrace();

  17. } catch (InstantiationException e) {

  18. e.printStackTrace();

  19. } catch (IllegalAccessException e) {

  20. e.printStackTrace();

  21. } catch (IllegalArgumentException e) {

  22. e.printStackTrace();

  23. }

  24. }

也就这几句代码不同:

插件程序的类现接口:

[java]  view plain copy

  1. package com.suchangli.plugin1;

  2. import com.suchangli.plugin.CommonInterface;

  3. public class Plugin1 implements CommonInterface{

  4. public int function1(int a, int b){

  5. return a+b;

  6. }

  7. }

直接安装两个程序,调用的时候会报这种错误:

copy过去报错,并且这种方式也不太现实,因为提供给插件开发者的时候肯定是以jar包的形式进行提供,而不是以原文件的形式提供,

更何况现在还报错。 究其原因是什么呢?

其实是这样的,这个java文件被当做程序的一部分(本来就是一部分)( jar包是以外部jar的方式添加进去的,外部jar包会作为程序的一部分被最终的程序文件中,也会报同样的错误),从而使得在主程序和插件程序中存在包名相同但验证码不同的类文件。

导出jar包,这个大家应该都会,不会的到网上搜一下。

把jar包放进插件的libs文件加下

引用jar包

使用红色框的“Add Libary”,而不是蓝色框的“Add External JARs”.

如果还是不行就通过这种方式:

再重新安装一次插件,运行一次主程序,结果如下:

主程序如何搜索到插件的,是在插件程序的menifest.xml文件中,定义了一个activity,定义了一个action:

这样主程序就可以使用PacageManager类的queryIntentActivites()方法查询相关的插件程序列表了。

程序主题插件的实现

在主程序中添加如下一个方法:

[java]  view plain copy

  1. private void useDexClassloader3(){

  2. //创建一个意图,用来找到指定的apk

  3. Intent intent = new Intent(“com.suchangli.android.plugin”, null);

  4. //获得包管理器

  5. PackageManager pm = getPackageManager();

  6. List resolveinfoes =  pm.queryIntentActivities(intent, 0);

  7. //获得指定的activity的信息

  8. ActivityInfo actInfo = resolveinfoes.get(0).activityInfo;

  9. //获得包名

  10. String pacageName = actInfo.packageName;

  11. try {

  12. Resources res = pm.getResourcesForApplication(pacageName);

  13. int id = 0;

  14. id = res.getIdentifier(“ic_launcher”, “drawable”, pacageName);

  15. Log.i(“”, "resId is " + id);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,没有人能随随便便成功。

加油,共勉。

不费力,其实费了很大力,这四个字就是我的建议!!

  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,没有人能随随便便成功。

加油,共勉。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值