Gradle 相关问题解决记录 & 疑难杂症记录

Gradle 相关问题解决记录

      • 双清解决一大部分问题
      • 小知识
      • 疑难杂症
        • 1. 解决在Java7的项目引用了Java8的第三方库:
        • 2. 第三方依赖冲突
        • 3. 多种风味,设置默认打包渠道,否则可能会导致打不进去包
        • 4. 接入三方aar,或者遇到**java.lang.NoClassDefFoundError** 问题
        • 5. Unable To Merge Dex
        • 6. Failed to execute aapt
        • 7. module层级依赖,遇到风味(productFlavors )缺失的问题
        • 8. library中有某个demension维度,但是app中没有
        • 9. 排除不需要的变体
        • 10. 集成第三方SDK android.arch.core.util.Funtion缺少
        • 11. Android Studio 3.6以上版本关闭gradle离线版本
        • 12. No resource found that matches the given name: attr 'colorPrimaryDark'.
        • 13. 强势刷新gradle依赖&& 发布到Maven
        • java.lang.AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm
        • AndroidX 迁移

双清解决一大部分问题

  • 遇到奇怪的问题先clean 删除build文件夹等清除缓存操作!!
  • .gradle .idea build等目录文件
  • 实在不行试试删除C盘User目录下的.gradle文件夹

小知识

  • 查看 module依赖树

gradlew :modulename:dependencies

  • build.gradle

在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;
    }
  }

疑难杂症

1. 解决在Java7的项目引用了Java8的第三方库:

  1. 将工程和模块的JavaVersion设置为 Java7语言
  2. defalutConfig 里配置 jackOptions{ enable = true}
  3. 升级至Java8,可能遇到乱七八糟的问题可以通过一起升级gradle版本解决

2. 第三方依赖冲突

  • exclude 语法,剔除冲突文件
  • 通过删除jar包里面相关的类(直接解压缩删除相关类)

3. 多种风味,设置默认打包渠道,否则可能会导致打不进去包

        // gradle 插件3.0后无效
        defaultPublishConfig "guestDebug"
        publishNonDefault true

4. 接入三方aar,或者遇到java.lang.NoClassDefFoundError 问题

问题背景:接入的方法数超过65536,开启multidex分包;
解决:
- 网上查询了资料发现5.0以下的系统,分包可能会导致通过library的类分到不同的包找不到,需要配置一下哪些类在主dex;或者配置dexOptions的一个选项:

    dexOptions{
         preDexLibraries = true
    }
  • 然后还是不解决,并且我的机子是5.0以上的系统,应该不存在这个问题,检查各类资源文件后发现so库的架构和之前的不一样了,配置相关选项解决(坑了我差不多一个星期)
    ndk {  
         abiFilters  'armeabi' 
    //      abiFilters  'armeabi-v7a' 
    }

5. Unable To Merge Dex

  • 检查是否第三方aar包与已引入的依赖库冲突,查看日志一般可以看到冲突的类: Multiple dex files define:Lcom.xxx.xxx.xxx

删除相关依赖包或者其他方式解决

  • 如果没有提示冲突类,检查依赖aar、jar等是否重复,比如升级SDK忘记删掉老的aar包会报这个错误

6. Failed to execute aapt

报错:

  • 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

解决:

  • 先检查所需要的资源、库有没有打入,一般是少了某项资源比如supportv4包没有打入
  • 检查buildtools 和compileSdkVersion 版本是否对应得上

7. module层级依赖,遇到风味(productFlavors )缺失的问题

情景: module A 依赖了 moduleB ,B中有许多中风味例如 :flavor1、flavor2,但是A没有,此时会报错
解决方法:

  • 给A或者B加上相应的风味,让他们能够匹配到
  • 在A的风味中加上 matchingFallbacks
        flavorDimensions "default" 
        productFlavors {    
        "moduleAFlavor" {       
             dimension "default" // 每个风味必须制定一个demension维度
             ...  
             matchingFallbacks = ['flavor1','flavor2'] 
        }

在BuildType 也可以用相同的方法解决BuildType缺失的问题

8. library中有某个demension维度,但是app中没有

// 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 { }
    }
}

9. 排除不需要的变体

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)
    }
}

10. 集成第三方SDK android.arch.core.util.Funtion缺少

集成小米单机游戏SDK 发现出现这个问题,文档要求集成V4的27.1.1的库,项目使用了26.1.0,出现这个问题 升级库即可,一般是使用的support版本不匹配

11. Android Studio 3.6以上版本关闭gradle离线版本

加完库依赖发现报错,原来是开启了离线模式,找了下设置居然没找到关掉离线模式的开关,搜了下发现移动到右侧gradle这边了
Gradle 相关问题解决记录 & 疑难杂症记录_第1张图片

12. No resource found that matches the given name: attr ‘colorPrimaryDark’.

发现这个是这个SDK引用到了 AppCompat库的东西,而文档未告知,所以Theme.AppCompat.Light.DarkActionBar相关主题就报错了,引入com.android.support:appcompat-v7:27.1.1 后解决(具体版本号根据项目而定)

13. 强势刷新gradle依赖&& 发布到Maven

  • Windows:
    gradlew build --refresh-dependencies
    gradle build --refresh-dependencies
  • Mac:
    ./gradlew build --refresh-dependencies

发布到Maven私服
第三方工具

java.lang.AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm

Android Studio 版本太低 尝试用高版本打开

AndroidX 迁移

最近把测试项目迁移到了androidX 发现现在迁移已经很方便了,特别是不用手动去解决第三方依赖库
修改gradle.properties文件

  • Refactor - migrate to android x
android.useAndroidX=true    // 使用Android X
android.enableJetifier=true  // 将第三方依赖库也一起迁移到AndroidX!!!
  • 然后将一些迁移错误的例如 ConstraintLayout 全局搜索替换一下 根据提示解决冲突就可以了(包名之类的)

附带网上搜的剔除support库依赖方法:未验证但是可以作为参考

   implementation('第三方库的依赖') { exclude group: 'com.android.support' }

推荐参考:AndroidX终极迁移指南

你可能感兴趣的:(日记总结)