我们在开发中可能会遇到同时开发几个app的情况,而这几个app在某些地方是相同的,而我们通常的做法是将相同的部分抽成一个library。这在eclipse中是很好实现的,而在Android studio中,我们一般都是抽成module,而一般这些module还是放在项目的根目录下的,要在另一个项目中使用,怎么办呢?
- 方法一:
将module拷贝到另一个项目的根目录下,在其settings.gradle 文件中的include 后面添加模块名。比如原来只有
include ':app'
然后我们添加一个utils模块:
include ':app',':utils'
最后别忘了在app那个build.gradle文件中的dependencies加上
compile project(":utils")
大家应该发现了,这种办法挺笨的,如果一个app中的module有代码上的改变,就要将有改变的module拷贝,然后覆盖未被改变的module。
其实我们有更好的办法,让两个app指向同一个module。
- 方法二:
我们在app的根目录的的同级目录(也就是你项目所在的目录),建立一个新的文件夹,比如命名为library,然后把module拷贝进去,在两个app的settings.gradle 文件中的include 后面修改或添加模块名。比如原来是
include ':app', ':pushsdk'
我们改成:
include ':app', ':pushsdk'
project(':pushsdk').projectDir = new File("../library", 'pushsdk')
之后我们就可以共用这个library中的module了,是不是方便了很多(当然,两个项目得在同一个文件夹里面,library也在这个文件夹里面)。
当有多个Module,并且Module又依赖于另一个Module时(嵌套Module),比如
include ':app', ':photochooselibrary', ':mynciclib', ':sharesdk'
project(':photochooselibrary').projectDir = new File("../library", 'photochooselibrary')
project(':mynciclib').projectDir = new File("../library", 'mynciclib')
project(':sharesdk').projectDir = new File("../library", 'sharesdk')
//这里是嵌套的,具体就不写了
然后只需要在App里的build.gradle里配置一行代码即可
compile project(':sharesdk')
如何出现问题一,如下
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute application@label value=(@string/app_name) from AndroidManifest.xml:8:9-41
is also present at [:sharesdk] AndroidManifest.xml:15:9-45 value=(@string/dummy_button).
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:5:5-19:19 to override.
这里应该也好理解,我就直接给出解决方案,只需在配置里配置这行代码
xmlns:tools="http://schemas.android.com/tools"
我的是这样
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.zdk.multimoduletest">
最后在Application配置这行即可
tools:replace="android:label,android:theme,android:icon"
我的是这样
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:label,android:theme,android:icon">
如果出现问题二:不能找到module:
首先将build.gradle(app)中的代码注释:
// compile project(':sharesdk')
然后对settings.gradle中的嵌套modele一条一条添加:
第一步:
include ':app',':photochooselibrary'
project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
第二步:
include ':app',':photochooselibrary',':mynciclib'
project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
project( ':mynciclib').projectDir = new File('../library','mynciclib')
第三步:
include ':app',':photochooselibrary',':mynciclib',':sharesdk'
project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
project( ':mynciclib').projectDir = new File('../library','mynciclib')
project( ':sharesdk').projectDir = new File('../library','sharesdk')
当项目左边目录显示
build.gradle(Module:app)
build.gradle(Module:mynciclib)
build.gradle(Module:photochooselibrary)
build.gradle(Module:sharesdk)
说明成功了!然后将build.gradle(app)中的代码注释取消就可以了:
compile project(':sharesdk')
好了,就到这里吧!
Android Studio如何引用外部Library工程