Android 系统核心或驱动的开发之Android repo 魔法

Android系统定制开发:ROM制作工具集详解 htmltable {th, td {th {pre {简介:ROM在电子设备中代表固件或操作系统,而Android ROM定制则是通过DIY方式对手机系统进行个性化改造与功能优化。本文介绍的“制作ROM工具集”涵盖从获取AOSP源码、搭建编译环境、修改系统组件到最终测试发布的完整流程,帮助用户掌握Android系统级开发技能。 阅读详情

Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。  

Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将 百多个 Git 库有效的进行组织。要想克隆和管理这百多个 Git 库,还真不是一件简单的事情。

在研究 Repo 的过程中,发现很多文档在 Google Group 上,非 “ 翻墙 ” 不可看。非法的事情咱不干,直接阅读 repo 的代码吧。

创建本地 Android 版本库镜像的思路

如果了解了 Repo 的实现,参考   《 Using Repo and Git 》   , 建立一个本地的 android 版本库镜像还是不难的:

·             下载 repo bootstrap 脚本

·                    $ curl http://android.git.kernel.org/repo >~/bin/repo

·                    $ chmod a+x ~/bin/repo

$ export PATH=$PATH:~/bin

·             提供 –mirror 参数调用 repo init ,建立 git 版本库克隆

$ repo init -u git://android.git.kernel.org/platform/manifest.git --mirror

o                使用 –morror 则下一步和源同步的时候,本地按照源的版本库组织方式进行组织,否则会按照 manifest.xml 指定的方式重新组织并检出到本地

·             开始和源同步

$ repo sync

·             修改 manifest ,修改 git 库地址,指向本地的 git 服务器

o                修改 platform/manifest.git 库中现有的 xml 文件,或者创建一个新的 xml 文件

o                将 git 的地址改为本地地址,提交并 push

·             本地 repo 镜像建立完毕之后,就可以在执行 repo init 时,使用本地更改后的 manifest 库,之后执行 repo sync 就是基于本地版本库进行同步了。

·             也可以改造 repo ,使得不必为 repo 工具初始化,也在本地网络完成操作 …

Repo init 干了些什么?

实际上,得到客户使用 repo 的信息后,首先下载 repo 执行脚本开始研究。

curl http://android.git.kernel.org/repo >~/bin/repo

难道只有 600 行的 python 代码么?要是这样应该很简单的呀。可以看下来,却发现远非如此。

Shell script or python ?

首先 repo 脚本使用了一个魔法:从脚本第一行的 shebang 来看应该是 shell 脚本,但是满眼却都是 python 语法,怎么回事?

  1 #!/bin/sh

  2

  3 ## repo default configuration

  4 ##

  5 REPO_URL='git://android.git.kernel.org/tools/repo.git'

  6 REPO_REV='stable'

  7

  8 # Copyright (C) 2008 Google Inc.

   ...

 

22 magic='--calling-python-from-/bin/sh--'

23 """exec" python -E "$0" "$@" """#$magic"

24 if __name__ == '__main__':

25   import sys

26   if sys.argv[-1] == '#%s' % magic:

27     del sys.argv[-1]

28 del magic

魔法就在第 23 行,巧妙的通过 python 三引号字串写出了一个能被 python 和 shell script 都能理解的代码,以此为界,代码由 Shell 脚本进入了 Python 的世界。

Bootstrap 和真正的 repo

通过 curl 下载的的 repo 并非完整的 repo 脚本,只是一个 bootstrap 。当 repo 执行时,会负责下载完整的 repo 代码,并将控制权转移给真正的 repo 。

通过 main 函数,可以看到 repo 运行的开始,就试图发现本地真正的完整的 repo 代码,以便移交控制权:

544 def main(orig_args):

545   main, dir = _FindRepo()

 

586   try:

587     os.execv(main, me)

其中 545 行的 _FindRepo() 会在当前目录开始向上递归查找 “.repo/repo/main.py” ,如果找到则移交控制权( 587 行)。

Repo bootstrap 脚本调用 init 只完成第一阶段的初始化

Repo 的 bootstrap 脚本只支持两个命令 help 和 init ,而 init 也只完成 repo 版本库克隆(即安装 repo 完整工具),之后就转移控制权。

在 Repo bootstrap 执行 init 可以提供很多参数,但实际上第一阶段初始化,只用到两个参数(而且都有默认值)

·             参数: –repo-url=URL
repo
工具本身的 git 库地址。缺省为: git://android.git.kernel.org/tools/repo.git

·             参数: –repo-branch=REVISION
使用 repo 的版本库,即 repo git 库的分支或者里程碑名称。缺省为 stable

第二阶段的 repo init

执行第二阶段的 repo init ,控制权已经移交给刚刚克隆出来的 repo git 库的脚本。

Repo git 库被克隆 / 检出到执行 repo init 命令当前目录下的 .repo/repo 子目录中,主要的执行脚本为 .repo/repo/main.py 。 main.py 接着执行 repo init 命令。

Repo 的代码组织的非常好,在 .repo/repo/subcmds/ 子目录下,是各个 repo 命令的处理脚本。 repo init 的第二阶段脚本正是由 .repo/repo/subcmds/init.py 负责执行的。第二阶段主要完成:

·             克隆由 -u 参数提供的 manifest Git 库,如克隆 android 库时:

$ repo init -u git://android.git.kernel.org/platform/manifest.git

·             如果不提供 -b REVISION 或者 –manifest-branch=REVISION 参数,则检出 manifest Git 库的 master 分支

·             如果不提供 -m NAME.xml 或者 –manifest-name=NAME.xml 参数,则使用缺省值 default.xml

·             如果提供 –mirror 参数,则后续同步操作会有相应的体现

Repo start 干了些什么?

Android 源码网站在介绍 repo 的使用模型中,有一个图片: http://source.android.com/images/git-repo-1.png , 介绍了 repo 的使用流程。其中 “repo start” 是紧接着 “repo sync” 后的第一个动作。那么这个动作是干什么的呢?

得益于 repo 对 git 操作的封装, ”repo start” 命令的处理代码只有区区 68 行。

  37   def Execute(self, opt, args):

 

 41     nb = args[0]

 

 47     projects = []

  48     if not opt.all:

  49       projects = args[1:]

 

 54     all = self.GetProjects(projects)

 

  57     for project in all:

 

  59       if not project.StartBranch(nb):

  60         err.append(project)

看到第 59 行了么,就是对 repo 同步下来的项目的多个 Git 版本库,逐一执行 project.StartBranch 操作。 nb 是 repo start 的第一个参数,即分支名称。

关于 StartBranch 的代码,在 project.py 中:

  857   def StartBranch(self, name):

  858     """Create a new branch off the manifest's revision.

  859     """

 

  894     if GitCommand(self,

  895                   ['checkout', '-b', branch.name, revid],

  896                   capture_stdout = True,

  897                   capture_stderr = True).Wait() == 0:

  898       branch.Save()

  899       return True

原来如此, repo start 就是逐一为各个版本库创建工作分支,以便在此分支下进行工作。

读者可以按图索骥,找到 repo 各个命令的实现,破解心中的疑惑。

 

来自:http://www.oschina.net/bbs/thread/12187

树莓派c语言串口通讯程序 在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一 阅读详情

相关推荐

微信小程序通过MQTT协议实现智能家居远程控制——基于阿里云物联网平台

本文详细介绍了如何利用微信小程序与MQTT协议,结合阿里云物联网平台,构建一套完整的智能家居远程控制系统。文章从平台配置、MQTT协议核心概念、小程序开发实战到单片机端对接,提供了全链路实践指南,并重点阐述了通过规则引擎实现消息路由与设备绑定的关键步骤,帮助开发者快速实现安全、稳定的自定义智能家居解决方案。

1208

[参考] Android 系统核心或驱动的开发之Android repo 魔法

Android 系统核心或驱动的开发之Android repo 魔法  Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本

jeffbao的专栏 572

【已验证】基于STM32F407与AD9833的幅频特性测试装置设计与实现

本文详细介绍了基于STM32F407微控制器和AD9833 DDS芯片的低成本幅频特性测试装置设计与实现方法。通过扫频原理,该装置能自动生成正弦波信号,测量滤波器等电路的输出幅度变化,并在LCD屏幕或示波器上绘制幅频特性曲线。文章提供了从硬件选型、CubeMX工程配置、关键驱动代码编写到数据处理与可视化的完整教程,帮助电子爱好者与工程师快速搭建实用的滤波器测试工具。

weixin_35649491的博客 120

Android repo 魔法

本文转载自:http://www.worldhello.net/2010/08/31/1915.html 本文是repo的高级说明,讲述repo的实现原理,一般可以不用理会。 Android repo 魔法 Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立

温陵布衣的专栏 1688

ROST_CM6软件之词频分析、社会网络和语义网络分析、情感分析

简介 ROST CM 6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。 社会网络和语义网络分析(S) 数据 注意,保存时编码要为ANSI 所以这里需要转换一下 准备自定义表与停词表 例如 同时,点击快速分析后,将会弹出网络图 对网络图进行设置 对布局进行设置 对节点、边进行设置 最终效果图 修改 情感分析

积一时之步,臻千里之遥程 9万+

服务器安装Ubuntu 18.04.2 LTS超详细步骤(小白图文详解)

服务器安装Ubuntu 18.04.2 LTS超详细步骤(小白图文详解) 本文不包括启动盘制作步骤,相关内容可自行百度 华为服务器 1 插入u盘,关机重启 2 初始化界面后进入到系统的BIOS设置界面 (华为服务器按Del键,不同品牌方法不同) 3 进入的时候,华为的服务器默认设置了BIOS密码,因此需要输入之前预设的密码。 注意密码大小写问题,若密码输错三次,则需重启 4 密码输入以后,进入...

crystalbang的博客 2万+

Android源码学习(3)Android repo 魔法

(注:本文转载自群英会博客,原文作者蒋鑫。蓝色文字为我的备注) Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码

jinxinliu1的专栏 477

零基础Python实战:手把手教你用PyGame制作动态烟花效果(附完整代码)

本文为零基础Python编程爱好者提供了一份详细的PyGame实战教程,手把手教你从环境搭建到代码实现,逐步构建一个动态烟花模拟器。教程涵盖了粒子系统、物理模拟(重力与阻力)、效果优化(拖尾与爆炸形态)以及完整的交互式主程序,帮助你通过Python烟花代码项目深入理解图形编程与面向对象设计。

weixin_29062255的博客 257

repo用法详解

转载地址是:http://blog.youkuaiyun.com/changjiang654/article/details/6253769 Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作

sunweizhong1024的专栏 8万+

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

大连网龙网络科技有限公司专注于在信息科技领域中向客户提供商业解决方案,是专业的互联网服务解决方案提供商和网络营销服务专家,为用户提供一体化的网络营销整体解决方案,龙腾CMS downloadFile接口存在任意文件读取漏洞。

薛定谔嘚喵博客 720

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2496

用repo创建本地 Android 版本库镜像的思路

Android repo 魔法Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。Android 使用 Git

shuwu 5399

IP-Guard分类管理详解

大家都知道在配置IPGUARD策略前需要做分类库进行设置和分类。 1、应用程序:可以分类,例如上班时间只能用OFFICE和WPS,记事本等办公软件,可以在分类里设置一个类 ;办公软件,在未分类里找到OFFICE,WPS等拖入心建的分类里就可以在配置策略里调用。 2、网站分类也不一样,可以按照自己方式自定义。也可以导入厂家已经收集到的网站分类。 3、邮箱分类:可以提前定义好一个或...

IP-Guard专栏 589

repo使用

1 介绍 Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令

fe学习之旅 824

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Repo--管理仓库的版本控制工具(一)

Repo 简介 Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分...

陈粤鹏的博客 1020

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Repo使用详解

Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了Repo 命令行工具,对 Git 部分命令封装,将 百多

Kslient的博客 2679

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

repo命令详解

Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将...

程序员之路-Stay Hungry. Stay Foolish. 93

repo

Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。 Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将

850
上一篇: RGB YUV的来历及相互转换
下一篇: Activity的启动
lb015331
博客等级 码龄19年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值