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

news2024/12/26 22:55:25

文章目录

  • 前言
  • 开发环境
  • 开发过程
    • 1. 遵循robots协议
    • 2. 页面结构分析
    • 3. Dart项目创建
    • 4. Dart项目运行与调试
    • 5. 第三库依赖
    • 6. 项目完整源码
  • 运行结果
  • 最后


前言

整理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

参考文档:

  • Using DevTools with a command-line app

5. 第三库依赖

  • 网络请求

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

  • HTML解析

采用Dart官方的html库。

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

dependencies:
  dio: ^5.1.1
  html: ^0.15.2

6. 项目完整源码

  • bin/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

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ansys】网格划分-优化、改善网格质量、修复网格、减小skewness、增大Orthogonal Quality的技巧

一、分析几何结构网格划分拓扑关系&#xff0c;调整网格尺寸 优化策略1&#xff1a;如果发现质量差的网格单元聚集在某一个实体附近&#xff0c;基本说明是这个实体的网格划分定义存在优化的地方。 例如下面这个几何模型。一个薄壁状长方体&#xff0c;加上一个模具框架&#x…

代码优美,搬砖不累:探索高质量代码之路

一、 前言 写出高质量代码是每个程序员的追求&#xff0c;也是提高自己编程能力的必经之路。高质量的代码可以提高软件的可维护性、可读性、可扩展性和可移植性等&#xff0c;降低软件开发和维护的成本。本文将介绍一些如何写出高质量代码的实用技巧和方法。 二、高质量代码的…

搞定Maven全功能,来从根上理解Maven拉包原理

依赖 生命周期与插件 模块聚合 模块继承 属性 版本管理 环境配置 私服 <dependencyManagement>的作用 在一次需求迭代中&#xff0c;我要求同事把写好的 RPC 接口打好包上传到公司私服上。然而&#xff0c;她并不熟悉 Maven&#xff0c;仅仅掌握了最基础的使用方…

【24】linux进阶——初识shell

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

管家婆辉煌Ⅱ 13.32版安装方法

因管家婆辉煌版已经长期不更新&#xff0c;现已经出现蓝屏的问题&#xff0c;故此新开此贴&#xff0c;慢慢更新安装方法。 首先管家婆下载地址&#xff1a;http://www.grasp.com.cn/download.aspx?id116 先安装sql server 2008 下载后&#xff0c;运行安装&#xff0c;请注…

《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第八章课后习题参考答案

第八章 面向对象技术与UML 课后习题参考答案 一、单项选择题 D &#xff08;2&#xff09;C &#xff08;3&#xff09;B &#xff08;4&#xff09;D &#xff08;5&#xff09;C &#xff08;6&#xff09;B &#xff08;7&#xff09;A &#xff08;8&#xff09;C&…

【LeetCode】343. 整数拆分

343. 整数拆分&#xff08;中等&#xff09; 方法一&#xff1a;数学推导 思路 将数字 n 拆分为若干个数字之和&#xff0c;即 n n1 n2 ... na &#xff0c;本道题等价于求解 max(n1 * n2 * ... * na) &#xff0c;根据数学推导&#xff0c;可以得到两个结论&#xff1a;…

【51单片机】LED点阵屏

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Waiting For Love】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;74HC595图片 &#x1f354;74HC59…

多层感知器模型与模型训练

文章目录 1. 多层感知器模型与模型训练1.1 多层感知器模型1.2 损失函数1.3 优化器与初始化模型1.4 编写训练循环1.5 案例代码整合 最近看了日月光华老师的《PyTorch深度学习简明实战》&#xff0c;将里面的代码自己动手复现了一遍&#xff0c;还是受益良多&#xff0c;书里面的…

【Python】狂肝两万字带你学会——类与对象

目录 01-初始对象 生活中的数据组织 程序中的数据组织​编辑 使用对象组织数据 总结01 02-类的成员方法 类的定义和使用 成员变量和成员方法 成员方法的定义语法 注意事项 成员方法——代码演示 总结02 03-类和对象 现实世界的事物和类 类和对象 使用类和对象…

Android 9.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在9.0的系统rom原生开发中,在产品对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中 最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

网络通信原理

网络通信原理目录 1.网络通信基础1.1 IP地址1.2 端口号 2. 通信协议2.1 协议简介2.1 协议分层 3. 封装和分用 1.网络通信基础 &#x1f604;网络通信的目的是网络数据传输&#xff0c;是主机的不同进程间&#xff0c;基于网络实现的数据传输。那么&#xff0c;首先我们应该先弄…

Java实现调用外部程序

Java实现调用外部程序 Java库Runtime类与ProcessBuilder类参数传递执行结果Runtime类的使用ProcessBuilder类的使用无参数调用简单参数调用复杂参数调用 Apache Commons Exec库使用步骤介绍使用实例 Java库 在Java中&#xff0c;可以通过Runtime类或ProcessBuilder类来实现调用…

看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!

粗略的实验 最后 最近在压测一批接口的时候&#xff0c;我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪&#xff0c;因为我们之前已经对这些接口进行了优化。但是&#xff0c;当我们进行排查时&#xff0c;发现问题出在数据库批量保存这块。 我们的项目使用了 myb…

开源小项目ChatGPT-website已获得100+star,我都干了什么

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

微信小程序学习实录1(wxml文档、引入weui、双向数据绑定、提交表单到后端)

微信小程序学习实录 一、wxml文档二、新建页面快捷方式三、微信小程序引入weui四、双向数据绑定1.wxml渲染层2.js逻辑层 提交表单到后端五、微信小程序跳转到H5 一、wxml文档 <!-- index.wxml --> <view><!-- 数据绑定 --><view><text>{{name}}…

蛋白质界的 ChatGPT:AlphaFold2 论文必备知识,不会有人还不知道吧

你知道 AlphaFold2 吗&#xff1f;它真正解决了蛋白质三维结构预测的算法困境&#xff0c;堪称蛋白质界的 chat-GPT4&#xff0c;甚至它的意义不是 chat-GPT4 所能够匹敌的。它为世界疾病治疗药物开发以及探究生物生命之谜提供了通向天神的一条道路&#xff0c;未来是生物的世纪…

Java 基础入门篇(二)—— Java 基础语法

文章目录 一、注释二、字面量三、变量3.1 变量概述3.2 变量在计算机中的底层原理 四、数据类型五、关键字、标志符六、类型转换6.1 自动类型转换6.2 表达式的自动类型转换6.3 强制类型转换 七、运算符7.1 基本算数运算符7.2 符号做连接符7.3 自增自减运算符7.4 赋值运算符7.5 …

Java 基础入门篇(五)—— 面向对象编程

文章目录 一、面向对象的思想二、类的定义与对象的创建三、对象内存分配情况 ★ 3.1 两个对象的内存图3.2 两个变量指向同一个对象内存图 四、构造器4.1 构造器的格式与分类4.2 构造器的调用 五、 this 关键字六、封装七、标准JavaBean补充&#xff1a;局部变量和成员变量的区别…

Java 基础入门篇(六)—— String 类详解

文章目录 一、String 类概述二、String 创建对象的方式2.1 创建对象的两种方式2.2 面试&#xff1a;两种方式的区别 ★2.3 常见面试题 ★ 三、String 类常用方法3.1 字符串内容比较3.2 常用 API&#xff1a;遍历、截取、替换、分割 一、String 类概述 java.lang.String 类代表…