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