Android之APP合并操作及相关问题

最近有需求要求进行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中的文件

  1. 去掉附APP的 app module 对应的 build.gradle 文件中的 applicationid 属性

  2. 删除附APP的 settings.gradle 文件

  3. 删除附APP中的 AndroidManifest.xml 标签中 android:name 属性

3.导入附APP在主项目中

  •  File → New → Import Module 导入主项目

Android之APP合并操作及相关问题_第1张图片

  • 勾选Import,再取一个不重复的名字: 

Android之APP合并操作及相关问题_第2张图片

  •  在主项目中的 setting.gradle 文件中添加 mylibrary
include ':app', ':mylibrary'
  •  为项目A添加 mylibrary 依赖,通过 File → Project Structure 进入工程管理界面。选择 app 、Dependencies、绿色 “+” 小图标、Module dependency,apply,依赖 implementation project(':mylibrary')。

Android之APP合并操作及相关问题_第3张图片

4. 附APP中引入aar包(两步)

  • 在附APP依照惯例完成引用arr包的操作:

拷贝aar包到主项目中的libs文件后,在build.gradle中配置:


repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    ...
    compile(name: '***', ext: 'aar') 
}
  • 在主APP中build.gradle(Moudle:app)中添加如下配置:
repositories {
    flatDir {
        dirs 'libs', '../***/libs'
    }
}

5.ButterKnife插件安装: 
按住Ctrl+Alt+S打开Settings界面,搜索Butterknife,然后按部就班的安装就好了。

Android之APP合并操作及相关问题_第4张图片

 安装了有个比较好玩的功能:找到一个布局然后,按住快捷键:Alt + insert,选择如图选项

Android之APP合并操作及相关问题_第5张图片

之后选择布局的内容,一键生成注册代码:

Android之APP合并操作及相关问题_第6张图片

 

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.合并遇到的问题

  • ERROR: The Android Gradle plugin supports only Butterknife Gradle plugin version 9.0.0-rc2 and higher

解决:它提示需要什么样的版本,就用什么版本。

此处为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'
    }
}

 

  • ERROR:More than one file was found with OS independent path 'lib/armeabi-v7a/xxx.so'

有个解决方案:

在build.gradle(Module :app)中的android{}里增加:

packagingOptions{
exclude 'lib/armeabi-v7a/xxx.so'
}

知道这个问题,就是包冲突了,我目前并不能找到这个冲突的包是谁,怎么找到呢?

只能根据build之后报错:那个冲突就排除哪一个。最后可以成功运行。

  • WARNING: API ‘variant.getJavaCompile()’ is obsolete and has been replaced with ‘variant.getJavaCompileProvider()’.It will be removed at the end of 2019.

解决方法是:gradle退回之前的版本。

 

引入三方库 兼容包版本不一致问题

  • Error:Execution failed for task ':app:preDebugBuild'.> Android dependency 'com.android.support:recyclerview-v7' has different version for the compile (25.3.1) and runtime (25.4.0) classpath. You should manually set the same version via DependencyResolution

由于两个项目使用的版本号不统一,在最外层项目的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的内容,只能单向访问。

你可能感兴趣的:(Android之从头自学)