因为VAInstrumentation实现了Handler.CallbackA

0人阅读 评论(0) 收藏 举报
分类:

CoreLibrary是VirtualApk(以下简称VA)的核心库,因为其中hook了一些被@hide注解的framework类,这些类无法被调用,所以这些无法被调用的类都放在了使用provided(Gradle3.0之后改为了compileOnly)依赖的库工程AndroidStub中,且路径与源码路径一致。
AndroidStub : 无法被直接调用的系统类,仅在编译时获得引用。
app :宿主程序
PluginDemo : 示例插件程序
VirtralApk-gradle-plugin : 自定义的Gradle插件
整个工程结构还是很清晰的,其中CoreLibrary是我们重点关注的对象

初始化 : PluginManager.getInstance(base).init()

VA的使用很简洁,首先在Application中初始化,在需要的地方load下插件APK,之后就可以像同一个工程一样去调用插件中的四大组件。看起来非常简洁,但是简洁不意味着简单。首先看下Application中的初始化。

CoreLibrary是VirtualApk(以下简称VA)的核心库,因为其中hook了一些被@hide注解的framework类,这些类无法被调用,所以这些无法被调用的类都放在了使用provided(Gradle3.0之后改为了compileOnly)依赖的库工程AndroidStub中,且路径与源码路径一致。
AndroidStub : 无法被直接调用的系统类,仅在编译时获得引用。
app :宿主程序
PluginDemo : 示例插件程序
VirtralApk-gradle-plugin : 自定义的Gradle插件
整个工程结构还是很清晰的,其中CoreLibrary是我们重点关注的对象

初始化 : PluginManager.getInstance(base).init()

VA的使用很简洁,首先在Application中初始化,在需要的地方load下插件APK,之后就可以像同一个工程一样去调用插件中的四大组件。看起来非常简洁,但是简洁不意味着简单。首先看下Application中的初始化。

1.通过反射获取到ActivityThread中的sCurrentActivityThread对象,其实就是获取ActivityThread实例

2.通过反射ActivityThread#getInstrumentation方法获取系统的getInstrumentation对象

3.实例化继承自Instrumentation并且实现了Handler.Callback接口的VAInstrumentation对象

5.通过反射ActivityThread#getHandler方法获取ActivityThread中的mH对象,mH对象是H的一个实例,H继承自Handler。系统对四大组件包括生命周期等的调用,本质上都是通过这个叫做mH的Handler对象完成的。

6.因为VAInstrumentation实现了Handler.Callback接口,所以可以通过反射将VAInstrumentation对象设置给mH对象。

以上“六脉神剑”操作完成之后,系统再调用ActivityThread中的mInstrumentation或者mH,首先会进入到VAInstrumentation对应的方法中,这样就完成了对Instrumentation及mH的hook。

VAInstrumentation相当于其中的mCallback对象,VAInstrumentation#handleMessage方法return false之后,不影响系统继续处理。目前实际来看,VAInstrumentation#handleMessage只是处理了插件包中Activity的theme信息。

对于插件化加载Activity的处理上面已经足够了,进一步的操作会在Activity章节分析。

通过反射获取ActivityManagerNative的gDefault属性(8.0之后是IActivityManagerSingleton属性,以下gDefault等同IActivityManagerSingleton),gDefault.get()返回的是AMS对象。这个过程可以参考Android Launcher启动应用程序流程源码解析中的“AMS中Binder机制简析”小节,直接搜索即可。

ActivityManagerProxy#newInstance使用动态代理的方式返回了代理AMS的ActivityManagerProxy对象,为了处理Service的声明周期问题(比如启动一个已经alive的service,不再次执行onCreate方法,只再次执行onStartCommend方法),在代理对象中拦截了startService、stopService、bindService、unbindService等操作,不在指定范围内的操作继续执行AMS原有操作。

通过反射设置gDefault对象的mInstance属性为代理AMS的ActivityManagerProxy对象。。。

https://rohs17.3566t.com/news/itemid-245240.shtml
https://rohs17.3566t.com/news/itemid-245239.shtml
https://rohs17.3566t.com/news/itemid-245238.shtml
https://rohs17.3566t.com/news/itemid-245232.shtml
https://rohs17.3566t.com/news/itemid-245233.shtml
https://rohs17.3566t.com/news/itemid-245234.shtml
https://rohs17.3566t.com/news/itemid-245235.shtml
https://rohs17.3566t.com/news/itemid-245236.shtml
https://rohs17.3566t.com/news/itemid-245237.shtml
https://www.3566t.com/buy/show-1336711.html
https://www.3566t.com/buy/show-1336715.html
https://www.3566t.com/buy/show-1336714.html
https://www.3566t.com/sell/show-10918549.html
https://www.3566t.com/sell/show-10918524.html
https://www.3566t.com/sell/show-10918522.html

查看评论

CoreLibrary是VirtualApk(以下简称VA)的核心库

CoreLibrary是VirtualApk(以下简称VA)的核心库,因为其中hook了一些被@hide注解的framework类,这些类无法被调用,所以这些无法被调用的类都放在了使用provided...
  • heyanfeng22
  • heyanfeng22
  • 2018-04-15 20:51:41
  • 12

不支持类型 Quartz.JobDataMap,因为它实现 IDictionary。

     在尝试 把Quartz定时器功能做成 WebService的过程中。因为想在客户端传递两个参数:一个是cron格式的时间,另一个是相应时间的类job类(特定时间触发的特定工作类)。设计web...
  • weinierbian
  • weinierbian
  • 2011-03-12 10:52:00
  • 3130

无法实现接口成员,因为它不是公共的——interface

//在使用Interface时 要注意:    namespace GenericTest { interface IAnimals // 接口前不能添加出...
  • XuJing_1022
  • XuJing_1022
  • 2015-10-20 14:38:34
  • 1407

二维码生成器(Vs.net 2005源程序)

  • 2013年02月01日 14:08
  • 2.38MB
  • 下载

无法实现接口成员,因为它不是公共的-----------interface

//在使用Interface时 要注意: namespace GenericTest { interface IAnimals // 接口前不能添加出public关键字之外的修饰符 ...
  • server126
  • server126
  • 2010-01-22 15:10:00
  • 6060

实现接口

实现接口   1、显式实现接口成员  为了实现接口,类可以定义显式接口成员执行体(Explicit interface member implementations)。显式接口成员执行体可以是一个方法...
  • lincnl
  • lincnl
  • 2007-09-13 11:32:00
  • 473

System.Array

System.Array         地球人都知道,所有的数组都是隐式的派生于这个基类。在MSDN里可以发现System.Array的原型是:         Code highlighting ...
  • jasonvip_c
  • jasonvip_c
  • 2009-10-15 13:34:00
  • 1870

继承的本质

 继承的本质:  继承的本质就是抽象,给出一个基类,然后建立他的子类,子类是对基类的一个具体描述,而基类是子类的抽象。例如我们创建一个person的类,在创建一个子类man,男人这个类是对人这类的继承...
  • baiyelove
  • baiyelove
  • 2007-05-15 10:47:00
  • 833

必须要转化成字符串返回才行-XmlWebService

System.InvalidOperationException: 生成 XML 文档时出错。           ---> System.InvalidOperationException: 必须...
  • liuhl0910
  • liuhl0910
  • 2015-02-04 20:54:24
  • 441

http缓存机制探索和疑问

最近在某一次面试中问到了关于浏览器缓存的问题,特此记录一下,以及发现的一些疑问 此篇文章中会遇到的几个名词:cache-control、lastmodify/etag 先说说cache-...
  • u013448536
  • u013448536
  • 2016-08-05 18:26:50
  • 225
    个人资料
    等级:
    访问量: 3万+
    积分: 689
    排名: 7万+
    最新评论