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

鍍金池/ 教程/ Android/ 深入Android frameworks
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<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()再強(qiáng)轉(zhuǎn)是一定會失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫設(shè)計(jì)范式
《App研發(fā)錄》一書
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機(jī)制
Java對象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(<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)》一書
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
安卓測試驅(qū)動開發(fā)/安卓測試驗(yàn)證
暗時(shí)間:學(xué)會正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動效專題
Feed系統(tǒng)的設(shè)計(jì)
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點(diǎn)子
WebRTC

深入Android frameworks

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

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

  • JNI函數(shù)注冊:把Java中聲明的native方法與C/C++代碼一一對應(yīng)起來
    • 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
    • 通過在C/C++代碼中設(shè)置好Java native方法對應(yīng)的結(jié)構(gòu)體數(shù)據(jù),就可以達(dá)到將其對應(yīng)起來的目的
    • 所有的注冊工作都在frameworks/base/core/jni/AndroidRuntime.cpp中完成
    • AndroidRuntime::registerNativeMethods函數(shù)調(diào)用了JNIHelp.cpp中的 jniRegisterNativeMethods方法,=> C_JNIEnv::RegisterNatives
    • 如果不通過上述方式注冊native函數(shù),函數(shù)被調(diào)用時(shí)AndroidRuntime會從所有已載入的so庫中 搜索被調(diào)用的函數(shù),效率較低,而上述注冊會加速native函數(shù)的查找,只需在JNINativeMethod數(shù)組 中查找即可
    • 而且由于上述注冊機(jī)制,使得可以在運(yùn)行時(shí)動態(tài)注冊/hook
    • 動態(tài)注冊
      • Java層調(diào)用System.loadLibrary加載so庫
      • 查找so庫中的JNI_OnLoad函數(shù),如果存在,則執(zhí)行之
      • 可以在JNI_OnLoad函數(shù)中進(jìn)行動態(tài)注冊

Hardware Abstract Layer(HAL)

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

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

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

    • 系統(tǒng)服務(wù)的初始化流程
      • 每個(gè)使用Binder機(jī)制進(jìn)行IPC的進(jìn)程,都需要打開一次/dev/binder設(shè)備,并進(jìn)行內(nèi)存映射,方便后續(xù)操作:sp<ProcessState> proc(ProcessState::self());
      • 每個(gè)進(jìn)程也需要創(chuàng)建一個(gè)BpBinder對象,并將其轉(zhuǎn)換為IServiceManager類型,保存到進(jìn)程數(shù)據(jù)結(jié)構(gòu)ProcessState中:sp<IServiceManager> sm = defaultServiceManager();
      • 其實(shí)上面的procsm變量都沒有使用,重要的工作是對兩個(gè)函數(shù)的調(diào)用,而之所以要定義未使用的變量,是為了利用對象的析構(gòu)機(jī)制自動釋放資源,如果未定義變量,那返回的對象會立即析構(gòu),而如果定義了變量,則會在離開作用域時(shí)析構(gòu);
      • 初始化相應(yīng)的服務(wù):MediaPlayerService::instantiate()
      • 創(chuàng)建線程池,加入線程池,并在其中開始循環(huán),以便響應(yīng)通過Binder發(fā)送的IPC請求: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è)模板類,用法是BnInterface<IXXX>,這樣聲明的類型就會同時(shí)繼承IXXX和BBinder,BnInterface<IXXX>是IXXX的實(shí)現(xiàn)者,提供API:queryLocalInterface(...);
      • BpInterface : INTERFACE, BpRefBase,它是個(gè)模板類,用法是BpInterface<IXXX>,這樣聲明的類型就會同時(shí)繼承IXXX和BpRefBase,BpInterface<IXXX>是IXXX的代理服務(wù)提供者(代理);
      • IServiceManager : IInterface,service manager也是一個(gè)服務(wù),只不過它比較特殊,它的功能是管理其他所有的服務(wù),其他所有的服務(wù)都需要把自己注冊到service manager的服務(wù)列表中;
      • BnServiceManager : BnInterface<IServiceManager>,是IServiceManager的實(shí)現(xiàn)者;
      • BpServiceManager : BpInterface<IServiceManager>,是IServiceManager的代理;
      • ServiceManager.java,是Java層對ServiceManager的定義,它通過ServiceManagerNative.asInterface(BinderInternal.getContextObject())獲得IServiceManager實(shí)例,而該方法則是通過查詢native層service manager的服務(wù)列表獲取服務(wù)實(shí)例;
      • IMediaPlayerService: IInterface,定義了MediaPlayerService的API,包括遠(yuǎn)程調(diào)用,屬性訪問;
      • BnMediaPlayerService: BnInterface<IMediaPlayerService>,是IMediaPlayerService的實(shí)現(xiàn)者;
      • BpMediaPlayerService: BpInterface<IMediaPlayerService>,是IMediaPlayerService的代理;

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

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

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

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

  • 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 => (如果對應(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 => (此處通過反射創(chuàng)建新activity對象,然后通過mInstrumentation調(diào)用新activity的onCreate/onResume等回調(diào))

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