1.Android Binder Hookçå®ç°
2.Framework层的源码Binder(源码分析篇)
3.Android Touch事件InputManagerService源码解析(二)
4.service managerå¨å®åçä»ä¹å±ä¸å±
5.Android N å大ç»ä»¶çå·¥ä½åç
Android Binder Hookçå®ç°
Binder Hookå¯ä»¥Hookæå½åAppç¨å°çç³»ç»Serviceæå¡ã以LocationManager为ä¾ï¼å¨è·åä¸ä¸ªLocationManageræ¶å为两æ¥ã第ä¸ï¼è·åIBinder对象ï¼ç¬¬äºï¼IBinder对象éè¿asInterface()转å为LocationMangerService对象ãæååå§åLocationManagerï¼applicationå±ç¨å°çé½æ¯LocationManagerã
Hookç大è´åçæ¯ï¼ServiceManagerå¨è·åæ个Binderæ¶ï¼å¦ææ¬å°æç¼åçBinderï¼å°±ä¸åè·¨è¿ç¨è¯·æ±Binderäºãæ们å¯ä»¥å¨ç¼åä¸å å ¥èªå·±çBinderï¼ä½¿å¾ServiceManageræ¥è¯¢æ¬å°ç¼åæ¶å¾å°ä¸ä¸ªèªå®ä¹çCustomBinder对象ï¼ä¸åè·¨è¿ç¨åç³»ç»è¯·æ±ã并ä¸ILocationManager.Stub.asInterface(CustomBinder)æ¹æ³è¿åæ们èªå®ä¹çService对象ã
è¿éé¢æ两个å°æ¹éè¦ç¨å°èªå®ä¹ç对象ãç±äºæ们åªHookå ¶ä¸ä¸é¨åçåè½ï¼å ¶ä»åè½è¿éè¦ä¿çï¼æ以ç¨å¨æ代ççæ¹å¼å建èªå®ä¹çBinderåèªå®ä¹çServiceã
å¨ç解åé¢çå 容åä½ éè¦äºè§£è¿äºç¥è¯ç¹ï¼
Activityçç±»å¨è·åç³»ç»Serviceæ¶ï¼é½æ¯è°ç¨getSystemService(serviceName)æ¹æ³è·åçã
Context ç getSystemService() æ¹æ³è°ç¨äº SystemServiceRegistry ç getSystemService() æ¹æ³ã
SystemServiceRegistry ä¸æä¸ä¸ªå¸¸é SYSTEM_SERVICE_FETCHERSï¼è¿æ¯ä¸ä¸ªMapãä¿åäºServiceNameå对åºçServiceFetcherãServicFetcheræ¯ç¨äºåå»ºå ·ä½Serviceçç±»ãServiceFetcher çå ³é®æ¹æ³æ¯ createService() æ¹æ³ã
å¨ ServiceFetcher ç createService() æ¹æ³ä¸ï¼è°ç¨äº ServiceManager.getService(name) æ¹æ³ã以 LocationManager 对åºç ServiceFetcher 为ä¾ï¼å®çcreateService()æ¹æ³æºç å¦ä¸ï¼
åå¦æ们è¦ä¿®æ¹ LocationManager ç getLastKnownLocation() æ¹æ³ï¼ä¸æé½æ¯ï¼ãæ们è¦åçå°±æ¯è®©ServiceManager.getService("location")è¿åæ们èªå®ä¹çBinderãå çä¸ä¸è¿ä¸ªæ¹æ³ç®ååçæºç ï¼
sCacheæ¯ä¸ä¸ªMapï¼ç¼åäºå·²ç»åç³»ç»è¯·æ±è¿çBinderãå¦ææ们éè¦è®©è¿ä¸ªæ¹æ³è¿åæ们æ们èªå·±çbinderï¼åªéè¦äºå å¾sCacheä¸putä¸ä¸ªèªå®ä¹çBinderå°±è¡äºã
å¨putä¹åï¼éè¦å å建åºä¸ä¸ªèªå®ä¹çBinderãè¿ä¸ªBinderå¨è¢« ILocationManager.Stub.asInterface å¤çåï¼å¯ä»¥è¿åä¸ä¸ªèªå®ä¹ç LocationManagerServiceã
å çä¸ä¸Binderç asInterface() çå®ç°ï¼
å¦ææ queryLocalInterface()æ¹æ³è¿åä¸ä¸ªèªå®ä¹çServiceï¼ä½¿å¾èµ°ifè¯å¥å é¨ï¼ä¸èµ°elseï¼é£å°±ç®æ¯Hookæåäºã
å设æ们æ³è®©ç³»ç»çLocationManagerè¿åçä½ç½®ä¿¡æ¯å ¨æ¯å¨å¤©å®é¨(., .)ãé£æ们éè¦ä½¿å¾ LocatitionManagerService ç getLastLocation() æ¹æ³ è¿åçå ¨æ¯ (., .)ã
ç±äºæ们ä¸è½ç´æ¥æ¿å°ç³»ç»çè¿ä¸ªService对象ï¼å¯ä»¥å ç¨åå°çæ¹å¼æ¿å°ç³»ç»çLocationManagerServiceãç¶åæ¦æªgetLastLocation()æ¹æ³ã
åççBinder对象å¨è°ç¨ queryLocalInterface() æ¹æ³æ¶ä¼è¿ååççService对象ãæ们å¸æè¿å3.1ä¸çèªå®ä¹Serviceãæ以è¿éæ¦æª queryLocalInterface() æ¹æ³ã
æäºèªå®ä¹çBinderåï¼å°å®æ³¨å ¥å°ServiceMangerçsCacheåéä¸å°±å®æHookäº~
å½onClick被è°ç¨çæ¶åï¼ToaståLogé½ä¼æ¾ç¤ºå¤©å®é¨çåæ (., .)ãè¯æHookæåï¼
ä½ çè³å¯ä»¥ç¨Binder Hookçæ¹å¼Hookæ ActivityManagerã
Framework层的Binder(源码分析篇)
本文以android-.0.0_r的AOSP分支为基础,解析framework层的源码Binder工作原理。
从ServiceManager的源码getService方法入手,其核心代码是源码通过getIServiceManager().getService(name)获取服务。首先,源码ServiceManager的源码次日买入公式源码实现与进程中的ProcessState密切相关,ProcessState是源码单例,负责打开和映射Binder驱动。源码构造函数中,源码它会初始化驱动、源码验证版本并设置线程数,源码接着进行binder映射。源码
在ProcessState的源码getContextObject方法中,调用native函数android_util_Binder.cpp中的源码getContextObject()。这个函数通过handle 0(ServiceManager的源码handle)获取BpBinder对象,然后通过javaObjectForIBinder函数将其转换为Java中的类型。
进一步分析,weui代码源码下载BpBinder与java层的Binder之间存在对应关系,通过BinderProxy NativeData创建单例的BinderProxy。然后,每个服务的BinderProxy实例化和计数处理都在这个过程中完成。ServiceManagerNative.asInterface方法简化了getIServiceManager的调用,通过调用asInterface实例化ServiceManagerProxy。
IServiceManager接口通过AIDL生成,其代理类ServiceManagerProxy实际上是唱吧代源码不必要的。aidl文件在编译时生成对应java代码,用于binder通信。通过aidl文件,我们可以看到如queryLocalInterface等方法的实现细节。
在Parcel的协助下,客户端与服务端进行数据传递,通过序列化和反序列化进行交互。在transact函数中,手机皮皮助手源码对Parcel大小进行检查,避免数据传输过大导致的问题。最后,客户端与binder驱动的通信过程涉及了Transaction数据的写入、等待响应、数据处理和内存回收等步骤。
总的来说,framework层的原油期货 源码Binder工作涉及服务管理、数据转换、通信协议和内存管理等环节,理解这些有助于深入掌握Binder的工作机制。
Android Touch事件InputManagerService源码解析(二)
解析Android Touch事件分发过程,深入InputManagerService源码。触摸事件的产生与传递机制是本文探讨的核心。
InputDispatcher接收到事件,通过enqueueInboundEventLocked接口将事件放入mInboundQueue队列,等待分发处理。
InputDispatcher内部线程在有事件时被唤醒,执行dispatchOnce,根据事件类型调用dispatchMotionLocked进行处理。处理流程涉及找到要处理事件的窗口。
窗口查找通过findFocusedWindowTargetsLocked方法实现,该方法从map中获取focusedWindowHandle和focusedApplicationHandle,存储目标窗口信息。
这些句柄的初始化在Activity的生命周期回调中,如Activity.onResume时。具体路径涉及ActivityTaskManagerService、DisplayContent、InputMonitor和InputManagerService。
分发循环由prepareDispatchCycleLocked、enqueueDispatchEntryLocked和enqueueDispatchEntriesLocked方法实现,最后调用startDispatchCycleLocked,将事件发送给对应进程。
InputReader持续从底层读取事件,InputDispatcher通过线程处理分发,直至事件被发送至目标进程。本文深入解析了Touch事件的分发机制与关键步骤,提供了对Android触摸事件处理过程的全面理解。
service managerå¨å®åçä»ä¹å±ä¸å±
service managerå¨å®åçä»ä¹å±ä¸å±
android-sdk-managerå æ¬å¦ä¸æ件ï¼
å å«å¤§édemo æ¼ç¤ºå·¥ç¨....SDKæ·»å äºæ°åè½ä¸è¬å°±ä¼å¨è¿éæ·»å 示ä¾ç¨åº.
Sources for Android SDK
FrameWorkå±çæºä»£ç
Google APIs
æå äºGoogleæå¡çFramework,æ¯æ£å¸¸ä½¿ç¨çandroid.jaréå¤äºä¸äºä¸è¥¿(æ¯å¦ Google Play Service / Google map ä¹ç±»ç).
XXX image
对åºçæ¬çèææºæ件.ä¸è¬ä¼ç»ARMåx两ç§çæ¬
Android N å大ç»ä»¶çå·¥ä½åç
æ¬æ侧é讲解android N ç³»ç»ä¸å大ç»ä»¶çå·¥ä½åçï¼ä¸åç³»ç»åçç¥æå·®å«ãéè¿åæå大ç»ä»¶çå·¥ä½æµç¨å 深对Android Frameworkçç解ï¼ä¹ä¸ºæ件åå¼åæä¸åºç¡ã
Activity
å±ç¤ºä¸ä¸ªçé¢å¹¶åç¨æ·äº¤äºï¼å®æ®æ¼çæ¯ä¸ä¸ªåå°çé¢çè§è²ã
Service
计ç®åç»ä»¶ï¼ç¨äºåå°æ§è¡ä¸ç³»å计ç®ä»»å¡ï¼å·¥ä½å¨ä¸»çº¿ç¨ï¼èæ¶æä½éè¦å¦èµ·çº¿ç¨ï¼ å为å¯å¨ç¶æåç»å®ç¶æã
BroadcastReceiver
æ¶æ¯åç»ä»¶ï¼ä¸»è¦ç¨äºä¸åç»ä»¶æè ä¸ååºç¨ä¹é´çæ¶æ¯ä¼ éï¼å®å·¥ä½å¨ç³»ç»å é¨ï¼ä¸éåæ§è¡èæ¶æä½ï¼æä½è¶ è¿5sï¼ä¼åºç°ANRã
ContentProvider
æ°æ®å ±äº«åç»ä»¶ï¼ç¨äºåå ¶ä»ç»ä»¶æè åºç¨å ±äº«æ°æ®ï¼ä¸»è¦æ§è¡CURDæä½ã
æ们å¯å¨ä¸ä¸ªactivityæ两ç§æ¹æ³ï¼
第ä¸ç§ï¼Activityç´æ¥å¯å¨æ¹å¼ï¼ï¼
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
第äºç§ï¼Contextå¯å¨æ¹å¼ï¼
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);
ä¸åçå¯å¨æ¹å¼Activityçå·¥ä½æµç¨æç¹å·®å«ã
两ç§å¯å¨é½ä¼è°ç¨å°Instrumentationç±»ä¸çexecStartActivityçæ¹æ³ï¼ç³»ç»æç»æ¯éè¿ActivityThreadä¸çperformLaunchActivityå®æActivityçå建åå¯å¨ã
performLaunchActivityæ¹æ³ä¸»è¦å®æ以ä¸å·¥ä½ï¼
1ãéè¿ActivityClientRecord对象è·åå¯å¨activityçç»ä»¶ä¿¡æ¯
2ãéè¿mInstrumentation对象çnewActivityæ¹æ³è°ç¨classloaderå®æactivityçå建
3ãéè¿r.packageInfo(LoadedApk 对象)çmakeApplicationæ¹æ³å°è¯å建Application对象
4ãå建ContextImpl对象并è°ç¨Activityçattachæ¹æ³å®æä¸äºæ°æ®çåå§å
5ãè°ç¨ActivityçonCreateæ¹æ³
å¨Activityå¯å¨çè¿ç¨ä¸ï¼Appè¿ç¨ä¼é¢ç¹å°ä¸AMSè¿ç¨è¿è¡éä¿¡ï¼
Appè¿ç¨ä¼å§æAMSè¿ç¨å®æActivityçå½å¨æç管ç以åä»»å¡æ ç管çï¼è¿ä¸ªéä¿¡è¿ç¨AMSæ¯Server端ï¼Appè¿ç¨éè¿ææAMSçclient代çIActivityManagerå®æéä¿¡è¿ç¨ï¼
AMSè¿ç¨å®æçå½å¨æ管ç以åä»»å¡æ 管çåï¼ä¼ææ§å¶æ交ç»Appè¿ç¨ï¼è®©Appè¿ç¨å®æActivity类对象çå建ï¼ä»¥åçå½å¨æåè°ï¼è¿ä¸ªéä¿¡è¿ç¨ä¹æ¯éè¿Binderå®æçï¼Appæå¨server端çBinder对象åå¨äºActivityThreadçå é¨ç±»ApplicationThreadï¼AMSæå¨clientéè¿ææIApplicationThreadç代ç对象å®æ对äºAppè¿ç¨çéä¿¡ã
Serviceæ两ç§å¯å¨æ¹å¼ï¼startService()åbindService()ï¼ä¸¤ç§ç¶æå¯ä»¥å¹¶å:
startServiceæµç¨
bindServiceæµç¨
BroadcastReceiverçå·¥ä½è¿ç¨ä¸»è¦å æ¬å¹¿æç注åãåéåæ¥æ¶:
å¨æ注åè¿ç¨ï¼
åéè¿ç¨
éæ注åæ¯ç±PackageManagerServiceï¼PMSï¼å¨åºç¨å®è£ çæ¶åå®ææ´ä¸ªæ³¨åè¿ç¨çï¼é¤å¹¿æ以å¤ï¼å ¶ä»ä¸å¤§ç»ä»¶ä¹é½æ¯å¨åºç¨å®è£ æ¶ç±PMS解æ并注åçã
æ¯ä¸ªè¿ç¨çå ¥å£é½æ¯ActivityThead.main()ï¼Appçå¯å¨æµç¨å¦ä¸ï¼
ä»æºç ä¸å¯ä»¥çåºï¼
åºç¨å¯å¨çå ¥å£ä¸ºActivityThreadçmainæ¹æ³ï¼mainæ¹æ³ä¼å建ActivityThreadå®ä¾å¹¶å建主线ç¨æ¶æ¯éåã
attachæ¹æ³ä¸è¿ç¨è°ç¨AMSçattachApplicationæ¹æ³ï¼å¹¶æä¾ApplicationThreadç¨äºåAMSçéä¿¡ã
attachApplicationæ¹æ³ä¼éè¿bindApplicationæ¹æ³åHæ¥è°åActivityThreadçhandleBindApplicationï¼è¿ä¸ªæ¹æ³ä¼å å建Applicationï¼åå è½½ContentProviderï¼ç¶åæä¼åè°ApplicationçonCreateæ¹æ³ã
ç±ä¸å¾å¯ä»¥çåºï¼å¨ContentProviderçå¯å¨è¿ç¨ä¸ä¼´éçappè¿ç¨çå¯å¨ã
ContentProviderçå ¶ä»CURDæä½å¦insertï¼deleteï¼updateè·queryçæµç¨ç±»ä¼¼ã