文档章节

Android 插件开发

Kerison
 Kerison
发布于 2014/10/08 14:55
字数 569
阅读 23
收藏 1

简介

DexClassLoader 是Android系统中特有的类加载器,其父类为ClassLoader,插件开发主要就是利用了DexClassLoader来实现动态加载类,以便实现动态切换各种功能。

实践

  1. 首先一般开发是提供Service的通用接口。此处为CommonService.java ,可导出jar以方便为其他人使用【PluginService.jar】。

public interface CommonService {
	/**
	 * say Hello
	 */
	public void sayHello();

	/**
	 * get sum
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public int add(int a, int b);
}

2.新建一个Application,实现上述接口,可为普通java jar包插件(只是业务),也可以为apk应用插件(主题,资源等)。

public class ServiceImpl implements CommonService {

	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		Log.e("ServiceImpl", "sayHello");
	}

	@Override
	public int add(int a, int b) {
		// TODO Auto-generated method stub
		return a+b;
	}
}

并修改应用程序配置文件中如下
        <activity
            android:name="xx.xx.plugin.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="xx.xx.plugin_1.ACTION" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

3.在自己的主程序中导入PluginService.jar

/**
	 * 定义一个插件的Action
	 */
	public static final String PLUGIN_1_ACTION = "xx.xx.plugin_1.ACTION";
	
    	protected void onPluginLoading() {
    		// 创建一个查找apk意图
    		Intent intent = new Intent(PLUGIN_1_ACTION, null);
    		// 获得应用程序包名
    		PackageManager pm = getPackageManager();
    		List<ResolveInfo> resolveinfoes = pm.queryIntentActivities(intent, 0);
    		ActivityInfo actInfo = resolveinfoes.get(0).activityInfo;
    		String pacageName = actInfo.packageName;
    		
    		// 获得apk的目录或者jar的文件Path
    		String apkPath = actInfo.applicationInfo.sourceDir;
    		
    		//解压后的目录  一般在/data/data/XXXX 自己的私有程序包内
    		String dexOutputDir = getApplicationInfo().dataDir;
    		// native代码的目录
    		String libPath = actInfo.applicationInfo.nativeLibraryDir;
    
    		// 创建dex类加载器
    		DexClassLoader classLoader = new DexClassLoader(apkPath, dexOutputDir,
    				libPath, getClassLoader());
    		// 利用反射调用插件包内的类的方法
    		try {
    			String className = pacageName+".ServiceImpl";
    			Class<?> clazz = Class.forName(className, true, classLoader);
    			// Class<?> clazz = classLoader.loadClass(className);
    			CommonService obj = (CommonService) clazz.newInstance();
    
    			obj.sayHello();
    			Log.e("Host", "return result is " + obj.add(1, 13));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
	}

先安装apk插件或copy jar文件到制定目录,然后再运行主程序,结果如下:


注意事项:

1.如果出现 ERROR/AndroidRuntime(12705): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation.一般是因为存在重复的类文件导致的,因为一般主程序直接引用jar包,系统会自动导出该依赖包,所以可以检查插件apk中是否重复导出了PluginService.jar

2.如果运行主程序出现找不到接口,可以查看是否正确导入依赖包PluginService.jar

差不多就是这个样子了,


© 著作权归作者所有

共有 人打赏支持
上一篇: Apache Commns io
Kerison
粉丝 1
博文 28
码字总数 13985
作品 0
南京
私信 提问
Android开发—— 小工具,大效率

一、Hugo插件 —— 打印方法运行时间 首先申明下,此Hugo非 彼Hugo(Hugo是由Go语言实现的静态网站生成器)。 Hugo插件作用 : 能够计算并打印一个方法的输入参数和函数的运行时间 Hugo插件应...

SuShine
01/04
0
0
提供Cordova android原生插件开发服务

android原生提供Cordova android原生插件开发服务,提供Cordova android原生插件 [产品功能] android原生表情键盘插件 android原生仿微信9图上传插件,解决cordova原本插件一次只能上传一张图...

panglongcl
2016/05/04
3
0
netbeans搭建安卓开发环境

NetBeans 上开发 Android 应用程序需要安装一个 Android SDK 和针对 NetBeans 的 Android 开发插件 下载并安装 Android SDK 下载 Android SDK 解压后运行 toolsandroid.bat update sdk 进行升...

daniel-john
2014/06/29
0
2
Android插件化开发,初入殿堂

好久没有写博客了,这次准备写写我这几天的研究成果——Android插件化开发框架CJFrameForAndroid。 背景交代 首先,你需要知道什么是插件化开发。就拿最常见的QQ来说,在第三个界面动态那里有...

kymjs张涛
2014/10/12
0
9
apkplug主题切换功能之主题包打包编译-07

主题包与普通插件开发相同,只是须上传服务器进行编译生成apk主题包 一 主题包(插件)搭建 1.按照普通app创建流程创建安卓工程 2.按照apkplug插件开发流程添加必要文件 <apkplug插件开发> osg...

梁大帅
2014/05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算游戏权重代码

$list = [ [ 'pt' => 1, //权重序号 'pv' => 0, //权重值 ], [ 'pt' => 2, 'pv' => 10, ], [ 'pt' => 3, ......

我才是张先生
8分钟前
5
0
智能分单算法

算法描述 目前在物流,企业用工等领域,都有着大量的通过算法对接到的订单进行智能分配的需求。本文模拟的是用户下订单,然后商家接到订单,由配送人员进行派送的场景。在实际的应用中类似于...

鱼煎
10分钟前
0
0
即将开源 | 2亿用户背后的Flutter应用框架Fish Redux

背景 在闲鱼深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞。对于闲鱼这样的负责业务场景,我们需要一个统一的应用框架来摆脱当下的开发困境,而这也...

阿里云云栖社区
15分钟前
0
0
Ubuntu上搭建比特币运行环境

Ubuntu版本:16.04.3 Bitcoin Core版本:0.16 1. 比特币运行依赖的开源库 (1)必须依赖的库 库 目的 描述 libssl 加密 随机数生成,椭圆曲线加密算法 libboost 工具 线程库,数据结构等 li...

LoSingSang
20分钟前
1
0
IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。 本地应用一键部署到任何...

zhaowei121
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部