文档章节

Android 插件开发

Kerison
 Kerison
发布于 2014/10/08 14:55
字数 569
阅读 21
收藏 1
点赞 0
评论 0

简介

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

差不多就是这个样子了,


© 著作权归作者所有

共有 人打赏支持
Kerison
粉丝 1
博文 28
码字总数 13985
作品 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
Andrid SDK tools 目录下的工具介绍

Andrid SDK tools 目录下的工具介绍 Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator ) 它是在你的计算机上运行的一个虚拟移动设备。你可以使用模拟器来...

流云的博客
2015/02/06
0
0
android同时监听所有activity生命周期状态实现

在做应用统计时我们可能需要在获取activity的生命周期状态,以前的方式是我们需要重写每一个activity的onResume() 等函数然后埋点。现在可以利用apkplug框架的activitylifecycle将所有activ...

梁大帅
2014/04/30
0
3
ButterKnife注解框架详解

  Android 懒人注解框架 :https://github.com/JakeWharton/butterknife   前言:     注解,相信很多同学都用到了,对控件进行初始化的时候需要用到 findViewById() ,当一个activit...

听着music睡
2017/04/12
0
0
开发原生安卓cordova插件(有原生界面)

上文开发的插件没有调用原生界面,本文介绍开发带有activity的插件 本文很多操作与上文重复,重复部分会省略 首先打开plug1,先开发插件的原生代码 在以下命名空间创建一个activity 名称为A...

canneljls
04/21
0
0
Flutter Plugin开发流程

这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等。 今天这篇文章,给大家介绍如何开发Flutter Plugin中Android的部分。有关Flutter以及Flutter Plugi...

Q吹个大气球Q
05/12
0
0
AndroidStudio、gradle、buildToolsVersion关系

使用AndroidStudio 开发也已经2年了,每次gradle 或者studio 有推荐更新后,项目重新sync后都会报错,提示更新相应的其他版本,比如AndroidStudio、gradle、buildToolsVersion版本; 先来说说...

SuShine
2017/11/07
0
0
Android studio用的几个插件

android studio常用插件,可极大简化开发,增强开发效率。 不懂安装studio插件,看参考博文:android stuido插件装:http://my.oschina.net/kooeasy/blog/491995 1、ButterKnife Zelezny But...

让代码飞一会
2015/08/13
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

全新内存布局Android5 for one x

众所周知Android5.0默认ART模式,运行速度加倍,软件占用内存也加倍,我们one x这种元老机采用旧的内存布局,data空间2g ART模式下安装几个软件也就不够用了。最近逛国外的xda论坛,发现有大...

CrazyManDF
10分钟前
0
0
web3j转账

 web3 转账功能   为了完成以太坊交易,必须有几个先决条件   1、对方的以太坊地址   2、确定要转账的金额   3、自己地址的转账权限   4、大于转账金额的以太币,以太币转账其实就...

智能合约
11分钟前
0
0
10.28 rsync工具介绍 , rsync常用选项, rsync通过ssh同步

rsync远程同步 重点!重点!!重点!!! 例子 • rsync -av /etc/passwd /tmp/1.txt • rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt rsync格式 • rsync [OPTION] … SRC DEST • rs......

Linux_老吴
24分钟前
0
0
iis php 环境搭建,非常详细的教程

准备篇 一、环境说明: 操作系统:Windows Server 2016 PHP版本:php 7.1.0 MySQL版本:MySQL 5.7.17.0 二、相关软件下载: 1、PHP下载地址: http://windows.php.net/downloads/releases/ph...

T_star
26分钟前
0
0
Day35 rsync通过服务同步

rsync通过服务同步 rsyncd.conf配置文件详解 port:指定在哪个端口启动rsyncd服务,默认是873端口。 log file:指定日志文件。 pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等...

杉下
32分钟前
1
0
【最新最全】为 iOS 和 Android 的真机和模拟器编译 Luajit 库

编译 Luajit 库,的确是一个挑战。因为官网的教程,在当前版本的 Xcode 和 NDK 环境中,已经不适用了。以前只是编译了适用于真机的 Luajit 库。最近在尝试编译模拟器 Luajit 库,就顺便梳理了...

ios122
32分钟前
0
0
rsync至ssh同步

rsync: 文件同步工具,可实现“增量拷贝”;使用yum安装rsync包 常用选项:-a=-rtplgoD (-r同步目录,-t保持文件的时间属性,-p保持文件的权限属性,-l保持软连接,-g保持文件的属组,-o保持...

ZHENG-JY
38分钟前
0
0
TradingView 学习笔记

#前言 公司最后需要使用TradingView展示K线图走势。由于之前没接触过,拿到文档时一脸蒙逼。还好找到二篇文章+Demo代码,直接改改就行了。 #被批 由于上面的懵懂,有个问题困扰4个小时没解决...

hihubs
38分钟前
0
0
10.28 rsync工具介绍~10.31 rsync通过ssh同步

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而...

洗香香
40分钟前
1
0
卷积为什么要旋转180度

参考《最容易理解的对卷积(convolution)的解释》 https://blog.csdn.net/bitcarmanlee/article/details/54729807 这篇博客详细讲解了“卷积”,提及了为什么要反转180度,我简述下。 1.卷积的...

datadev_sh
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部