Android Framework源码当中哪些类有必要进行vc 深入详解源代码学习

前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在《拓展系列》里。随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以把它提到《学习系列》专讲一章基础篇。刚装了UBUNTU14.04,所以尝试在新环境下编译一下android源码。因为和谐原因,我临时买了个VPN,推荐一下(还算稳定):&或者
1、参考链接(官方):环境:/source/initializing.html下载:/source/downloading.html编译:/source/building-running.html
2、Ubuntu14.04(x64)+ OpenJDK7最新的代码用默认的openjdk7就可以编译通过,反而用jdk6无法编译。安装openjdk7:
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
安装其他组件:
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
我这里安装很快(我配置了163的mirror),一切顺利。
3、连上VPN直接参考这个VPN官方说明:https://www.51jsq.org/setting/ubuntu.shtml
4、安装repo
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl /git-repo-downloads/repo & ~/bin/repo
$ chmod a+x ~/bin/repo
为了方便,你可以继续配置一下repo:在.bashrc中添加:
alias repo='~/bin/repo'
5、开始下载
$ mkdir android
$ cd android
$ repo init -u /platform/manifest //下载最新
上面是初始化(init)repo版本库,真正的下载:
$ repo sync
也许是我命好,FQ之后,下载一切顺利,没有以前碰到的和网上说的的一大堆问题,唯一的一个尴尬的问题,下载的过程中经常断。早上醒来的时候断了,继续repo sync,下班回来一看,断了,repo sync ...大概断断续续的花了2天2夜在今天晚上加班回来下载好了。提醒一下,如果你下载出错了,请务必仔细看看是什么错误,不是一味的repo sync,我这次这么顺利简直&不科学&~下载好了!!!!
6、开始编译初始化一些参数和变量:
$ source build/envsetup.sh
定义设备类型,我们使用模拟器(aosp_arm-eng):
xxx@ubuntu:~/Data/android$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. vbox_x86-eng
8. aosp_hammerhead-userdebug
9. aosp_mako-userdebug
10. aosp_manta-userdebug
11. aosp_tilapia-userdebug
12. aosp_grouper-userdebug
13. aosp_deb-userdebug10、小结
14. aosp_flo-userdebug
15. mini_armv7a_neon-userdebug
16. mini_mips-userdebug
17. mini_x86-userdebug
Which would you like? [aosp_arm-eng] 1
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4.3.2.1.000.000
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_2ND_ARCH=
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
OUT_DIR=out
============================================
定义好了后,开始编译(是最新的4.4.3的版本):
xxx@ubuntu:~/Data/android$ make -j8
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4.3.2.1.000.000
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_2ND_ARCH=
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
OUT_DIR=out
============================================
including ./abi/cpp/Android.mk ...
including ./art/Android.mk ...
including ./bionic/Android.mk ...
including ./bootable/diskinstaller/Android.mk ...
including ./bootable/recovery/Android.mk ...
including ./build/libs/host/Android.mk ...
including ./build/target/board/Android.mk ...
including ./build/tools/Android.mk ...
including ./cts/Android.mk ...
// ... ...
Installed file list: out/target/product/generic/installed-files.txt
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
mkuserimg.sh out/target/product/generic/system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img ext4 system
out/target/product/generic/root/file_contexts
// ... ...
+ ENABLE_SPARSE_IMAGE=
+ '[' out/target/product/generic/system = -s ']'
+ '[' 6 -ne 5 -a 6 -ne 6 ']'
+ SRC_DIR=out/target/product/generic/system
+ '[' '!' -d out/target/product/generic/system ']'
+ OUTPUT_FILE=out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
+ EXT_VARIANT=ext4
+ MOUNT_POINT=system
+ FC=out/target/product/generic/root/file_contexts
+ case $EXT_VARIANT in
+ '[' -z system ']'
+ '[' -n out/target/product/generic/root/file_contexts ']'
+ FCOPT='-S out/target/product/generic/root/file_contexts'
+ MAKE_EXT4FS_CMD='make_ext4fs
-S out/target/product/generic/root/file_contexts -l
-a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system'
+ echo make_ext4fs -S out/target/product/generic/root/file_contexts -l
-a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system
make_ext4fs -S out/target/product/generic/root/file_contexts -l
-a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system
+ make_ext4fs -S out/target/product/generic/root/file_contexts -l
-a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system
Creating filesystem with parameters:
Block size: 4096
Blocks per group: 32768
Inodes per group: 7040
Inode size: 256
Journal blocks: 2200
Blocks: 140800
Block groups: 5
Reserved block group size: 39
Created filesystem with
inodes and 800 blocks
+ '[' 0 -ne 0 ']'
Install system fs image: out/target/product/generic/system.img
out/target/product/generic/system.img+ maxsize= blocksize=2112 total= reserve=5947392
编译完成。
7、运行模拟器在前面 souce build/envsetup.sh中已经添加emulator命令了:
$ emulator
就能跑起一个模拟器了:
8、修改和编译系统应用代码我们修改一下系统应用Mms的标题:使用mm命令编译:
xxx@ubuntu:~/Data/android/packages/apps/Mms$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4.3.2.1.000.000
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_2ND_ARCH=
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
OUT_DIR=out
============================================
make:进入目录'/home/xxx/Data/android'
target R.java/Manifest.java: Mms (out/target/common/obj/APPS/Mms_intermediates/src/R.stamp)
warning: string 'menu_insert_smiley' has no default translation.
target Java: Mms (out/target/common/obj/APPS/Mms_intermediates/classes)
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
Copying: out/target/common/obj/APPS/Mms_intermediates/classes-jarjar.jar
Copying: out/target/common/obj/APPS/Mms_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/APPS/Mms_intermediates/classes.jar
Proguard: out/target/common/obj/APPS/Mms_intermediates/proguard.classes.jar
ProGuard, version 4.10
Reading program jar [/home/xxx/Data/android/out/target/common/obj/APPS/Mms_intermediates/classes.jar]
// ... ...
target Dex: Mms
Copying: out/target/common/obj/APPS/Mms_intermediates/classes.dex
target Package: Mms (out/target/product/generic/obj/APPS/Mms_intermediates/package.apk)
nothing matches overlay file ic_contact_picture.png, for flavor ,,,,,,,,,,,,mdpi,,,,,,,
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
warning: string 'menu_insert_smiley' has no default translation.
warning: string 'menu_insert_smiley' is missing 19 required localizations: az_AZ en_AU en_CA en_GB en_IN en_NZ en_SG en_US eo_EU hy_AM ka_GE km_KH lo_LA mn_MN ne_NP si_LK zh_CN zh_HK zh_TW
dex2oatd I
art/dex2oat/dex2oat.cc:1082] dex2oat: out/host/linux-x86/bin/dex2oatd --runtime-arg -Xms64m --runtime-arg -Xmx64m --boot-image=out/target/product/generic/dex_bootjars/system/framework/boot.art --dex-file=out/target/product/generic/obj/APPS/Mms_intermediates/package.apk --dex-location=/system/priv-app/Mms.apk --oat-file=out/target/product/generic/obj/APPS/Mms_intermediates/package.odex --android-root=out/target/product/generic/system --instruction-set=arm --instruction-set-features=default
dex2oatd I
art/dex2oat/dex2oat.cc:252] dex2oat took 1.s (threads: 8)
Notice file: packages/apps/Mms/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/priv-app/Mms.apk.txt
Install: out/target/product/generic/system/priv-app/Mms.apk
Install: out/target/product/generic/system/priv-app/Mms.odex
// ... ...
Install: out/target/product/generic/data/app/MmsTests.apk
Install: out/target/product/generic/data/app/MmsTests.odex
make:离开目录&/home/xxx/Data/android&
主要是生成了两个文件: out/target/product/generic/system/priv-app/Mms.apkout/target/product/generic/system/priv-app/Mms.odex
9、安装到手机因为是系统应用,为了重启有效,使用push命令把两个文件push到模拟器中对应的位置:
// 注意现在一些核心的应用的位置由以前的system/app调整为了system/priv-app,不要push错了
xxx@ubuntu:~/Data/android$ adb push out/target/product/generic/system/priv-app/Mms.odex system/priv-app
2893 KB/s (2085348 bytes in 0.703s)
xxx@ubuntu:~/Data/android$ adb push out/target/product/generic/system/priv-app/Mms.apk system/priv-app
3315 KB/s (1785258 bytes in 0.525s)
看下模拟器效果:
标题被替换了。类似了,你可以修改framework,替换内核,不过有些需要重启模拟器,有些需要重新编译相关的所以模块,这里只是简单的介绍,以后有机会再细说。
10、小结有了源码,可以学习优秀的代码,可以从历史提交看看它们是如何改进的,可以定制自己的系统样式,可以做的事情很多...
阅读(...) 评论()Android Framework源码当中哪些类有必要进行深入学习?
平时写android程序过程中发现很多东西用得心里没底, 想着阅读一些android的源代码, 请问哪些比较重要或者很值得学习的源码中的类可以学习?
按时间排序
android native framework也很有学习的意义,ServiceManager与Binder设备的关系,以及以MediaPlayService为例与ServiceManager之间的交互两方面搞清楚的话,进程间通信就基本搞清楚了。目前正在学习中,希望能和大家多多交流
contextservicemanager
谢邀,我也是入门不久,只是看了一点点。 我支持 的回答
四大组件相关:Activity, Service/IntentService, BroadcastReceiver, ContentProvider, IntentUI相关:View, ViewGroup, ViewRoot, ViewRootImpl, Scroller, 五大布局类, SurfaceView, Animator, Animation, Window, WindowManager适配器相关:BaseAdapter线程相关:AsyncTask, HandlerThread消息相关:Message, Messenger, MessageQueue, Looper, Handler, Parcelable进程相关:Binder其他:Application, Context, 各种ManagerService,如ActivityManagerService, WindowManagerService, PackageManagerService等。阅读源码这种事情,正确的方法是平时遇到困惑时去查看,养成看源码的习惯。如果毫无目的去阅读,会发现很快就忘掉了,理解也不深刻。
ViewRootImpl这个类非常重要,直接关系着View的绘制流程调用;另外ViewGroup和View 里面事件处理和分发都值得关注。
说说比较熟悉的几个部分吧,之后想到再补充1. 从WindowManagerService出发从WMS出发,可以看到每一个View添加进来的过程,以及系统如何添加一个新的WindowState被WMS进行管理,如何通知SurfaceFlinger去进行View的绘制,每一个Window在WMS中间都是以WindowState为基础进行管理的,WindowState的Client如何通过Binder机制与ViewRoot进行通信,WindowState如何计算每个Window的大小(从PhoneWindowManager调用过来),以及一些SystemUI里面的组件的信息如何通过WMS进行转发,每个Window出现的动画如何调用,Window更新Focus时候的如何进行,每个Window层级如何计算2. 从ActivityManagerService出发AMS和ActivityStackSupervisor对于ActivityStack的管理(moveTaskToBack,moveTaskToFront),ActivityStack与WindowState之间的联系,一个
《Android开发艺术探索》这本书很经典,一楼二楼说的知识点书里基本都涵盖了,而且结构清晰,通俗易懂
设计模式吧
谢邀,题主如果是写应用方面的程序,我觉得大部分代码可以浅读,大体了解流程,不需要抠具体细节,但是还有一部分代码需要我们深读一下,掌握原理。深读:如:View、ViewGroup、AdapterView、ListView、GridView、Window、ViewDragHelper、ItemTouchHelper、SurfaceView、TextureView、VelocityTracker、GestureDetector、Scroller、ScrollerCompat、OverScroller等浅读:WMS、AMS、PMS、NMS、InputSystem等相关实现1. Android事件分发机制:帮助你在写复杂自定义控件时协助解决事件冲突。2. View的测量布局和绘制机制,熟练掌握画布Canvas API、Android坐标系、触控事件等,熟悉绘图技巧、熟悉滑动原理。3. Android动画:熟练掌握动画Tween Animation、Frame Animation、Property Animation,有助于你写出交互体验好的自定义控件。4. Android多线程通信原理、线程控制、线程池、掌握Handler、Looper、ThreadLocal、Thread、Runnable、AsyncTask、HandlerThread、IntentService、Future、FutureTask、Callable等,掌握Java并发编程。5.掌握Android进程间通信原理,试着分析Binder工作机制。5.了解Activity启动过程,可以从startActivity()一步一步分析源码,过程不必拘泥于实现细节,掌握大致流程即可。6.了解四大组件工作过程,和上面一个一样,从源码分析,一步一步来看WMS、AMS、PMS、NMS等如何通过binder完成进程间通信。7.了解window创建过程、掌握window添加删除更新机制。8.理解C如Application对应的Context、Activity对应的Context、Service对应的Context以及Context之间的关系9.掌握Android资源加载机制用的比较多的Java辅助知识点:1. 并发编程:线程池、ThreadLocal、Future、FutureTask、Callable等2.Java动态代理(cglib/jdk)、反射3.Java IO、集合类4.序列化5.注解6.IOC和AOP7.类加载器……以上仅仅是个人见解,待完善,希望对题主有帮助,另外我自己也会分享和整理一些不错的文章、库、项目、资源站到,希望对你有帮助------------------------------------------------分割线-----------------------------------------------------后面有童鞋提到书籍,这里我也想补充下我看过的不错的Android图书,给大家做个参考,另外我也会一直更新MobDevGroup资源,尤其是Android版块的优秀分类文章,遇到不错的都会放上去:郭霖:《第一行代码》徐宜生:《Android群英传》任玉刚:《Android开发艺术探索》何红辉:《Android开发进阶从小工到专家》何红辉、关爱民:《Android源码设计模式解析与实战》柯元旦:《Android内核剖析》包建强:《App研发录:架构设计、Crash分析和竞品技术分析》【韩】金泰延、宋享周、朴知勋、李白、林起永 著-----武传海 译《Android框架揭秘》丰生强:《Android软件安全与逆向分析》-------------------------------------------更新--------------------------------------关于源码我这里列了一张图,可以作为参考,原图地址:
那就从你最常用的看起,这样心里就有底了
ListView控件相关的内容可以看一下,包含回收复用机制,滑动机制。搞明白这个,其他控件就基本也不会有太大问题了
inputsystemwindowmanagerservicepackagemanagerserviceapp的viewsystemactivitymanagerservicesurfaceflinger开机启动流程binder嗯嗯,差不多这些你搞懂了系统方面就没问题了可惜app开发跟framework还是有比较大差别的,至少你了解这些就不会出现你的app报错在framework层你看不懂log的情况而且还能直接跳过app的开发框架,直接使用service来做一些比较有趣的事
几块需要看的1.handler looper 是咋工作的2.touch事件的响应3.view的绘制4.viewgroup的测量与布局5.四大组件常用方法的实现以上是一个android开发务必搞清楚的其余按需求看,形成调用方法时,f2进去看看实现的条件反射阅读源码是逐步进行的,其实不推荐初看源码的人去阅读pms ams wms的代码,大多数人都会知难而退,先了解基本的,常用的,一旦养成那些条件反射,便会逐步揭开那些晦涩难懂模块的幕布,自己觉得幕布揭的差不多了再去系统看,事半功倍。千万记得,直接阅读大量源码对于大多数人来说只会头疼,过几天什么都忘了,那个条件反射才是最重要的。
已有帐号?
无法登录?
社交帐号登录Android FrameWork中的SP、RefBase、weakref_impl,Thread类
在阅读Android的Framework处的代码可以发现,无处不在SP给予了我视觉上的冲击,这个是什么?初级的我,看这个当初就基本当成指针来用,熟不知其的内在美,于是在这里和大家一起学习总结SP类的魅力所在。
1 SP这货是个模板类,让我们看下他的结构。
inline sp() : m_ptr(0) { }
sp(T* other);
sp(const sp& other);
template sp(U* other);
template sp(const sp& other);
// Assignment
sp& operator = (T* other);
sp& operator = (const sp& other);
template sp& operator = (const sp& other);
template sp& operator = (U* other);
void clear();
// Accessors
operator* () const
{ return *m_ }
operator-> () const { return m_
get() const
{ return m_ }
// Operators
COMPARE(==)
COMPARE(!=)
COMPARE(>)
COMPARE(<)
COMPARE(=)
看到了上述的代码结构,瞬间觉得其高大上,作为一个经典的模板类,精懂的人说这个类很好,其实没有过多的去了解他只知道是更好的维护对象。这个SP指针内部有个T* m_ptr成员变量,它是真正指向我们new出来的变量。
我们以sp mA = new A();为例,作为一个模板类的构造函数,调用如下:
sp::sp(T* other)
: m_ptr(other)
if (other) other->incStrong(this);
果然,new出来的A对象被存入到sp的成员变量之中,这里看到对mA对象构建时,会调用A的一个incStrong,这个是什么?阅读过代码的都知道一个RefBase类,他是比sp类更为常见的类,我们看她的结构可以发现内容都较多,但都是一些很特别的东西,
我们看下面的UML图来分析我们之间构建的A为何要继承与RefBase。
可以看到继承了RefBase,那么A的对象有东西可以玩了,调用RefBase的incStrong函数,接着看他的实现,先来个构造函数过过瘾:
RefBase::RefBase()
: mRefs(new weakref_impl(this))
做的东西不多,但是有一个成员变量mRefs,必然他先实现,好吧mRefs被赋&#20540;给了一个wekref_impl这个对象,传入的this就是我们的这个new A()对象,好的接着再看看:
weakref_impl(RefBase* base)
: mStrong(INITIAL_STRONG_VALUE)
, mWeak(0)
, mBase(base)
, mFlags(0)
这里有个mBase,他是一个RefBase类,故按C&#43;&#43;的知识,一个从RefBase继承的A类对象被赋&#20540;给了mBase,那基类的指针mBase就可以访问类A自带的重载的虚函数了,先留着过会就会用到。
回来我们来看这个刚才other->incStrong(),调用的是基类的incStrong,看他的实现:
void RefBase::incStrong(const void* id) const
weakref_impl* const refs = mR//影子对象的refs
refs->incWeak(id);
refs->addStrongRef(id);
const int32_t c = android_atomic_inc(&refs->mStrong);
ALOG_ASSERT(c > 0, "incStrong() called on %p after last strong ref", refs);
#if PRINT_REFS
ALOGD("incStrong of %p from %p: cnt=%d\n", this, id, c);
if (c != INITIAL_STRONG_VALUE)
android_atomic_add(-INITIAL_STRONG_VALUE, &refs->mStrong);
refs->mBase->onFirstRef();//mBase维护着继承类实际对象this指针
这里是增加了对这个指针的引用次数,最重要的一点是关注最后一行代码,在我们写自己类的时候一般都喜欢重载该函数,在这里面对类对象进行必要的初始化。
refs为mRefs,就是我们类A的对象的一个继承成员weakref_impl,该对象有个内部成员mBase,通过上面的分析可知mBase就是指向类A对象的指针,故当访问虚函数时,实际调用的是派生类的重载函数,故最终首次建立一个sp mA 时,就也是所谓的第一次引用吧。
2.学一学Android Native的Thread类
上面介绍了很多的类,在onFirstRef里面可以经常会遇到一个run函数,这是启动一个新线程的方法,那就是你的类A 继承了thread类,从上一UML图可以看到,thread有几个核心的函数,最重要的就是一个run函数。来看她的部分代码:
status_t Thread::run(const char* name, int32_t priority, size_t stack)
Mutex::Autolock _l(mLock);
if (mRunning) {
// thread already started
return INVALID_OPERATION;
// reset status and exitPending to their default value, so we can
// try again after an error happened (either below, or in readyToRun())
mStatus = NO_ERROR;
mExitPending =
mThread = thread_id_t(-1);
// hold a strong reference on ourself
mHoldSelf =
mRunning =
if (mCanCallJava) {
res = createThreadEtc(_threadLoop,
this, name, priority, stack, &mThread);//启动_threadLoop线程
res = androidCreateRawThreadEtc(_threadLoop,
this, name, priority, stack, &mThread);
if (res == false) {
mStatus = UNKNOWN_ERROR;
// something happened!
mRunning =
mThread = thread_id_t(-1);
mHoldSelf.clear();
// "this" may have gone away after this.
return UNKNOWN_ERROR;
// Do not refer to mStatus here: The thread is already running (may, in fact
// already have exited with a valid mStatus result). The NO_ERROR indication
// here merely indicates successfully starting the thread and does not
// imply successful termination/execution.
return NO_ERROR;
// Exiting scope of mLock is a memory barrier and allows new thread to run
上深入的话会比较复杂,但是一点可以肯定的是调用的线程函数是_thread_Loop,看看他的实现:
int Thread::_threadLoop(void* user)
Thread* const self = static_cast(user);//派生类对象转为基类指针
if (first) {
self->mStatus = self->readyToRun();//直接调用继承类的readyToRun
result = (self->mStatus == NO_ERROR);
result = self->threadLoop();
这里的self是什么,实际是我们新建的一个对象,那么首次就是调用类A的操作函数readyToRun(),随后一般是调用threadLoop进入线程的循环,线程的退出主要由threadLoop函数的返回结果来决定。
3. 好了,下面再来看看这个这几个比较常见的过程,会和C&#43;&#43;的多态符合重载有紧密的关系。
比如mA->fun(),一&#30524;看去感觉和普通的指针调用没有区别,但你是否知道mA只是一个sp类的对象,那么这个mA->的操作符是什么?那就是所谓的符合重载,来看sp的几个运算符的重载函数:
operator* () const
{ return *m_ }
operator-> () const { return m_
get() const
{ return m_ }
很好,可以看到他的实现,不需要输入参数,返回一个m_ptr,m_ptr是什么,前面说过他是我们new A()出来的一个对象,那么调用的就是类A所属的成员函数.类&#20284;的还有:
sp& sp::operator = (T* other)
if (other) other->incStrong(this);
if (m_ptr) m_ptr->decStrong(this);
template template
sp& sp::operator = (const sp& other)
T* otherPtr(other.m_ptr);
if (otherPtr) otherPtr->incStrong(this);
if (m_ptr) m_ptr->decStrong(this);
m_ptr = otherP
分别是对指针与引用的赋&#20540;操作。
上述的Android Framework里面会经常遇到这些细节性的问题,了解这些基本类往往可以做到事半功倍,代码更加心领神会!
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 有必要 php源代码 的文章

 

随机推荐