Google刚刚公布,稳定版的Android源代码已经公布,任何人都可以免费下载。Google希望通过公布源代码,电信运营商和手机制造商,乃至一般开发者们进一步深刻了解和利用Android系统,从而有益于该平台下的的发展。
看来T-Mobile G1不一定打得过iPhone,那么Android呢?
现在源代码公布在http://source.android.com/,SDK网站是http://code.google.com/android/
‘贰’ 大牛们是怎么阅读 Android 系统源码的
由于工作需要大量修改framework代码, 在AOSP(Android Open Source Project)源码上花费了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用类的实现, 在Android包管理器里把源码下载下来, 随便一个IDE配好Source Code的path看就行.
但如果想深入的了解Android系统, 那么可以看下我的一些简单的总结.
知识
java
Java是AOSP的主要语言之一. 没得说, 必需熟练掌握.
熟练的Android App开发
linux
Android基于Linux的, 并且AOSP的推荐编译环境是Ubuntu 12.04. 所以熟练的使用并了解Linux这个系统是必不可少的. 如果你想了解偏底层的代码, 那么必需了解基本的Linux环境下的程序开发. 如果再深入到驱动层, 那么Kernel相关的知识也要具备.
Make
AOSP使用Make系统进行编译. 了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.
Git
AOSP使用git+repo进行源码管理. 这应该是程序员必备技能吧.
C++
Android系统的一些性能敏感模块及第三方库是用C++实现的, 比如: Input系统, Chromium项目(WebView的底层实现).
硬件
流畅的国际网络
AOSP代码下载需要你拥有一个流畅的国际网络. 如果在下载代码这一步就失去耐心的话, 那你肯定没有耐心去看那乱糟糟的AOSP代码. 另外, 好程序员应该都会需要一个流畅的Google.
一台运行Ubuntu 12.04的PC.
如果只是阅读源码而不做太多修改的话, 其实不需要太高的配置.
一台Nexus设备
AOSP项目默认只支持Nexus系列设备. 没有也没关系, 你依然可以读代码. 但如果你想在大牛之路走的更远, 还是改改代码, 然后刷机调试看看吧.
高品质USB线
要刷机时线坏了, 没有更窝心的事儿了.
软件
Ubuntu 12.04
官方推荐, 没得选.
Oracle Java 1.6
注意不要用OpenJDK. 这是个坑, 官方文档虽然有写, 但还是单独提一下.
安装:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default
Eclipse
估计会有不少人吐槽, 为什么要用这个老古董. 其实原因很简单, 合适. 刚开始搞AOSP时, 为了找到效率最优的工具, 我尝试过Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最终结果还是Eclipse. 主要优点有:
有语法分析 (快速准确的类, 方法跳转).
支持C++ (IntelliJ的C++支持做的太慢了).
嵌入了DDMS, View Hierarchy等调试工具.
为了提高效率, 花5分钟背下常用快捷键非常非常值得.
调整好你的classpath, 不要导入无用的代码. 因为AOSP项目代码实在是太多了. 当你还不需要看C++代码时, 不要为项目添加C++支持, 建索引过程会让你崩溃.
Intellij IDEA
开发App必备. 当你要调试系统的某个功能是, 常常需要迅速写出一个调试用App, 这个时候老旧的Eclipse就不好用了. Itellij IDEA的xml自动补全非常给力.
巨人的肩膀
这个一定要先读. 项目介绍, 代码下载, 环境搭建, 刷机方法, Eclipse配置都在这里. 这是一切的基础.
这个其实是给App开发者看的. 但是里面也有不少关于系统机制的介绍, 值得细读.
此老罗非彼老罗. 罗升阳老师的博客非常有营养, 基本可以作为指引你开始阅读AOSP源码的教程. 你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:
早期的博客是基于旧版本的Android;
大量的代码流程追踪. 读文章时你一定要清楚你在看的东西在整个系统处于什么样的位置.
邓凡平老师也是为Android大牛, 博客同样很有营养. 但是不像罗升阳老师的那么系统. 更多的是一些技术点的深入探讨.
Android官方Issue列表. 我在开发过程中发现过一些奇怪的bug, 最后发现这里基本都有记录. 当然你可以提一些新的, 有没有人改就是另外一回事了.
一定要能流畅的使用这个工具. 大量的相关知识是没有人系统的总结的, 你需要自己搞定.
其它
代码组织
AOSP的编译单元不是和git项目一一对应的, 而是和Android.mk文件一一对应的. 善用mmm命令进行模块编译将节省你大量的时间.
Binder
这是Android最基础的进程间通讯. 在Application和System services之间大量使用. 你不仅要知道AIDL如何使用, 也要知道如何手写Binder接口. 这对你理解Android的Application和System services如何交互有非常重要的作用. Binder如何实现的倒不必着急看.
HAL
除非你对硬件特别感兴趣或者想去方案公司上班, 否则别花太多时间在这一层.
CyanogenMod
这是一个基于AOSP的第三方Rom. 从这个项目的wiki里你能学到很多AOSP官方没有告诉你的东西. 比如如何支持Nexus以外的设备.
DIA
这是一个Linux下画UML的工具, 能够帮你梳理看过的代码.
XDA
这里有最新资讯和最有趣的论坛.
想到了再补充.
‘叁’ 现在到哪获取android系统源代码
Android系统源码都在http://android.git.kernel.org/网址下,其中那个系统app都在platform/packages/apps结构下。
在刚才的Git的shell命名行窗口中输入下面的命名:
git clone git://android.git.kernel.org/platform/packages/apps/Luancher2.git
你就可以在你的msysGit安装目录的git下(~\msysgit\msysgit\git)看到Luancher工程文件夹了。
然后打开~\msysgit\msysgit\git\Luancher2文件夹,就可以看到Android的Luancher系统源码工程了。
对于其他的app系统源码的获取方法和上述的Luancher相同,只是命名行后的参数不同。
git clone git://android.git.kernel.org/需下载源码的app所在的位置。
‘肆’ 自己可以编译安卓源码吗
用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:
sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”
其中[email protected]为你自己的邮箱.
简要说明
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.
源码下载
由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)
repo工具下载及安装
通过执行以下命令实现repo工具的下载和安装
mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:
我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:
这里写图片描述
执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.
错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:
通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)
如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.
结束吧
到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.
‘伍’ androidstudio导入系统源码,附可导入源码工程-Android API31
清华大学镜像站
可能遇上编译时jdk版本问题,需要多个jdk切换
进入根目录
用android studio直接打开android.ipr就可以了
已编译源码工程分享
‘陆’ ARM芯片单片机(如SoC的RK3399),如何虚拟安卓系统云手机
也许是答非所问。假设你问的是往rk3399主板上安装android。这需要android源码编译运行,国内清华的源(不能直接访问谷歌),yonglinux系统去make,make后的代码用adc或其他方式发送(烧写进去)到主板上,主板就能安卓了。编译其cpu或其他驱动是最麻烦的了,关于你问的如果不是这个意思,而是打算在android上再虚拟一个Android,可以找一下双开系统的相关资料(github或其他源码网址去找一下。小米我记得开源了,但不清楚开源到哪种程度,有可能的话可以借鉴一下源代码)。
‘柒’ 如何编译lineage不支持的机型
device文毕友件,android_device_$your-device-name
kernel文件,android_kernel_$your-device-name
vendor文件,android_vendor_$your-device-name
收集或者制作或者修改,完成,你的机型文件后
清华镜像源,打开看教程(同步出错有问题就手猜槐网络,一般都有答案,系统最好在Linux和他的各种分支中选择>经常用Windows-觉得Mac很反人类-不过开发商好像很喜欢-可能是苹果给出的条件太好-没人能拒绝,我觉得Ubuntu不错,也很喜欢Deepin-适合新手-国内维护挺不错的)
然后整理MK文件:
也可以点这里,去官网找一下相关机型或品牌文件作为参考
比如我的手机是ZUK EDGE
##ZUKEDGE
#我的机型代号-z2x,这个是开发用的代号;
#我的内部机型-z2151,这个是从官方下载开源部分需要的型号;
#ZUK特殊部分其他机型不一定会有一般就是三个:device、kernel、vendor(非必有)
#<类型name="仓库名"path="文件路径"/>
<android
name="lineage"
path="~/bin/lineage"/>
<device
name="android_device_zuk_z2"
path="$android/device/zuk/z2x"/>
<device
name="android_device_zuk_msm8996-common"
path="$android/device/zuk/msm8996-common"/>#ZUK特殊部分
<kernel
name="android_kernel_zuk_msm8996"
path="$android/kernel/zuk/msm8996"/>#这个命名比较特别,打包开发的
<!--附加部分,vendor一般有生成脚本或者需要额外编写-->
<vendor
name="android_vendor_z2x"
path="$android/vendor/zuk/z2x"/>
<vendor
name="android_vendor_msm8996-common"
path="$android/vendor/zuk/msm8996-common"/>#ZUK特殊部分
#end
######错误部分,可以查阅,帮助理解,最好跳过,跳过
把上面的文件解包放置到相应文件夹下
device文件,android_device_$your-device-name
kernel文件,android_kernel_$your-device-name
vendor文件,android_vendor_$your-device-name"_"对应是一个文件夹分层,比如device就是在“android源码“文件夹下(看你怎么起名字,就是清华网站中提示你的“WORKING_DIRECTORY”文件夹,可以是‘android’、‘lineage’等等)的device文件夹下,你的机子品牌文件夹下,你的机型里(比如我的手机是ZUK EDGE-我是穷逼,没钱换机,我的相应机型代号就是z2x-根据代号搞开发,内部机型z2151-根据内部型号找官方开源代码,以下示例)
示例:
device:android_device_zuk_z2x
仓库文件就在:~/bin/lineageOS/device/zuk/z2x
kernel:android_kernel_zuk_msm8996#为什么这个忽然变成msm8996了呢,哈哈|
仓库文件就在:~/bin/lineageOS/kernel/zuk/msm8996#因为机型特别
vendor:android_vendor_zuk_z2x#一般是不提供这个仓库部分的,
#会有比如“extract-files.sh”等脚本
#需要连接你的手机,生成这些文件
以上引号部分是由网络自动保存编写错误部兆弊分
sourcebuild/envsetup.sh
lunchlineage_z2x-userdebug#这条命令去查看机型文件夹下的lineage_*.mk文件,把z2x换成你的
cddevice/zuk/z2x#这条应该是你的机型文件夹,和下一条命令看情况找找你的vendor扩展脚本
./extract-files.sh#这个看情况,找找你的脚本
croot#返回lineage根目录
make-j8#开始编译ROM,后面的-j*是线程,看你的CPU而定
#看输出log,编译完成ROM在out文件夹下
这样就完成了:
看似简单,实则简单,但是肯定会出错,因为你是在学习,好好学,好好问问,学会用网络,别跟个愣头B一样,张嘴就是:我是小白,这个怎么弄,我不会啊,你教教我呗,这个什么意思;崽种不会自己学
‘捌’ 怎样查看 Android APP 源代码
用压缩软件打开apk文件,解压出根目录中的classes.dex文件
使用cmd ,dex2jar.bat classes.dex命令将classes.dex转换为jar
再用jd-gui打开该jar就可以查看源码了,如果apk安全性好的话,有些代码是看不到的
‘玖’ 为什么在清华镜像下载的frameworks/base的Android源码中找不到AMS、WMS这些类
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。