在我们有两个Android Studio工程的情况时,我们想使用一个作为library工程导入到另一个工程作为一个module。我们可以使用Android Studio很容易的做到。
注意: 1. MyApplication的 targetSdkVersion 22 不能比 MyLibrary的低.
2. 在File ->Project Struceture 如果依赖不成功,可以试着手动在 APP 的 dependencies部分直接添加 都可以.
3. 合并完成后经过测试手动删除MyLibrary中Manifest中的"MAIN"即可
<intent-filter>
4. 合并完成后switch case语句不能继续使用R.id.xxx了,可以使用if-else代替,studio下点击提示错误的case语句同时按 alt+enter快速批量修改
让我们假设我们有两个工程:MyApplication和MyLibrary,我们想导入MyLibrary到MyApplication作为一个module。
步骤一:先修改MyLibrary为Library
另外就是需要修改Module:app-library里面的:
sync一下工程,没有问题.MyLibrary 工程就修改完了。
然后我们在MyApplication 工程中导入
MyLibrary 作为一个module。
步骤二:MyApplication 导入Moudule并完成依赖
在MyApplication 工程中, 点击File -> New -> Import Module。
点击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 (懒人方法)