自定义Gradle部分总结

目录

  • 背景
  • 自定义config.gradle
  • 单个Dex
  • 签名配置

1、背景

项目为了快速开发引入过多的第三方库,app级的build.gradle里面包含很多内容看起来很乱,同时会随时遇到单个dex 中方法总数超过65535的问题,导致最后打包失败。
gradle 功能相当强大,这里不做过多的描述,重点介绍其中的自定义管理第三方库的自定义gradle,如何解决单个Dex65535的问题以及其他相关问题。

2、自定义config.gradle

  • 在Project模式下新建config.gradle ,然后在Project下的build.gradle 通过 apply from: 'config.gradle' 引入。


    自定义Gradle部分总结_第1张图片
    image.png

    自定义Gradle部分总结_第2张图片
    image.png
  • 开始编辑我们的config.gradle


    自定义Gradle部分总结_第3张图片
    image.png
  • 在app下的build.gradle中可以使用config.gradle 中的定义内容


    自定义Gradle部分总结_第4张图片
    image.png

dependencies 的前后对比


自定义Gradle部分总结_第5张图片
image.png

这样就可以随心所欲的在config中管理第三方库,如果你的项目采用组件化的时候,你会发现这种方式更加随心所欲。在一个config中管理所有module中的依赖。

3、单个Dex

app是由被转换成一个.class文件的java写成的。然后这个class文件(以及任何jar依赖)被编译成单个classes.dex文件。然后这个dex文件和一个apk文件(即最终从app商店所下载的东西)所需要的任意资源相组合。
这种编译过程的一个缺陷是一个dex文件系统只允许最多有65k个方法。在安卓的早期,达到65k方法上限的应用解决这个问题的办法就是使用Proguard来减少无用的代码。但是,这个方法有局限,并且只是为生产app拖延了接近65k限制的时间
为了解决这个问题,谷歌在最近的兼容库中放出了一个针对65k方法限制的解决方案:multidexing。这个方法非常方便并且允许你突破65k方法限制。
使用步骤:

1.config.gradle中定义
deps.multiDex = "com.android.support:multidex:1.0.2"

2.build.gradle中引入并配置
implementation deps.multiDex

 defaultConfig {
        .....
        multiDexEnabled true
    }

3.在MyApp集成Application ,并重写 attachBaseContext 方法 ,进行分包处理
public class MyApp extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //突破65535的限制
        MultiDex.install(this);
    }
}

说明此方法尽管可以解决单个Dex的65K问题,但是它会影响app的启动性能,所以在遇到次问题时要注意代码的简洁,尽量避免使用MultiDex。
提升app启动性能,请参考

4、签名配置

具体步骤:

1.在Project模式下新建 keystore.properties 文件 ,存放签名信息
storePassword=guiying712
keyPassword=guiying712
keyAlias=guiying712
storeFile=/mykey.jks
2.在app下的build.gradle中配置
根直接配置
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

signingConfigs 配置
 signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

你可能感兴趣的:(自定义Gradle部分总结)