Android源代码下载的方式目前一般都是使用Git来下载对应版本的包路径default.xml文件,然后使用脚本语言解析此xml文件来进行下载。目前,使用最多的就是Python编写的脚本来进行下载,参考此篇博客文章:。但是这个Python下载脚本有问题,用此脚本下载,并没有下载xml包路径下的所有源代码文件。而且,最主要的就是Android源代码越来越大,很少人能够一天就下载下来,此外,如果遇见电脑断电等,某个包没下完还要手动去删除来重新下载,有点麻烦。正好正在学习Lua语言,所以自己就动手使用Lua语言编写了个能完整下载Android源代码的下载脚本。
此篇文章是在你已经获得了default.xml文件后继续操作的步骤,如何获得default.xml文件,请参考此文章。
要能够使用此Lua脚本,你必须要安装Lua,Lua的下载地址为:http://code.google.com/p/luaforwindows/downloads/list
-- path为你要存放源代码的目录,一定要是\\,不支持/,会出错找不到目录
-- 若目录名字有空格,应该使用“”括起来,“”要转义,如下的\"Program Files\"
-- git为你git的安装目录
-- C:/Users/wenwei/manifest/default.xml为default所在的目录,根据你下载的路径进行替换
-- 脚本运行会在同级目录在生成data.msg文件,请不要删除或者移动到其它地方
require("LuaXml")
local path="D:\\code2\\src4.4"
local git="D:\\\"Program Files\"\\Git\\bin\\git.exe"
local file=xml.load("C:/Users/wenwei/manifest/default.xml")
local suffix=".git"
local url=git.." clone http://android.googlesource.com/"
local DownLoadedPathTable={}
local dlData=io.open("data.msg","r")
if dlData ~= nil then
for data in dlData:lines() do
if type(data)=="string" and data ~= "" and data ~=" " then
data=string.gsub(data,"^%s*(.-)%s*$","%1")
table.insert(DownLoadedPathTable,data)
end
end
else
print("已下载包数据信息文件不存在!若是第一次下载,请忽略此信息!")
end
function find(tag)
local tab={}
tab.path={}
tab.name={}
for i=1,#file,1 do
local attri=file[i]
if type(attri)=="table" then
if attri[0]==tag then
table.insert(tab.path,attri.path)
table.insert(tab.name,attri.name)
end
end
end
return tab
end
local pro=find("project")
for i=1,#pro.path,1 do
pro.path[i]=string.gsub(pro.path[i],"/","\\")
end
for k,v in pairs(DownLoadedPathTable) do
for k1,v1 in pairs(pro.path) do
if v==v1 then
pro.path[k1]=nil
pro.name[k1]=nil
break
end
end
end
if pro ~=nil then
local check="if not exist "..path.." md "..path
os.execute(check)
for k,v in pairs(pro.path) do
local pathsrc=path.."\\"..v
local command="if not exist "..pathsrc.." ( md "..pathsrc..") else ( rd /s/q "..pathsrc..")"
os.execute(command)
local dl=url..pro.name[k]..suffix.." "..pathsrc
os.execute(dl)
local file=io.open("data.msg","a+")
if file ~= nil then
file:write(v)
file:write("\n")
file:close()
end
end
end