本文针对于在linux环境下,不使用eclipse而把一个eclipse项目转换为gradle默认结构的项目的情况,脚本可能在mac下也适用,未验证。
windows中的转换问题,以及使用eclipse进行导出再导入到android studio的问题均不在此讨论之内。
本文原创,转载请注明出处:
http://blog.csdn.net/maosidiaoxian/article/details/48517275
前些天在网上找到了一个库,可它是一个eclipse项目,并且有两年没更新了,习惯了使用远程依赖的管理方式的我就想把它转成一个Gradle构建的项目,并且是Android Studio中默认使用的项目结构,试了几次均不成功。于是在github上搜索,居然找到了一个老外的项目,里面有实现这个需求的脚本。项目地址:https://github.com/saadfarooq/android-migrate-gradle
不过这个项目老外也是两年没更新了,使用的Android Gradle Plugin版本还是0.4的,并且还有其他问题。二话不说,clone下来,自己修改了几次,终于改好了一个较为完善的脚本,虽还有一些瑕疵,等下说明。
我改完的脚本如下:
echo -n "include " > settings.gradle; # Loop through the sub-project directories for dname in `find -name src`;do # Remove ant stuff echo "Removing adt generated folders"; rm -rf $dname/../bin; rm -rf $dname/../gen; plugin="apply plugin: 'com.android.application'" if grep -Fxq "android.library=true" $dname/../project.properties; then plugin="apply plugin: 'com.android.library'" fi dependencies=`cat $dname/../project.properties |sed -n "s/android.library.reference.*=..\/\(.*\)/ compile project(':\1')/p"` echo "Creating; src directory" $dname/main; mkdir $dname/main; echo "Creating java src directory" $dname/main; mkdir $dname/main/java; # Copy old stuff to new paths echo "Copying Manifest from " $dname/../ to $dname/main; cp $dname/../AndroidManifest.xml $dname/main/; echo "Moving code to new 'main' folder"; for srcs in `ls $dname`; do [[ $srcs != "main" ]] && mv $dname/$srcs $dname/main/java \ && echo "Movings source dir "$srcs ; done # Create test directory echo "Creating test directory" $dname/test; mkdir $dname/test; echo "Moving resources to new 'resource' folder " $dname/main/res ; mv $dname/../res $dname/main/; echo "Removing unnecessary files"; for file in `ls $dname/../`; do [[ -f $dname/../$file ]] && rm $dname/../$file; done [[ -f build.gradle.template ]] && \ echo "Copying gradle build file to modules" && \ cp build.gradle.template $dname/../build.gradle # Create the default build.gradle file echo "Write gradle build file to modules"; echo "$plugin android { compileSdkVersion 23 buildToolsVersion \"23.0.0\" defaultConfig { minSdkVersion 7 targetSdkVersion 22 } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) $dependencies } " > $dname/../build.gradle; # Add current project to settings.gradle echo -n \':`dirname ${dname##*./}`\' >> settings.gradle; # Final comments echo "Processing of " $dname "done. "; echo; done # Remove the last "," in settings.gradle sed -i "s/''/', '/" settings.gradle; # Add all project configuration to build.gradle in project root directory. echo "Write gradle build file to root project."; echo "buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } } allprojects { repositories { jcenter() } } " > build.gradle; # Copy Gradle stuff from ANDROID_HOME if possible if [ -n "$ANDROID_HOME" ] ; then cp $ANDROID_HOME/tools/templates/gradle/wrapper/* -rf ./; #Create local.properties echo "Create local.properties file."; echo "## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. #`date` sdk.dir=$ANDROID_HOME " > local.properties fi # Remove IDE specific files rm -rf .idea;
这个脚本针对于github上的一些eclipse项目中,有多个project的情况,在有多个project的目录下执行。在Gradle中,对于此类多项目构建,在根项目会有一个settings.gradle以及build.gradle,还有其他的gradle wrapper的文件,比如.gradle/,gradle/,以及gradlew。所以脚本先生成一个settings.gradle文件,里面的内容是:include。接着遍历每个下一层有src目录的文件夹,将其作为一个module进行转换,并把名字加到外面的settings.gradle中,然后生成外面的build.gradle,可能还会生成local.properties文件,从SDK中复制gradle wrapper的内容。最后是删除.idea目录。这是整个项目的执行过程。详细每一行就不分析了,懂shell命令的也不用我多说。
目前用此脚本对github上的部分使用adt 14以上构建的eclipse项目进行转换后都可以直接构建。不过现在为此已知的问题有:
1. 没有把libs里的support包或appcompat包去掉换成对应的远程依赖。目前似乎不影响构建。
2. 对于子项目非平级结构的多项目,可能转换会有问题。可能存在路径上的问题。
3. gradle wrapper是拷贝自android sdk的,版本可能有点老,而我在build.gradle中声明的Android Gradle Plugin版本是1.3.0,所以会导致用gradlew构建不了,但如果你安装的gradle版本不低的话,直接使用gradle构建没有问题。
4. 如果项目是git项目,没有把gradle项目需要忽略的文件添加到.gitignore中。不影响构建,不过需要手动添加要忽略的文件到.gitignore中。
5. 对于Android Manifest中声明的minVersion和targetVersion,以及versionName和versionCode,package等信息,未能移到build.gradle中来。
目前我fork的项目地址为:https://github.com/msdx/android-migrate-gradle。如果有什么好的提议或解决方法,欢迎提交Pull Request或Issue。