Windows 中 使用python 一鍵下載android r代碼

爲了在window方便看代碼,所以下載google原生android r代碼,寫了一段python腳本方便下載

1.  安裝GIT

git官網下載:https://git-scm.com/downloads/

安裝git到如下路徑  C:/Program Files/Git

2.  安裝PYTHON

python官網下載:https://www.python.org/downloads/

安裝python到如下路徑 C:/Program Files/python

3.  下載代碼

拷貝如下腳本保存到本地到文件download_android_r.py,使用cmd命令行進入到剛剛下載文件的目錄執行python download_android_r.py下載代碼到本地目錄

import os
from subprocess import call
from os import (popen,makedirs, chdir, symlink)
from xml.dom import (Node,minidom)
from os.path import (isdir, sep, dirname, exists)
google_addr='https://android.googlesource.com/'
tsinghua_addr='https://aosp.tuna.tsinghua.edu.cn/'
download_addr=tsinghua_addr if True else google_addr
 
android_manifest_git=download_addr+'platform/manifest.git'
kernel_common_git=download_addr+'kernel/common.git'
kernel_exynos_git=download_addr+'kernel/exynos.git'
kernel_goldfish_git=download_addr+'kernel/goldfish.git'
kernel_hikey_linaro_git=download_addr+'kernel/hikey-linaro.git'
kernel_msm_git=download_addr+'kernel/msm.git'
kernel_omap_git=download_addr+'kernel/omap.git'
kernel_samsung_git=download_addr+'kernel/samsung.git'
kernel_tegra_git=download_addr+'kernel/tegra.git'
kernel_x86_64_git=download_addr+'kernel/x86_64.git'
 
def downloadAndroidSource(path='', name='',down_dir=sep.join(['d:','android_source']), manifest = False, goldfish = False):
    if not isdir(down_dir):
        makedirs(down_dir)
    goldfish_dir = sep.join([down_dir,'goldfish'])
    manifest_dir = sep.join([down_dir,'manifest'])
    android_source = sep.join([down_dir,'android_r'])
 
    # 1. 打印一句話
    print('down start ')
    # 2. 修改爲源碼要保存的路徑
    if not os.path.exists(android_source):
        os.mkdir(android_source)
 
    # 3. 使用清華源下載地址
    prefix ="git clone {}".format(download_addr)
    suffix = ".git"
 
    # 下載manifest函數
    def downloadManifest():
        print('down manifest')
        if not isdir(manifest_dir):
            chdir(down_dir)
            call('git clone {}'.format(android_manifest_git))
            if exists(manifest_dir):
                chdir(manifest_dir)
                call('git checkout android-r-preview-4')
            else:
                print('git clone {} error'.format(android_manifest_git))
        else:
            chdir(manifest_dir)
            call('git pull')
 
 
    # 下載kernel函數
    def downloadGoldfish():
        print('down goldfish')
        if not isdir(goldfish_dir):
            chdir(down_dir)
            call('git clone {}'.format(kernel_goldfish_git))
            if exists(goldfish_dir):
                chdir(goldfish_dir)
                call('git checkout android-goldfish-4.9-dev')
            else:
                print('git clone {} error'.format(kernel_goldfish_git))
        else:
            chdir(goldfish_dir)
            call('git pull')
 
 
    # 下載某一個模塊函數
    def downloadMode(rootdir, path, name):
        chdir(rootdir)
        print('downloadMode path={} -> name={}'.format(path, name))
        if not exists(path):
            last = path.rfind("/")
            if last != -1:
                d = rootdir + "/" + path[:last]
                if not exists(d):
                    makedirs(d)
                chdir(d)
            print('{}{}{}'.format(prefix, name, suffix))
            call(prefix + name + suffix)
        else:
            chdir(rootdir+'/'+path)
            call('git pull')
 
    #拷貝文件
    def copyfile(src, dest):
        if not exists(dest):
            print('copyfile src={} -> dest={}'.format(src, dest))
            if not isdir(dirname(dest)):
                makedirs(dirname(dest))
            copyfile(src, dest)
    #創建連接文件
    def linkfile(src, dest):
        if not exists(dest):
            print('linkfile src={} -> dest={}'.format(src, dest))
            if not isdir(dirname(dest)):
                makedirs(dirname(dest))
            symlink(src, dest)
 
     # 4. 下載goldfish
    if goldfish:
        downloadGoldfish()
 
     # 5. 下載manifest
    if manifest or not isdir(manifest_dir):
        downloadManifest()
 
    rootdir = android_source
    if path and name:
        # 6.可以根據manifest文件中的path和namne下載單個模塊
        downloadMode(rootdir, path, name)
    else:
        # 6.根據 manifest 中 default.xml 下載所有模塊
        dom = minidom.parse(sep.join([manifest_dir,'default.xml']))
        root = dom.documentElement
        for node in root.getElementsByTagName("project"):
            path = node.getAttribute("path")
            name = node.getAttribute("name")
            if path and name:
                pass#print(path+' -> '+name)
                #downloadMode(rootdir, node.getAttribute("path"), node.getAttribute("name"))
            for child in [child for child in node.childNodes if child.nodeType == Node.ELEMENT_NODE]:
                print(child)
                src = child.getAttribute("src")
                dest = child.getAttribute("dest")
                if child.tagName == 'copyfile':
                    copyfile(src, dest)
                elif child.tagName == 'linkfile':
                    linkfile(src, dest)
 
    #創建驅動軟連接goldfish -> android_r/kernel/goldfish
    if isdir(goldfish_dir):
        linkfile(goldfish_dir,sep.join([android_source,'kernel','goldfish']))
 
if __name__ == '__main__':
    email = popen('git config user.email').read().splitlines()[0]
    if email == '[email protected]':#下載框架代碼
        download_dict = {
            'frameworks/base':'platform/frameworks/base',
            'frameworks/native':'platform/frameworks/native',
            'hardware/libhardware':'platform/hardware/libhardware',
            'hardware/interfaces':'platform/hardware/interfaces'
        }
        for (path, name) in download_dict.items():
            downloadAndroidSource(path=path, name=name, goldfish=False)
    else:
        downloadAndroidSource()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章