通过反射获取ActivityManagerNative的gDefaul地方

标签: q
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

查看评论

ActivityManagerNative 反射

由于想在程序里面更改系统的语言设置,查看了Settings中的源码后发现时这样实现的:  Java代码   IActivityManager am = ActivityMana...
  • Aaronzzq
  • Aaronzzq
  • 2015-07-15 16:16:53
  • 2321

通过反射机制获得系统字体Size【ActivityManagerNative无法调用问题】

【反射机制】参考此文【http://blog.csdn.net/coolcoffee168/article/details/5835143】     一 【获取系统字体】参考此文【http://...
  • guai8023
  • guai8023
  • 2015-10-21 11:57:12
  • 685

ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)

由于ActivityManagerService没有使用aidl机制,因此就直接用了代码实现看上去复杂了一些,下面我们来理下ActivityManager、ActivityManagerService...
  • kc58236582
  • kc58236582
  • 2015-12-24 16:19:58
  • 5047

android api 26 ActivityManagerNative类被弃用。代理类ActivityManagerProxy已经被删除。改用AIDL方式。

今天撸源码:startActivity()。 发现了在API 26中: ActivityManagerNative类被弃用,代理类ActivityManagerProxy已经被删除。 本篇文章主要是记...
  • qi1017269990
  • qi1017269990
  • 2017-12-23 13:33:44
  • 240

通过反射获取泛型的实际类型

package cn.itcast.generic; import java.io.Serializable; import java.lang.reflect.ParameterizedType;...
  • th676759829
  • th676759829
  • 2014-06-22 22:22:57
  • 1125

Java中通过反射获取泛型实例

通过反射获取泛型实例
  • jackielee_first
  • jackielee_first
  • 2016-11-27 17:54:57
  • 4768

java 反射机制--根据属性名获取属性值

/** * 根据属性名获取属性值 * * @param fieldName * @param request * @return */ ...
  • jiao_zg
  • jiao_zg
  • 2017-09-08 18:25:55
  • 6831

Java(通过反射获取方法并使用)

package com.sanmao10;import java.lang.reflect.Constructor; import java.lang.reflect.Method;public cl...
  • qq_16103331
  • qq_16103331
  • 2016-07-16 22:58:55
  • 2917

java开发中利用反射获取对象静态的方法

class User { //静态的方法 public static void staticMethod(){ System.out.println("您调用了静态的方法"); } } p...
  • u012949047
  • u012949047
  • 2016-05-28 00:29:06
  • 776

C# 通过反射获取实例对象

namespace XXX5 { class A { public virtual void print() { Console...
  • u011484013
  • u011484013
  • 2016-06-22 17:21:47
  • 1622
    个人资料
    等级:
    访问量: 3万+
    积分: 688
    排名: 7万+
    最新评论