Skip to content

android 插件化开发研究 2

cheyiliu edited this page Dec 1, 2014 · 6 revisions

源码分析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开始分析,文字不好描述了,上图
![PluginManager API](https://github.com/cheyiliu/All-in-One/blob/master/res/umeng-apf.jpg)


# 绕过签名验证,让apf跑起来
* see https://github.com/cheyiliu/dynamic-load-demo2


# 结论
* 还是反射+DexClassLoader

# 相关链接
* [[android-插件化开发研究]]
Clone this wiki locally