android-AndroidStudio踩坑记录

as 版本 3.4.2

可以参考的两个工程


常用插件


设置代理

有了 Proxifier 可以不用这样设置代理就可以访问当 Google 服务.

  1. 本地 ssr 勾选 允许来自局域网的连接, 设置端口为 10088

  2. as 设置代理

    file -> settings, 搜索 proxy.

    选择 手动设置, 选择 http, 主机是 localhost, 端口是上面设置的端口, 也就是 10088

    然后填一个 https://www.google.com/ 测试一下是否成功

  3. 然后下 sdk 啥的就很快了, 可以在 任务管理器 看到


android studio 如何修改包名

参考: https://www.jianshu.com/p/557e1906db1a


Android Studio UTF-8编码格式设置

在AndroidStudio中,单击File,找到setting,在新打开的窗口里点击 Editor 再选择 File Encodings,我们可以看到默认编码格式是GBK,只需要把所有的编码格式都改成UTF-8就可以了。


Android Studio常用快捷键

https://www.jianshu.com/p/d65a72b6677d

  • ctrl + alt + o : 去除无用引用
  • ctrl + alt + L : 格式化代码
  1. 查找:
    Ctrl+R 替换文本
    Ctrl+F 查找文本
    Ctrl+N 查找类
    Ctrl+Shift+N 查找文件
    Ctrl+Shift+Alt+N 查找类中的 方法或变量
    Alt+F3 ,逐个往下查找相同文本,并高亮显示。

Alt + F7, 查找 方法或变量 被调用的地方.

  1. 移动:
    Ctrl+Alt+ left/right 返回至上次浏览的位置
    Alt+ left/right 切换代码视图
    Alt+ Up/Down 在方法间快速移动定位
    Ctrl+Shift+Up/Down 代码向上/下移动。
    F2 或Shift+F2 高亮错误或警告快速定位

  2. 补全:
    Alt+Insert 生成代码(如get,set方法,构造函数等)
    Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者 )
    Ctrl+J 自动代码

  3. 提示:
    Ctrl+空格 代码提示
    Ctrl+Alt+Space 类名或接口名提示
    Ctrl+P 方法参数提示
    Ctrl+H 显示类结构图


修改 gradle 版本

默认目录是在 C:\Users\wilker\.gradle\wrapper\dists

可以参考: Android Studio 修改gradle版本 - https://www.jianshu.com/p/23c4663ee326


重命名 包名 package

如果只是想修改打包 包名 的话, 不用去修改 AndroidManifest.xml 中的 package, 修改 build.gradle 中的 applicationId 即可. 然后 gradle 中 build

如: applicationId 改为 com.aaa.bbb, logcat 中可以看到


使用 android studio 打包 unity 使用的插件jar


.jar 与 .aar的区别

参考: Android studio中如何生成引用 .aar 和 .jar - https://www.jianshu.com/p/76559da9ab39

从名称上来讲,一个是java application resource;一个是android application resource
那所有的区别从名字上即可体会到:

  • .jar 中只包含class文件和清单文件
  • .aar 中包含了class文件和其他所有资源文件,包括res中资源文件

比如你的lib库是一个自定义view封装,里面不仅有class文件并且包含了资源文件,那么此时你就需要将这个库以.aar的形式来提供给使用。


build.gradle 分析

file -> project structure , build.gradle 里面的配置可以在这里可视化操作. ( ctrl + shift + alt + s )

  • apply

    如果是 应用主体 的话, 这里会是 apply plugin: 'com.android.application'

    如果是 模块 的话, 这里会是 apply plugin: 'com.android.library'

  • buildTypes

    打包的一些参数

  • dependencies

    依赖的 第三方 jar, aar

    implementation fileTree(include: ['*.jar'], dir: 'libs') : 根据匹配规则, 多个依赖. 依赖 目录 libs 下的所有 .jar 后缀的文件

    implementation files('libs/classes.jar', 'libs/xxx.jar') : 指定依赖 目录 libs 下的 classes.jarxxx.jar 文件

    implementation 'com.android.support:appcompat-v7:28.0.0' : 指定兼容的api. 这里很可能会遇到报错, 参考: [报错: Could not find any version that matches com.android.support:appcompat-v7:29](#报错: Could not find any version that matches com.android.support:appcompat-v7:29)

  • task

    自定义任务. 根据规则写需要的任务, 会出现在这里, 双击执行任务.

    exportJar.dependsOn(deleteOldJar, build) : 是指自定义的 exportJar 任务按顺序依赖 deleteOldJar, build 这两个任务


tasks 任务相关

添加自定义任务 task

  1. aaa

  2. 刷新一下工程的 gradle

跳过任务

有时候不想要某个任务是可以跳过, 比如打 unity Android 库的时候, build 的时候会执行 verifyReleaseResources 资源验证任务, 但是一般 AndroidManifest.xml 配置引用 res 相关资源不严谨找不到时 (这个并不影响打出来 aar 包), 就会执行任务失败, 导致后续有任务依赖的话就无法执行.

build.gradle 加上

1
2
3
4
5
6
// 去掉不想要的任务
tasks.whenTaskAdded {task ->
if(task.name.contains("verifyReleaseResources")) {
task.enabled = false
}
}

创建 签名文件 keystore

使用 android studio 创建的是 .jks (java keystore) 后缀的文件

build -> generate signed bundle/apk -> next -> create new


创建 icon 资源

  • 前置物料: 前景 icon 和 背景 icon

Android App Bundle (aab) 构建

两种方式

  1. 构建所有版本的 aab 包: gradle 窗口的 tasks 中 build -> bundle
  2. 构建 debug 版本的 aab 包: build -> build bundle/apk -> build bundle

Android App Bundle (aab) 文件提取 apk

  1. 去官网下最新的 bundletool. https://github.com/google/bundletool/releases

    命令行文档: https://developer.android.com/studio/command-line/bundletool

  2. 运行命令, 这里用的版本是 bundletool-all-0.10.2.jar

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    E:\its_rummy\z_package\debug (master -> origin)
    λ java -jar ..\..\tools\bundletool-all-0.10.2.jar build-apks --bundle="aaa.aab" --output=aaa.apks --ks=..\..\aaa.jks --ks-pass=pass:aaa --ks-key-alias=aaa --key-pass=pass:aaa

    -jar : bundletool 工具
    --bundle : aab 包
    --output : 输出 apks
    --ks : 签名文件
    --ks-pass : 签名文件密码
    --ks-key-alias : 签名别名
    --key-pass : 密码
  3. 输出的文件 aaa.apks 用解压工具打开, 可以看到不同 cpu 架构的 apk 包


添加构建版本

这个可以使用多个 签名文件 keystore 同时打出多个签名的包. 比如 [构建 release apk](#构建 release apk), 打出的 apk 会同时输出到 build/outputs/apk

构建 release apk

  1. 创建 release keystore, 参考: [创建 签名文件 keystore](创建 签名文件 keystore)

  2. 添加 gradle 构建版本. ctrl + shift + alt + s 调出可视化配置 build.gradle 的界面 project structure

    1. 给主module (这里是app) 添加一个 signing configs

    2. 给主module (这里是app) 的 build variants 指定签名配置 signing config 为 刚添加的配置. ( debugger = true 只是方便 logcat 调试看日志 )

    配置完后 build.gradle 会增加以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    android {
    signingConfigs {
    release {
    storeFile file('F:\\z_temp\\yangx.jks')
    storePassword '12345678a'
    keyPassword '12345678a'
    keyAlias = 'yangx'
    }
    }
    buildTypes {
    release {
    ...
    debuggable = true
    signingConfig signingConfigs.release
    }
    }
    }
  3. 双击 gradle 中的 build

    就出来了签名版的 apk


单元测试

旨在测试接口的正确性

引入依赖一般 使用 implementation 引入远程库, 不用下载 jar 库引入.


java 单元测试

如果只是测试 非Android 的 java 代码的话, 新建一个 java library 模块去测试. 测试时间快


android 单元测试

参考: android-Androidd单元测试-Espresso.md


profiler

profiler 窗口: view -> tool windows -> profiler


编辑器设置


logcat 界面

view -> tool windows -> logcat


gradle sync

file -> sync project with gradle files 或者


自动导入所有包


隐藏竖线

  • 这条线

    image-20220929162134584

  • 取消勾选

    image-20220929162101585


Android 默认 debug 签名

默认使用 %USERPROFILE%\\.android\debug.keystore.


gradle 修改 AndroidManifest.xml

AndroidManifest.xml 中的值一般是写死的, 但是有了 gradle 构建 apk, 就可以在通过在 AndroidManifest.xml 中放点占位符 ${place_app}

然后在 build.gradle 中定义不同的 构建渠道/版本 替换掉这个 占位符, 达到动态修改的目的

以 application 的 meta-data 为例

  1. 在 AndroidManifest.xml 中加入占位符

    1
    2
    3
    4
    5
    6
    7
    8
    <application
    android:allowBackup="true">

    <!-- meta 测试值 -->
    <meta-data
    android:name="mymeta01"
    android:value="hello my application:${place_app}"></meta-data>
    </application>
  2. 在 build.gradle 中指定 不同构建版本的这个 占位符 的值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    android {
    buildTypes {
    release {
    manifestPlaceholders = [
    place_app : "yangx001",
    }

    debug {
    buildConfigField('String', 'My_VALUE', '"http://www.yangx.com/"')
    manifestPlaceholders = [
    place_app : "wilker001",
    }
    }
    }
  3. 构建测试, 这里使用单元测试

    1
    2
    3
    4
    5
    6
    @Test
    public void Test_getValueFromAndroidManifest() throws PackageManager.NameNotFoundException {
    ApplicationInfo appInfo = mActivity.getPackageManager().getApplicationInfo(mActivity.getPackageName(), PackageManager.GET_META_DATA);
    String appMsg = appInfo.metaData.getString("mymeta01");
    Log.d(TAG, " application meta: " + appMsg);
    }

    locat 打印出的日志

    1
    02-27 21:44:23.564 11390-11420/? D/--- EspressoTest:  application meta: hello my application:wilker001

gradle 添加 res/values 键值对

把需要动态的数据配置到 res/values 中的 xml 中, 可以代码中获取.

而 res/values 又可以通过 gradle 动态构建出来, 配置到不同的渠道中.

  1. 在 build.gradle 中添加新键值对, 必须是之前不存在, 否者构建会报错

    1
    2
    3
    4
    5
    6
    android {
    defaultConfig {
    // 添加 res/values 键值对, 添加的 键 必须不存在, 否则报错
    resValue('string', 'ps_hello', 'nice to meet you')
    }
    }
  2. 在 java 中动态获取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static String GetStringVaule(Activity activity, String key) {
    Resources res = activity.getResources();
    String appPackageName = activity.getApplication().getPackageName();
    return res.getString(res.getIdentifier(key, "string", appPackageName));
    }

    @Test
    public void Test_getValueFromResStrings() {
    String val = Tools.GetStringVaule(mActivity, "ps_hello");
    Log.d(TAG, "val: " + val);
    }

    logcat

    1
    02-27 23:50:58.232 32053-32087/com.its.demo.testgoogle D/--- EspressoTest: val: nice to meet you

gradle BuildConfig 字段

用于构建不同版本 (debug/release) 时, 指定不同的值 (目的和 cpp 中的宏差不多).

DefaultConfig对象中专门对外提供了buildConfigField(type, name, value)方法,用于向构建时生成的BuildConfig.java类中增加新的属性。

  1. 例如: 在 build.gradle 中添加一个 在 BuildConfig 生成字段 My_VALUE

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    android {
    buildTypes {
    release {
    // 在 BuildConfig 生成字段 My_VALUE, 注意一定要用 '' 包住,
    buildConfigField('String','My_VALUE','"http://www.wilker.com/"')
    }

    debug {
    buildConfigField('String','My_VALUE','"http://www.yangx.com/"')
    }
    }
    }
  2. 然后 gradle sync 一下, 就会生成这个字段

  3. 测试一下构建不同版本的 apk, 这个值就不一样

    1
    Log.d(TAG, "MY_VALUE: " + BuildConfig.My_VALUE);

gradle 配置 多渠道 打包 productFlavors

这需要和 [自定义 BuildConfig](#自定义 BuildConfig) 和 添加构建版本 结合起来, 产生多个 apk 变体

  • buildTypes : 是指构建的版本, 比如有两个版本 debug 和 release
  • productFlavors : 是指构建的不同渠道, 比如有两个渠道 beijing 和 shandong

那么总共就可以构建出 2(渠道) x 2 (版本) 个包体: beijing 的 debug 和 release 包体, shandong 的 debug 和 release 包体

同时 gradle 窗口会多出很多版本的构建任务出来, 可以单独构建 某个渠道 的 所有版本.

添加 渠道

  1. build.gradle 中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    android {
    ...
    // Specifies the flavor dimensions you want to use. The order in which you
    // list each dimension determines its priority, from highest to lowest,
    // when Gradle merges variant sources and configurations. You must assign
    // each product flavor you configure to one of the flavor dimensions.
    flavorDimensions 'api', 'version' // 优先级 高 -> 低, productFlavors 中每个渠道必须在 dimension 属性指定一个 这里的标记

    productFlavors {
    demo {
    // Assigns this product flavor to the 'version' flavor dimension.
    dimension 'version'
    }

    full {
    dimension 'version'
    }

    minApi24 {
    // Assigns this flavor to the 'api' dimension.
    dimension 'api'
    }

    minApi21 {
    dimension "api"
    }
    }
    }

    dependencies { // 指定渠道依赖
    // 通用依赖
    implementation 'com.google.android.gms:play-services-location:15.0.1'

    // 不同渠道的依赖
    shandongImplementation 'com.google.android.gms:play-services-location:15.0.1'
    beijingImplementation 'com.google.android.gms:play-services-location:15.0.1'
    }
  2. gradle sync 一下. 或者 build -> rebuild project. 就会生成不同变体的 BuildConfig 文件 (build -> generated -> source -> buildconfig)


代码中获取动态参数的几种方式

  1. AndroidManifest.xml 中配置 application,activity,service 中的 meta 参数. 而 AndroidManifest.xml 又可以在 gradle 中配置. [gradle 修改 AndroidManifest.xml](#gradle 修改 AndroidManifest.xml)
  2. BuildConfig 中配置. [gradle BuildConfig 字段](#gradle BuildConfig 字段)
  3. res 中的 xml 中配置. [gradle 添加 res/values 键值对](#gradle 添加 res/values 键值对)

引用其他模块

比如: testapp 模块引用 app 模块

ctrl + shift + alt + s

其实就是 testapp 模块的 build.gradle 中添加这个

1
2
3
dependencies {
implementation project(path: ':app')
}

手动移动模块

  • 应用场景: 把一个模块从 工程 a 移到 工程 b 中

    1. 直接复制模块目录到 目的工程 中

    2. settings.gradle 中添加模块, 然后 gradle sync 同步一下, 就可以在显示任务了


添加第三方库

  1. 先把库丢到 对应模块的 libs 下

  2. 在对应模块的 build.gradle 中添加上库依赖

    1
    2
    3
    4
    dependencies {
    // oppo
    implementation files('libs/gamesdk-oversea-20191224.jar')
    }
    • 也可以可视化添加: file -> project structure -> dependencies 中给对应的模块添加上库


控制台中文乱码

help -> edit custom vm options… , 增加一行 utf8 配置

1
-Dfile.encoding=UTF-8

参考: https://blog.csdn.net/github_2011/article/details/109135258


修改仓库引用

解决 build 慢问题

修改 项目级 的 build.gradle, 指定源为 阿里云

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
buildscript {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' } // mavenCentral 镜像仓库
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } // google 镜像仓库
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} // jcenter 镜像仓库
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath 'com.novoda:bintray-release:+'
}
}

allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
}

自建 maven 仓库

参考: android-搭建本地maven仓库.md


第三方库默认下载位置

C:\Users\$USER$\.gradle\caches\modules-2\files-2.1


UI 控件

添加控件并调整位置

  1. 如果控件, 并将控件的四个边的圆点拖到边上就可以决定对齐哪个边并自由调整位置了


生成布局代码


jar构建踩坑

  • android studio 报错: The ANDROID_DAILY_OVERRIDE value is outdated. Please set the ANDROID_DAILY_OVERRIDE environment variable to "21c0aef24ab2b18140facf573fe8f4f258301e2a"

    将 project 的 gradle 的工具改成其他版本, 不要用 alpha版本

    1
    2
    dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'
  • aapt.exe 意外停止. 报错: com.android.ide.common.process.ProcessException: Failed to execute aapt

    原因:在build.gradle文件中,

    1
    compileSdkVersion 和 buildToolsVersion 不匹配
  • 报错: Failed to resolve:com.android.support:appcompat-v7

    build.gradle 文件中的这个值改成已有的

    1
    2
    3
    dependencies {
    ...
    compile 'com.android.support:appcompat-v7:26.+'
  • 构建 gradle 报错: Execution failed for task ':app:lint'

    • 在所有模块的 build.gradle 文件中加入
    1
    2
    3
    4
    5
    android {
    lintOptions {
    abortOnError false
    }
    }
  • 构建gradle报错: Could not get unknown property 'jniLibs' for source set 'main' of type

    字段 sourceSets 放错位置, 应该在 android 标签内

    参考: https://blog.csdn.net/changcsw/article/details/80020851

  • 构建gradle报错: Error converting bytecode to dex xxx

    Edit First Clean and then Make Project also works.

    参考: https://stackoverflow.com/questions/34352591/android-error-converting-byte-to-dex


as gradle Plugin 版本对应关系


cmake 配置找不到

  1. 安装 cmake

    image-20221017110430104

  2. local.properties 中配置 cmake 路径

    1
    2
    sdk.dir=D\:\\unity_kit\\android_sdk
    cmake.dir=D\:\\unity_kit\\android_sdk\\cmake\\3.18.1 // 配置这个路径, 注意路径格式

    如果配置失败, gradle sync 时会报错: CMake '3.18.1' was not found in PATH or by cmake.dir property

  3. 然后就可以在 gradle 中配置了

    1
    2
    3
    4
    5
    6
    7
    8
    android {
    externalNativeBuild {
    cmake {
    path "src/main/cpp/CMakeLists.txt" // 要使用 cmake 编译的配置文件
    version "3.18.1" // 版本
    }
    }
    }

    参考: https://developer.android.com/studio/projects/install-ndk?hl=zh-cn


logcat 过滤日志


踩坑

报错: Plugin with id ‘com.android.application’ not found.

打开报错的项目的build.gradle,看看有没有buildscript{}

1
2
3
4
5
6
7
8
9
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
//注意:更换成自己的AS的版本
}
}

报错: Could not find com.android.tools.build:gradle:2.9

进入%android-studio安装目录%\gradle\m2repository\com\android\tools\build\gradle , 看已有的版本有哪些, 填上去去

参考: https://blog.csdn.net/moira33/article/details/78850806


报错: Could not find any version that matches com.android.support:appcompat-v7:29

可能当前模块的 build.gradlecompileSdkVersiontargetSdkVersion 为 29, 应用主体的 compileSdkVersiontargetSdkVersion 为 28, 所以要对齐到应用主体的编译版本, 改为 28 就好,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
android {
compileSdkVersion 28
buildToolsVersion "29.0.1"

defaultConfig {
minSdkVersion 19
targetSdkVersion 28
}
}

dependencies {
// implementation 'com.android.support:appcompat-v7:29.+' // 不去兼容 29 的
implementation 'com.android.support:appcompat-v7:28.0.0' // 增加兼容 28 的
}

然后 clean 一下该模块重新构建


调试时 no debuggable processes

参考: no debuggable processes 或者 Enable ADB Integration找不到 - https://www.jianshu.com/p/c86f4c78867c

设置打包参数是否可以调试


修改完 gradle 不生效

修改完 gradle 一定要刷新一下才生效

然后在 build 出 apk.


报错: Manifest merger failed with multiple errors

模块a 引用 模块b 时, 合并 Manifest 报错, 但是给的信息很有先, 只有 Manifest merger failed with multiple errors

查看具体的信息可以在 项目的根目录 (模块目录的上一级目录) 执行: gradlew processDebugManifest --stacktrace -info, 然后搜索关键之 error, fail 之类的就可以找到错误信息

1
2
3
4
5
6
7
8
9
10
11
12
E:\its_rummy\Rummy_AndroidStudio>gradlew processDebugManifest --stacktrace -info
[:app] E:\its_rummy\Rummy_AndroidStudio\app\build\intermediates\library_manifest\debug\AndroidManifest.xml:50:5-76 Warning:
Element uses-permission#android.permission.ACCESS_WIFI_STATE at [:app] AndroidManifest.xml:50:5-76 duplicated with element declared at [:app] AndroidManifest.xml:42:5-76
E:\its_rummy\Rummy_AndroidStudio\testapp\src\main\AndroidManifest.xml:7:9-43 Error:
Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest.xml:7:9-43
is also present at [:app] AndroidManifest.xml:58:9-40 value=(@mipmap/app_icon).
Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:5:5-22:19 to override.
E:\its_rummy\Rummy_AndroidStudio\testapp\src\main\AndroidManifest.xml:11:9-40 Error:
Attribute application@theme value=(@style/AppTheme) from AndroidManifest.xml:11:9-40
is also present at [:app] AndroidManifest.xml:60:9-50 value=(@style/UnityThemeSelector).
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:5:5-22:19 to override.

参考: Manifest merger failed with multiple errors, see logs问题处理 - https://blog.csdn.net/Picasso_L/article/details/53085299


报错: Cannot resolve external dependency com.xxx

原因是下载不到远程仓库的 库, 网络原因, 可能需要 科学上网.


报错 a single dex file 大于 65536

报错: Cannot fit requested classes in a single dex file (# methods: 72725 > 65536)

在对应模块的 gradle 文件里加入配置

1
2
3
defaultConfig {
multiDexEnabled true
}

参考: https://blog.csdn.net/zhangphil/article/details/80306301


报错 META-INF

报错: More than one file was found with OS independent path 'META-INF/DEPENDENCIES'

在对应模块的 gradle中加入配置

1
2
3
4
5
android {      
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
}

参考: https://stackoverflow.com/questions/44342455/more-than-one-file-was-found-with-os-independent-path-meta-inf-license


报错:unrecognized Attribute name MODULE

  • 方案一 (建议)

    将 as 升级到最新, sdk 也更新到最新即可, 然后修改 gradle 构建版本, 如: 最新为 32

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
        android {
    compileSdkVersion 32
    buildToolsVersion '32.0.0'
    defaultConfig {
    minSdkVersion 19
    targetSdkVersion 32
    }
    }

    - 方案二

    报错:unrecognized Attribute name MODULE

    gradle里面compileSdkVersion和buildToolsVersion版本过高,超过Android Studio支持范围

    参考: https://blog.csdn.net/QQ1075687690/article/details/118732947



    ---

    #### as 报错找不到任务

    报错: `android xxx not found in project`

    解决办法: 关闭工程, 把工程下 `.idea` 文件夹删掉, 重新打开即可.

    参考: https://blog.csdn.net/goleftgoright/article/details/50171963



    ---

    #### as 升级到 2020.3.1 没有 gradle 任务

    此时需要打开 **Preferences -> Experimental**:

    ![](https://pic05.wilker.cn/20220121165634-653.webp)

    将 **Gradle** 下面的 ☑️ Do not build Gradle task list during Gradle sync 勾选去掉,选择 **Apply**,点击 **OK** 后。再点击 **图标**(Sync Project with Gradle Files)

    参考: https://blog.csdn.net/qq_20613731/article/details/119940006



    ---

    #### gradle tool 升级报错已已损坏

    报错: `Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager. 错误`

    gradle 配置的是 32.0.0

    ```json
    android {
    compileSdkVersion 32
    buildToolsVersion '32.0.0'
    defaultConfig {
    minSdkVersion 19
    targetSdkVersion 32
    }
    }

改成 31.0.0 也报类似的错误

原因是:

The main problem is the two files missing in SDK build tool 31 that are:

  1. dx.bat
  2. dx.jar

解决办法:

  1. %ANDROID_SDK%\build-tools\32.0.0 目录下的 d8.bat 改成 dx.bat
  2. %ANDROID_SDK%\build-tools\32.0.0\lib 目录下的 d8.jar 改成 dx.jar

参考: https://stackoverflow.com/questions/68387270/android-studio-error-installed-build-tools-revision-31-0-0-is-corrupted


创建新项目 gradle 构建失败

错误: org.gradle.api.resources.ResourceException: Could not get resource

原因是下载不到需要资源, 可以增加多几个下载源, 修改项目级 build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories { // 修改为以下 下载源
maven {
url 'https://maven.google.com/'
name 'Google'
}
mavenCentral()
jcenter(){ url 'https://jcenter.bintray.com/'}
google()
maven { url 'https://dl.google.com/dl/android/maven2/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
classpath 'com.google.gms:google-services:4.3.3'
}
}

参考: https://www.jianshu.com/p/80efaa3372a6


报错重复的类

  • 错误

    1
    2
    3
    4
    Execution failed for task ':app:checkDebugDuplicateClasses'.
    > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
    > Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-compat-27.0.2-runtime (com.android.support:support-compat:27.0.2)

  • 解决办法: 在全局 gradle.properties 中加入配置

    1
    2
    android.useAndroidX=true
    android.enableJetifier=true