Dart - 爬取Android Studio历史版本信息


前言

整理Android Studio历史版本信息时发现有点多,于是想一劳永逸写一个简单的爬虫抓取一下数据并生成我想要的格式,又刚好还没用Dart写过爬虫,所以尝试用Dart开发一个。

开发环境

  • Dart: 2.19.6

开发过程

1. 遵循robots协议

准备爬取的地址:https://developer.android.com/studio/archive
robots.txt文件地址:https://developer.android.com/robots.txt,文件内容:

User-Agent: *
Disallow: /assets/css/
Disallow: /assets/images/
Disallow: /assets/js/
Disallow: /guide/samples/
Disallow: /images/
Disallow: /partners/
Disallow: /sdk/OLD_RELEASENOTES
Disallow: /sdk/RELEASENOTES
Disallow: /sdk/older_releases
Disallow: /shareables/
Allow: /images/social/
Allow: /images/cards/distribute/stories/

User-agent: Google-DevRel
Allow: /

Sitemap: https://developer.android.com/sitemap.xml

robots.txt文件内容可知,并没有禁止我们抓取/studio/archive路径页面。如果不清楚robots协议中规则的含义,请看Google 如何解读 robots.txt 规范

2. 页面结构分析

通过浏览器的开发工具获取/studio/archive路径页面源码,页面结构如下:

screenshot1

关键源码:

<iframe src="https://developer.android.com/frame/studio/archive_c7422450e31f348e868f1f64f6e846d8cd0410f9d9227a1b6b3c4d4432813f8f.frame"
        class="framebox inherit-locale scroll"
        allow="clipboard-write https://android-dot-devsite-v2-prod.appspot.com"
        allowfullscreen is-upgraded>
</iframe>

通过iframe标签加载历史版本信息页面,当然这个/frame/studio/archive_xxx.frame路径也还不是最终的路径,最终会被重定向到:

https://android-dot-devsite-v2-prod.appspot.com/studio/archive_c7422450e31f348e868f1f64f6e846d8cd0410f9d9227a1b6b3c4d4432813f8f.frame

获取/frame/studio/archive_xxx.frame路径页面源码,页面结构如下:

screenshot2

devsite-expandable标签源码:

<devsite-expandable is-upgraded="" id="expandable-1">
    <p class="expand-control" aria-controls="expandable-1" aria-expanded="false" tabindex="0"
       role="button">Android Studio Giraffe | 2022.3.1 Beta 1
        <span>April 20, 2023</span>
    </p>
    <div class="downloads">
        Installers
        Chrome OS: <a
            href="https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.12/android-studio-2022.3.1.12-cros.deb">android-studio-2022.3.1.12-cros.deb</a>
        (928.9 MB)
        Mac (Apple Silicon): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.12/android-studio-2022.3.1.12-mac_arm.dmg">android-studio-2022.3.1.12-mac_arm.dmg</a>
        (1.2 GB)
        Mac (Intel): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.12/android-studio-2022.3.1.12-mac.dmg">android-studio-2022.3.1.12-mac.dmg</a>
        (1.2 GB)
        Windows (64-bit): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.12/android-studio-2022.3.1.12-windows.exe">android-studio-2022.3.1.12-windows.exe</a>
        (1.1 GB)

        SHA-256 checksums
        1960acdb21f2327bf13ea2c830ab6ae42e6ca1074edd4a072eaf37ae61eea220
        android-studio-2022.3.1.12-cros.deb
        b71be41ab6f1e07bb06167876e82bb8a92e109b9d0e719622e72f0beeabfc593
        android-studio-2022.3.1.12-mac_arm.dmg
        80b70dc2cb9c64f47b706195be210615dfacf8f0d7da6f3cfe3566c9e7ed0a8e
        android-studio-2022.3.1.12-mac.dmg
        bb32d89edeb20124041aec8ae4bee1b1889be8dcfec595846bd67f75b2fa1a52
        android-studio-2022.3.1.12-windows.exe

        Zip files
        Linux: <a
            href="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2022.3.1.12/android-studio-2022.3.1.12-linux.tar.gz">android-studio-2022.3.1.12-linux.tar.gz</a>
        (1.2 GB)
        Mac (Apple Silicon): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2022.3.1.12/android-studio-2022.3.1.12-mac_arm.zip">android-studio-2022.3.1.12-mac_arm.zip</a>
        (1.2 GB)
        Mac (Intel): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2022.3.1.12/android-studio-2022.3.1.12-mac.zip">android-studio-2022.3.1.12-mac.zip</a>
        (1.2 GB)
        Windows (64-bit): <a
            href="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2022.3.1.12/android-studio-2022.3.1.12-windows.zip">android-studio-2022.3.1.12-windows.zip</a>
        (1.1 GB)

        SHA-256 checksums
        5b2e6289fb1c2f52a8ed9227c7fb80bf2272338712e8b7d3616c5d25b664ea9a
        android-studio-2022.3.1.12-linux.tar.gz
        a89e9a0e7c915ccfd3254e9f7c3f86fd6c94232501b5dee536de9fa191abcb98
        android-studio-2022.3.1.12-mac_arm.zip
        09f3a5b1204cff143d985f6fdab82d83e957428c31c9fac3d698b2ecf655c1bf
        android-studio-2022.3.1.12-mac.zip
        b27af90f27cf0be1f3eb1e3b9393234168944b663ca510d7ec4804535e760aca
        android-studio-2022.3.1.12-windows.zip
    </div>
</devsite-expandable>

从页面结构可知,每一个devsite-expandable标签都是一个版本,其中p标签包含版本名称和发布日期,div标签包含下载信息。

3. Dart项目创建

电脑上安装的Flutter SDK自带有Dart SDK,所以不再需要额外安装Dart SDK。如果电脑上没有,请参考官方文档Get the Dart SDK安装SDK。

  • 通过Android Studio创建(需要安装Dart插件

screenshot3

选择创建命令行/控制台应用(Console Application)即可。如果遇到错误:

Error: the folder specified as the Dart SDK home does not exist.

请检查Dart SDK路径是否正确。

  • 通过命令行创建
dart create 项目名称

创建命令的更多使用方法可以通过执行dart create -h命令查看:

Create a new Dart project.

Usage: dart create [arguments] <directory>
-h, --help                       Print this usage information.
-t, --template                   The project template to use.

          [console] (default)    A command-line application.
          [package]              A package containing shared Dart libraries.
          [server-shelf]         A server app using package:shelf.
          [web]                  A web app that uses only core Dart libraries.

    --[no-]pub                   Whether to run 'pub get' after the project has
                                 been created.
                                 (defaults to on)
    --force                      Force project generation, even if the target
                                 directory already exists.

4. Dart项目运行与调试

如果是通过IDE(Android Studio等)开发Dart项目,运行和调试很简单就不再赘述。

  • 通过命令行运行Dart项目
cd Dart项目路径
dart run

dart run命令会默认执行项目内bin目录下的dart文件。

  • 通过命令行调试Dart项目
cd Dart项目路径
dart run --pause-isolates-on-start --observe

执行输出:

The Dart VM service is listening on http://127.0.0.1:8181/zjUsxx99OtA=/
The Dart DevTools debugger and profiler is available at: http://127.0.0.1:8181/zjUsxx99OtA=/devtools/#/?uri=ws%3A%2F%2F127.0.0.1%3A8181%2FzjUsxx99OtA%3D%2Fws
Building package executable... 
Built spider:spider.
...

命令行的作用只是运行项目并开启调试,实际是通过在浏览器打开输出结果中的链接进行调试。关键链接:

http://127.0.0.1:8181/zjUsxx99OtA=/devtools/#/?uri=ws%3A%2F%2F127.0.0.1%3A8181%2FzjUsxx99OtA%3D%2Fws

浏览器调试页面:

screenshot4

参考文档:

5. 第三库依赖

  • 网络请求

Flutter开发中用习惯了dio库,所以这里也继续使用,当然用其他库也行。

  • HTML解析

采用Dart官方的html库。

目前只需要依赖这两个库,在Dart项目的pubspec.yaml文件中加上依赖配置:

dependencies:
  dio: ^5.1.1
  html: ^0.15.2

6. 项目完整源码

  • bin/spider.dart源码:
import 'package:spider/spider.dart' as spider;

void main(List<String> arguments) {
  spider.startTask();
}
  • lib/spider.dart源码:
import 'package:dio/dio.dart';
import 'package:html/dom.dart';
import 'package:html/parser.dart';

import './model/platform.dart';
import './model/version.dart';

const String androidStudioArchiveUrl =
    'https://developer.android.com/studio/archive';
final Dio dio = Dio();

/// 开始任务
void startTask() {
  loadHtml(androidStudioArchiveUrl).then((value) {
    parseHtml(parse(value));
  });
}

/// 加载网页
Future<dynamic> loadHtml(String url) async => (await dio.get(url)).data;

/// 解析网页
void parseHtml(Document document) {
  // 找到iframe标签
  var elements = document.getElementsByTagName('iframe');
  if (elements.isNotEmpty) {
    var iframe = elements.first;
    var src = iframe.attributes['src'];
    if (src != null && src.isNotEmpty) {
      // 加载版本列表网页
      loadHtml(src).then((value) {
        parseVersionList(parse(value));
      });
    }
  }
}

/// 解析版本列表
void parseVersionList(Document document) {
  var elements = document.getElementsByClassName('all-downloads');
  if (elements.isNotEmpty) {
    var versions = <Version>[];
    var div = elements.first;
    for (var child in div.children) {
      var version = getVersionInfo(child);
      if (version != null) {
        versions.add(version);
        version.platforms = getDownloadInfo(child);
      }
    }
    // 过滤非稳定版本(Canary/Beta/RC)并返回最新10个版本
    versions = versions
        .where((element) =>
            !element.name.contains(RegExp(r'(Canary)|(Beta)|(RC)')))
        .take(10)
        .toList(growable: false);
    var output = buildOutput(versions);
    print(output);
  }
}

/// 获取版本信息
Version? getVersionInfo(Element element) {
  var versionElements = element.getElementsByClassName('expand-control');
  if (versionElements.isNotEmpty) {
    var versionInfo = versionElements.first.text.split('\n');
    if (versionInfo.length > 1) {
      return Version(versionInfo[0], versionInfo[1]);
    }
  }
  return null;
}

/// 获取下载信息
List<Platform> getDownloadInfo(Element element) {
  var platforms = <Platform>[];
  var downloadElements = element.getElementsByClassName('downloads');
  if (downloadElements.isNotEmpty) {
    var downloadInfo = downloadElements.first.innerHtml.split('\n\n');
    for (var i = 0; i < downloadInfo.length; ++i) {
      var lines = downloadInfo[i].split('\n');
      for (var line in lines) {
        if (downloadInfo[i].contains('SHA-256 checksums')) {
          // 解析checksums
          if (line.contains('android-studio')) {
            var info = line.split(' ');
            if (info.length > 1) {
              var checksums = info[0];
              var fileName = info[1];
              for (var platform in platforms) {
                if (platform.installerUrl?.contains(fileName) == true) {
                  platform.installerChecksums = checksums;
                  break;
                } else if (platform.zipFileUrl?.contains(fileName) == true) {
                  platform.zipFileChecksums = checksums;
                  break;
                }
              }
            }
          }
        } else {
          // 解析安装包和压缩文件
          if (line.contains('<a href=')) {
            var info = line.split(': ');
            if (info.length > 1) {
              Platform? platform;
              for (var plat in platforms) {
                if (plat.name == info[0]) {
                  platform = plat;
                  break;
                }
              }
              if (platform == null) {
                platform = Platform(info[0]);
                platforms.add(platform);
              }
              if (downloadInfo[i].contains('Installers')) {
                platform.installerUrl = info[1];
              } else {
                platform.zipFileUrl = info[1];
              }
            }
          }
        }
      }
    }
  }
  return platforms;
}

/// 构建输出
String buildOutput(List<Version> versions) {
  // 创建表格
  Element table = Element.tag('table');
  // 创建表头
  table.children.add(
    Element.tag('tr')
      ..children.addAll([
        Element.tag('th')..text = '版本名称',
        Element.tag('th')..text = '发布日期',
        Element.tag('th')..text = '适用平台',
        Element.tag('th')..text = '安装包',
        Element.tag('th')..text = '压缩文件'
      ]),
  );
  // 创建表格数据
  for (var version in versions) {
    var length = version.platforms.length;
    List<List<Element>> elements =
        List.generate(length, (index) => <Element>[], growable: false);
    for (var i = 0; i < version.platforms.length; ++i) {
      var platform = version.platforms[i];
      if (i == 0) {
        elements[i].addAll([
          Element.tag('td')
            ..text = version.name
            ..attributes.addAll({'rowspan': '$length'}),
          Element.tag('td')
            ..text = version.releaseDate
            ..attributes.addAll({'rowspan': '$length'})
        ]);
      }
      elements[i].add(Element.tag('td')..text = platform.name);
      if (platform.installerUrl != null) {
        elements[i].add(Element.tag('td')
          ..text =
              '${platform.installerUrl}<br/>SHA-256 checksums:<br/>${platform.installerChecksums}');
      } else {
        elements[i].add(Element.tag('td')..text = '/');
      }
      if (platform.zipFileUrl != null) {
        elements[i].add(Element.tag('td')
          ..text =
              '${platform.zipFileUrl}<br/>SHA-256 checksums:<br/>${platform.zipFileChecksums}');
      } else {
        elements[i].add(Element.tag('td')..text = '/');
      }
    }
    for (var element in elements) {
      table.children.add(Element.tag('tr')..children.addAll(element));
    }
  }
  return table.outerHtml.replaceAll('&lt;', '<').replaceAll('&gt;', '>');
}
  • lib/model/version.dart源码:
import './platform.dart';

class Version {
  String name;
  String releaseDate;
  List<Platform> platforms;

  Version(this.name, this.releaseDate) : platforms = <Platform>[];
}
  • lib/model/platform.dart源码:
class Platform {
  String name;
  String? installerUrl;
  String? installerChecksums;
  String? zipFileUrl;
  String? zipFileChecksums;

  Platform(this.name);
}

运行结果

版本名称发布日期适用平台安装包压缩文件
Android Studio Flamingo | 2022.2.1 April 13, 2023Chrome OS android-studio-2022.2.1.18-cros.deb (844.9 MB)
SHA-256 checksums:
8ed5269db85eea539671da2be445d3374efbb99f42106b022c84d102566db60c
/
Mac (Apple Silicon) android-studio-2022.2.1.18-mac_arm.dmg (1.2 GB)
SHA-256 checksums:
745f0fa810c12b775944f6eb09fb5c0fdae79521c3b00d6e42d350e159f909fb
android-studio-2022.2.1.18-mac_arm.zip (1.2 GB)
SHA-256 checksums:
65036554076d76c9cfaf3f7a3a6184747a3f5c5362faf66dbd848fcd4a6cff45
Mac (Intel) android-studio-2022.2.1.18-mac.dmg (1.2 GB)
SHA-256 checksums:
e770d71f3b269f7d8c95510b0a243ff6c467b2577056280885a360df087df5f1
android-studio-2022.2.1.18-mac.zip (1.2 GB)
SHA-256 checksums:
9f0adcf8d8ba9dab8bd5d13e796c5c0c7a131b9319c60ab87a1af4cc25e07e20
Windows (64-bit) android-studio-2022.2.1.18-windows.exe (1.0 GB)
SHA-256 checksums:
c3811117b4fb8b41f23d060915a9bf020eab037e183b0eb1614ef44ad5103b8a
android-studio-2022.2.1.18-windows.zip (1.0 GB)
SHA-256 checksums:
60c66f50ca155e8befc9ba683d248e5ad152103a7b2bb3211bfdd9e3e78424eb
Linux/ android-studio-2022.2.1.18-linux.tar.gz (1.1 GB)
SHA-256 checksums:
cdd852c4499b5f7402df44dfc69e8ca418ffc9a684caab34047476fd2cb24efc
Android Studio Electric Eel | 2022.1.1 Patch 2 February 27, 2023Chrome OS android-studio-2022.1.1.21-cros.deb (801.3 MB)
SHA-256 checksums:
2d522ddf6894eb3999ceb4150cedc701d91cefe1b356edd651d512489b35aa30
/
Mac (Apple Silicon) android-studio-2022.1.1.21-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
2ced38b172557967109b19730c865e2a2a279969890f4432913a92ac152dcfbb
android-studio-2022.1.1.21-mac_arm.zip (1.1 GB)
SHA-256 checksums:
8171f686d7d9521620b895e89421b45a31cb7b77ffa451236f3ead788da37332
Mac (Intel) android-studio-2022.1.1.21-mac.dmg (1.1 GB)
SHA-256 checksums:
d6a073066178be9d224a49e7d8469f00c21a14e7ffeb17a77f5aa43c31624086
android-studio-2022.1.1.21-mac.zip (1.1 GB)
SHA-256 checksums:
d91af16c2982e1655e6bc3935ea29be3ba4866dd89310c634d858f0766eb18e6
Windows (64-bit) android-studio-2022.1.1.21-windows.exe (988.6 MB)
SHA-256 checksums:
7f08286effd7c426e36a5dd2d49979d9d461874ca4a6fffe87e0092619b68c98
android-studio-2022.1.1.21-windows.zip (991.4 MB)
SHA-256 checksums:
45db1f103b1113590e01ce73452ccbe6ca24af83188c51f8cabf57ceb9ae32ce
Linux/ android-studio-2022.1.1.21-linux.tar.gz (1.0 GB)
SHA-256 checksums:
0bca26c45daf5cad79b131c34013b985d146a2526990ea2aa6d88792d51905a1
Android Studio Electric Eel | 2022.1.1 Patch 1 January 31, 2023Chrome OS android-studio-2022.1.1.20-cros.deb (805.3 MB)
SHA-256 checksums:
5dd13ca2c2471e9bc6eb2d943dddfe30a0f17c2f6c5c3eae08878ab4c02bacef
/
Mac (Apple Silicon) android-studio-2022.1.1.20-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
ebb8e842eda3d500adf1aece9eb5b9d9b5963016d0233b42ed12107b2cc952a9
android-studio-2022.1.1.20-mac_arm.zip (1.1 GB)
SHA-256 checksums:
abc4a5f480b2c0bdc2aab13dd1f3cfa2f9274f4a39ffa115cec01afb03052f15
Mac (Intel) android-studio-2022.1.1.20-mac.dmg (1.1 GB)
SHA-256 checksums:
b7ee174891a5d72bf02e026455d992228446b80566dae7cafe1cdc9437a67e0e
android-studio-2022.1.1.20-mac.zip (1.1 GB)
SHA-256 checksums:
d361756059d2c6c358d1db35cedf0fcf64abd264c0aee4acf669f8a5c6705356
Windows (64-bit) android-studio-2022.1.1.20-windows.exe (988.6 MB)
SHA-256 checksums:
5afb440754a8bd752340141b0c77ce9036e640b2932be60e50971b5e705b4d8e
android-studio-2022.1.1.20-windows.zip (991.4 MB)
SHA-256 checksums:
0d8974578d6b8e311b135388070e236bd16cddfd932579f2d719118b3dd022cb
Linux/ android-studio-2022.1.1.20-linux.tar.gz (1.0 GB)
SHA-256 checksums:
517eda3a94ccdb74bb3413cd033fdf284c8afdda96a68934367a57f70724ea9e
Android Studio Electric Eel | 2022.1.1 January 12, 2023Chrome OS android-studio-2022.1.1.19-cros.deb (806.6 MB)
SHA-256 checksums:
8c7f76847a379d38fe475846fd6d8d68176a1fa3b6a5e84ea1a67477ec0549d2
/
Mac (Apple Silicon) android-studio-2022.1.1.19-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
78c450022fc1a85af90ae64fced4eafbc1ca4149e60bb14085f4f1503ff1cb36
android-studio-2022.1.1.19-mac_arm.zip (1.1 GB)
SHA-256 checksums:
01f2e05fd0159e37983a7eca9ddb0c41c2bef067230d8a241de483fc194545c0
Mac (Intel) android-studio-2022.1.1.19-mac.dmg (1.1 GB)
SHA-256 checksums:
3e965f50d7312859b4ea11cf530ca1a6ba0bc476a285fe614a2b2f3cde1fc2d0
android-studio-2022.1.1.19-mac.zip (1.1 GB)
SHA-256 checksums:
495019dd6e57e1a706ee36e0e6562b5da1a0cb9b0bee1c50bb544625b79d7a51
Windows (64-bit) android-studio-2022.1.1.19-windows.exe (992.1 MB)
SHA-256 checksums:
1ae29028ef09838a04fffae463e4b008251019a33733dd27aa72ca6b2d9c1029
android-studio-2022.1.1.19-windows.zip (994.9 MB)
SHA-256 checksums:
12eaad3efce8bdc54024f0c7efc37e4cb29139f855862c49fd0653030a1619af
Linux/ android-studio-2022.1.1.19-linux.tar.gz (1.0 GB)
SHA-256 checksums:
96ec44e9ad82f3a241dbc7b3b88655e3d4f2137d784b545c3574270906a68d40
Android Studio Dolphin | 2021.3.1 Patch 1 October 13, 2022Chrome OS android-studio-2021.3.1.17-cros.deb (778.2 MB)
SHA-256 checksums:
4d0c442d806fa8651c8e1baade6586c70aa46a61790aac0e91dfb4d5be7a7213
/
Mac (Apple Silicon) android-studio-2021.3.1.17-mac_arm.dmg (1.0 GB)
SHA-256 checksums:
0adbbddfa1e0e52e7bf21a5b560f60f8982ef82c0677db2d2ff7a2bd73ab156f
android-studio-2021.3.1.17-mac_arm.zip (1.0 GB)
SHA-256 checksums:
0e3923e5a4d7e7255c2e379ad2ab4e2aa5d52e6b2ed092938665c955214f3f05
Mac (Intel) android-studio-2021.3.1.17-mac.dmg (1.0 GB)
SHA-256 checksums:
4e10799559efc3445d61fb12bbf68e0a9801607a6114c6783bb26a93784d3150
android-studio-2021.3.1.17-mac.zip (1.0 GB)
SHA-256 checksums:
a7695e0aa16404717ebcc018f37e123b7cfa6ef04f3e207f949eb2b9fc2e9c28
Windows (64-bit) android-studio-2021.3.1.17-windows.exe (957.3 MB)
SHA-256 checksums:
dd176791e15e921d4a3b3c9a251c61e5cfd28d75588fd717971dfbac030cd497
android-studio-2021.3.1.17-windows.zip (959.6 MB)
SHA-256 checksums:
bdce14643efee37a4d892994b3329496460062f9c65ed870ff61a80267cb206a
Linux/ android-studio-2021.3.1.17-linux.tar.gz (982.7 MB)
SHA-256 checksums:
89adb0ce0ffa46b7894e7bfedb142b1f5d52c43c171e6a6cb9a95a49f77756ca
Android Studio Dolphin | 2021.3.1 September 15, 2022Chrome OS android-studio-2021.3.1.16-cros.deb (777.6 MB)
SHA-256 checksums:
dbd78bbcc0d334f0aeec1849e69877c83bec08bc4db508c391ac11fdfc9ea65c
/
Mac (Apple Silicon) android-studio-2021.3.1.16-mac_arm.dmg (1.0 GB)
SHA-256 checksums:
3c7c32b12644bda70a7845a7b9f2de196614c96a796dfd7d774e4c92a4b1eec0
android-studio-2021.3.1.16-mac_arm.zip (1.0 GB)
SHA-256 checksums:
bdf6bf858b1c017a24a0ce24d6979b00011b5fbe270ea007fc2184de8a4f6f40
Mac (Intel) android-studio-2021.3.1.16-mac.dmg (1.0 GB)
SHA-256 checksums:
4f1efabf0763ac06accb676790d1b5673f4cd8d995711fd9586d4742ba50ef05
android-studio-2021.3.1.16-mac.zip (1.0 GB)
SHA-256 checksums:
a00c4646e6a0bd2d029f0b22b329246817f31eef57d03e251c4f433f155bd866
Windows (64-bit) android-studio-2021.3.1.16-windows.exe (950.7 MB)
SHA-256 checksums:
35bcdf04192e31568914931dc6f52e1879763c211321bf5f2f87d70b84516e1e
android-studio-2021.3.1.16-windows.zip (953.1 MB)
SHA-256 checksums:
8235ab7aa34117c7a6c27bf30cea2f2a4043fabacd03b8b988bb689d41e09200
Linux/ android-studio-2021.3.1.16-linux.tar.gz (976.2 MB)
SHA-256 checksums:
1a725b585786f43b944336caf703360446e3f4b5e6e234057ff121e50ef91d9a
Android Studio Chipmunk | 2021.2.1 Patch 2 August 3, 2022Chrome OS android-studio-2021.2.1.16-cros.deb (857.0 MB)
SHA-256 checksums:
b020a9a664d8237711e74198d5d07087858d993c0b7ade1f35cbaff668e8acd5
/
Mac (Apple Silicon) android-studio-2021.2.1.16-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
d4e06bcc6f614cd4b261fc6034529edb205b31b0e56824490a91350c3640806a
android-studio-2021.2.1.16-mac_arm.zip (1.1 GB)
SHA-256 checksums:
5754d3a8e46e5c243651007948601b7118793cbe9bc89e4c63101ee626141d5f
Mac (Intel) android-studio-2021.2.1.16-mac.dmg (1.1 GB)
SHA-256 checksums:
df46f2199fcf4c7e6b882ba16151ea1d2dd48a15f5c87d30224f1b5401d2b648
android-studio-2021.2.1.16-mac.zip (1.1 GB)
SHA-256 checksums:
bd5e47536f0de945a0bdec9ea15d720b0dbf692f39592f648614639e2ae543dd
Windows (64-bit) android-studio-2021.2.1.16-windows.exe (974.5 MB)
SHA-256 checksums:
214fc7339060990d615bb02f2576474a3d6c152249fb67b03124162e111da4c7
android-studio-2021.2.1.16-windows.zip (986.6 MB)
SHA-256 checksums:
78575a5b779d66630b757a32df0a26b8c052995623d649ed31787fb64eef14b1
Linux/ android-studio-2021.2.1.16-linux.tar.gz (1.0 GB)
SHA-256 checksums:
aa5773a9e1da25bdb2367a8bdd2b623dbe0345170ed231a15b3f40e8888447dc
Android Studio Chipmunk | 2021.2.1 Patch 1 May 25, 2022Chrome OS android-studio-2021.2.1.15-cros.deb (857.0 MB)
SHA-256 checksums:
1300f2e48734ad57b9598f1f620ab2c72436b7fa60ced2d96266dadaf3078489
/
Mac (Apple Silicon) android-studio-2021.2.1.15-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
ce1fb8ba48c93e65fca450667786b4b98aa000ff274ca890e3de36efdabcc22b
android-studio-2021.2.1.15-mac_arm.zip (1.1 GB)
SHA-256 checksums:
1b150c65b84dfbe34490d06437b40b6421eb65a06b54c9fc6d9134574020b763
Mac (Intel) android-studio-2021.2.1.15-mac.dmg (1.1 GB)
SHA-256 checksums:
fcaf413951119324ab22a0a4f2634bade90692991e9381cbf4a274e3cd60243a
android-studio-2021.2.1.15-mac.zip (1.1 GB)
SHA-256 checksums:
feda0fad3c2c19e3438cc8132f573dad40c2eb2cccef3239757069740b481e63
Windows (64-bit) android-studio-2021.2.1.15-windows.exe (974.4 MB)
SHA-256 checksums:
d99d2b24e232ac869d9c9e64cd19cd2572cfd4512e7df7941b812c4cd39d7b45
android-studio-2021.2.1.15-windows.zip (986.5 MB)
SHA-256 checksums:
a992449e546660fc5f8026f72b0f0e804f8d9c82a5e628d502ab60d1ab2b0f8c
Linux/ android-studio-2021.2.1.15-linux.tar.gz (1.0 GB)
SHA-256 checksums:
0018e0dfc0dd2921700516f7a2c443377c557788da7fb0a45243ecb4300745be
Android Studio Chipmunk | 2021.2.1 May 9, 2022Chrome OS android-studio-2021.2.1.14-cros.deb (857.0 MB)
SHA-256 checksums:
a9ed74d7641b32dac6bf4886f288ae9e6bc62f51fa645b7e21b2b999100614d7
/
Mac (Apple Silicon) android-studio-2021.2.1.14-mac_arm.dmg (1.1 GB)
SHA-256 checksums:
eda598ecffd2640083031d81194cbeacf507c06febb8dc69f277f36fe47ba7a8
android-studio-2021.2.1.14-mac_arm.zip (1.1 GB)
SHA-256 checksums:
1d288d0946d6abd68af45b23ec46610099fc603533803a7738e4c9edcbd2e66d
Mac (Intel) android-studio-2021.2.1.14-mac.dmg (1.1 GB)
SHA-256 checksums:
e3c4131cdb92ac3b2a8f287f7989528dd7a413477adc90f008748371921e80ee
android-studio-2021.2.1.14-mac.zip (1.1 GB)
SHA-256 checksums:
5952717cb21e0bbfbaa25ea6ee2053c7bf8ba849430065f9e26d2c655a6af757
Windows (64-bit) android-studio-2021.2.1.14-windows.exe (974.4 MB)
SHA-256 checksums:
de733bcd1cd4fd23d474c76889db0ba9af0a5ae5ba7171fb9aa8e27311cf950b
android-studio-2021.2.1.14-windows.zip (986.5 MB)
SHA-256 checksums:
db7dc822992f7905e86f5da757f36678fc5b0b587438da946c64892b27785bba
Linux/ android-studio-2021.2.1.14-linux.tar.gz (1.0 GB)
SHA-256 checksums:
e98bb08ae6b4eaa9401b555a294d98615a6ade4c85b43c630a880313eab3c7b3
Android Studio Bumblebee | 2021.1.1 Patch 3 April 7, 2022Chrome OS android-studio-2021.1.1.23-cros.deb (799.0 MB)
SHA-256 checksums:
f5733f44ab39d61b8885abc0d49b69a191d505114c154f3b5c4ee4d2f0b233e6
/
Mac (Apple Silicon) android-studio-2021.1.1.23-mac_arm.dmg (971.0 MB)
SHA-256 checksums:
f2ab09466927f338b2c1ff27635be7cf24b08191bccdeb63ee68b33a01d0a05c
android-studio-2021.1.1.23-mac_arm.zip (971.4 MB)
SHA-256 checksums:
6c0844ffed7c56bdf023d50a0ad515d8437e1544dd6dbf16a8879fa11422ae50
Mac (Intel) android-studio-2021.1.1.23-mac.dmg (974.2 MB)
SHA-256 checksums:
ce85ddff4c39f3eaa0b314cffa5f23987e255cce5d7aa900281884643f0a2db3
android-studio-2021.1.1.23-mac.zip (975.0 MB)
SHA-256 checksums:
404b7e555e2913008c68d7ea3d9603448487dd543087c6d6fcf94e3e4cf71e16
Windows (64-bit) android-studio-2021.1.1.23-windows.exe (914.8 MB)
SHA-256 checksums:
def7755842942be93c56db94c7d53eed70004b0ab1dc8883e959da0649032582
android-studio-2021.1.1.23-windows.zip (925.4 MB)
SHA-256 checksums:
a4d9bf8f4f67392052d70770495e572eda4d85d7a3d59c648e655a1b9d2aea27
Linux/ android-studio-2021.1.1.23-linux.tar.gz (948.3 MB)
SHA-256 checksums:
b37506cd8ac7a80fe30cd1724e3be5c2d970a7aa6aa3fc9ca745afe3700aabcf

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当遇到Android Studio出现"no modle"的问题时,可以尝试以下解决办法。首先,在主项目的AndroidManifest.xml文件下的根标签中添加xmlns:tools="http://schemas.android.com/tools",application标签下添加tools:replace="Android:icon, android:theme"。\[1\]另外,可能还会遇到找不到R文件、Attribute value must be constant、错误提示元素值必须为常量表达式、错误提示找不到符号等问题。这可能是因为模块中使用了Butterknife导致的,可以参考这篇文章解决:http://blog.csdn.net/iehshx/article/details/68064363。\[1\]此外,还需要注意module下布局文件名称最好不要跟主项目文件夹下的布局文件重名,否则会出现异常。如果module下的AndroidManifest.xml文件下有android:name=".common.MyApplication",主项目下的AndroidManifest.xml就要再申明要导入的module包含其他module,导入时要一起导入主项目。\[1\]另外,如果遇到Android Studio的版本问题,可以尝试使用Dart开发一个简单的爬虫来抓取历史版本信息并生成所需格式。\[2\]最后,如果以上方法都无效,可以尝试断开电脑的有线网络,连接手机热点,并确保Android Studio的代理设置为No proxy。此外,还可以查看.gradle文件夹下的gradle.properties文件,将其中的相关内容删除或注释掉,然后重新打开Android Studio进行下载。\[3\]希望这些方法能够帮助你解决Android Studio出现"no modle"的问题。 #### 引用[.reference_title] - *1* [Android studio将一个项目作为module导入另一个项目](https://blog.csdn.net/hdhhd/article/details/126383287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Dart - 爬取Android Studio历史版本信息](https://blog.csdn.net/crasowas/article/details/130313030)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【已解决】Android Studio No Module](https://blog.csdn.net/weixin_43732022/article/details/128151589)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值