
Android插件技术
文章平均质量分 62
风语
这个作者很懒,什么都没留下…
展开
-
Android插件技术——(二)加载已安装apk
上一篇中我们讨论了如何加载未安装的插件apk,并获取其资源。本篇我们将讨论如何加载一个已安装的apk,获取其资源,并跳转至其Activity。首先,Host工程如下:public class MainActivity extends Activity { private static final String PLUGIN_PACKAGE = "com.example.androidplugi原创 2015-08-18 20:41:27 · 804 阅读 · 0 评论 -
谈动态代理在Android插件中的一些用法
我们为设备的插件提供了一系列接口,现在想记录下每个接口的调用情况,通常的做法是在每一个接口函数里都加上一堆上报的代码,这不是不可以,只是有些麻烦了,以后接口里每新增一个函数,就得记得加上上报,对于我这种记性不好的人来说,忘加的概率很大,所以如果有一劳永逸的办法那就好了,以后新增函数都会自动上报。先给出当前接口的形式,如下:public abstract class AbsBluetoothManag原创 2016-04-27 15:15:22 · 1803 阅读 · 0 评论 -
如何拦截Activity的启动(二)
本文我们将以一个工程为例,验证Hook Activity的可行性。我们的目标如下: - 指定插件Apk路径,启动插件 - 插件内部可启动Activity - 插件可作为独立App启动首先新建插件工程,和正常APP一般无二,没有任何特别的地方。所有的Activity都是从android.app.Activity继承,可以安装并运行。接下来新建宿主工程,并将插件Apk用adb push到宿主原创 2016-02-16 18:21:11 · 2767 阅读 · 2 评论 -
如何拦截Activity的启动(一)
要把正常的apk当做一个插件启动起来,首先我们拿到这个插件的Launcher Activity,然后启动宿主APP中的Proxy Activity,在这里面调用插件的Activity的生命周期回调。结果会报Null Pointer Exception,原因在于调用插件Activity的onCreate时会调用到super.onCreate,里面需要用到的一些上下文没有初始化过,所以为null。这里原创 2016-02-15 13:57:09 · 3229 阅读 · 0 评论 -
关于Handler的拦截
为什么要Hook Handler?Android系统中存在大量Handler,我们要改变系统的某些行为就需要Hook掉一些关键节点的Handler,为此,我们要清楚Handler的工作原理。先做一个实验来看看Hook Handler的效果,如下:public class MainActivity extends Activity { private Button mBtnShow; p原创 2016-02-16 11:14:22 · 2825 阅读 · 0 评论 -
如何拿到插件Apk的Intent Filter?
加载插件时需要获取到插件APK的详细信息,比如AndroidManifest.xml中注册的四大组件。Android SDK提供了接口,如下:PackageManager pm = getPackageManager();PackageInfo packageInfo = pm.getPackageArchiveInfo( apkFile.getAbsolutePath()原创 2016-02-03 22:51:14 · 2504 阅读 · 1 评论 -
插件待研究的问题
如何满足以下条件: 一、运行对象可以单独运行,也可以作为插件运行,不需要做额外的修改 二、插件之间,插件和宿主可以互相通信,包括跨进程通信 三、插件完全透明,抽象成服务,用URI表示服务地址,宿主做DNS和权限控制原创 2015-11-15 21:17:51 · 634 阅读 · 0 评论 -
Android插件技术——(四)加载未安装apk
上一篇虽然研究了如何加载未安装apk的资源,然而由于只是当做普通的Java类来加载,没有Android系统上下文,所以无法启动Activity,展开布局,进行各种界面交互,本篇将研究如何解决这些问题。首先介绍一下核心思路,未安装的apk是没有系统上下文的,所以导致上述一系列问题,由此可见,解决问题的关键是给插件赋予一个系统上下文。而这个上下文如何生成呢?一种可行的方案是采用主App的上下文做代理,以原创 2015-08-19 17:03:27 · 2562 阅读 · 0 评论 -
Android插件技术——(三)加载未安装apk
上一篇我们了解了Android中动态加载插件jar,然而实际插件运用中,往往是Android主apk动态加载一个甚至任意个插件apk,这个插件apk可以是已安装的或未安装的,功能也比单纯的jar更丰富。本篇将针对动态加载未安装apk来展开。步骤如下: 一、采用上一篇中的Android Host工程,仍然导出插件接口类 二、新建Android插件工程,导入插件接口类,编译成apk,并push到手机原创 2015-08-18 19:42:58 · 1817 阅读 · 0 评论 -
Android插件技术——(一)动态加载jar
在入门Android插件技术之前,先仔细阅读如下两篇文章一、解读ClassLoader 二、Android中的类加载器DexClassLoader接下来,我们通过android实现动态加载jar,步骤如下: 一、新建一个Android Host工程,添加插件接口类IPlugin,并将该接口导出为jar,所有选项为默认,无需dx转换 二、新建Java Plugin工程,导入步骤一中的IPlugi原创 2015-08-18 16:58:53 · 905 阅读 · 0 评论 -
Android插件技术——开篇
之所以想写这个专题,有以下几点原因:一、客户端开发不同于网页端开发,客户端要做修改上线就只能等到下次发版了,而网页端是可以随时修改上线的。要解决这个问题,插件是一个不错的思路。可以将app不同功能模块分别做成插件,然后主App动态加载,主app保留插件管理和一些基础功能,按一定的策略后台查询插件列表更新情况,然后静默更新插件,下次启动APP时就会加载到最新的插件了,用户毫不知情。划分功能模块可以保证原创 2015-08-19 17:41:36 · 746 阅读 · 0 评论 -
谈Android PowerManager的Hook技术
在插件中,需要禁止插件调用系统原生接口持有WakeLock,Hook技术是不错的解决方案。通过阅读系统源码,可以了解到PowerManager持有WakeLock操作最后都通过Binder跨进程调到系统服务中,我们只要拦截这个Binder的所有调用即可。思路是先通过反射拿到这个IPowerManager的Binder,然后动态生成该Binder的代理对象,再覆盖原有的Binder即可。public原创 2017-03-29 11:20:15 · 1504 阅读 · 5 评论