-
Notifications
You must be signed in to change notification settings - Fork 43
android 插件化开发研究 2
cheyiliu edited this page Dec 1, 2014
·
6 revisions
- github地址 https://github.com/umeng/apf
- com.example.host, 宿主工程,调用各种plugin
- 宿主工程依赖apf-framework.jar, 暂未开源但可用jd-jui查看代码
- com.example.plugin1.ifs, 接口定义
- com.example.plugin1, plugin工程, 实现接口并供宿主调用
- 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-插件化开发研究]]
Just build something.