zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  最近想学习Android开发,可是SDK Manager的下载速度太慢了。电脑开了一整天,SDK包还没有下载完。

  在网上搜索了一下如何快速下载Android SDK。发现一文——《利用迅雷快速下载官方Android SDK》(http://vc4j.com/archives/21.html)。

  该方法确实不错,但存在三个问题——

1.因官网更新,“repository.xml”已过时,上面没有所需要的Android SDK。

2.xml文件中的信息很多,找到自己所需的SDK比较费神。而且一般需要下载多个文件(platform、sample、doc、add-on)。

3.当找到文件名后,要手动合并路径。这样枯燥、机械的操作让人厌烦。

 

  所以我希望有一个工具,能实现——

1.能够像SDK Manager一样,找到所有Android SDK。

2.能够处理xml,只显示Android SDK文件信息。

3.自动生成下载地址,不需要手动合并路径。最好能做成下载链接,点一下就可让下载工具进行下载,而不需要“复制->切换到下载工具->新建任务->粘贴->确定->切换到浏览器->...”这样机械的循环。

 

  怎样才能做出这样的工具呢?虽然现在有很多种编程工具支持xml。但很明显,使用网页+JavaScript的方案是最合适的。无需安装,直接显示,而且天生支持下载工具。

  我以前写了一套JavaScript兼容不同浏览器的xml函数库(zyllibjs_xml.js),正好能拿来用一下。可惜后来发现,只有IE默认支持跨域访问。而跨域访问在其他浏览器下,需要做一些复杂的配置。

 

 

(1)——使用xsl转换xml,得到核心SDK的下载地址

 

1.1 xml数据

 

  首先,我们得知道存放了Android SDK文件地址的xml在哪里。

  打开SDK Manager,点击右下角的按钮弹出“log”窗口——

 

  观察后发现,核心SDK的下载地址是在这个地址——

https://dl-ssl.google.com/android/repository/repository-5.xml

 

  将repository-5.xml下载下来,观察其结构。摘录部分——

    <sdk:platform>
<sdk:version>1.1</sdk:version>
<sdk:api-level>2</sdk:api-level>
<sdk:revision>1</sdk:revision>
<sdk:description>Android SDK Platform 1.1_r1</sdk:description>
<sdk:desc-url>http://developer.android.com/sdk/android-1.1.html</sdk:desc-url>
<sdk:obsolete/>
<sdk:archives>
<sdk:archive arch="any" os="windows">
<sdk:size>46828615</sdk:size>
<sdk:checksum type="sha1">a4060f29ed39fc929c302836d488998c53c3002e</sdk:checksum>
<sdk:url>android-1.1_r1-windows.zip</sdk:url>
</sdk:archive>
<sdk:archive arch="any" os="macosx">
<sdk:size>45584305</sdk:size>
<sdk:checksum type="sha1">e21dbcff45b7356657449ebb3c7e941be2bb5ebe</sdk:checksum>
<sdk:url>android-1.1_r1-macosx.zip</sdk:url>
</sdk:archive>
<sdk:archive arch="any" os="linux">
<sdk:size>45476658</sdk:size>
<sdk:checksum type="sha1">c054d25c9b4c6251fa49c2f9c54336998679d3fe</sdk:checksum>
<sdk:url>android-1.1_r1-linux.zip</sdk:url>
</sdk:archive>
</sdk:archives>
<sdk:layoutlib>
<sdk:api>4</sdk:api>
</sdk:layoutlib>
</sdk:platform>


 

  沿着“sdk:platform\sdk:archives\sdk:archive\sdk:url”的路径,可以找到文件地址。

 

 

1.2 xsl转换文件

 

  现在数据xml已经有了,怎么才能将它按所需要的样式来显示呢?最规范的做法是使用xsl转换(XSL Transformations)。

 

  因为上面已经分析了数据xml的结构,我们很快就能写出对应的xsl转换文件(repository.xsl)——

<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<xsl:stylesheet version="1.0"
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
xmlns:sdk
="http://schemas.android.com/sdk/android/repository/5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>

<xsl:template match="/">
<!-- 主体 -->
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="sdk:license">
<!-- 许可信息 -->
<!-- hide -->
</xsl:template>

<xsl:template match="sdk:platform">
<!-- 平台 -->
<h2>platform(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:archives">
<!-- 文件集 -->
<xsl:apply-templates select="sdk:archive"/>
</xsl:template>

<xsl:template match="sdk:archive">
<!-- 文件 -->
<xsl:apply-templates select="sdk:url"/>
</xsl:template>

<xsl:template match="sdk:url">
<!-- 文件的URL -->
http://dl.google.com/android/repository/<xsl:value-of select="."/><br/>
</xsl:template>

<xsl:template match="sdk:platform">
<!-- 平台 -->
<h2>platform(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:system-image">
<!-- 系统图片 -->
<h2>system-image(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:sample">
<!-- 例子 -->
<h2>sample(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:platform-tool">
<!-- 平台工具 -->
<h2>platform-tool(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:tool">
<!-- 工具 -->
<h2>tool(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:doc">
<!-- 文档 -->
<h2>doc(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

<xsl:template match="sdk:extra">
<!-- 额外 -->
<h2>extra(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
<xsl:apply-templates select="sdk:archives"/>
<br />
</xsl:template>

</xsl:stylesheet>

 

 

  注——

1.因数据xml使用了命名空间,所以在xsl转换文件中也得写上该命名空间,这样才能成功转换。

2.可以配合使用“xsl:apply-templates”与“xsl:template”,让标签按规定的模板进行显示。(如“<xsl:apply-templates select="sdk:archives"/>”与“<xsl:template match="sdk:archives">”)。

3.可以使用“<xsl:value-of select="sdk:api-level"/>”的方式获得节点的文本。这样我们就能生成标题与下载地址。

 

 

1.3 转换指定文件

 

  现在已做好xsl转换文件,怎么才能用它转换xml文件呢?

  最基础的办法是,给数据xml的头部增加一行“<?xml-stylesheet type="text/xsl" href="repository.xsl"?>”,这样浏览器就能对其转换了。可是我们不能采用这种办法,因为数据xml是在官网上(https://dl-ssl.google.com/android/repository/repository-5.xml)。

  这时就得编写JavaScript脚本,来处理xml操作。

  网页的全部代码为——

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Anroid SDK URL 1</title>
<script type="text/javascript" src="zyllibjs_xml.js"></script>
<script type="text/javascript">
// 取得命名对象
function getRef(id)
{
if (document.getElementById) return document.getElementById(id); // DOM
if (document.all) return document.all[id]; // IE4
if (document.layers) return document.layers[id]; // Netscape4
returnnull;
}

// 初始化
function init()
{
// Load XSL
var xslRepository = xml_loadFile("repository.xsl");

// Load main
var xmlDoc = xml_loadFile("https://dl-ssl.google.com/android/repository/repository-5.xml");
var divShow = getRef("divShow");
divShow.innerHTML
= xml_transformNode(xmlDoc, xslRepository);
}
</script>
</head>
<body onload="init()">
<h1>Anroid SDK URL(安卓SDK地址)</h1><br />
<div id="divShow"/>
</body>
</html>

 

 

  脚本其实很简单,步骤为——

1.加载xsl转换文件。(var xslRepository = xml_loadFile("repository.xsl");)

2.加载数据xml。(var xmlDoc = xml_loadFile("https://dl-ssl.google.com/android/repository/repository-5.xml");)

3.指定显示的div。(var divShow = getRef("divShow");)

4.进行转换,并将转换结果交给指定的div。(divShow.innerHTML = xml_transformNode(xmlDoc, xslRepository);)

 

  这里用到了2个zyllibjs_xml.js中的函数——

xml_loadFile:xml同步/异步加载。

xml_transformNode:xsl转换。

 

 

1.4 小结

 

  运行效果为——

[sdkurl1.png]

 

  成功的显示了SDK的下载地址。现在就可以将地址复制到下载工具进行下载了。

 

  还有可以改进的地方吗?仔细观察后发现,现在存在2点不足——

1.浏览器卡顿。因为现在是使用同步方式下载xml的,要等到整个文件下载完后,浏览器才会恢复响应。这会严重影响用户体验。

2.没有附加SDK。该网页中只有核心SDK,没有得附加SDK(如Google APIs)。而我们在很多时候需要用到附加SDK。

 

  怎么办呢?请听下回分解。

 

posted on 2011-11-28 16:00  zyl910  阅读(1816)  评论(3编辑  收藏  举报