目录
- 背景
- 自定义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' 引入。
-
开始编辑我们的config.gradle
-
在app下的build.gradle中可以使用config.gradle 中的定义内容
dependencies 的前后对比
这样就可以随心所欲的在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']
}
}