-
}
-
@SuppressLint(“NewApi”) private void useDexClassLoader2(){
-
//创建一个意图,用来找到指定的apk
-
Intent intent = new Intent(“com.suchangli.android.plugin”, null);
-
//获得包管理器
-
PackageManager pm = getPackageManager();
-
List resolveinfoes = pm.queryIntentActivities(intent, 0);
-
//获得指定的activity的信息
-
ActivityInfo actInfo = resolveinfoes.get(0).activityInfo;
-
//获得包名
-
String pacageName = actInfo.packageName;
-
//获得apk的目录或者jar的目录
-
String apkPath = actInfo.applicationInfo.sourceDir;
-
//dex解压后的目录,注意,这个用宿主程序的目录,android中只允许程序读取写自己
-
//目录下的文件
-
String dexOutputDir = getApplicationInfo().dataDir;
-
//native代码的目录
-
String libPath = actInfo.applicationInfo.nativeLibraryDir;
-
//创建类加载器,把dex加载到虚拟机中
-
DexClassLoader calssLoader = new DexClassLoader(apkPath, dexOutputDir, libPath,
-
this.getClass().getClassLoader());
-
//利用反射调用插件包内的类的方法
-
try {
-
Class<?> clazz = calssLoader.loadClass(pacageName+".Plugin1");
-
CommonInterface obj = (CommonInterface)clazz.newInstance();
-
int ret = obj.function1(1, 13);
-
Log.i(“Host”, "return result is " + ret);
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
} catch (InstantiationException e) {
-
e.printStackTrace();
-
} catch (IllegalAccessException e) {
-
e.printStackTrace();
-
} catch (IllegalArgumentException e) {
-
e.printStackTrace();
-
}
-
}
也就这几句代码不同:
插件程序的类现接口:
[java] view plain copy
-
package com.suchangli.plugin1;
-
import com.suchangli.plugin.CommonInterface;
-
public class Plugin1 implements CommonInterface{
-
public int function1(int a, int b){
-
return a+b;
-
}
-
}
直接安装两个程序,调用的时候会报这种错误:
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
-
private void useDexClassloader3(){
-
//创建一个意图,用来找到指定的apk
-
Intent intent = new Intent(“com.suchangli.android.plugin”, null);
-
//获得包管理器
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
视频**
[外链图片转存中…(img-QbeGisJX-1643524450486)]
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-HhrQXkDc-1643524450487)]