赞
踩
gradlew :modulename:dependencies
示例:gradlew AssembleDebug --profile,会在build/reports/profile生出相应的时间统计数据
import java.time.*
gradle.taskGraph.beforeTask { Task task ->
task.ext.setProperty("startTime", Instant.now())
}
gradle.taskGraph.afterTask { Task task, TaskState state ->
println task.name + " took " + Duration.between(task.ext.startTime, Instant.now()).toMillis() + " millis"
}
在BuildConfig文件 生成对应的变量:buildConfigField “boolean”, “LOG_DEBUG”, “true”
在manifest文件的占位符 manifestPlaceholders = [UMENG_CHANNEL_VALUE: “xxx”]
获取AndroidManifest文件的值
/**
* 不同的类型要区别获取,以下是String类型的
* @param context 上下午
* @param metaName meta-data定义的名字
* @param defaultValue 默认值
* @return
*/
public static String getAppMetaDataString(Context context, String metaName, String defaultValue) {
try {
//application标签下用getApplicationinfo,如果是activity下的用getActivityInfo
//Sting类型的用getString,Boolean类型的getBoolean,其他具体看api
String value = context.getPackageManager()
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)
.metaData.getString(metaName, defaultValue);
return value;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return defaultValue;
}
}
variantFilter { variant ->
def names = variant.flavors*.name
def types = variant.buildType.name
if (names.contains("abi") && types == "debug") {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}
最近把测试项目迁移到了androidX 发现现在迁移已经很方便了,特别是不用手动去解决第三方依赖库
修改gradle.properties文件
android.useAndroidX=true // 使用Android X
android.enableJetifier=true // 将第三方依赖库也一起迁移到AndroidX!!!
附带网上搜的剔除support库依赖方法:未验证但是可以作为参考
implementation('第三方库的依赖') { exclude group: 'com.android.support' }
推荐参考:AndroidX终极迁移指南
AGP插件版本 | 所需的最低 Gradle 版本 |
---|---|
8.1 | 8.0 |
8.0 | 8.0 |
7.4 | 7.5 |
7.3 | 7.4 |
7.2 | 7.3.3 |
7.1 | 7.2 |
7.0 | 7.0 |
4.2.0+ | 6.7.1 |
4.1.x | 6.5 |
4.0.x | 6.1.1 |
3.6.x | 5.6.4 |
3.5.x | 5.4.1 |
3.4.x | 5.1.1 |
3.3.x | 4.10.x |
3.2.x | 4.6.x |
3.1.x | 4.4.x |
3.0.x | 4.1.x |
KGP version | Gradle min and max versions | AGP min and max versions |
---|---|---|
1.9.0 | 6.8.3 – 7.6.0 | 4.2.2 – 7.4.0 |
1.8.20 | 6.8.3 – 7.6.0 | 4.1.3 – 7.4.0 |
1.8.0 | 6.8.3 – 7.3.3 | 4.1.3 – 7.2.1 |
1.7.20 | 6.7.1 – 7.1.1 | 3.6.4 – 7.0.4 |
1.7.0 | 6.7.1 – 7.0.2 | 3.4.3 – 7.0.2 |
1.6.20 | 6.1.1 - 7.0.2 | 3.4.3 - 7.0.2 |
Gradle version | Embedded Kotlin version | Kotlin Language version |
---|---|---|
5.0 | 1.3.10 | 1.3 |
5.1 | 1.3.11 | 1.3 |
5.2 | 1.3.20 | 1.3 |
5.3 | 1.3.21 | 1.3 |
5.5 | 1.3.31 | 1.3 |
5.6 | 1.3.41 | 1.3 |
6.0 | 1.3.50 | 1.3 |
6.1 | 1.3.61 | 1.3 |
6.3 | 1.3.70 | 1.3 |
6.4 | 1.3.71 | 1.3 |
6.5 | 1.3.72 | 1.3 |
6.8 | 1.4.20 | 1.3 |
7.0 | 1.4.31 | 1.4 |
7.2 | 1.5.21 | 1.4 |
7.3 | 1.5.31 | 1.4 |
7.5 | 1.6.21 | 1.4 |
7.6 | 1.7.10 | 1.4 |
8.0 | 1.8.10 | 1.8 |
8.2 | 1.8.20 | 1.8 |
8.3 | 1.9.0 | 1.8 |
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Android.kotlinVersion}"
"org.jetbrains.kotlinx:kotlinx-coroutines-android:${Android.kotlinVersion}"
"androidx.core:core-ktx:1.6.0"
Android Studio 版本 | Kotlin 插件版本 | Kotlin 版本 |
---|---|---|
3.0.x | 1.2.x | 1.2.x |
3.1.x | 1.2.x - 1.2.61 | 1.2.x |
3.2.x | 1.3.x - 1.3.50 | 1.3.x |
3.3.x | 1.3.x - 1.3.50 | 1.3.x |
3.4.x | 1.3.x - 1.3.50 | 1.3.x |
3.5.x | 1.3.x - 1.3.50 | 1.3.x |
3.6.x | 1.3.x - 1.3.72 | 1.3.x |
4.0.x | 1.4.x - 1.4.31 | 1.4.x |
4.1.x | 1.4.x - 1.4.31 | 1.4.x |
4.2.x | 1.5.x - 1.5.21 | 1.5.x |
4.3.x | 1.5.x - 1.5.21 | 1.5.x |
2020.1.x | 1.4.x - 1.4.31 | 1.4.x |
2020.2.x | 1.4.x - 1.4.31 | 1.4.x |
2020.3.x | 1.4.x - 1.4.31 | 1.4.x |
4.4.x | 1.6.x | 1.6.x |
- 将工程和模块的JavaVersion设置为 Java7语言
- defalutConfig 里配置 jackOptions{ enable = true}
- 升级至Java8,可能遇到乱七八糟的问题可以通过一起升级gradle版本解决
- exclude 语法,剔除冲突文件
- 通过删除jar包里面相关的类(直接解压缩删除相关类)
// gradle 插件3.0后无效
defaultPublishConfig "guestDebug"
publishNonDefault true
问题背景:接入的方法数超过65536,开启multidex分包;
解决:
- 网上查询了资料发现5.0以下的系统,分包可能会导致通过library的类分到不同的包找不到,需要配置一下哪些类在主dex;或者配置dexOptions的一个选项:
dexOptions{
preDexLibraries = true
}
- 然后还是不解决,并且我的机子是5.0以上的系统,应该不存在这个问题,检查各类资源文件后发现so库的架构和之前的不一样了,配置相关选项解决(坑了我差不多一个星期)
ndk {
abiFilters 'armeabi'
// abiFilters 'armeabi-v7a'
}
- 检查是否第三方aar包与已引入的依赖库冲突,查看日志一般可以看到冲突的类: Multiple dex files define:Lcom.xxx.xxx.xxx
删除相关依赖包或者其他方式解决
- 如果没有提示冲突类,检查依赖aar、jar等是否重复,比如升级SDK忘记删掉老的aar包会报这个错误
- 使用exclude 排除
报错:
- com.android.ide.common.process.ProcessException Failed to execute aapt…
- …with arguments {package -f --no-crunch -I
- …finished with non-zero exit value 1-3
解决:
场景: module A 依赖了 moduleB ,B中有许多中风味例如 :flavor1、flavor2,但是A没有,此时会报错
解决方法:
- 给A或者B加上相应的风味,让他们能够匹配到
- 在A的风味中加上 matchingFallbacks
flavorDimensions "default"
productFlavors {
"moduleAFlavor" {
dimension "default" // 每个风味必须制定一个demension维度
...
matchingFallbacks = ['flavor1','flavor2']
}
在BuildType 也可以用相同的方法解决BuildType缺失的问题
// In the app's build.gradle file.
android {
defaultConfig{
// 下面这句话告诉gradle,当遇到一个module中有个app中没有的'minApi'维度时,
// 它应该按照下面这个顺序去匹配这个维度的flavors
missingDimensionStrategy 'minApi', 'minApi18', 'minApi23'
// 若其他module中还有更多app中没有的维度,你必须为所有的维度定义回退策略
missingDimensionStrategy 'abi', 'x86', 'arm64'
}
flavorDimensions 'tier'
productFlavors {
free {
dimension 'tier'
// 你可以在一个特定的flavor中覆盖defaultConfig的配置
missingDimensionStrategy 'minApi', 'minApi23', 'minApi18'
}
paid { }
}
}
集成小米单机游戏SDK 发现出现这个问题,文档要求集成V4的27.1.1的库,项目使用了26.1.0,出现这个问题 升级库即可,一般是使用的support版本不匹配
加完库依赖发现报错,原来是开启了离线模式,找了下设置居然没找到关掉离线模式的开关,搜了下发现移动到右侧gradle这边了
clean后仍然无法解决,搜了下 stackoverflow 删除 .gradle文件夹 后正常编译
发现这个是这个SDK引用到了 AppCompat库的东西,而文档未告知,所以Theme.AppCompat.Light.DarkActionBar相关主题就报错了,引入com.android.support:appcompat-v7:27.1.1 后解决(具体版本号根据项目而定)
- Windows:
gradlew build --refresh-dependencies
gradle build --refresh-dependencies- Mac:
./gradlew build --refresh-dependencies
最近接入小米SDK的时候appkey 和 appid 都是纯数字,最后发现取值的时候被解析成int类型导致取不到值,其实应该是一个string类型的key;解决方法:
在需要被当成string类型的纯数字参数加一个斜杆: / ;
比如数值 1234567890,需要写成 /1234567890
Android Studio 版本太低 尝试用高版本打开
这个问题比较奇葩,查看日志发现压缩so库资源的task被跳过了,在so库路径设置正确的情况下:
- 设置NDK环境
- 检查自己的gradle脚本 是否跳过了此任务(例如含debug字段)
推荐参考解决:再见,Jetifier
直接这样执行,原先监听端口方式无效
d8.bat
、d8.jar
改为/复制 一个为dx.bat
、dx.jar
(\lib 目录下)plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
}
老项目找不到AndroidManifest文件导致编译不过,添加以下配置即可
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"androidManifestFile": "$projectDir/src/main/AndroidManifest.xml".toString()
]
}
}
}
What went wrong:
Execution failed for task ':android_sdk:proguardJar'.
> java.io.IOException: Please correct the above warnings first.
- 根据提示解决警告
- 忽略或者直接不混淆一些错误比较多的非关键类
# proguard-rules.pro 文件
#不警告编译过程中的警告:Please correct the above warnings first
#-dontwarn com.mobile.emm.**
三方库使用了lambda表达式,但是当前sdk的编译版本依然是JDK7 ,需要将当前SDK module以及app module改为JDK8
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}
jdk版本不对,切换为老的JDK11解决。
一样也是JDK版本不对,如果切换回老的版本后还是不行,查看是不是用了默认的debug的签名秘钥,如果是的话把他删除或者删除整个.android文件夹。这个问题多半是先安装了新的再安装了老板的android studio
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。