第一次接触到多模块是因为老板需要一款集合了多个之前开发的软件的功能的apk,鉴于移植工程量比较大,打包成jar使用的话只能使用它们的Java文件,所以我想到了能不能像eclipse里一样使用library,网上搜索了一下,果然有,也就是这时候认识到了一个新的概念,模块化,把其它demo当成module导入到我需要开发的项目中。当然这之中也踩了不少的坑,现在来分享一下我的经验,由于我的经验我会从导入module的配置讲起。
一、导入module:
Source directory:这里是你要作为module导入的demo在本地的路径
Module name:这里你可以为你的module命名,这里可以看到报错了“Select modules to Import”,这是因为项目里已经有同名的module了,你需要选择Import,并为需要导入的module改名,这样下方的Finish按钮才可用。如下图
点击下方蓝色按钮Finish那就完成了module的导入。导入之后添加依赖。
打开project structure界面
选中denpendencies选项卡,点击右边绿色+号按钮,选择最后一个module dependency添加对新导入module的依赖即可。
你需要把导入的module当成library使用还需要把build.gradle文件里第一行的apply plugin: 'com.android.application'改为apply plugin: 'com.android.library' defaultConfig里的applicationId也必须删除。具体可参考如下代码: apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion '25.0.0' defaultConfig { minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { } }全部改好之后在sync一下project即可。
现在来说说容易遇见的错误有哪些
1、Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed with multiple errors, see logs
这个错误是最常见的,这是由于导入的module与项目的build.gradle文件里的defaultConfig不一致导致的,解决方法很简单,把你项目里的defaultConfig里的内容copy到你导入的module里即可。
2、Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attribute application@label value=(@string/app_name) from AndroidManifest.xml:16:9-41 is also present at [CampusAccess:IDRDemo:unspecified] AndroidManifest.xml:17:9-48 value=(@string/action_settings). Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:13:5-48:19 to override.
这也是一个比较常见的问题,当你的module和app都对AndroidManifest.xml的application进行有属性设置又不相同时就会报这个错,因为它没有办法把它们合并在一起。(编译时多个module之间相同的文件夹和相同的文件、属性都会进行合并,最终只保留一份)。这时候你可以根据它的建议使用tools来进行替换。也可以直接把module里AndroidManifest的属性配置全部删除。可以参看下面代码示例:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.scarx.idcardreader" > <application android:allowBackup="true" > </application> </manifest>3、如果你运行软件时发现实际运行了两个软件,那么一定是你module里的AndroidManifest.xml注册的Activity没有把<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 去掉导致实际运行了两个apk。
二、多个module版本配置管理
上面第一个问题的解决办法除了直接拷贝外,还有另外一种更好的解决方式,通过根目录里的build.gradle来设置全局的参数。这种方法更方便项目的后期维护和修改。
首先在build.gradle(根目录)里的allprojects里添加全局参数ext
allprojects { ext { androidApplicationId = 'com.fernanependocejas.android10.sample.presentation' androidVersionCode = 1 androidVersionName = "1.0" testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" testApplicationId = 'com.fernandocejas.android10.sample.presentation.test' } } 之后在module的build.gradle里使用: apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.ee" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" } }
