最近有需求要求进行APP合并操作,两个最低版本号为21的APP集成在一个安卓4.4.2的板子上。
降级报错:Unable to get provider com.amitshekhar.DebugDBInitProvider
安卓做多了,总会遇到这个问题,所以此文尽力记录一下合并操作。
首先要有主APP与附APP的源代码。没有源码的话,合并APP可以试一下反编译(呵呵~),开玩笑啦。
1.将附APP中的build.gradle 文件中
apply plugin: 'com.android.application' 更改为 apply plugin: 'com.android.library'
2. 编辑附APP中的文件
去掉附APP的 app module 对应的 build.gradle 文件中的 applicationid 属性
删除附APP的 settings.gradle 文件
删除附APP中的 AndroidManifest.xml 的
3.导入附APP在主项目中
include ':app', ':mylibrary'
4. 附APP中引入aar包(两步)
拷贝aar包到主项目中的libs文件后,在build.gradle中配置:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
...
compile(name: '***', ext: 'aar')
}
repositories {
flatDir {
dirs 'libs', '../***/libs'
}
}
5.ButterKnife插件安装:
按住Ctrl+Alt+S打开Settings界面,搜索Butterknife,然后按部就班的安装就好了。
安装了有个比较好玩的功能:找到一个布局然后,按住快捷键:Alt + insert,选择如图选项
之后选择布局的内容,一键生成注册代码:
6.附APP项目中的资源ID冲突:
官方解释:
当多个库项目进行合并时,不同项目中的资源ID可能会重复。在ADT 14之前,无论是主项目还是库项目,资源ID统一被定义为 final 类型的静态变量。这样照成的结果就是主项目进行编译时一旦发现资源ID冲突,库项目中对应的资源文件以及引用资源文件的代码都需要重新编译。 |
在工程里我们都知道不同xml下的控件id名字就算相同也没啥问题,因为我们知道每个控件id都会被声明为final,也就是唯一的
但是在module中控件id却没有声明为final,也就是不具有唯一的性质。
附APP里由于R类中变量不再是final类型而无法使用butterknife,为了解决此问题,Jakewharton大神引入了butterknife-gradle-plugin插件,用于生成变量类型为final的R2类。
因此,在附APP中注解都使用R2类,但是在代码里还是需要使用R类,因为R类中的ID不是常量。
并且,不能使用switch-case语句的问题,要使用if语句判断。
7.合并遇到的问题
解决:它提示需要什么样的版本,就用什么版本。
此处为butterknife-gradle-plugin 9.0.0-rc2 版本为例:
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.2'
//添加butterknife
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'
}
}
有个解决方案:
在build.gradle(Module :app)中的android{}里增加:
packagingOptions{
exclude 'lib/armeabi-v7a/xxx.so'
}
知道这个问题,就是包冲突了,我目前并不能找到这个冲突的包是谁,怎么找到呢?
只能根据build之后报错:那个冲突就排除哪一个。最后可以成功运行。
解决方法是:gradle退回之前的版本。
引入三方库 兼容包版本不一致问题
由于两个项目使用的版本号不统一,在最外层项目的build.gradle中增加:
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.android.support'
&& !details.requested.name.contains('multidex') ) {
//统一版本号
details.useVersion "25.4.0"
}
}
}
}
注: app可以直接访问mylibrary定义的内容,mylibrary无法访问app的内容,只能单向访问。