在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 深入Android frameworks
Launch mode 和 Intent flags專(zhuān)題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語(yǔ)言精粹》
Memory leak專(zhuān)題
React基礎(chǔ)
《Test Driven Development: By Example》一書(shū)
Developer tools
安卓開(kāi)發(fā)技能樹(shù)
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個(gè)安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再?gòu)?qiáng)轉(zhuǎn)是一定會(huì)失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)范式
《App研發(fā)錄》一書(shū)
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書(shū)
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機(jī)制
Java對(duì)象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(cè)(<a rel="nofollow" href="http://develop
Futurice公司安卓團(tuán)隊(duì)的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項(xiàng)目架構(gòu)
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書(shū)
Rx在Android中的最佳實(shí)踐
函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)
ProGuard
面向?qū)ο罅笤瓌t(SOLID+)
深入理解Java虛擬機(jī)
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實(shí)踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測(cè)試驅(qū)動(dòng)開(kāi)發(fā)/安卓測(cè)試驗(yàn)證
暗時(shí)間:學(xué)會(huì)正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動(dòng)效專(zhuān)題
Feed系統(tǒng)的設(shè)計(jì)
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書(shū)筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專(zhuān)題
一些很棒的點(diǎn)子
WebRTC

深入Android frameworks

《深入理解Android 5源代碼》一書(shū)的內(nèi)容實(shí)在太渣,轉(zhuǎn)戰(zhàn)博客系列:老羅的Android之旅

Java Native Interface(JNI)系統(tǒng)

  • JNI函數(shù)注冊(cè):把Java中聲明的native方法與C/C++代碼一一對(duì)應(yīng)起來(lái)
    • JNINativeMethod結(jié)構(gòu)體,name, signature, fnPtr三個(gè)成員
    • signature部分:V - void - void, Z - jboolean - boolean, J - jlong - long, S - jshort - short, Ljava/lang/String; - jstring - String, Ljava/net/Socket; - jobject - Socket
    • 通過(guò)在C/C++代碼中設(shè)置好Java native方法對(duì)應(yīng)的結(jié)構(gòu)體數(shù)據(jù),就可以達(dá)到將其對(duì)應(yīng)起來(lái)的目的
    • 所有的注冊(cè)工作都在frameworks/base/core/jni/AndroidRuntime.cpp中完成
    • AndroidRuntime::registerNativeMethods函數(shù)調(diào)用了JNIHelp.cpp中的 jniRegisterNativeMethods方法,=> C_JNIEnv::RegisterNatives
    • 如果不通過(guò)上述方式注冊(cè)native函數(shù),函數(shù)被調(diào)用時(shí)AndroidRuntime會(huì)從所有已載入的so庫(kù)中 搜索被調(diào)用的函數(shù),效率較低,而上述注冊(cè)會(huì)加速native函數(shù)的查找,只需在JNINativeMethod數(shù)組 中查找即可
    • 而且由于上述注冊(cè)機(jī)制,使得可以在運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)/hook
    • 動(dòng)態(tài)注冊(cè)
      • Java層調(diào)用System.loadLibrary加載so庫(kù)
      • 查找so庫(kù)中的JNI_OnLoad函數(shù),如果存在,則執(zhí)行之
      • 可以在JNI_OnLoad函數(shù)中進(jìn)行動(dòng)態(tài)注冊(cè)

Hardware Abstract Layer(HAL)

  • 將硬件抽象化,為操作系統(tǒng)提供虛擬硬件平臺(tái),操作系統(tǒng)的代碼和硬件驅(qū)動(dòng)的代碼完全分離,軟硬件完全分離, 便于保護(hù)硬件廠商的知識(shí)產(chǎn)權(quán),也便于軟硬件測(cè)試并行化
  • 主要包括hw_module_t, hw_module_methods_t, hw_device_t
  • hw_module_methods_t為所有硬件操作定義了統(tǒng)一的API
  • 硬件模塊的編寫(xiě)有一定規(guī)范,HAL按照該規(guī)范載入硬件模塊的SO庫(kù),獲取綁定其中的符號(hào)、代碼

Binder機(jī)制(跨進(jìn)程通信IPC)

  • Android深入淺出之Binder機(jī)制

    • 系統(tǒng)服務(wù)的初始化流程
      • 每個(gè)使用Binder機(jī)制進(jìn)行IPC的進(jìn)程,都需要打開(kāi)一次/dev/binder設(shè)備,并進(jìn)行內(nèi)存映射,方便后續(xù)操作:sp<ProcessState> proc(ProcessState::self())
      • 每個(gè)進(jìn)程也需要?jiǎng)?chuàng)建一個(gè)BpBinder對(duì)象,并將其轉(zhuǎn)換為IServiceManager類(lèi)型,保存到進(jìn)程數(shù)據(jù)結(jié)構(gòu)ProcessState中:sp<IServiceManager> sm = defaultServiceManager();
      • 其實(shí)上面的procsm變量都沒(méi)有使用,重要的工作是對(duì)兩個(gè)函數(shù)的調(diào)用,而之所以要定義未使用的變量,是為了利用對(duì)象的析構(gòu)機(jī)制自動(dòng)釋放資源,如果未定義變量,那返回的對(duì)象會(huì)立即析構(gòu),而如果定義了變量,則會(huì)在離開(kāi)作用域時(shí)析構(gòu);
      • 初始化相應(yīng)的服務(wù):MediaPlayerService::instantiate()
      • 創(chuàng)建線程池,加入線程池,并在其中開(kāi)始循環(huán),以便響應(yīng)通過(guò)Binder發(fā)送的IPC請(qǐng)求:ProcessState::self()->startThreadPool()IPCThreadState::self()->joinThreadPool();
    • IBinder, BBinder, BpBinder, IInterface, BpInterface, IServiceManager, BpServiceManager, MediaPlayerService, BnMediaPlayerService 它們之間什么關(guān)系?

      • BBinder : IBinder : RefBase,定義了binder的API:transact(...)等基礎(chǔ)API;
      • BpRefBase : RefBase,定義了基礎(chǔ)的代理API:remote()
      • BpBinder : IBinder,它也定義了代理的API:remoteBinder()
      • IInterface : RefBase,定義了所有的service的公共API:asBinder(...)
      • BnInterface : INTERFACE, BBinder,它是個(gè)模板類(lèi),用法是BnInterface<IXXX>,這樣聲明的類(lèi)型就會(huì)同時(shí)繼承IXXX和BBinder,BnInterface<IXXX>是IXXX的實(shí)現(xiàn)者,提供API:queryLocalInterface(...)
      • BpInterface : INTERFACE, BpRefBase,它是個(gè)模板類(lèi),用法是BpInterface<IXXX>,這樣聲明的類(lèi)型就會(huì)同時(shí)繼承IXXX和BpRefBase,BpInterface<IXXX>是IXXX的代理服務(wù)提供者(代理);
      • IServiceManager : IInterface,service manager也是一個(gè)服務(wù),只不過(guò)它比較特殊,它的功能是管理其他所有的服務(wù),其他所有的服務(wù)都需要把自己注冊(cè)到service manager的服務(wù)列表中;
      • BnServiceManager : BnInterface<IServiceManager>,是IServiceManager的實(shí)現(xiàn)者;
      • BpServiceManager : BpInterface<IServiceManager>,是IServiceManager的代理;
      • ServiceManager.java,是Java層對(duì)ServiceManager的定義,它通過(guò)ServiceManagerNative.asInterface(BinderInternal.getContextObject())獲得IServiceManager實(shí)例,而該方法則是通過(guò)查詢native層service manager的服務(wù)列表獲取服務(wù)實(shí)例;
      • IMediaPlayerService: IInterface,定義了MediaPlayerService的API,包括遠(yuǎn)程調(diào)用,屬性訪問(wèn);
      • BnMediaPlayerService: BnInterface<IMediaPlayerService>,是IMediaPlayerService的實(shí)現(xiàn)者;
      • BpMediaPlayerService: BpInterface<IMediaPlayerService>,是IMediaPlayerService的代理;

      • IXXX是接口的定義,實(shí)現(xiàn)者是BnXXX,使用者通過(guò)代理BpXXX和接口(服務(wù))打交道;
      • Bp ==> Binder proxy;
      • BpServiceManager可以理解為IServiceManager的代理,對(duì)用戶透明,是僅供內(nèi)部使用的API;
      • Bn ==> Binder native;
      • Bn和Bp相對(duì),Bp是代理,則Bn就是和代理通信的另一端(實(shí)現(xiàn)端),Bp通過(guò)和Bn通信,代理IXXX向使用者提供服務(wù);
    • addService的IPC過(guò)程
      • 調(diào)用的是remote()->transact(...)函數(shù),而remote返回的實(shí)際上就是初始化ServiceManager時(shí)創(chuàng)建的BpBinder;
      • ==> IPCThreadState::self()->transact(...),在其中通過(guò)binder設(shè)備發(fā)送命令和數(shù)據(jù),同時(shí)讀取返回的命令和數(shù)據(jù);
    • 自行實(shí)現(xiàn)一整套service
      • 如果是純native的service,沒(méi)有應(yīng)用層入口,則需要和MediaPlayerService一樣,實(shí)現(xiàn)一個(gè)main函數(shù),并在其他同類(lèi)service的啟動(dòng)處啟動(dòng)自定義的service;
      • 定義service接口IXXX : IInterface,定義需要的API;
      • 定義BnXXX和BpXXX,完成service的實(shí)現(xiàn)和代理;
  • 淺談Service Manager成為Android進(jìn)程間通信(IPC)機(jī)制Binder守護(hù)進(jìn)程之路
    • binder機(jī)制為service manager預(yù)留了通道,使其可以率先把自己注冊(cè)為binder守護(hù)進(jìn)程
    • binder IPC機(jī)制client和server通信只需要一次數(shù)據(jù)拷貝:client從用戶空間拷貝到內(nèi)核空間;server和內(nèi)核空間(binder驅(qū)動(dòng))共享數(shù)據(jù)
    • 通過(guò)ioctl機(jī)制通知binder驅(qū)動(dòng)自己成為守護(hù)進(jìn)程之后,service manager進(jìn)程將進(jìn)入binder_loop,循環(huán)等待client的請(qǐng)求到來(lái)
  • 淺談Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server和Client獲得Service Manager接口之路
    • sp<IServiceManager> defaultServiceManager();這一方法實(shí)現(xiàn)了單例模式,單例保存在gDefaultServiceManager
    • 創(chuàng)建單例:gDefaultServiceManager = interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));
    • 簡(jiǎn)化為:gDefaultServiceManager = new BpServiceManager(new BpBinder(0));

Android啟動(dòng)運(yùn)行在獨(dú)立進(jìn)程的Service

  • 跨進(jìn)程,當(dāng)然就會(huì)使用binder機(jī)制
  • 包括三次跨進(jìn)程通信
    • 從主進(jìn)程(調(diào)用startService的進(jìn)程)調(diào)用到ActivityManagerService進(jìn)程中,完成新進(jìn)程的創(chuàng)建,新進(jìn)程開(kāi)始執(zhí)行
    • 從新進(jìn)程調(diào)用到ActivityManagerService進(jìn)程中,新進(jìn)程告知ActivityManagerService自己已經(jīng)準(zhǔn)備就緒
    • 從ActivityManagerService進(jìn)程又回到新進(jìn)程中,傳遞了相關(guān)信息,最終將服務(wù)啟動(dòng)起來(lái)

Android應(yīng)用程序的Activity啟動(dòng)過(guò)程

  • step2: Activity.startActivity =>
  • step3: Activity.startActivityForResult
  • step4: Instrumentation.execStartActivity =>
  • step5: ActivityManagerProxy.startActivity == binder ==>
  • step6: ActivityManagerService.startActivity =>
  • step6: ActivityManagerService.startActivityAsUser =>
  • step7: ActivityStackSupervisor.startActivityMayWait =>
  • step8: ActivityStackSupervisor.startActivityLocked =>
  • step9: ActivityStackSupervisor.startActivityUncheckedLocked =>
  • step10: ActivityStack.resumeTopActivityLocked => (此函數(shù)有兩次調(diào)用,不同參數(shù)執(zhí)行路徑不同)
  • step11: ActivityStack.startPausingLocked =>
  • step12: ApplicationThreadProxy.schedulePauseActivity == binder ==>
  • step13: ActivityThread$ApplicationThread.schedulePauseActivity =>
  • step14: ActivityThread.queueOrSendMessage => (PAUSE_ACTIVITY)
  • step15: ActivityThread$H.handleMessage =>
  • step16: ActivityThread.handlePauseActivity => (在此處調(diào)用前一activity的onPause回調(diào))
  • step17: ActivityManagerProxy.activityPaused == binder ==>
  • step18: ActivityManagerService.activityPaused =>
  • step19: ActivityStack.activityPaused =>
  • step20: ActivityStack.completePauseLocked =>
  • step21: ActivityStack.resumeTopActivityLocked =>
  • step22: ActivityStack.startSpecificActivityLocked => (如果對(duì)應(yīng)進(jìn)程不存在,則創(chuàng)建進(jìn)程)
  • step23: ActivityManagerService.startProcessLocked =>
  • step24: ActivityThread.main =>
  • step25: ActivityManagerProxy.attachApplication == binder ==>
  • step26: ActivityManagerService.attachApplication =>
  • step27: ActivityManagerService.attachApplicationLocked =>
  • step28: ActivityStack.realStartActivityLocked =>
  • step29: ApplicationThreadProxy.scheduleLaunchActivity == binder ==>
  • step30: ApplicationThread.scheduleLaunchActivity =>
  • step31: ActivityThread.queueOrSendMessage => (LAUNCH_ACTIVITY)
  • step32: ActivityThread$H.handleMessage =>
  • step33: ActivityThread.handleLaunchActivity =>
  • step34: ActivityThread.performLaunchActivity => (此處通過(guò)反射創(chuàng)建新activity對(duì)象,然后通過(guò)mInstrumentation調(diào)用新activity的onCreate/onResume等回調(diào))

  • Step1 - Step 11:Launcher通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityManagerService,它要啟動(dòng)一個(gè)Activity;
  • Step 12 - Step 16:ActivityManagerService通過(guò)Binder進(jìn)程間通信機(jī)制通知Launcher進(jìn)入Paused狀態(tài);
  • Step 17 - Step 24:Launcher通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityManagerService,它已經(jīng)準(zhǔn)備就緒進(jìn)入Paused狀態(tài),于是ActivityManagerService就創(chuàng)建一個(gè)新的進(jìn)程,用來(lái)啟動(dòng)一個(gè)ActivityThread實(shí)例(how?),即將要啟動(dòng)的Activity就是在這個(gè)ActivityThread實(shí)例中運(yùn)行;
  • Step 25 - Step 27:ActivityThread通過(guò)Binder進(jìn)程間通信機(jī)制將一個(gè)ApplicationThread類(lèi)型的Binder對(duì)象傳遞給ActivityManagerService,以便以后ActivityManagerService能夠通過(guò)這個(gè)Binder對(duì)象和它進(jìn)行通信;
  • Step 28 - Step 35:ActivityManagerService通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityThread,現(xiàn)在一切準(zhǔn)備就緒,它可以真正執(zhí)行Activity的啟動(dòng)操作了。