‘壹’ 拿到android 项目源码后,如何才能以最高效的速度看懂
1.显然Eclipse不是阅读Android源码的好工具,不流畅,搜索低效,继承性关系/调用关系都无法有效查看。推荐Source Insight,在这个工具帮助下,你才可以驾驭巨大数量的Android 源码,你可以从容在java,C++,C代码间遨游,你可以很快找到你需要的继承关系。
顺便,我们公司一直是Windows+Linux+Samba的工作模式。
2.宏观上看,Android源码分为功能实现上的纵向,和功能拓展上的横向。在阅读源码时需要把握好着两个思路。
譬如你需要研究音频系统的实现原理,纵向:你需要从一个音乐的开始播放追踪,一路下来,你发现Jni调用解码库,共享内存的创建和使用,路由的切换,音频输入设备的开启,音频流的开始。
3.Android的功能模块绝大部分是C/S架构,你心里一定需要有这个层级关系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城。然后你才能发现HAL和Kernel一层层地剥离。
我大概在三个月前阅读完Android UI系统的源码,这是Android最复杂的部分,没有之一。
我需要先找一个开头,和UI有直接关系的就是最常见的Activity了吧,我就从它开始解剖。
我从Activity的创建入手,寻找Activity真正的创建位置,setContentview这个方法很明显和UI有关,这两方面一结合,我发现了ViewRoot和WindowManager的身影,沿着WM和WMS我发现了Surface,以及draw的函数,它居然在Activity 创建时出现的DeCorView上画东西。借助Source Insight我总结了UI Java层的横向静态图。
完成这个静态UML,我觉得我可以开始功能实现上追踪了,这部分主要是C++的代码(这也是我坚定劝阻的放弃Eclipse的原因),我沿着draw函数,看到了各个层级的关系,SurfaceSession的控制和事务处理,SharedBuffer读写控制,彪悍的SurfaceFlinger主宰一切,OpenGL ES的神笔马良。FrameBuffer和FrameBufferDevice的图像输出。一气呵成的完成了。
‘贰’ 谁有android应用案例开发大全源代码
《Android应用案例开发大全》是以Android手机综合应用程序开发为主题,通过11个典型范例全面且深度地讲解了单机应用、网络应用、商业案例、2D和3D游戏等多个开发领域。
全书共分12章,主要以范例集的方式来讲述Android的开发应用,详细介绍了Android的移动查询系统、数据库客户端、网络游戏开发、动态壁纸游戏、移动管理系统、导航与地图开发(LBS)、Web端和移动客户端开发、单机项目移动开发、传感器和3D游戏开发、电子阅读器等主流的应用。随书光盘中包括了所有范例的源程序,并对程序进行了详细的注释。
‘叁’ 如何在Android源码下编译自己的项目
在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈Android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解).
本文适用于Ubuntu 16.04上编译Android 6.0.*,其他情况请酌情处理,自行参考官网吧.
请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:
sudo apt-get install git
git config –global user.email “[email protected]”
git config –global user.name “test”
‘肆’ 初学android studio如何保存项目源码全部保存也太大了,有40左右mb!
从Eclipse中导出1.将你的ADT插件版本升级到22.0以上。2.在Eclipse中,选择File-->Export。3.在弹出的导出窗口中,打开Android的文件夹,选择“GenerateGradleBuildFiles”。4.选中你想要导入到AndroidStudio中的项目,Finish。PS:导出的项目将会和原来的项目在同一目录,覆盖原来的同时,会新增一个叫build.gradle的文件,导入AndroidStudio时将首先读取这个文件。导入到AndroidStudio1.在AndroidStudio中,首先关掉你当前的打开的项目。2.在欢迎界面,点击ImportProject(注:也是可以直接在菜单选择Importproject的)3.选中你在Eclipse中导出的项目,目录,点击build.gradle文件,然后OK4.在之后的弹出对话框中,会要求你选择Gradle的配置,选中Usegradlewrapper.(注:也可以自定义你本机装的Gradle)PS:如果没有Gradebuild文件,也是可以将普通的安卓项目导入到AndroidStudio中,它会用现有的Antbuild.但为了更好地使用之后的功能和充分使用构建变量,还是强烈地建议先从ADT插件中生成Gradle文件再导入AndroidStudio~~~
‘伍’ 求android安卓完整项目源码,用SQLite数据库的,项目别太小。 感谢!
没有人会把项目免费送你的。。。
‘陆’ android 源码哪里下载
什么乱七八糟的,官方参考网站是 source.android.com 查看原帖>>
‘柒’ android源码里有哪些比较好的算法或框架推荐
Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数
手机
用户来说,他们主要也就是根据这些方面的功能来对系统那个进行修改。我们可以通过本文介绍的Android多媒体框架的源码解读,来具体分析一下这方面的基本知识。
Android多媒体框架的代码在以下目录中:external/opencore/。这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:
* android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author。
* baselibs:包含数据结构和线程安全等内容的底层库
* codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现
* engines:包含PVPlayer和PVAuthor引擎的实现
* extern_libs_v2:包含了khronos的OpenMAX的头文件
* fileformats:文件格式的据具体解析(parser)类
* nodes:编解码和文件解析的各个node类。
* oscl:操作系统兼容库
* pvmi: 输入输出控制的抽象接口
* protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容
* pvcommon:pvcommon库文件的Android.mk文件,没有源文件。
* pvplayer:pvplayer库文件的Android.mk文件,没有源文件。
* pvauthor:pvauthor库文件的Android.mk文件,没有源文件。
* tools_v2:编译工具以及一些可注册的模块。
Splitter的定义与初始化
以wav的splitter为例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。
我们由底往上看,vwavfileparser.cpp中的PV_Wav_Parser类有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成员函数,此类应该就是最终的解析类。我们搜索PV_Wav_Parser类被用到的地方可知,在PVMFWAVFFParserNode类中有PV_Wav_Parser的一个指针成员变量。
再搜索可知,PVMFWAVFFParserNode类是通过PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()类构造函数中通过PVPlayerNodeInfo类被注册到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。
由上可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。
综述一下splitter的定义与初始化过程:
每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。
每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。
播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。
在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成员变量中。
当前Splitter的匹配过程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid。
从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:
android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数
1.{"setDataSource", "(Ljava/lang/String;)V", (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径
3.status_t MediaPlayer::setDataSource(const char *url)
此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());
然后新建一个IMediaPlayer变量, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));
在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)中
调status_t MediaPlayerService::Client::setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。
在MediaPlayerService::Client::setDataSource中,调sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)
生成一个继承自MediaPlayerBase的PVPlayer实例。
‘捌’ 有没有适合 Android 开发初学者的 App 源码推荐
如果是初学者的话,建议先看看sdk中的sample,这些项目都是google提供的研究价值蛮高的,先从java基础开始学起吧。