framework学习

来源:互联网 发布:淘宝上下架时间几点好 编辑:程序博客网 时间:2024/05/13 14:55
很多Android开发者可能觉得仅仅了解Java层还不够,这里结合源码帮助大家如何了解Android Framework层。

  首先eoeAndroid提示大家需要了解哪些前置知识,首先要有C++基础,如果你只会C,可能对于C++ STL标准库,以及模板和泛型的理解会吃力很多,同时要有OOP的思想否则看Android这样的大工程可能无法很好的组织,这点可以通过h文件画出 UML图来快速了解整个结构。

  1. 首先我们从Android GIT源码托管站点下载Framework层的源码,在base.git包

  2. 对于Android来说,Google内部使用C++有些类似STL,因为部分用到了只是再次封装,这里建议大家直接看base中的include目录下的utils里的文件,比如说String8.h、String16.h、Vector.h、KeyedVector.h以及TypeHelpers.h

  这里String8和String16和STL中的String相比,提供了更多的辅助方法,相比标准库更完善些,其中有些类似uint8_t、 uint_16t和uint32_t这里我们可以理解为VC中的char、short和int,就是8位、16位和32位的整形,主要是标示的范围不同,使用更小的单位可以更节省内存开销,对于系统来说这是十分重要的,对于Vector和STL中的vector功能上是相同的,而KeyedVector我们当做stl中的map去对待即可,本身就是一个哈希映射类型,下面eoeAndroid要强调的就是TypeHelpers这个文件,里面封装的sp模板和wp模板,很多源码中会有类似 static sp 这样的定义,就需要深入的了解下Android的SP了,如果你真的会C++这些都是小儿科了,比如

Java代码:
  1. template class sp;

  2. template struct trait_trivial_move< sp >{
  3. enum { value = true };
  4. };

  5. // wp<> can be trivially moved
  6. template class wp;
  7. template struct trait_trivial_move< wp >{
  8. enum { value = true };
  9. };
复制代码

     3. 当然基本的C++设计模式,CWJ推荐大家还是要掌握的,比如说单件模式在C++中,可以在Singleton.h文件中写到,

Java代码:
  1. template class Singleton{

  2. public static TYPE& getInstance() {

  3. Mutex Autolock _l(sLock);

  4. TYPE* instance = sInstance;
  5. if (instance == 0) {
  6. instance = new TYPE();
  7. sInstance = instance;
  8. }

  9. return *instance;
  10. }

  11. protected Singleton() { };
  12. Singleton() { };


  13. private Singleton(const Singleton&);
  14. Singleton& operator = (const Singleton&);
  15. static Mutex sLock;
  16. static TYPE* sInstance;
  17. };
复制代码

    4. 所有的结构h文件看完后,可以转向base的libs目录,这里对应的是相应的cpp文件,里面包含着具体的实现。  5. Android Framework可以让我们更了解系统底层,开发出更有竞争力的产品。


==============================================

   对于Android Framework层的学习,在上一次的 Android框架层学习指导 中我们已经讲到了基础的结构和定义,但是对于Framework层的核心还有哪些呢?

  1. 在Android源码的base中,我们可以看到每个目录进去,都会有java和jni两个文件夹,后者对于初入android框架的学习十分有帮助,如果你刚开始了解NDK和JNI相关的不妨读读Google的代码,这对于代码风格和质量的提高都很有帮助。

  2. 对于NDK和JNI来说,编译我们需要一个好的环境,这里还是推荐基于Unix架构的Linux或Mac OS编译,Android123推荐放弃Windows下的Cygwin和MingWin可以节省不少的时间,对于编译来说先掌握mk文件的结构比较重要,这里可以直接查看base目录中每个jni子目录的android.mk文件即可,在Linux下mk文件这种脚本方式对于过去一些Visual Studio用惯的可能感觉有些原始。

  3. 当然学习Android Framework可以帮助改进系统,定制自己的固件,部分核心的库是独立的external包,比如说 SQLite、Webkit、zlib、libpng这些Android使用第三方开源的库都是在platform/external/xxx.git 中。xxx代表最终的库名。

  4. 对于部分的核心库,上次我们在Android框架层学习指导一文中由于篇幅并没有提到,其实在base目录下面的native中可以看到很多系统结构的定义和实现。Android开发网推荐深入掌握Android这个namespace中的所有结构,这样的基础是十分必要的。

  5. 最后我们附上Base目录的结构图,希望对大家有用:

Java代码:

  1. ├─api

  2. ├─build
  3. ├─cmds
  4. │ ├─am
  5. │ │ └─src
  6. │ │ └─com
  7. │ │ └─android
  8. │ │ └─commands
  9. │ │ └─am
  10. │ ├─app_process
  11. │ ├─backup
  12. │ ├─bmgr
  13. │ │ └─src
  14. │ │ └─com
  15. │ │ └─android
  16. │ │ └─commands
  17. │ │ └─bmgr
  18. │ ├─bootanimation
  19. │ ├─bugreport
  20. │ ├─dumpstate
  21. │ ├─dumpsys
  22. │ ├─ime
  23. │ │ └─src
  24. │ │ └─com
  25. │ │ └─android
  26. │ │ └─commands
  27. │ │ └─ime
  28. │ ├─input
  29. │ │ └─src
  30. │ │ └─com
  31. │ │ └─android
  32. │ │ └─commands
  33. │ │ └─input
  34. │ ├─installd
  35. │ ├─keystore
  36. │ ├─pm
  37. │ │ └─src
  38. │ │ └─com
  39. │ │ └─android
  40. │ │ └─commands
  41. │ │ └─pm
  42. │ ├─rawbu
  43. │ ├─runtime
  44. │ ├─screencap
  45. │ ├─service
  46. │ ├─servicemanager
  47. │ ├─stagefright
  48. │ ├─surfaceflinger
  49. │ ├─svc
  50. │ │ └─src
  51. │ │ └─com
  52. │ │ └─android
  53. │ │ └─commands
  54. │ │ └─svc
  55. │ └─system_server
  56. │ └─library
  57. ├─core
  58. │ ├─config
  59. │ │ ├─debug
  60. │ │ │ └─android
  61. │ │ │ └─util
  62. │ │ ├─ndebug
  63. │ │ │ └─android
  64. │ │ │ └─util
  65. │ │ └─sdk
  66. │ │ └─android
  67. │ │ └─util
  68. │ ├─java
  69. │ │ ├─android
  70. │ │ │ ├─accessibilityservice
  71. │ │ │ ├─accounts
  72. │ │ │ ├─annotation
  73. │ │ │ ├─app
  74. │ │ │ │ ├─admin
  75. │ │ │ │ └─backup
  76. │ │ │ ├─appwidget
  77. │ │ │ ├─bluetooth
  78. │ │ │ ├─content
  79. │ │ │ │ ├─pm
复制代码
=============================

Java代码:

  1. │ │ │ │ └─res
  2. │ │ │ ├─database
  3. │ │ │ │ └─sqlite
  4. │ │ │ ├─ddm
  5. │ │ │ ├─debug
  6. │ │ │ ├─emoji
  7. │ │ │ ├─gesture
  8. │ │ │ ├─hardware
  9. │ │ │ ├─inputmethodservice
  10. │ │ │ ├─net
  11. │ │ │ │ └─http
  12. │ │ │ ├─nfc
  13. │ │ │ │ └─tech
  14. │ │ │ ├─os
  15. │ │ │ │ └─storage
  16. │ │ │ ├─pim
  17. │ │ │ │ └─vcard
  18. │ │ │ │ └─exception
  19. │ │ │ ├─preference
  20. │ │ │ ├─provider
  21. │ │ │ ├─security
  22. │ │ │ ├─server
  23. │ │ │ │ └─search
  24. │ │ │ ├─service
  25. │ │ │ │ ├─urlrenderer
  26. │ │ │ │ └─wallpaper
  27. │ │ │ ├─speech
  28. │ │ │ │ ├─srec
  29. │ │ │ │ └─tts
  30. │ │ │ ├─test
  31. │ │ │ │ └─suitebuilder
  32. │ │ │ │ └─annotation
  33. │ │ │ ├─text
  34. │ │ │ │ ├─format
  35. │ │ │ │ ├─method
  36. │ │ │ │ ├─style
  37. │ │ │ │ └─util
  38. │ │ │ ├─util
  39. │ │ │ ├─view
  40. │ │ │ │ ├─accessibility
  41. │ │ │ │ ├─animation
  42. │ │ │ │ └─inputmethod
  43. │ │ │ ├─webkit
  44. │ │ │ └─widget
  45. │ │ └─com
  46. │ │ ├─android
  47. │ │ │ ├─internal
  48. │ │ │ │ ├─app
  49. │ │ │ │ ├─appwidget
  50. │ │ │ │ ├─backup
  51. │ │ │ │ ├─content
  52. │ │ │ │ ├─database
  53. │ │ │ │ ├─http
  54. │ │ │ │ │ └─multipart
  55. │ │ │ │ ├─logging
  56. │ │ │ │ ├─net
  57. │ │ │ │ ├─nfc
  58. │ │ │ │ ├─os
  59. │ │ │ │ │ └─storage
  60. │ │ │ │ ├─policy
  61. │ │ │ │ ├─preference
  62. │ │ │ │ ├─service
  63. │ │ │ │ │ └─wallpaper
  64. │ │ │ │ ├─statusbar
  65. │ │ │ │ ├─util
  66. │ │ │ │ ├─view
  67. │ │ │ │ │ └─menu
  68. │ │ │ │ └─widget
  69. │ │ │ └─server
  70. │ │ └─google
  71. │ │ └─android
  72. │ │ ├─collect
  73. │ │ ├─mms
  74. │ │ │ ├─pdu
  75. │ │ │ └─util
  76. │ │ └─util
  77. │ ├─jni
  78. │ │ └─android
  79. │ │ ├─graphics
  80. │ │ └─opengl
  81. │ ├─res
  82. │ │ ├─assets
  83. │ │ │ ├─images
  84. │ │ │ ├─sounds
  85. │ │ │ └─webkit
  86. │ │ └─res
  87. │ │ ├─anim
  88. │ │ ├─color
  89. │ │ ├─drawable
  90. │ │ ├─drawable-en-hdpi
  91. │ │ ├─drawable-en-ldpi
  92. │ │ ├─drawable-en-mdpi
  93. │ │ ├─drawable-hdpi
  94. │ │ ├─drawable-land-hdpi
  95. │ │ ├─drawable-land-ldpi
  96. │ │ ├─drawable-land-mdpi
  97. │ │ ├─drawable-ldpi
  98. │ │ ├─drawable-mdpi
  99. │ │ ├─drawable-nodpi
  100. │ │ ├─layout
  101. │ │ ├─layout-land
  102. │ │ ├─layout-port
  103. │ │ ├─raw
  104. │ │ ├─raw-ar
  105. │ │ ├─raw-cs
  106. │ │ ├─raw-da
  107. │ │ ├─raw-de
  108. │ │ ├─raw-en-rGB
  109. │ │ ├─raw-es
  110. │ │ ├─raw-fi
  111. │ │ ├─raw-fr
  112. │ │ ├─raw-hu
  113. │ │ ├─raw-it
  114. │ │ ├─raw-iw
  115. │ │ ├─raw-ja
  116. │ │ ├─raw-ko
  117. │ │ ├─raw-nl
  118. │ │ ├─raw-pl
  119. │ │ ├─raw-pt-rBR
  120. │ │ ├─raw-ru
  121. │ │ ├─raw-th
  122. │ │ ├─raw-tr
  123. │ │ ├─raw-zh-rCN
复制代码
http://www.eoeandroid.com/thread-91982-1-1.html