迁移更新Android Studio 3.5

第一次使用Android Studio配置(三):gradle项目构建

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

gradle优化配置,提高速度

第一步:配置.gradle文件夹目录(开启Gradle单独守护线程)
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8  

// 配置编译时的jvm虚拟机   -Xmx:表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小

//-XX:MaxPermSize:表示对非堆区分配的内存的最大上限(方法区)

//-Dfile.encoding=UTF-8  在JVM启动,设置系统文件编码格式为utf-8

org.gradle.daemon=true  // 开启线程守护,第一次编译时开线程,后续构建可以复用,节约构建时间
org.gradle.parallel=true  // 开启并行编译,相当于多条线程再走
org.gradle.configureondemand=true   //按需配置,目前还在试验孵化阶段

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

方式二:在settings设置配置

等同于 org.gradle.parallel=true

依赖库使用固定版本

api 'com.google.code.gson:gson:2.8.5'

 不推荐的写法

api 'com.google.code.gson:gson:2.8.+'

离线模式配置:

所谓离线模式offline,就是gradle在解析依赖的时候采用本地的依赖库

若是项目中有新增或者修改依赖,则不能采用offline模式因为此时本地仓库中可能不存在项目需要的依赖

方式1-通过gradle动态开关切换离线模式

方式2-全局离线模式配置:Ctrl+Alt+S打开设置选项卡,找到Gradle选项,选中offline work,点击apply,如下

方式3-编译时开启离线模式:

上面配置等同于,直接在命令后加 --offline,如:gradlew build --offlline

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

https://www.jianshu.com/p/200d55b4d40a  https://m.imooc.com/article/20533

1.更新配置Gradle版本

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

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

然后就配置Android Plugin的版本

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

}

然后同步gradle。
通常情况下你会发现速度特别慢,因为没有翻墙,默认是从国外服务器下载gradle;
这时候就可以强制关闭程序,直接在网上找资源,gradle下载网址:http://services.gradle.org/distributions/ ,下载链接:https://services.gradle.org/distributions/gradle-5.5.1-all.zip

把下载好的gradle-5.4.1-all.zip这个包,放在目录

C:\Users\%username%\.gradle\wrapper\dists\gradle-5.4.1-all

C:\Users\%username%\.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx

(3221gyojl5jsh0helicew7rwx 是随机码文件夹名字每台机器上不一样),注意不需要手动解压,然后重启程序自动同步gradle即可;

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

使用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兼容性的支持

更新时间:2021/1/14

compile、implementation、api、compileOnly区别详解

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

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

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

首先是2.x版本的依赖方式:

这里写图片描述

再来看看3.0的:

这里写图片描述

api==compile

api:跟2.x版本的 compile完全相同

implementation  实现接口依赖方式

implementation只能在内部使用此模块,比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要提供给外部访问,那么就使用api依赖即可

这个指令的特点就是,对于模块A使用了该命令编译的依赖,项目中的其他模块将无法使用模块A里面的依赖,也就是将该依赖隐藏在内部,而不对外部公开。 

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

https://maven.fabric.io/public


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

implementation project(path:':libraryC')

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

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

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

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

compile(implementation,api)

这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包

implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。

当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile或api依赖的com.android.support包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。

provided(compileOnly)

只在编译时有效,不会参与打包
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。

更新时间: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("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库

在我们自己创建library给别人使用时,如果需要依赖com.android.support的话,建议用provided的方式依赖(android studio3.0中更改为compileOnly),这样只会在编译时有效,不会参与打包。以免给使用者带来不便。

例:

    compileOnly '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'
            }
        }
    }
}

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

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

。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值