Thursday, September 12, 2013

Android Studio 0.2.x 引入多模块 Eclipse 项目

!!!!太他妈的累人了!整整折腾了两天!!!!!!!


不知从那个版本开始 Import Module... Android StudioFile菜单中消失了,在0.2.0之前的版本作为library的模块可以像Eclipse里一样,绝对路径可以完全和主Applicaiton无关,比如如下的目录结构:

/AllProjects/androidProject/myApplication
/Libs/android/ActionbarSherlock

这里myApplication用到ActionbarSherlock这个库,但是到了0.2.x版本行不通了。首先你得把ActionbarSherlock 移成和myApplication 同级目录,但如果按照上面的目录结构,eclipse 引出Gradle后,用Android Studio 引入后,Project的名字叫andropidProject ,如果在androidProject 目录下还有其他项目,引出到Android Studio后显然会引起混乱,所以重新调整目录结构如下:

/AllProjects/androidProject/myAppProject/myApplication
/AllProjects/android/Project/myAppProject/ActionbarSherelock

然后从Eclipse Export Gradle...但是:别以为这样就OK了,后面的问题仍然是一连串的,下面我分步骤讲解下。

基本环境:
  • Ubuntu 13.04 64bit
  • Eclipse Standard 4.3 (KEPLER)
  • Android Studio 0.2.8 Build #AI-132.821530
  • JDK "1.7.0_25"
  • Android SDK Tools 22.0.5


项目:
myApplication

依赖库:
ActionbarSherlock
drag-sort-listview


第一步:
调整目录结构,并在Eclipse里正确编译。

/
├─ AllProjects
│  └─ androidProject
│  └─ myAppProject
│     ├─ myApplication
│     ├─ ActionbarSherlock
│     └─ drag-sort-listview
└─ android-sdk-linux


第二步:
导出gradle build 文件。

选择Eclipse->File->Export... ,在Export 对话框中选择Android->Generate Gradle build files .具体导出方法参看 Android 官方介绍Migrating from Eclipse 。选中所有要导出的项目,myApplication, actionbarsherlock, drag-sort-listview ,点下一步,确认Project root 是否是 /AllProjects/androidProject/myAppProject , (如果不是,说明你的项目目录结构不正确),最后向导会在Project root 目录中生成下列文件和目录:

gradle/
build.gradle
gradlew
gradlew.bat
settings.gradle

第三步:
运行Android Studio ,Welcome 窗口中选择 Import Project... File->Import Project... 选择导入 /AllProjects/androidProject/myAppProject/build.gradle .

接下来第一个问题来了,按照Android 官方站点的介绍,选择 use gradle wrapper , 出现如下错误:



这里有两个问题,第1个问题比较复杂,先解决第2个问题。
2个问题产生的原因可能是我在Android Studio 中将ADT目录 指向 /android-sdk-linux ,而不是Android Studio Bundle ADT (在Android Studio 目录下的SDK目录),我想通常同时用Eclipse Android Studio的都会这么配置吧,否则机器上保存两份ADT 不是有病嘛!

3.1 步:
Project root 目录中创建 local.properties 文件,文件中加上如下行:

sdk.dir=/home/royer/android-sdk-linux

(你也可用Android Studio new Project.. 生成一个Android Project ,让后从那里copy 一个 local.properties过来)。


现在回头看第一个问题,这个应该是Android Studio 或者 Intellij Bug... Anyway, 解决方法如下:

3.2步:
选择 Use local gradle distribution , Gradle home 里输入你本地的Gradle 路径,如下图:



Gradle 可以到 Gradle download 下载,我用了1.7 版,1.61.8应该也都可以。

到此时,导入是成功了,但编译通不过,碰到的第1个问题是:

Gradle: Execution failed for task ':myApplication:processDebugManifest'.
> Manifest merging failed. See console for more info.

按照提示,开console, 运行 ./gradlew build ,可以看到原因,是myApplication 指定的 android:targetSdkVersion 低于 actionbarsherlock 指定的版本。

第四步:
修改 AndroidManifest.xml确保 主项目和库项目的tagetSdkVersion 一致.

重新build,刚才错误消失了,但新出了19个错误,大致如下:

Gradle: Error while executing dx command
Gradle: UNEXPECTED TOP-LEVEL EXCEPTION:
Gradle: java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/NotificationCompatIceCreamSandwich;

实际上是如何引用 supportv4 库的问题, Eclipse 里是copy 到个项目的libs 目录下,而Android Studio 是引用repositories 的方法。参考Android 官方文档 Support Library Setup,解决如下:

第五步:
修改每个项目的build.gradle 文件。
dependencies {
compile "com.android.support:support-v4:18.0.+"
compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-v4.jar')
.....
}
注:如果你的libs 目录里只有android-support-v4.jar ,则可以把 comile fileTree 整行删除。



OK, 到此为止,至少我成功的import了。

Search This Blog