美文网首页
没有Linux机器,也能一睹AOSP

没有Linux机器,也能一睹AOSP

作者: 签到钱就到 | 来源:发表于2017-12-29 18:26 被阅读356次
    AOSP
    :什么是AOSP?
    :"Android Open-Source Project"的缩写。中文意为"Android 开放源代码项目",简单描述就是Android手机系统的源代码。那些乱七八糟的UI定制、功能开发,高通、MTK、展讯等平台都是基于这个AOSP的二次开发、三次开发。另外,很多讲解Android源代码的书,或多或少都需要结合AOSP来阅读。

    按照Google的官方教程下载编译整个Android源码也是一个劳民伤财的巨大工程。首先得有linux环境,内存要大,硬盘也要大,cpu不能差,这里不多介绍了。网络上教程资源很多,可以搜索查看。

    本文要讲得是在不需要编译、不需要获取所有源码,只是想看看Android的部分源码的前提下,介绍一种简便获取AOSP的方法。

    本文核心:用python脚本,从manifest文件中,一个一个获取到最新的git仓库里的代码。

    本文是根据Windows 环境下载 Android 源码整理而来。

    1. 熟悉镜像服务器

    下面介绍了替换Google服务器的一种镜像下载方式。

    2. 安装Python、git环境

    • 建议安装Python3
    • 配置Git代理

    当获取时出现下面类似Maximum (20) redirects followed的错误,请尝试配置代理。(在公司需要代理才能访问外网,访问内网时需要去除代理)

    Cloning into 'base'...
    fatal: unable to access 'http://mirrors.tuna.tsinghua.edu.cn/aosp/platform/frameworks/base.git/': Maximum (20) redirects followed
    

    设置代理:
    git config --global http.proxy http://proxy.abc.com:80
    git config --global https.proxy https://proxy.abc.com:80
    取消代理:
    git config --global --unset http.proxy
    git config --global --unset https.proxy

    3. 开始表演

    1. 下载manifest清单,并找到自己想要的版本

    打开git命令行,输入:
    git clone https://aosp.tuna.tsinghua.edu.cn/platform/manifest.git

    $ git clone https://aosp.tuna.tsinghua.edu.cn/platform/manifest.git
    Cloning into 'manifest'...
    remote: Counting objects: 6742, done.
    remote: Compressing objects: 100% (4462/4462), done.
    remote: Total 6742 (delta 2433), reused 3160 (delta 1013)
    Receiving objects: 100% (6742/6742), 2.65 MiB | 2.14 MiB/s, done.
    Resolving deltas: 100% (2433/2433), done.
    Checking connectivity... done.
    

    里面除了 git 的配置目录外,clone 下来了一个 default.xml 文件。

    可以git branch -a先查看一下版本信息

    $ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/adt_23.0.3
      remotes/origin/afw-test-harness-1.5
      remotes/origin/afw-test-harness-2.1
      remotes/origin/afw-test-harness-marshmallow-dev
      remotes/origin/afw-test-harness-nougat-dev
      remotes/origin/android-1.6_r1
    

    找到自己想要的那个版本,checkout出来,下面我checkout的是android-5.1.1_r9,一下子从master分支,切到了android-5.1.1_r9分支。

    money@qiandao MINGW32 /f/Gerrit/manifest (master)
    $ git checkout remotes/origin/android-5.1.1_r9
    Note: checking out 'remotes/origin/android-5.1.1_r9'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b <new-branch-name>
    
    HEAD is now at 7e381b0... Manifest for Android 5.1.1 release 9
    
    money@qiandao MINGW32 /f/Gerrit/manifest ((android-5.1.1_r9))
    

    2. 配置Python脚本

    需要调整的内容:

    • 下载源码的目录:rootdir = "F:/Android/source/android-5.1.1_r9"
    • Git安装路径:默认情况下是C:/Program Files (x86)/Git/bin/git.exe,如果安装到别处,自己调整,注意斜杠正反
    • manifest文件夹下的defult.xml文件路径:F:/Gerrit/manifest/default.xml
    • 下面的代码我只下载了framework的,其他的可以根据根目录自己定制,如果需要下载全部,可以删除那个if条件。
    import xml.dom.minidom
    import os
    from subprocess import call
     
    #downloaded source path
    rootdir = "F:/Android/source/android-5.1.1_r9"
     
    #git program path
    git = "C:/Program Files (x86)/Git/bin/git.exe"
     
    dom = xml.dom.minidom.parse("F:/Gerrit/manifest/default.xml")
    root = dom.documentElement
     
    prefix = git + " clone https://aosp.tuna.tsinghua.edu.cn/"
    suffix = ".git"
     
    if not os.path.exists(rootdir):
        os.mkdir(rootdir)
     
    for node in root.getElementsByTagName("project"):
        os.chdir(rootdir)
        mPath = node.getAttribute("path")
        d = mPath
        last = d.rfind("/")
        if last != -1:
            d = rootdir + "/" + d[:last]
        if not os.path.exists(d):
            os.makedirs(d)
        os.chdir(d)
    #    print(d)
        if(mPath.startswith("framework")):
            print(mPath)
            cmd = prefix + node.getAttribute("name") + suffix
            call(cmd)
    

    运行之后:

    F:\myGitHub\myPython3>python f:/Gerrit/manifest/getAOSP.py
    F:/Android/source/android-5.1.1_r9/frameworks
    Cloning into 'av'...
    remote: Counting objects: 191197, done.
    remote: Compressing objects: 100% (59552/59552), done.
    remote: Total 191197 (delta 137158), reused 182217 (delta 129436)
    Receiving objects: 100% (191197/191197), 42.13 MiB | 2.42 MiB/s, done.
    Resolving deltas: 100% (137158/137158), done.
    Checking connectivity... done.
    Checking out files: 100% (2900/2900), done.
    F:/Android/source/android-5.1.1_r9/frameworks
    Cloning into 'base'...
    remote: Counting objects: 2559919, done.
    remote: Compressing objects: 100% (562974/562974), done.
    remote: Total 2559919 (delta 1652150), reused 2555075 (delta 1647444)
    Receiving objects: 100% (2559919/2559919), 2.39 GiB | 1.99 MiB/s, done.
    Resolving deltas: 100% (1652150/1652150), done.
    Checking connectivity... done.
    Checking out files: 100% (27359/27359), done.
    

    后面就可以阅读源码了。。。用Source insight?或者其他更好的?我也不清楚了,我也是刚学。

    不过我听我的小伙伴说,用linux下编译出来的某个东西,可以导入到Android Studio或Eclipse里查看或者调试framework层的源码。

    后面有时间会整理推荐一些大牛的博客。

    相关文章

      网友评论

          本文标题:没有Linux机器,也能一睹AOSP

          本文链接:https://www.haomeiwen.com/subject/bqfwgxtx.html