android-AndroidStudio踩坑记录
as 版本 3.4.2
可以参考的两个工程
常用插件
- 自动生成布局代码 - https://github.com/boredream/BorePlugin
设置代理
有了 Proxifier 可以不用这样设置代理就可以访问当 Google 服务.
本地 ssr 勾选 允许来自局域网的连接, 设置端口为 10088
as 设置代理
file -> settings, 搜索 proxy.
选择 手动设置, 选择 http, 主机是 localhost, 端口是上面设置的端口, 也就是 10088
然后填一个 https://www.google.com/ 测试一下是否成功
然后下 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 : 格式化代码
- 查找:
Ctrl+R 替换文本
Ctrl+F 查找文本
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
Ctrl+Shift+Alt+N 查找类中的 方法或变量
Alt+F3 ,逐个往下查找相同文本,并高亮显示。
Alt + F7, 查找 方法或变量 被调用的地方.
移动:
Ctrl+Alt+ left/right 返回至上次浏览的位置
Alt+ left/right 切换代码视图
Alt+ Up/Down 在方法间快速移动定位
Ctrl+Shift+Up/Down 代码向上/下移动。
F2 或Shift+F2 高亮错误或警告快速定位补全:
Alt+Insert 生成代码(如get,set方法,构造函数等)
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者 )
Ctrl+J 自动代码提示:
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
- 参考文章: android studio 打包.jar到unity调用 - https://blog.csdn.net/unity_http/article/details/79929454
.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.jar 和 xxx.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
- 参考资料
- 官网: more_about_tasks - https://docs.gradle.org/current/userguide/more_about_tasks.html
aaa
刷新一下工程的 gradle
跳过任务
有时候不想要某个任务是可以跳过, 比如打 unity Android 库的时候, build 的时候会执行 verifyReleaseResources 资源验证任务, 但是一般 AndroidManifest.xml 配置引用 res 相关资源不严谨找不到时 (这个并不影响打出来 aar 包), 就会执行任务失败, 导致后续有任务依赖的话就无法执行.
在 build.gradle 加上
1 | // 去掉不想要的任务 |
创建 签名文件 keystore
使用 android studio 创建的是 .jks (java keystore) 后缀的文件
build -> generate signed bundle/apk -> next -> create new
创建 icon 资源
- 前置物料: 前景 icon 和 背景 icon
Android App Bundle (aab) 构建
- Android动态化框架App Bundles - https://zhuanlan.zhihu.com/p/38481475
两种方式
- 构建所有版本的 aab 包: gradle 窗口的 tasks 中 build -> bundle
- 构建 debug 版本的 aab 包: build -> build bundle/apk -> build bundle
Android App Bundle (aab) 文件提取 apk
去官网下最新的 bundletool. https://github.com/google/bundletool/releases
命令行文档: https://developer.android.com/studio/command-line/bundletool
运行命令, 这里用的版本是 bundletool-all-0.10.2.jar
1
2
3
4
5
6
7
8
9
10E:\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 : 密码输出的文件 aaa.apks 用解压工具打开, 可以看到不同 cpu 架构的 apk 包
添加构建版本
这个可以使用多个 签名文件 keystore 同时打出多个签名的包. 比如 [构建 release apk](#构建 release apk), 打出的 apk 会同时输出到 build/outputs/apk 中
构建 release apk
创建 release keystore, 参考: [创建 签名文件 keystore](创建 签名文件 keystore)
添加 gradle 构建版本. ctrl + shift + alt + s 调出可视化配置 build.gradle 的界面 project structure
给主module (这里是app) 添加一个 signing configs
给主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
17android {
signingConfigs {
release {
storeFile file('F:\\z_temp\\yangx.jks')
storePassword '12345678a'
keyPassword '12345678a'
keyAlias = 'yangx'
}
}
buildTypes {
release {
...
debuggable = true
signingConfig signingConfigs.release
}
}
}双击 gradle 中的 build
就出来了签名版的 apk
单元测试
旨在测试接口的正确性
引入依赖一般 使用 implementation 引入远程库, 不用下载 jar 库引入.
java 单元测试
- Android单元测试(一):JUnit框架的使用 - https://blog.csdn.net/qq_17766199/article/details/78243176
如果只是测试 非Android 的 java 代码的话, 新建一个 java library 模块去测试. 测试时间快
android 单元测试
参考: android-Androidd单元测试-Espresso.md
profiler
- Android Studio Profiler Memory (内存分析工具)的简单使用及问题 - https://cloud.tencent.com/developer/article/1369594
- 手把手教你在Android Studio 3.0上分析内存泄漏 - https://www.jianshu.com/p/bdfd2a6b2681
profiler 窗口: view -> tool windows -> profiler
编辑器设置
logcat 界面
view -> tool windows -> logcat
gradle sync
file -> sync project with gradle files 或者
自动导入所有包
隐藏竖线
这条线
取消勾选
Android 默认 debug 签名
默认使用 %USERPROFILE%\\.android\debug.keystore
.
gradle 修改 AndroidManifest.xml
- Android Gradle manifestPlaceholders 占位符详解 - https://segmentfault.com/a/1190000009176256
AndroidManifest.xml 中的值一般是写死的, 但是有了 gradle 构建 apk, 就可以在通过在 AndroidManifest.xml 中放点占位符 ${place_app}
然后在 build.gradle 中定义不同的 构建渠道/版本 替换掉这个 占位符, 达到动态修改的目的
以 application 的 meta-data 为例
在 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>在 build.gradle 中指定 不同构建版本的这个 占位符 的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14android {
buildTypes {
release {
manifestPlaceholders = [
place_app : "yangx001",
}
debug {
buildConfigField('String', 'My_VALUE', '"http://www.yangx.com/"')
manifestPlaceholders = [
place_app : "wilker001",
}
}
}构建测试, 这里使用单元测试
1
2
3
4
5
6
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 键值对
- Android gradle 配置strings.xml资源 - https://blog.csdn.net/jerycoupter/article/details/70159410
把需要动态的数据配置到 res/values 中的 xml 中, 可以代码中获取.
而 res/values 又可以通过 gradle 动态构建出来, 配置到不同的渠道中.
在 build.gradle 中添加新键值对, 必须是之前不存在, 否者构建会报错
1
2
3
4
5
6android {
defaultConfig {
// 添加 res/values 键值对, 添加的 键 必须不存在, 否则报错
resValue('string', 'ps_hello', 'nice to meet you')
}
}在 java 中动态获取
1
2
3
4
5
6
7
8
9
10
11public static String GetStringVaule(Activity activity, String key) {
Resources res = activity.getResources();
String appPackageName = activity.getApplication().getPackageName();
return res.getString(res.getIdentifier(key, "string", appPackageName));
}
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 字段
- Gradle全局变量设置、自定义BuildConfig - https://blog.csdn.net/qq_26296197/article/details/80045497
用于构建不同版本 (debug/release) 时, 指定不同的值 (目的和 cpp 中的宏差不多).
DefaultConfig
对象中专门对外提供了buildConfigField(type, name, value)
方法,用于向构建时生成的BuildConfig.java
类中增加新的属性。
例如: 在 build.gradle 中添加一个 在 BuildConfig 生成字段 My_VALUE
1
2
3
4
5
6
7
8
9
10
11
12android {
buildTypes {
release {
// 在 BuildConfig 生成字段 My_VALUE, 注意一定要用 '' 包住,
buildConfigField('String','My_VALUE','"http://www.wilker.com/"')
}
debug {
buildConfigField('String','My_VALUE','"http://www.yangx.com/"')
}
}
}然后 gradle sync 一下, 就会生成这个字段
测试一下构建不同版本的 apk, 这个值就不一样
1
Log.d(TAG, "MY_VALUE: " + BuildConfig.My_VALUE);
gradle 配置 多渠道 打包 productFlavors
- 官方文档 - https://developer.android.com/studio/build/build-variants?utm_source=android-studio#product-flavors
- flavorDimensions
- 使用gradle的productFlavors实现Android项目多渠道打包 - https://zhuanlan.zhihu.com/p/33722674
这需要和 [自定义 BuildConfig](#自定义 BuildConfig) 和 添加构建版本 结合起来, 产生多个 apk 变体
- buildTypes : 是指构建的版本, 比如有两个版本 debug 和 release
- productFlavors : 是指构建的不同渠道, 比如有两个渠道 beijing 和 shandong
那么总共就可以构建出 2(渠道) x 2 (版本) 个包体: beijing 的 debug 和 release 包体, shandong 的 debug 和 release 包体
同时 gradle 窗口会多出很多版本的构建任务出来, 可以单独构建 某个渠道 的 所有版本.
添加 渠道
在 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
37android {
...
// 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'
}gradle sync 一下. 或者 build -> rebuild project. 就会生成不同变体的 BuildConfig 文件 (build -> generated -> source -> buildconfig)
代码中获取动态参数的几种方式
- 在 AndroidManifest.xml 中配置 application,activity,service 中的 meta 参数. 而 AndroidManifest.xml 又可以在 gradle 中配置. [gradle 修改 AndroidManifest.xml](#gradle 修改 AndroidManifest.xml)
- BuildConfig 中配置. [gradle BuildConfig 字段](#gradle BuildConfig 字段)
- res 中的 xml 中配置. [gradle 添加 res/values 键值对](#gradle 添加 res/values 键值对)
引用其他模块
比如: testapp 模块引用 app 模块
ctrl + shift + alt + s
其实就是 testapp 模块的 build.gradle 中添加这个
1 | dependencies { |
手动移动模块
应用场景: 把一个模块从 工程 a 移到 工程 b 中
直接复制模块目录到 目的工程 中
在 settings.gradle 中添加模块, 然后 gradle sync 同步一下, 就可以在显示任务了
添加第三方库
先把库丢到 对应模块的 libs 下
在对应模块的 build.gradle 中添加上库依赖
1
2
3
4dependencies {
// 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 慢问题
- 阿里云仓库地址: https://maven.aliyun.com/mvn/view
- Android Studio 中的 mavenCentral、jcenter、google仓库 - https://juejin.im/post/5dc0c7076fb9a04a8e3bd730
修改 项目级 的 build.gradle, 指定源为 阿里云
1 | buildscript { |
自建 maven 仓库
第三方库默认下载位置
C:\Users\$USER$\.gradle\caches\modules-2\files-2.1
UI 控件
添加控件并调整位置
如果控件, 并将控件的四个边的圆点拖到边上就可以决定对齐哪个边并自由调整位置了
生成布局代码
- Android Studio 插件 - 自动根据布局生成 Activity 等代码 (插件代码开源) - https://blog.csdn.net/weixin_41673515/article/details/103079825
jar构建踩坑
android studio 报错:
The ANDROID_DAILY_OVERRIDE value is outdated. Please set the ANDROID_DAILY_OVERRIDE environment variable to "21c0aef24ab2b18140facf573fe8f4f258301e2a"
将 project 的 gradle 的工具改成其他版本, 不要用 alpha版本
1
2dependencies {
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
3dependencies {
...
compile 'com.android.support:appcompat-v7:26.+'构建 gradle 报错:
Execution failed for task ':app:lint'
- 在所有模块的 build.gradle 文件中加入
1
2
3
4
5android {
lintOptions {
abortOnError false
}
}构建gradle报错:
Could not get unknown property 'jniLibs' for source set 'main' of type
字段 sourceSets 放错位置, 应该在 android 标签内
构建gradle报错:
Error converting bytecode to dex xxx
Edit First
Clean
and thenMake Project
also works.参考: https://stackoverflow.com/questions/34352591/android-error-converting-byte-to-dex
as gradle Plugin 版本对应关系
cmake 配置找不到
安装 cmake
local.properties 中配置 cmake 路径
1
2sdk.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
然后就可以在 gradle 中配置了
1
2
3
4
5
6
7
8android {
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 过滤日志
- 使用 Logcat 查看日志 - https://developer.android.com/studio/debug/logcat?hl=zh-cn
踩坑
报错: 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
, 看已有的版本有哪些, 填上去去
报错: Could not find any version that matches com.android.support:appcompat-v7:29
可能当前模块的 build.gradle 的 compileSdkVersion 和 targetSdkVersion 为 29, 应用主体的 compileSdkVersion 和 targetSdkVersion 为 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 | E:\its_rummy\Rummy_AndroidStudio>gradlew processDebugManifest --stacktrace -info |
参考: 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 | defaultConfig { |
参考: 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 | android { |
报错: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
62android {
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**:

将 **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:
- dx.bat
- dx.jar
解决办法:
- 将
%ANDROID_SDK%\build-tools\32.0.0
目录下的 d8.bat 改成 dx.bat - 将
%ANDROID_SDK%\build-tools\32.0.0\lib
目录下的 d8.jar 改成 dx.jar
创建新项目 gradle 构建失败
错误: org.gradle.api.resources.ResourceException: Could not get resource
原因是下载不到需要资源, 可以增加多几个下载源, 修改项目级 build.gradle
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. |
参考: https://www.jianshu.com/p/80efaa3372a6
报错重复的类
错误
1
2
3
4Execution 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
2android.useAndroidX=true
android.enableJetifier=true