本文针对于在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。

linux下将eclipse项目转换为gradle项目的更多相关文章

  1. maven项目转换为gradle项目

    进入到项目更目录,运行 gradle init --type pom 上面的命令会根据pom文件自动生成gradle项目所需的文件和配置,然后以gradle项目重新导入即可.

  2. Eclipse中 将java Gradle项目转换为web项目

    1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下:      找到:<natures> </natures>代码段,在代码段中加入如下内容并保存:   ...

  3. 在linux下用tomcat部署java web项目的过程与注意事项

    在linux下用tomcat部署java web项目的过程与注意事项 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/ ...

  4. 在linux下用tomcat部署java web项目的过程与注意事项(转)

    在linux下用tomcat部署java web项目的过程与注意事项一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/in ...

  5. eclipse中 将java项目转换为web项目

    来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件,  ...

  6. eclipse中 将java项目转换为web项目 博客分类: Tomcat

      1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下:      找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: ...

  7. Eclipse java项目转换为web项目

    1.打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: <nature>org ...

  8. Linux下部署开源版“禅道”项目管理系统《转载》

    Linux下部署开源版“禅道”项目管理系统 https://www.cnblogs.com/xxsl/p/6525378.html

  9. Linux下使用Eclipse开发Hadoop应用程序

    在前面一篇文章中介绍了如果在完全分布式的环境下搭建Hadoop0.20.2,现在就再利用这个环境完成开发. 首先用hadoop这个用户登录linux系统(hadoop用户在前面一篇文章中创建的),然后 ...

随机推荐

  1. Gazebo機器人仿真學習探索筆記(四)模型編輯

    模型編輯主要是自定義編輯物體模型構建環境,也可以將多種模型組合爲新模型等,支持外部模型導入, 需要注意的導入模型格式有相應要求,否在無法導入成功, COLLADA (dae), STereoLitho ...

  2. android自定义view实现progressbar的效果

    一键清理是很多Launcher都会带有的功能,其效果也比较美观.实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效.本文 ...

  3. Download all Apple open source OS X files at once

    While it is well known that Mac OS X contains open source code, how to access and download that sour ...

  4. Java spi机制浅谈

    最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...

  5. StringBuffer与StringBuilder详解

    刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuild ...

  6. 数据库隔离级别(mysql+Spring)与性能分析

     数据库隔离级别与Spring配置事务的联系及性能影响,以下是个人理解,如果有瑕疵请及时指正.   这里以mysql为例,先明确以下几个问题: 一.一般项目如果不自己配置事务的话,一般默认的是au ...

  7. 在go中使用json作为主要的配置格式

    最近在用go重构,在先前的代码中,我们使用的ini文件进行配置,但是因为很多历史遗留问题,导致配置混乱,维护困难,自然也需要考虑重构了. 通用配置格式 通用的配置格式有很多,常用的就有ini,json ...

  8. Scipy教程 - 统计函数库scipy.stats

    http://blog.csdn.net/pipisorry/article/details/49515215 统计函数Statistical functions(scipy.stats) Pytho ...

  9. 【一天一道LeetCode】#95. Unique Binary Search Trees II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  10. Java 8新特性探究(三)泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...