迁移至Android3.0遇到一些问题

一、AS3.0新增功能

此处略(自行Google )

官方文档

二、迁移后速度对比

gradle2.2 gradle3.0
首次 770s 260s
修改代码(一行) 291s 123s
修改代码(一行) 250s 140s
修改代码(一行) 252s 119s

迁移后3.0后速度提升接近50%左右;首次build使用6min左右,以后每次能控制在3min左右,当然不同项目可能存在差异但提升开发效率一定是肯定的

三、迁移步骤

  1. 下载最新官方AndroidStudio3.0并完成安装

  2. 修改gradle-wrapper.properties

    distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip
  3. 修改根目录build.gradle

    buildscript {
        repositories {
            google()//add
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'//update
    }
    
    allprojects {
        repositories {
            //add
            maven {
                url 'https://maven.google.com'
            }
         }
    }
  4. 修改根目录gradle.properties

    可以在项目根目录的gradle.properties中添加如下代码,这样可以统一项目中各Module的使用版本属性

    //as3.0默认开启aapt2功能用以提高构建速度,但目前貌似兼容不好,会有错误,此处关闭该功能
    android.enableAapt2=false
    
    MIN_SDK_VERSION = 14
    COMPILE_SDK_VERSION = 23
    TARGET_SDK_VERSION = 21
    //AndroidStudio3.0以上版本的BuildToolsVersion至少是26.0.2以上
    BUILD_TOOLS_VERSION = 26.0.2

    其他个module的build.gradle文件中可以这样引用其变量

    android {
      compileSdkVersion COMPILE_SDK_VERSION.toInteger()
      buildToolsVersion BUILD_TOOLS_VERSION.toString()
    
      defaultConfig {
          minSdkVersion MIN_SDK_VERSION.toInteger()
          targetSdkVersion TARGET_SDK_VERSION.toInteger()
      }
    }
  5. 注释掉所有build.gradle中enforceUniquePackageName=false

    enforceUniquePackageName在gradle4.1中性已被弃用会编译报错

  6. 去掉build.gradle中可能存在的apply plugin: ‘com.neenbedankt.android-apt’;将apt修饰符调整为annotationProcessor
    eg:

    apply plugin: 'com.neenbedankt.android-apt'//删除
    
    apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"//将apt修饰符调整为annotationProcessor
  7. 在混淆文件(proguard-project.txt)中注释掉所有-libraryjars代码
    新版本中AS默认已对其jars做非混淆处理了,不用重复声明

  8. 修改app的build.gradle

        android{
    
            flavorDimensions "tier" //add
    
            productFlavors {
                xiaomi{
                    dimeension 'tier'
                }
                ...
            }
    
            applicationVariants.all { variant ->
                //统一输出apk路径
               variant.getPackageApplication().outputDirectory=new File(project.buildDir.absolutePath+"/outputs/apk")
    
                variant.outputs.all {
                       //修改App文件名称
                      outputFileName = "${variant.name}-${variant.versionName}.apk"
                }
            }   
    }
    
    task myTask << {
        xxx
    }
    
    //<<写法已不建议使用,需修改为如下
    task myTask  {
        doLast{
            xxx
        }
    }
  9. 修改Fragment
    所有的Fragment必须提供无参构造器,传参可以通过调用setArgments(Bundle b)来实现;在有参构造器加上@SuppressLint(“ValidFragment”)注解,避免打release版本失败

  10. 自定义动画xml文件需要放到正确文件目录
    属性动画xml应放到animator目录否则release版本会构建失败

  11. getSystemService的写法
    Activity.getSystemService需要修改成getApplicationContext.getSystemService否则在Android N版本以下会有内存泄漏存在

  12. freeline对as3.0不支持强制使用会报错,只能等待阿里升级了

至此项目中隐含的构建失败风险因子已被移除,在终端进入项目根目录执行

./gradlew assembleDebug //for mac 首次会现在gradle4.1版本以及相关库耐心等待即可

四、依赖配置关键字

implementation

迁移至Android3.0遇到一些问题_第1张图片

  • C模块的类只暴露给A,APP无法直接引用
  • C中的drawable、layout、string目录可以直接被APP引用
  • 修改C,只会导致C本身以及直接依赖的A重新编译
  • 使用implementation能够加快gradle build

compile

迁移至Android3.0遇到一些问题_第2张图片

  • C接口可暴露给任意Module,APP可以跨层引用C接口(类)
  • 修改C会导致C以及所有直接或间接依赖的Module重新编译
  • 拖慢gradle build

总结

compile关键字已不建议使用,可以使用新关键字api直接替换(compile==api);但我们原则上是优先使用implementation关键字替换,如果有问题再考虑使用api替换

以上只是本人在自己项目迁移至AS3.0过程中遇到的问题及其解决方法,后续会继续补充!

你可能感兴趣的:(android开发)