导入一个AndroidStudio工程作为一个Library Module

在我们有两个Android Studio工程的情况时,我们想使用一个作为library工程导入到另一个工程作为一个module。我们可以使用Android Studio很容易的做到。

注意: 1. MyApplication的 targetSdkVersion 22 不能比 MyLibrary的低.

          2. 在File ->Project Struceture 如果依赖不成功,可以试着手动在 APP 的 dependencies部分直接添加 都可以.

          3. 合并完成后经过测试手动删除MyLibrary中Manifest中的"MAIN"即可

          <intent-filter>

                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

          4. 合并完成后switch case语句不能继续使用R.id.xxx了,可以使用if-else代替,studio下点击提示错误的case语句同时按 alt+enter快速批量修改


          4. 后期假如出现图片重复,或者风格重复的情况,具体看log解决.
          5. 如果两个工程中有同名的使用文件比较麻烦,需要手动修改.
          6.如果添加了想删除,在File->Project Structure 下选择要删的APP,点做上面的"-".然后在工程目录下在删除对应的目录就可以了.D:\workspace\PortableEquipment


########################################################################################################
开始库工程的导入:

让我们假设我们有两个工程:MyApplication和MyLibrary,我们想导入MyLibrary到MyApplication作为一个module。

步骤一:先修改MyLibrary为Library



首先我们需要从MyLibrary工程中找到module中的build.gradle文件,它通常在app目录下,除非你修改了module的名称。

注意builde.gradle文件的plugin是‘com.android.application’。为了使用这个工程作为一个library工程,我们需要修改为 ‘com.android.library’[注意区分大小写]。文件的内容就像这样:

试着sync一下工程,会出现一个错误: Library projects cannot set applicationId(类工程不能设置applicationId)。

我们可以删除gradle文件中的applicationId这行,在defaultConfig 括号里面。

另外就是需要修改Module:app-library里面的:

      minifyEnabled true  ->  minifyEnabled false



sync一下工程,没有问题.MyLibrary 工程就修改完了。 


然后我们在MyApplication 工程中导入 
MyLibrary 作为一个module。 


骤二:MyApplication 导入Moudule并完成依赖

在MyApplication 工程中, 点击File -> New -> Import Module。




出现一个对话框


从MyLibrary工程中找到你想要导入的Module目录。通常它是app module除非你给了它另一个名称。



如果在MyApplication工程中Module使用相同的名称将会出现错误。为了从一个library工程导入一个修改的Module,我们可以给它一个版本号在Module名称设置框。


修改Module的名称为my-library,导入成功。




点击OK,就完成了。

IDE会在MyApplication/app/build/gradle file文件添加好依赖。

依赖部分就像下面的一样:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'    
    compile project(':my-library')
}

骤三:修改Manifest
刚合并完会有两个Manifet文件,这时两个文件都有"Main"标记的activity. 这样第一次先启动那个Activity就不一定了. 删除Mylibrary第一次启动的Activity Main属性
修改完后,就可以在主工程中调用库工程了. 如果类名写上去无法解析,那试着编译下这样代码跟新才能生效.

骤四:其他设置

它可能工作的挺好,但这有一个很重要的问题,MyLibrary工程有它自己的依赖。例如,MyApplication和MyLibrary使用support libraries,这有可能会发生冲突。

我们可以在gradle中通过transitive配置依赖避免这个问题。 
我们可以修改这行

compile project(':my-library')
   
   
  • 1

compile(project(':my-library')){
    transitive=false;
}

这个问题就可以避免。Done!

问题1:

Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:9

Error:(28, 9) Attribute application@theme value=(@style/ThemeActionBar) from AndroidManifest.xml:28:9

is also present at XXXX-trunk:XXXXLib:unspecified:15:9 value=(@style/AppTheme)

Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:24:5 to override

Error:Execution failed for task ':XXXX:processDebugManifest'.

> Manifest merger failed with multiple errors, see logs

原因:

AS的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报上面的错误。

解决方法有以下2种:

方法1: 在Manifest.xml的application标签下添加tools:replace="android:icon, android:theme"(多个属性用,隔开,并且记住在manifest根标签上加入xmlns:tools="http://schemas.android.com/tools",否则会找不到namespace哦)

方法2: 在build.gradle根标签上加上useOldManifestMerger true (懒人方法)


问题2:有的定义冲突,尤其权限
Warning:D:\workspace\PortableEquipment\app-ai2\src\main\AndroidManifest.xml:25:5-79 Warning:
    Element uses-permission#android.permission.ACCESS_FINE_LOCATION at AndroidManifest.xml:25:5-79 duplicated with element declared at AndroidManifest.xml:9:2-76

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值