【小沐学Android】开发常见问题FAQ之Gradle更新

文章目录

  • 1、简介
    • 1.1 Android简介
    • 1.2 Gradle简介
    • 1.3 Gradle的配置文件
      • 1.3.1 应用模块的 build.gradle
      • 1.3.2 项目的 settings.gradle
      • 1.3.3 gradle-wrapper.properties
  • 2、Gradle文件下载失败
    • 2.1 手动下载gradle
    • 2.2 配置本地gradle
    • 2.3 配置国内镜像
  • 3、repositories配置国内源
    • 3.1 单个项目配置
    • 3.2 全局配置
  • 4、解决Android studio模拟器闪烁黑屏问题
    • 4.1 修改显卡设置
    • 4.2 修改模拟器渲染方式
  • 5、Activity 开发入门
    • 5.1 声明 Activity
    • 5.2 声明 intent 过滤器
    • 5.3 启动 Activity
    • 5.4 声明权限
    • 5.5 Activity 生命周期
  • 6、“Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:”的解决方法
  • 7、IOException: https://dl.google.com/android/repository/addons_list-3.xml java.net.ConnectException: Connection refused: connect
  • 结语

1、简介

1.1 Android简介

Android是一个开源的,基于Linux的移动设备操作系统,主要使用于移动设备,如智能手机和平板电脑。Android是由谷歌及其他公司带领的开放手机联盟开发的。
【小沐学Android】开发常见问题FAQ之Gradle更新_第1张图片
Android 构建系统会编译应用资源和源代码,然后将它们打包成 APK 或 Android App Bundle 文件,供您测试、部署、签名和分发。
【小沐学Android】开发常见问题FAQ之Gradle更新_第2张图片

1.2 Gradle简介

Gradle 是一个专注于灵活性和性能的开源构建自动化工具。Gradle 构建脚本是使用 Groovy 或 Kotlin DSL 编写的。

Gradle支持许多主要的IDE,包括Android Studio,Eclipse,IntelliJ IDEA,Visual Studio 2019和XCode。 您还可以通过终端中的命令行界面或通过持续集成服务器调用 Gradle。

  • 高度可定制 — Gradle 的建模方式以最基本的方式进行定制和扩展。
  • 快速 — Gradle 通过重用先前执行的输出、仅处理更改的输入以及并行执行任务来快速完成任务。
  • 功能强大 — Gradle 是 Android 的官方构建工具,支持许多流行的语言和技术。

【小沐学Android】开发常见问题FAQ之Gradle更新_第3张图片
Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于 Android Studio 运行并单独更新。

Gradle 和 Android Gradle 插件独立于 Android Studio 运行。这意味着,您可以在 Android Studio 内、计算机上的命令行或未安装 Android Studio 的计算机(如持续集成服务器)上构建 Android 应用。

Gradle 简单来讲就是一个构建工具,也就是一些复杂的操作不需要开发者自己去弄,而是通过构建工具去完成的。Gradle有个非常突出的特点,就是它自身就是一门语言(基于Groovy),是一种自动化构建语言,相较于Maven中基于XML的各种繁琐配置,Gradle使用Groovy语言构建文件更加的灵活。Gradle是Android Studio默认的构建工具,它提高了Android的开发效率,它的作用就是管理项目中的依赖、打包、编译……。要注意的是,Gradle它并不是独属于Android。
【小沐学Android】开发常见问题FAQ之Gradle更新_第4张图片
JCenter 代码库已于 2021 年 3 月 31 日变为只读代码库。请勿添加jcenter()代码库,以免获取过时的依赖项。

1.3 Gradle的配置文件

1.3.1 应用模块的 build.gradle

如需向您的项目添加依赖项,请在模块的 build.gradle 文件的 dependencies 代码块中指定依赖项配置,如 implementation。应用模块的以下 build.gradle 文件包含三种不同类型的依赖项:plugins 、android 、dependencies 。

【小沐学Android】开发常见问题FAQ之Gradle更新_第5张图片
其中dependencies的每种依赖项配置都要求不同种类的库依赖项,如下所示:

// 本地库模块依赖项
implementation project(':mylibrary')

// 本地二进制文件依赖项
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/foo.jar', 'libs/bar.jar')

// 远程二进制文件依赖项
implementation 'com.example.android:app-magic:12.3'
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

1.3.2 项目的 settings.gradle

settings.gradle 文件(对于 Groovy)或 settings.gradle.kts 文件(对于 Kotlin 脚本)位于项目的根目录下。此设置文件会定义项目级仓库设置,并告知 Gradle 在构建应用时应将哪些模块包含在内。多模块项目需要指定应包含在最终 build 中的每个模块。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {//这里是gradle脚本执行所需依赖,分别是对应的maven库和插件
    
    repositories {
        google()//从Android Studio3.0后新增了google()配置,可以引用google上的开源项目
        jcenter()//是一个类似于github的代码托管仓库,声明了jcenter()配置,可以轻松引用 jcenter上的开源项目
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'此处是android的插件gradle,gradle是一个强大的项目构建工具
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {//这里是项目本身需要的依赖,比如项目所需的maven库
    repositories {
        google()
        jcenter()
    }
}

// 运行gradle clean时,执行此处定义的task任务。
// 该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。
// gradle使用groovy语言,调用method时可以不用加()。
task clean(type: Delete) {
    delete rootProject.buildDir
}

1.3.3 gradle-wrapper.properties

每一个用gradle编译的工程,都会有一个gradle\wrapper目录。该目录下有2个文件:gradle-wrapper.jar和gradle-wrapper.properties。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

distributionUrl是要下载的gradle的地址,使用哪个版本的gradle,就在这里修改。
下载的gradle-5.4.1-bin.zip存放到C:\Users.gradle\wrapper\dists目录中。

gradle的3种版本:

gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。例如,https://services.gradle.org/distributions/gradle-5.4.1-all.zip

gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。例如,https://services.gradle.org/distributions/gradle-5.4.1-bin.zip

gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。例如,https://services.gradle.org/distributions/gradle-5.4.1-src.zip

其中,GRADLE_USER_HOME表示用户目录。

在windows下是%USERPROFILE%/.gradle,例如C:\Users\<user_name>\.gradle\。

在linux下是$HOME/.gradle,例如~/.gradle。

【小沐学Android】开发常见问题FAQ之Gradle更新_第6张图片

2、Gradle文件下载失败

Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-XXX?

Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于 Android Studio 运行并单独更新。

2.1 手动下载gradle

检查build.gradle对应的Gradle Plugins插件版本:
https://developer.android.google.cn/studio/releases/gradle-plugin.html
【小沐学Android】开发常见问题FAQ之Gradle更新_第7张图片

下载指定的gradle版本到本地。
查看C:\Users\用户名.gradle\wrapper\dists下的gradle压缩包,看自己有啥版本的压缩包,如果都没有就去下载一个。
打开目录:C:\Users\tomcat.gradle\wrapper\dists
【小沐学Android】开发常见问题FAQ之Gradle更新_第8张图片
浏览器打开 https://gradle.org/releases/ 并找到 xxx.zip 文件下载。

# 官网
https://services.gradle.org/distributions/

# 腾讯
https://mirrors.cloud.tencent.com/gradle/

【小沐学Android】开发常见问题FAQ之Gradle更新_第9张图片

https://downloads.gradle-dn.com/distributions/gradle-5.4.1-all.zip

把下载好的 zip 复制到上面那个目录,然后回到 android studio ,右键Gradle,刷新,重启Androidstudio还是不行的话,就继续下一步操作。

2.2 配置本地gradle

配置项目的gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
// 或
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-5.4.1-all.zip
// 或
distributionUrl=file:///C:/Users//tomcat//.gradle//wrapper//dists//gradle-5.4.1-all.zip

修改项目的build.gradle为对应的Gradle Plugins插件版本:

dependencies {
   classpath 'com.android.tools.build:gradle:3.5.3'
}

如果指定的插件版本尚未下载,则 Gradle 会在您下次构建项目时进行下载;或者,您也可以在 Android Studio 菜单栏中依次点击 File > Sync Project with Gradle Files 进行下载。

2.3 配置国内镜像

https://mirrors.cloud.tencent.com/gradle/
腾讯做了国内镜像可以直接下载:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-5.4-rc-1-all.zip

【小沐学Android】开发常见问题FAQ之Gradle更新_第10张图片
在这里插入图片描述
【小沐学Android】开发常见问题FAQ之Gradle更新_第11张图片

3、repositories配置国内源

阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源,速度更快更稳定。

https://developer.aliyun.com/mvn/guide?spm=a2c40.maven_devops2020_goldlog_.0.0.275c3054yut6Ld
【小沐学Android】开发常见问题FAQ之Gradle更新_第12张图片

【小沐学Android】开发常见问题FAQ之Gradle更新_第13张图片
https://developer.aliyun.com/article/621196

  • Q:首页无法浏览public库的内容?

  • A:public库是group库,其实代理了maven central和jcenter仓库。你可以浏览proxy库central或jcenter的内容,凡是里面有的包都可以通过public库下载。
    而我们常用的 public 仓库,其实是 central 仓库和 jcenter 仓库的聚合,所以配置了 public 仓库,就不需要再配置 jcenter 的仓库了。

  • Q: 为什么你配置里用的 URL 都是 https://maven.aliyun.com/repository/public,而我看其他的人/文章,都用的是 http://maven.aliyun.com/nexus/content/groups/public 呢?

  • A: 阿里云在前几年对 https://maven.aliyun.com 进行了代码和架构上的改造,新版的 https://maven.aliyun.com 下载速度更快,支持高并发,而且全站进行了 HTTPS 加密,更安全。而新版的 Maven Mirror 地址,就是 https://maven.aliyun.com/repository/{reponame},然而阿里云为了保持旧地址的兼容,所以旧地址依然可以使用,但推荐使用新地址。

3.1 单个项目配置

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
    }
}

或者

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
    }
}

或者

buildscript{
    repositories{
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        mavenLocal()
        mavenCentral()
    }
    dependencies{
        classpath "com.android.tools.build:gradle:3.6.0"
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        mavenLocal()
        mavenCentral()
    }
}

或者

buildscript {
    repositories {
        maven { url 'http://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
    }
}

allprojects {
    repositories {
        maven { url 'http://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
    }
}

3.2 全局配置

在操作系统当前用户的 HOME 目录,找到 .gradle 文件夹,在这个文件夹下面创建一个文本文件 init.gradle,完整的文件路径可能如下:在${USER_HOME}/.gradle/下创建init.gradle文件,在此文件中加入如下代码片段:

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
            }
        }
        maven {
            url ALIYUN_REPOSITORY_URL
            url ALIYUN_JCENTER_URL
        }
    }
}

或者

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}

4、解决Android studio模拟器闪烁黑屏问题

4.1 修改显卡设置

打开NVIDIA控制面板,选择管理3d设置,选择程序设置,选择“qemu-system-i386.exe”(读者要根据自己电脑里面的实际进程包名,我的是i386),将“首选图形处理器”的默认设置改为“集成图形”。

4.2 修改模拟器渲染方式

【小沐学Android】开发常见问题FAQ之Gradle更新_第14张图片
【小沐学Android】开发常见问题FAQ之Gradle更新_第15张图片

将Graphics(图样)换成Software(软件),点击Finish。

5、Activity 开发入门

5.1 声明 Activity

要使应用能够使用 Activity,您必须在清单中声明 Activity 及其特定属性。
要声明 Activity,请打开清单文件,并添加 元素作为 元素的子元素。例如:

    <manifest ... >
      <application ... >
          <activity android:name=".ExampleActivity" />
          ...
      </application ... >
      ...
    </manifest >
    

5.2 声明 intent 过滤器

要使用此功能,您需要在 元素中声明 属性。此元素的定义包括 元素,以及可选的 元素和/或 元素。这些元素组合在一起,可以指定 Activity 能够响应的 intent 类型。例如,以下代码段展示了如何配置一个发送文本数据并接收其他 Activity 的文本数据发送请求的 Activity:

    <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
    

5.3 启动 Activity

在此示例中, 元素指定该 Activity 会发送数据。将 元素声明为 DEFAULT 可使 Activity 能够接收启动请求。 元素指定此 Activity 可以发送的数据类型。以下代码段展示了如何调用上述 Activity:

    // Create the text message with a string
    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
    // Start the activity
    startActivity(sendIntent);

5.4 声明权限

您可以使用清单的 标记来控制哪些应用可以启动某个 Activity。父 Activity 和子 Activity 必须在其清单中具有相同的权限,前者才能启动后者。如果您为父 Activity 声明了 元素,则每个子 Activity 都必须具有匹配的 元素。

    <manifest>
    <activity android:name="...."
       android:permission=”com.google.socialapp.permission.SHARE_POST”

    />

然后,为了能够调用 SocialApp,您的应用必须匹配 SocialApp 清单中设置的权限:

    <manifest>
       <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
    </manifest>

5.5 Activity 生命周期

为了在 Activity 生命周期的各个阶段之间导航转换,Activity 类提供六个核心回调:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用其中每个回调。
【小沐学Android】开发常见问题FAQ之Gradle更新_第16张图片

6、“Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:”的解决方法

Android studio升级到最新版本之后出现 “Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:”的报错提示:
在这里插入图片描述
将 “File – Project Structure – Project ”路径下的Gradle version改为最新版本:
【小沐学Android】开发常见问题FAQ之Gradle更新_第17张图片
将Gradle Version 里的版本号改为最新的版本号,最新版本是7.0,那么就选择7.0版本。
【小沐学Android】开发常见问题FAQ之Gradle更新_第18张图片

https://mirrors.cloud.tencent.com/gradle/gradle-7.0-all.zip

7、IOException: https://dl.google.com/android/repository/addons_list-3.xml java.net.ConnectException: Connection refused: connect

  • 方法1:(不行)
    解决办法:打开~/.gradle/gradle.properties 文件,打开并删掉代理配置(带有“proxy”的端口或ip地址配置)

  • 方法2:(可行)
    修改文件“build.gradle”中的compileSdkVersion和targetSdkVersion为较为新的值,比如29.

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

你可能感兴趣的:(Android,android,android,studio,gradle,java,Groovy)