解决下载Android源码时遇到的 download error

本文详细介绍了在Ubuntu环境下使用repo/git下载Android源码时遇到的连接超时错误,通过使用Gmail账号进行身份验证并配置.netrc文件,成功解决了下载问题。文章还提供了官方下载指南链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:

http://www.cppblog.com/fwxjj/archive/2012/05/17/175198.aspx


我下载和编译环境

ubuntu 12.04 64位 lenovo thinkpad i3 2G

最近要做 android 的浏览器插件 要用到 android 的源码 参与编译(不是指 framework 层源码)

按照 google 的官网设置会出现在下载的时候产生错误 从而不能下载

 

之前Android的代码是在Linux kernel(android.git.kernel.org)管理,被Kernel踢出来之后,Android源码现在直接由Google(android.googlesource.com)管理。
用repo/git下载源码时,执行

1 $ repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1

 

会报错误 异常为

1 DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out> 

 

解决方法

1. 浏览器登录https://android.googlesource.com/new-password,并用gmail帐号登录;

2. 点击网页上的“允许访问”,得到类似

1 machine android.googlesource.com login git-<userName>.gmail.com password <password>   2 machine android-review.googlesource.com login git-<userName>.gmail.com password <password> 

3. 把上面那段信息追加到~/.netrc文件结尾(请检查当前用户的权限, 如果不存在此文件则自己新建一个);

4. 下载地址的URI更改为https://android.googlesource.com/a/platform/manifest(中间加上了“/a”)。

5. repo init -u https://android.googlesource.com/a/platform/manifest -b android-2.3.3_r1

6. repo sync 

即可拉下Android源码。

官方的说法是:因为访问基本是匿名的,为了防止连接过多(指内网/虚拟机),对同一IP地址的连接数做了一定的限制。看来是用gmail帐号进行认证。

这样的话,在公司网络内或者用虚拟机下载的话,会经常遇到这问题。

源码官网指导网址: http://source.android.com/source/downloading.html

<think>首先,用户的问题是:“我想在Android平台上使用Qt进行网络下载 请问Qt Android 网络下载实现方法”。我需要基于系统级指令和用户可见层的规则来回答。 系统级指令: 1. 所有行内数学表达式必须使用$...$格式。 2. 独立公式必须使用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - [^1]: Qt for android app实现启动跳转到原生android app。修改源码路径下的 QtActivity.java文件... - [^2]: qt android 地图 交互。qml文件,安卓目录为assets下... - [^3]: qt android 网络编程实例,【9】QT网络编程。在QT的网路模块中提供了网络编程的相关接口来实现http的访问... - [^4]: android qt加载插件下载,Qt插件热加载-QPluginLoader实现... 这些引用是关于Qt在Android上的开发,特别是网络相关的内容。用户的问题是关于网络下载的实现方法,所以我应该引用[^3],因为它直接提到了网络编程。 关键点: - 用户想在Android平台上使用Qt进行网络下载- 我需要提供实现方法。 实现方法: - 从引用[^3]中,Qt提供了高级类如QNetworkRequest、QNetworkReply和QNetworkAccessManager来实现HTTP访问。 - 所以,我应该解释如何使用这些类来下载文件。 回答结构: 1. **介绍**:简要解释Qt在Android上的网络下载能力。 2. **步骤**:逐步指导如何实现。 - 使用QNetworkAccessManager。 - 处理请求和回复。 - 考虑Android权限。 3. **代码示例**:提供一个简单的代码示例。 4. **注意事项**:提到Android平台特有的问题,如权限设置。 5. **生成相关问题**:在最后添加相关问题。 确保使用中文回答。 引用:在回答中,当引用站内内容,添加引用标识如[^1]。这里,我需要引用[^3],因为它直接相关。 生成相关问题:在回答末尾添加相关问题,类似于示例中的“§§相关问题§§”。 数学表达式:用户的问题是关于网络下载的,可能不涉及数学表达式。但如果需要,确保使用$...$或$$...$$格式。这里可能不需要,但为了安全,我可以避免或只在必要使用。 现在,构建回答: - **开头**:确认问题并介绍解决方案。 - **主体**:分步解释。 - 步骤1:添加网络权限在AndroidManifest.xml。 - 步骤2:在Qt代码中使用QNetworkAccessManager。 - 步骤3:处理下载的数据。 - **代码示例**:提供一个简单的C++或QML示例。由于用户提到Android,使用C++可能更合适。 - **结尾**:总结并添加相关问题。 代码示例:基于引用[^3],使用QNetworkAccessManager。例如: ```cpp QNetworkAccessManager *manager = new QNetworkAccessManager(this); QUrl url("http://example.com/file.txt"); QNetworkRequest request(url); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { if(reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 处理下载的数据 } reply->deleteLater(); }); ``` 在Android上,需要设置权限:在AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>。 引用:当提到网络编程,自然地添加引用[^3]。 相关问题: 1. 如何在Qt Android应用中处理网络错误? 2. Qt Android网络下载的性能优化方法? 3. Qt Android中如何实现文件下载进度显示? 确保回答真实可靠:基于Qt文档和引用[^3]的内容。</think>### Qt Android 网络下载实现方法 在Android平台上使用Qt进行网络下载,主要依赖于Qt的网络模块,特别是高级类如`QNetworkAccessManager`、`QNetworkRequest`和`QNetworkReply`。这些类简化了HTTP请求的处理,支持文件下载、数据获取等操作。以下是详细的实现步骤和示例代码,基于Qt 5.x及以上版本(兼容Android环境)。实现过程需注意Android平台的权限配置和异步处理机制。 #### 步骤1: 添加Android网络权限 在Qt Android应用中,必须先声明网络访问权限。否则,应用无法访问互联网。 - 打开项目中的`AndroidManifest.xml`文件(位于`android`目录下)。 - 添加以下权限声明: ```xml <uses-permission android:name="android.permission.INTERNET"/> ``` - 如果下载文件到外部存储,还需添加: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` #### 步骤2: 使用Qt网络模块实现下载 Qt提供了`QNetworkAccessManager`类处理网络请求。以下是分步实现方法(以C++为例): 1. **创建网络管理器**:初始化`QNetworkAccessManager`对象,用于发送请求。 2. **设置请求URL**:使用`QNetworkRequest`指定下载文件的URL。 3. **发送GET请求**:调用`get()`方法发起下载。 4. **处理响应**:通过信号槽机制异步接收数据,避免阻塞UI线程。 5. **保存文件**:将下载的数据写入本地文件(如SD卡)。 ##### 完整C++代码示例 ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QFile> #include <QDebug> void downloadFile(const QString &url, const QString &savePath) { QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkRequest request(QUrl(url)); // 设置下载URL request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); // 允许重定向 QNetworkReply *reply = manager->get(request); // 发送GET请求 // 连接信号槽:处理下载完成事件 QObject::connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 读取下载数据 QFile file(savePath); if (file.open(QIODevice::WriteOnly)) { file.write(data); // 保存文件 file.close(); qDebug() << "文件下载成功:" << savePath; } else { qDebug() << "文件保存失败:" << file.errorString(); } } else { qDebug() << "下载错误:" << reply->errorString(); } reply->deleteLater(); // 释放资源 manager->deleteLater(); }); // 可选:连接进度更新信号 QObject::connect(reply, &QNetworkReply::downloadProgress, [](qint64 bytesReceived, qint64 bytesTotal) { qDebug() << "下载进度:" << bytesReceived << "/" << bytesTotal; }); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); downloadFile("http://example.com/file.zip", "/sdcard/Download/file.zip"); // 示例URL和保存路径 return a.exec(); } ``` #### 步骤3: Android平台特有注意事项 - **文件路径问题**:Android中推荐使用`QStandardPaths`类获取安全路径,避免权限错误。例如: ```cpp QString savePath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/file.zip"; ``` - **UI线程安全**:在Qt Widgets或QML应用中,确保网络回调不直接操作UI元素。使用`QMetaObject::invokeMethod`跨线程更新UI。 - **错误处理**:Android网络环境不稳定,需处理超、重定向等问题。可设置超: ```cpp request.setTransferTimeout(10000); // 10秒超 ``` - **Qt版本兼容**:确保使用Qt for Android模块,并在项目文件(`.pro`)中添加: ``` QT += network ``` #### 常见问题解决 - **下载失败**:检查AndroidManifest权限是否正确;使用`adb logcat`查看错误日志。 - **性能优化**:对大文件使用分块下载(`QNetworkReply::read()`),避免内存溢出。 - **QML实现**:如果使用QML,可通过`XmlHttpRequest`或调用C++后端实现[^3]。例如: ```qml // QML示例(需在C++中暴露接口) WebView { url: "http://example.com" onLoadingChanged: if (loadRequest.status === WebView.LoadSucceededStatus) saveData() } ``` 通过以上方法,您可以在Qt Android应用中高效实现网络下载功能。Qt的网络模块封装了底层细节,使开发更便捷[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七斗星

赏点银子去植发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值