android 插件化开发研究 2 - cheyiliu/All-in-One GitHub Wiki
源码分析umeng apf框架
- github地址 https://github.com/umeng/apf
源码工程结构(3个工程+1个依赖jar)
- com.example.host, 宿主工程,调用各种plugin
- 宿主工程依赖apf-framework.jar, 暂未开源但可用jd-jui查看代码
- com.example.plugin1.ifs, 接口定义
- com.example.plugin1, plugin工程, 实现接口并供宿主调用
逐个分析这4(3个工程+1个依赖jar)部分
com.example.plugin1.ifs, 接口定义部分
- lib工程, 定义接口
public interface ExampleApfService { public int add(int a, int b);
public int minus(int a, int b);
public int multiply(int a, int b);
public int divide(int a, int b);
}
### com.example.plugin1, plugin工程
* 实现接口
public class ExampleApfServiceImpl implements com.example.plugin1.ifs.ExampleApfService { private static final String TAG = ExampleApfServiceImpl.class.getName();
/**
* Flawed implementation, mind overflow.
*/
@Override
public int add(int a, int b) {
Log.d(TAG, "calling implementation add.");
return a + b;
}
@Override
public int minus(int a, int b) {
Log.d(TAG, "calling implementation minus.");
return a - b;
}
/**
* Flawed implementation of {@link #multiply(int, int)}. Mind overflow.
*/
@Override
public int multiply(int a, int b) {
Log.d(TAG, "calling implementation multiply.");
return a * b;
}
/**
* Flawed implementation, mind divided by zero.
*/
@Override
public int divide(int a, int b) {
Log.d(TAG, "calling implementation divide.");
return a / b;
}
}
### com.example.host, 宿主工程
* 核心代码
PluginManager.registerPlugin("com.example.plugin1"); PluginManager.loadPlugins(getApplicationContext()); ExampleApfService service = (ExampleApfService) PluginManager .newInstance("com.example.plugin1.ExampleApfServiceImpl");
service.add(a, b);
### apf-framework.jar, 核心都在这里了
* 从宿主工程调用的api开始分析,文字不好描述了,上图

# 绕过签名验证,让apf跑起来
* see https://github.com/cheyiliu/dynamic-load-demo2
# 结论
* 还是反射+DexClassLoader
# 相关链接
* [android-插件化开发研究](/cheyiliu/All-in-One/wiki/android-插件化开发研究)