android记账本源码(Android源码解析Window系列第(一)篇---Window的基本认识和Activity的加载流程)
本文目录
- Android源码解析Window系列第(一)篇---Window的基本认识和Activity的加载流程
- 如何调试跟踪Android Framework源代码
- android 记账本app功能为何无法实现 代码见补充
- android 源码 怎么只编译 systemui
- 没有android内核的系统源代码应该怎么利用
- 不知谁有基于android的错题本系统源码!
- 怎么用git查看本地android源码改动
Android源码解析Window系列第(一)篇---Window的基本认识和Activity的加载流程
您可能听说过View ,ViewManager,Window,PhoneWindow,WindowManager,WindowManagerService,可是你知道这几个类是什么关系,干嘛用的。概括的来说,View是放在Window中的,Window是一个抽象类,它的具体实现是PhoneWindow,PhoneWindow还有个内部类DecorView,WindowManager是一个inte***ce,继承自ViewManager,它是外界访问Window的入口,,提供了add/remove/updata的方法操作View,WindowManager与WindowManagerSerice是个跨进程的过程,WindowManagerService的职责是对系统中的所有窗口进行管理。如果您不太清楚,建议往下看,否则就不要看了。
Android系统的Window有很多种,大体上来说,Framework定义了三种窗口类型;
这就是Framework定义了三种窗口类型,这三种类型定义在WindowManager的内部类LayoutParams中,WindowManager讲这三种类型 进行了细化,把每一种类型都用一个int常量来表示,这些常量代表窗口所在的层,WindowManagerService在进行窗口叠加的时候,会按照常量的大小分配不同的层,常量值越大,代表位置越靠上面, 所以我们可以猜想一下,应用程序Window的层值常量要小于子Window的层值常量,子Window的层值常量要小于系统Window的层值常量。 Window的层级关系如下所示。
上面说了Window分为三种,用Window的type区分,在搞清楚Window的创建之前,我们需要知道怎么去描述一个Window,我们就把Window当做一个实体类,给我的感觉,它必须要下面几个字段。
实际上WindowManager.LayoutParams对Window有很详细的定义。
提取几个重要的参数
Window是一个是一个抽象的概念,千万不要认为我们所看到的就是Window,我们平时所看到的是视图,每一个Window都对应着一个View,View和Window通过ViewRootImpl来建立联系。有了View,Window的存在意义在哪里呢,因为View不能单独存在,它必须依附着Window,所以有视图的地方就有Window,比如Activity,一个Dialog,一个PopWindow,一个菜单,一个Toast等等。
通过上面我们知道视图和Window的关系,那么有一个问题,是先有视图,还是先有Window。这个答案只有在源码中找了。应用程序的入口类是ActivityThread,在ActivityThread中有performLaunchActivity来启动Activity,这个performLaunchActivity方法内部会创建一个Activity。
如果activity不为null,就会调用attach,在attach方法中通过PolicyManager创建了Window对象,并且给Window设置了回调接口。
PolicyManager的实现类是Policy
这样Window就创建出来了, 所以先有Window,后有视图,视图依赖Window存在 ,再说一说视图(Activity)为Window设置的回调接口。
Activity实现了这个回调接口,当Window的状态发生变化的时候,就会回调Activity中实现的这些接口,有些回调接口我们还是熟悉的,dispatchTouchEvent,onAttachedToWindow,onDetachedFromWindow等。
下面分析view是如何附属到window上的,通过上面可以看到,在attach之后就要执行callActivityOnCreate,在onCreate中我们会调用setContentView方法。
getWindow获取了Window对象,Window的具体实现类是PhoneWindow,所以要看PhoneWindow的setContentView方法。
这里涉及到一个mContentParent变量,他是一个DecorView的一部分,DecorView是PhoneWindow的一个内部类,我先介绍一下关于DecorView的知识。
DecorView是Activity的**VIew,DecorView继承自FrameLayout,在DecorView中有上下两个部分,上面是标题栏,下面是内容栏,我们通过PhoneWindow的setContentView所设置的布局文件是加到内容栏(mContentParent)里面的,View层的事件都是先经过DecorView在传递给我们的View的。
OK在回到setContentView的源码分析,我们可以得到Activity的Window创建需要三步。
- 1、 如果没有DecorView,在installDecor中创建DecorView。
- 2、将View添加到decorview中的mContentParent中。
- 3、回调Activity的onContentChanged接口。
先看看第一步,installDecor的源码
installDecor中调用了generateDecor,继续看
直接给new一个DecorView,有了DecorView之后,就可以加载具体的布局文件到DecorView中了,具体的布局文件和系统和主题有关系。
在看第二步,将View添加到decorview中的mContentParent中。
直接将Activity视图加到DecorView的mContentParent中,最后一步,回调Activity的onContentChanged接口。在Activity中寻找onContentChanged方法,它是个空实现,我们可以在子Activity中处理。
到此DecorView被创建完毕,我们一开始从Thread中的handleLaunchActivity方法开始分析,首先加载Activity的字节码文件,利用反射的方式创建一个Activity对象,调用Activity对象的attach方法,在attach方法中,创建系统需要的Window并为设置回调,这个回调定义在Window之中,由Activity实现,当Window的状态发生变化的时候,就会回调Activity实现的这些回调方法。调用attach方法之后,Window被创建完成,这时候需要关联我们的视图,在handleLaunchActivity中的attach执行之后就要执行handleLaunchActivity中的callActivityOnCreate,在onCreate中我们会调用setContentView方法。通过setContentView,创建了Activity的**View---DecorView,DecorView的内容栏(mContentParent)用来显示我们的布局。 这个是我们上面分析得到了一个大致流程,走到这里,这只是添加的过程,还要有一个显示的过程,显示的过程就要调用handleLaunchActivity中的handleResumeActivity方法了。最后会调用makeVisible方法。
这里面首先拿到WindowManager对象,用tWindowManager 的父接口ViewManager接收,ViewManager可以
最后调用 mDecor.setVisibility(View.VISIBLE)设置mDecor可见。到此,我们终于明白一个Activity是怎么显示在我们的面前了。
参考链接:
***隐藏网址***
如何调试跟踪Android Framework源代码
本文讲解如何在Eclipse中导入Android源代码(包括Framework和Application的代码),然后通过模拟器或真机跟踪/调试Android的Java代码,区别于一般基于Android SDK的纯应用开发,这里可以跟踪/调试Framework中的代码。
一、准备工作
确保机器上已经安装并配置下列软件环境:JDK/ Eclipse / Android SDK / ADT
即,机器上已经安装了Eclipse下Android应用开发所需的环境。如果还未配置,移步《搭建Windows下Android应用开发环境——Eclipse/Android/ADT》。
另外,为了跟踪调试Android源码,你还需要有Android源码,并有源码的编译环境,可以是:
虚拟机环境 虚拟机中安装Linux,Linux下编译Android源码。此环境下,如果要在宿主机的Eclipse中调试,还需要把Android的源码路径共享出来,宿主机可访问到;
有单独的可编译Android的网络环境 在你的客户端的机器**问服务器共享出来的Android的源码路径;
Linux环境下直接通过Eclipse跟踪调试本机上的Android源码。
-Xms40m
-Xmx384m
-Xms128m
-Xmx512m
先启动机器(模拟器启动,或真机打开,并通过USB与PC正常连接),也就是要在DDMS Perspective的Devices视图中看到有机器连接;
确保运行中的代码与你要调试的代码是一样的。
把鼠标放在某个变量上,看它的值。也可以Eclipse中的各种调试手段调试你的代码。
通过Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控制程序的执行。
本文讲解是基于Windows环境的,但是不仅适用于Windows环境,同样适用于Mac OS和Linux系统,只是一些路径和使用方式有差别;
可以跟踪/调试所有Android中Java的源码(无论Framework的代码,还是App中的代码),并不能Debug Framework中的c/c++ code;
为了使整个项目在Eclipse中都能编译过,.classpath中也包含了out/里编译生成的内容,所以必须保证Android源码是已经编译过的。
跟踪/调试的前提是要在所要调试代码处设置断点,并知道该处代码执行在哪个进程中。
- ===================================================================================================================
注意:不管哪种工作方式,Android源码要都是已经编译过的,且编译时采用的是Eng模式(vs User mode)。编译Android Platform和Kernel的过程,可参考《Ubuntu10.10下编译Android2.2平台》及《Ubuntu10.10下编译Android2.2内核》。
二、基本设置
准备工作完毕之后,现在做一些基本的设置。
***隐藏网址***
2. 修改Eclipse的设置
修改eclipse.ini文件,更改下列内容:
view plaincopy
改为:
view plaincopy
这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。
三、Eclipse中创建工程
1. File 》 New 》 Java Project
2. 输入项目名
3. 取消Use default location,并在Location中输入或选择Android源码路径《Android_ROOT》
4. 选择Next 》 Finish。会有一个漫长的等待过程
新建的工程可能会有错误,根据错误提示,加入或者删除项目中配置的程序包。
四、调试环境配置
1. 右击刚刚在#3中创建的项目;
2. 选择:Debug As 》 Debug Configurati***…;
3. 右击“Remote Java Application”,选择New。或者直接双击“Remote Java Application”创建一个新的Remote Application。
4. 填入Name;Project选择刚刚创建的项目Android2.3.7;端口填写8700(不一定是8700,到DDMS Perspective下的Device View中看所需的端口号)。
5. Apply保存,然后退出。
五、调试
可以通过模拟器或者真机调试。
无论模拟器还是真机,都要:
假如,我们想要跟踪锁屏解锁的调用情况。
我们知道解锁的实现是在LockScreen.java的onGrabbedStateChange()函数,运行在system_process进程中。
那么,
1. 在onGrabbedStateChange()中要调试的地方设置断点;
2. 在Device View中,选中system_process,并点击小爬虫图标;
3. 用Section#4创建的Debug配置,Debug;
4. 在模拟器或真机上,执行到解锁操作时,代码就会停在断点处;
这样你就可以,
总结
通过本文可以:
如果导入的工程有错误,可以参照下面方法操作。
===================================================================================================================
我们导入一个android自带应用的工程时,往往有很多错误。以自带的 AlarmClock 为例,导入eclipse后,往往出现很多错误,如下图所示:
例如,上图中的Intent.ACTION_ALARM_CHANGED 无法访问,下面我们就找到源代码看看原因何在?
根据java 编程规范,我们知道这个api (静态变量)被隐藏掉了,所以在sdk中无法使用。在知道了原因之后,我们有几种解决方案(建议使用方法二):
1. 自己将源代码中的@hide去掉,然后编译一个sdk来替换默认的sdk。
在linux上使用 make PRODUCT-sdk-sdk 命令,编译一个新的sdk出来,注意编译后其实我们不需要整个sdk,只需要android.jar这个文件替换掉sdk里的android.jar,例如:笔者的sdk里的jar对应的目录为:
F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar
具体编译sdk的方法是,在linux编译环境下用命令 make PRODUCT-sdk-sdk ,成功后,会有如下提示:
Package SDK: out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86.zip
我们进入到 linux编译环境的 out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86/platforms/android-2.2/目录下可以看到android.jar 文件。使用此文件替换 F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar 即可。替换前记得备份
此方法较为麻烦,建议使用方法二
2. 添加framework 编译出来的class.jar文件到 eclipse的build path
其实在编译android的时候,我们将framework 编译到一个临时的jar包中了,这个jar包的路径一般为:
out/target/common/obj/J**A_LIBRARIES/framework_intermediates/classes.jar
我们只需要在linux上android源代码目录下使用make 命令即可生成此文件。
由于这个jar文件中的api 还没有重新打包,里面被@hide掉的api并没有被去掉。所以我们依然能够引用里面
被@hide的api 。而sdk 中的android.jar文件时重新打包生成的,其里标记有@hide的api已经被去掉了。
所以我们把 out/target/common/obj/J**A_LIBRARIES/framework_intermediates/classes.jar 拷贝到本地pc上。
然后在工程中添加此jar包。
具体方法:
1 . 拷贝linux编译生成的 out/target/common/obj/J**A_LIBRARIES/framework_intermediates/classes.jar到本机PC。
2,在eclipse的Android项目中,选择项目属性-》Java Build Path-》Libraries-》Add Library-》User Library-》Next-》 UserLibraries进入到User Libraries管理界面,点击New新建一个User Library,比如android_framework,点击Add Jars把Jar包加入到建立的User Library中,最后点击OK。
3.选择项目属性-》Java Build Path-》Order and Export,把所建立的User Libraries移到Android SDK的上面。
如下图:
之后我们的工程错误消失了:
android 记账本app功能为何无法实现 代码见补充
你要看设置一个断点看看Exception exp 是什么。或者打个Log看一下
下一步根据问题来Google(当然你有思路就不用Google了)
我猜是你没有写权限到Mainfest里面。
android 源码 怎么只编译 systemui
Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,下载的代码包经过解压后(这里是Android2.2的源码包),源代码的第一层目录结构如下:-- Makefile-- bionic (bionic C库)-- bootable (启动引导相关代码)-- build (存放系统编译规则及generic等基础开发包配置)-- cts (Android兼容性测试套件标准)-- dalvik (dalvik J**A虚拟机)-- development (应用程序开发相关)-- external (android使用的一些开源的模组)-- frameworks (核心框架——java及C++语言)-- hardware (主要保护硬解适配层HAL代码)-- libcore -- ndk -- device -- out (编译完成后的代码输出与此目录)-- packages (应用程序包)-- prebuilt (x86和arm架构下预编译的一些资源)-- sdk (sdk及模拟器)-- system (文件系统库、应用及组件——C语言)`-- vendor (厂商定制代码)bionic 目录-- libc (C库) -- arch-arm (ARM架构,包含系统调用汇编实现) -- arch-x86 (x86架构,包含系统调用汇编实现) -- bionic (由C实现的功能,架构无关) -- docs (文档) -- include (头文件) -- inet -- kernel (Linux内核中的一些头文件) -- netbsd (?netbsd系统相关,具体作用不明) -- private (?一些私有的头文件) -- stdio (stdio实现) -- stdlib (stdlib实现) -- string (string函数实现) -- tools (几个工具) -- tzcode (时区相关代码) -- unistd (unistd实现) `-- zoneinfo (时区信息)-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)-- libm (libm数学库的实现,) -- alpha (apaha架构) -- amd64 (amd64架构) -- arm (arm架构) -- bsdsrc (?bsd的源码) -- i386 (i386架构) -- i387 (i387架构?) -- ia64 (ia64架构) -- include (头文件) -- man (数学函数,后缀名为.3,一些为****BSD的库文件) -- powerpc (powerpc架构) -- sparc64 (sparc64架构) `-- src (源代码)-- libstdc++ (libstdc++ C++实现库) -- include (头文件) `-- src (源码)-- libthread_db (多线程程序的调试器库) `-- include (头文件)`-- linker (动态链接器) `-- arch (支持arm和x86两种架构)bootable 目录-- bootloader (适合各种bootloader的通用代码) `-- legacy (估计不能直接使用,可以参考) -- arch_armv6 (V6架构,几个简单的汇编文件) -- arch_m**7k (高通7k处理器架构的几个基本驱动) -- include (通用头文件和高通7k架构头文件) -- libboot (启动库,都写得很简单) -- libc (一些常用的c函数) -- nandwrite (nandwirte函数实现) `-- u**loader (u**loader实现)-- diskinstaller (android镜像打包器,x86可生产iso)`-- recovery (系统恢复相关) -- edify (升级脚本使用的edify脚本语言) -- etc (init.rc恢复脚本) -- minui (一个简单的UI) -- minzip (一个简单的压缩工具) -- mtdutils (mtd工具) -- res (资源) `-- images (一些图片) -- tools (工具) `-- ota (OTA Over The Air Updates升级工具) `-- updater (升级器)build目录-- core (核心编译规则)-- history (历史记录)-- libs `-- host (主机端库,有android “cp”功能替换)-- target (目标机编译对象) -- board (开发平台) -- emulator (模拟器) -- generic (通用) -- idea6410 (自己添加的) `-- sim (最简单) `-- product (开发平台对应的编译规则) `-- security (密钥相关)`-- tools (编译中主机使用的工具及脚本) -- acp (Android "acp" Command) -- apicheck (api检查工具) -- applypatch (补丁工具) -- apriori (预链接工具) -- atree (tree工具) -- bin2a** (bin转换为a**工具) -- check_prereq (检查编译时间戳工具) -- dexpreopt (模拟器相关工具,具体功能不明) -- droiddoc (?作用不明,java语言,网上有人说和JDK5有关) -- fs_config (This program takes a list of files and directories) -- fs_get_stats (获取文件系统状态) -- iself (判断是否ELF格式) -- isprelinked (判断是否prelinked) -- kcm (按键相关) -- lsd (List symbol dependencies) -- releasetools (生成镜像的工具及脚本) -- rgb2565 (rgb转换为565) -- signapk (apk签名工具) -- soslim (strip工具)`-- zipalign (zip archive alignment tool)dalvik目录 dalvik虚拟机.-- dalvikvm (main.c的目录)-- dexdump (dex反汇编)-- dexlist (List all methods in all concrete classes in a DEX file.)-- dexopt (预验证与优化)-- docs (文档)-- dvz (和zygote相关的一个命令)-- dx (dx工具,将多个java转换为dex)-- hit (?java语言写成)-- libcore (核心库)-- libcore-disabled (?禁用的库)-- libdex (dex的库)-- libnativehelper (Support functi*** for Android’s class libraries)-- tests (测试代码)-- tools (工具)`-- vm (虚拟机实现)development 目录 (开发者需要的一些例程及工具)-- apps (一些核心应用程序) -- BluetoothDebug (蓝牙调试程序) -- CustomLocale (自定义区域设置) -- Development (开发) -- Fallback (和语言相关的一个程序) -- FontLab (字库) -- GestureBuilder (手势动作) -- NinePatchLab (?) -- OBJViewer (OBJ查看器) -- SdkSetup (SDK安装器) -- SpareParts (高级设置) -- Term (远程登录) `-- launchperf (?)-- build (编译脚本模板)-- cmds (有个monkey工具)-- data (配置数据)-- docs (文档)-- host (主机端USB驱动等)-- ide (集成开发环境)-- ndk (本地开发套件——c语言开发套件)-- pdk (Plug Development Kit)-- samples (演示程序) -- AliasActivity () -- ApiDemos (API演示程序) -- BluetoothChat (蓝牙聊天) -- BrowserPlugin (浏览器插件) -- BusinessCard (商业卡) -- Compass (指南针) -- ContactManager (联系人管理器) -- CubeLiveWall** (动态壁纸的一个简单例程) -- FixedGridLayout (像是布局) -- GlobalTime (全球时间) -- HelloActivity (Hello) -- Home (Home) -- JetBoy (jetBoy游戏) -- LunarLander (貌似又是一个游戏) -- MailSync (邮件同步) -- MultiResolution (多分辨率) -- MySampleRss (RSS) -- NotePad (记事本) -- RSSReader (RSS阅读器) -- SearchableDictionary (目录搜索) -- **JNI (JNI例程) -- SkeletonApp (空壳APP) -- Snake (snake程序) -- SoftKeyboard (软键盘) -- Wiktionary (?维基) `-- Wiktionary**(?维基例程)-- scripts (脚本)-- sdk (sdk配置)-- simulator (?模拟器)-- testrunner (?测试用)`-- tools (一些工具)
没有android内核的系统源代码应该怎么利用
1. 获取源代码
在cd ~/myandroid/kernel中执行以下命令
git clone git://android.git.kernel.org/kernel/common.git
这需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。
然后进入到common目录,然后用下面的命令来取得goldfish分支:
git checkout origin/android-goldfish-2.6.27 -b goldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。
可以通过git branch来列出本地的所有分支。
2. 在Host OS上准备编译环境
尽管很多人安装完Ubuntu后第一件事情就是装上build-essential,不过我在这里还是要提醒一下大家,另外做menuconfig的时候ncurses-devel库也是必须的。运行以下命令,一次搞定:
sudo apt-get install build-essential ncurses-dev
3. 准备交叉编译工具链
Android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。如果你拿了完整的Android platform 的代码树,它就会在prebuilt目录下。如果没有拿完整的代码树也没有关系,只要用Git clone一个或者到从GitWeb下载一个prebuilt项目 ,如果是从GitWeb下载的话记得解压缩就行。
4. 设定环境变量
把prebuilt中的arm-eabi编译器加入$PATH
$export PATH=$PATH:/myandroid/androidsrc/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
设定目标arch为arm
$export ARCH=arm
打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器
CROSS_COMPILE ?= arm-eabi-
把
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
$(call ld-option, -Wl$(comma)–build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:
LDFLAGS_BUILD_ID =
下面的这段解释来自陈罡的blog
把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
对这个–build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:
***隐藏网址***
5、从SDK中获得内核配置文件
大家都知道,内核编译中有一步make menuconfig,用于配置kernel。这里我们可以先获取官方的配置,如果必要的话再作改动。先启动模拟器 emulator -avd xxxx ,然后通过adb pull命令(该命令用于从设备上复制文件到本地)即可完成。
$adb pull /proc/config.gz ~/
现在我们用gunzip把config.gz解开,把得到的config文件移动到kernel source所在的目录,然后重命名为.config即可。
$ gunzip config.gz
$ mv config ~/sources/goldfish-kernel/.config
6、开始编译
因为我们之前已经把SDK中.config复制到了kernel目录下,如果需要修改配置,可以使用
make menuconfig
修改并保存配置,如果没有特殊需要的话就可以直接用
make
命令来编译内核了
7、测试生成的zImage
编译内核的过程应该很顺利,因为默认的配置对内核作了大幅的精简,大约5~6分钟就可以编译完成了,会在最终会在arch/arm/boot目录下面生成一个zImage,这个就是我们所要的运行在模拟器上的内核映像了。
下面我们就在模拟器中测试一下我们所生成的zImage。
emulator avd xxx -kernel ./zImage
其中xxx是**D名称 ,如果想输出kernel log,请加上-show-kernel参数。
关于为实际设备编译kernel
如果要为一个实际的设备比如说G1重新编译内核映像,步骤和上述为一个运行在模拟器上的内核映像步骤基本一致,只是所需要的源代码应当来自主线而不是goldfish分支。另外,编译完成以后载入映像的方式也不同,需要通过USB将映像烧入nand flash。
不知谁有基于android的错题本系统源码!
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的底层实现).
怎么用git查看本地android源码改动
首先你拷贝的源码有用git管理版本,最简单的查看方法是看看那个目录下有没有 .git 目录,注意这是个隐藏目录,需要显示隐藏的文件才能看到
然后你电脑上需要有git环境
然后就可以进入你想看的有.git的目录,
如果别人修改的android源码没有用git提交,直接在这个目录下执行 git status命令查看修改了哪些文件,git diff是查看所有修改文件的具体修改内容,或者git diff path 查看单独某个文件的修改(path是一个文件的路径,比如 aa/bb.txt 就是查看aa路径下的bb.txt文件修改的具体内容)
如果别人修改的android源码已经提交了,可以使用git log查看以前的提交信息,每次提交会有一个id,git log之后出现的类似
commit cbbe72c134feb5146101a86bda88e36fd93f7a5b
这样的后面的cbbe72c134feb5146101a86bda88e36fd93f7a5b就是那次提交的id,
git diff cbbe72c134feb5146101a86bda88e36fd93f7a5b就可以看那次提交的修改了
更多文章:
数据结构 菜鸟教程(python 代码中 ret=True 代表什么意思)
2026年4月9日 03:20
click15杨策出什么事了(click15杨策出什么事了)
2026年4月9日 03:00
沪深300指数市盈率(沪深300(000300)的市盈率在哪里可以看)
2026年4月9日 02:20
漂亮好看的html加载页(html海报网页制作-怎样制作html网页)
2026年4月9日 02:00
如何求 y的补码(设x=+10110101 y=-01101110 分别求x y的原码,补码,反码)
2026年4月9日 01:20
android详细教程(Android Camera2 教程 · 第一章 · 概览)
2026年4月9日 00:40







