迁移更新Android Studio 3.4

第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

https://www.cnblogs.com/smyhvae/p/4456420.html

android studio生成aar包并在其他工程引用aar包

https://blog.csdn.net/getchance/article/details/47257389

gradle优化配置,提高速度

第一步:配置.gradle文件夹目录(开启Gradle单独守护线程)

org.gradle.daemon=true  // 开启线程守护,第一次编译时开线程,之后就不会再开了
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8  // 配置编译时的虚拟机大小
org.gradle.parallel=true  // 开启并行编译,相当于多条线程再走
org.gradle.configureondemand=true   启用新的孵化模式

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=8192m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
gradlePropertiesProp=gradlePropertiesValue
sysProp=shouldBeOverWrittenBySysProp
envProjectProp=shouldBeOverWrittenByEnvProp
systemProp.system=systemValue
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=8192m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

第二步:修改android studio配置

  • Ctrl+Alt+S打开设置选项卡,找到Gradle选项,选中offline work,点击apply,如下

     

    gradle选项配置

  • 找到Compiler选项,设置如下

     

参考:加快gradle的编译速度总结-亲身经历 

https://www.jianshu.com/p/200d55b4d40a

 https://m.imooc.com/article/20533

1.更新配置Gradle版本

Gradle需要更新到4.1,在gradle/wrapper/gradle-wrapper.properties中配置:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

然后就配置Android Plugin的版本

buildscript {
    repositories {
        jcenter()
        google()
    
          }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
    }
}
allprojects {
    repositories {
        jcenter()
        google()
    }
}

然后同步gradle。
通常情况下你会发现速度特别慢,因为没有翻墙,默认是从国外服务器下载gradle;
这时候就可以强关AS,直接在网上找资源,把gradle-4.1-all.zip这个包,放在

C:\Users\你的用户名\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew\gradle-4.1

目录中(最后那个乱码文件夹名字每台机器上不一样),注意不需要手动解压,然后重启AS自动同步gradle即可;

 

2.Flavor Dimensions变更

Android Plugin3.0的依赖机制:在使用library时会自动匹配variant(debug, release),就是说app的debug会自动匹配library的debug,相信大多数人也像我一样,当library多了,不会手动选择每个Library的variant。现在好了,它会自动匹配了。同样如果使用flavor的时候,比如app的redDebug同样会自动匹配library的readDebug。虽然有这样的优势,但是在使用flavor时,必须定义flavor dimension,否则会提示错误:

Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.

加上默认的dimension;大概就是为了保证各个渠道包要保持某些属性的一致;总之按照官网上的说法,只要给每个渠道都设置一个“flavorDimensions”就可以了

这个错误,我也已经在使用Android Studio3.0以后碰到好多次了。现在使用flavor,必须像下面一样配置:

// Specifies a flavor dimension.
flavorDimensions "color"

productFlavors {
     red {
      // Assigns this product flavor to the 'color' flavor dimension.
      // This step is optional if you are using only one dimension.
      dimension "color"
      ...
    }

    blue {
      dimension "color"
      ...
    }
}

注意:如果library有两个dimensions:color,shape,但是app只有color,那么会如下的编译错误:

Error:Could not resolve all dependencies for configuration ':bar:redDebugCompileClasspath'.
Cannot choose between the following configurations on project :foo:
  - redCircleDebugApiElements
  - redSquareDebugApiElements
  ...

APP使用flavorSelection选定使用某个flavor dimension,注意如下配置:

android {
  ...
  // The flavorSelection property uses the following format:
  // flavorSelection 'dimension_name', 'flavor_name'

  // Chooses the 'square' flavor from libraries that specify a 'shape'
  // dimension.
  flavorSelection 'shape', 'square'}

4.使用annotationProcessor

使用annotationPorcessor代替apt

dependencies {
    ...
    annotationProcessor 'com.google.dagger:dagger-compiler:<version-number>'
}

注意:目前apt可用,但是未来稳定版本会移除。

//1.在project的build.gradle中删除

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

//2.在module的build.gradle中删除

apply plugin:'android-apt'

//3.将module的build.gradle文件中的

              dependencyapt 'com.jakewharton:butterknife-compiler:8.1.0'

改为annotationProcessor'com.jakewharton:butterknife-compiler:8.1.0'

gradle打包,自定义apk名称代码报错(Cannot set the value of read-only property 'outputFile' )

报错

Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
<a href="openFile:D:\eclipseCode\ipay-android\xinlebao\build.gradle">Open File</a>

解决 :修改文件名代码请这样写

android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "xinlebao_${defaultConfig.versionName}_${releaseTime()}.apk"
                }
            }

 在主项目model中加入获取时间戳方法:

def buildTime() {
    def date = new Date()
    def formattedDate = date.format('yyyy_MM_dd--HH:mm')
    return formattedDate
}

AAPT2 编译报错 AAPT2 error

  • 报错

    Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    
  • 解决:在gradle.properties中关闭APPT2 编译

    android.enableAapt2=false
    
  • 注:如果是eclipse转到as上的项目,可能没有gradle.properties文件,请在项目根目录中手动创建

 参考链接:http://www.jianshu.com/p/9af06314e036

http://makaidong.com/bluestorm/970_9001358.html
http://blog.csdn.net/ncuboy045wsq/article/details/73521856
http://www.jianshu.com/p/9af06314e036
 

更新时间:2018/01/21

https://maven.google.com 连接不上的解决办法

dl.google.com 局域网可访问

https://maven.google.com 会 301 跳转到https://dl.google.com/dl/android/maven2/

所以直接替换 https://maven.google.comhttps://dl.google.com/dl/android/maven2/

maven { url 'https://dl.google.com/dl/android/maven2/'}

参考博客:http://blog.csdn.net/a06_kassadin/article/details/72796696

 

更新时间:2018/02/09

Can't process attribute android:fillColor="@color/text_gray": references to other resources are not

...

升级为android studio3.0,gradle升级为4.1,报错:

     A failure occurred while executing com.android.build.gradle.tasks.MergeResources$FileGenerationWorkAction
  > Error while processing D:\Android\WeishuProjects\Zszy\app\src\main\res\drawable\ic_right_gray_24dp.xml : Can't process attribute android:fillColor="@color/text_gray": references to other resources are not supported by build-time PNG generation.

解决方法:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

你需要在项目的build.gradle脚本中,增加对Vector兼容性的支持

 

更新时间:2018/02/09

Android Studio3.0之后由compile变为implementation

在com.android.tools.build:gradle 3.0 以下版本依赖在gradle 中的声明写法

compile fileTree(dir: 'libs', include: ['*.jar'])
  • 但在3.0后的写法为
implementation fileTree(dir: 'libs', include: ['*.jar'])
或
api fileTree(dir: 'libs', include: ['*.jar'])

其实在新版本 Android Gradle plugin 3.0 中 已经将 compile 标记为过时了,而取而代之的是 implementationapi 两个关键字。那么它们有什么区别呢?

api 关键字 其实等同于 compile 。但为什么要换个名字呢,目前还没有查到相关的信息,如有大神知道,请留言告知。

implementation : 

这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。 

使用了该命令编译的依赖,它仅仅对当前的 Moudle 提供接口。例如我们当前项目结构如下:



LibraryA 中引用了 LibraryC 的库,如果对 LibraryC 的依赖用的是 implementation 关键字。 如下:

dependencies {
    . . . . 
    implementation project(path:':libraryC')
}

那么 LibraryC 中的接口,仅仅只能给 LibraryA 使用,而我们的 App Moudle 是无法访问到 LibraryC 提供的接口的,也就是将该依赖隐藏在内部,而不对外部公开。这就是 implementation 关键字的作用。

那为什么要这么做呢?
答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口

为什么能加快编译速度呢?
这对于大型项目含有多个 Moudle 模块的, 以上图为例,比如我们改动 LibraryC 接口的相关代码,这时候编译只需要单独编译 LibraryA 模块就行, 如果使用的是 api 或者旧时代的 compile,由于App Moudle 也可以访问到 LibraryC ,所以 App Moudle 部分也需要重新编译。当然这是在全编的情况下。

至于编译速度的对比,国外有个小哥已经做了简单的对比,效果还是不错。地址可点击原文跳转过去查看。

那么我们现有项目中的依赖如何修改呢? 

答案是:将 compile 都修改为 implementation 然后尝试进行项目构建,如果构建成功那么恭喜你,如果构建不成功,则查看相关的依赖项,并将其修改为 api 关键字依赖。

参考链接:https://juejin.im/post/5a0a71466fb9a045196918ab
自我总结:使用implementation 加快编译速度,只访问依赖的库项目,不会访问库里面嵌套依赖的库项目。报错的依赖库改api

 

更新时间:2018/8/8

android项目app中引用不到module下的jar包问题

在module中导入了***.jar或者在线的包,在app中如果想引用这个jar里相关的内容时,发现根本引用不到,会提示你add library/*****.jar 一大串,你回车一下或者点一下没反应,根本没有用。

只需把module下gradle里相关jar的implementation改为api即可,因为implementation 修饰的只能在当前module中引用,你在app下是引用不了的,你改完重新编译下即可进行引用了。

参考:https://blog.csdn.net/weixue9/article/details/80774418

主项目和库项目清单文件冲突错误

Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs

(Manifest合并失败)

解决:注释application属性

    <!--Error:Execution failed for task ':app:processDebugManifest'.-->
    <!--&gt; Manifest merger failed with multiple errors, see logs-->
    <!--清单文件合并错误-->
    <!--android:icon="@mipmap/ic_launcher"-->
    <!--android:label="@string/app_name"-->
    <!--android:supportsRtl="true"-->
    <!--tools:replace="android:icon, android:label,android:theme"-->
    <!--android:theme="@style/AppTheme"-->
    <application
            android:allowBackup="true"

          >

。。。

com.android.support冲突的解决办法

exclude group:表示只要包含com.android.support的都排除 
api是android studio3.0中新的依赖方式,对依赖方式还不熟悉的话可以看这篇文章:Android Studio3.0新的依赖方式

例如:

    api("com.afollestad.material-dialogs:core:0.9.5.0") {
        exclude group: 'com.android.support'
    }
  • module:删排除group中的指定module 

例如:

    api("com.afollestad.material-dialogs:core:0.9.5.0") {
        exclude group: 'com.android.support', module: 'support-v13'
        exclude group: 'com.android.support', module: 'support-vector-drawable'
    }
  • 另外还有一个建议,在我们自己创建library给别人使用时,如果需要依赖com.android.support的话,建议用provided的方式依赖(android studio3.0中更改为compileOnly),这样只会在编译时有效,不会参与打包。以免给使用者带来不便。

例:

    provided 'com.android.support:appcompat-v7:26.1.0'

 使用统一的support版本包

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
//                details.useVersion '26.1.0'
                details.useVersion '27.1.1'
            }
        }
    }
}

。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章