背景
以前有一个项目实在Eclipse下面开发的,现在看着android studio那么火爆,于是想着迁移至android studio中看看,于是就有了下面的这些过程.
下面发两张迁移前后的图片:
迁移后:
准备开始迁移
一个android项目主要分为:代码,各种资源文件,引用的jar包,引用的工程.
在Eclipse下面android工程大致是这个样子的:
ApplictioNname
-gen //系统生成文件
-src
-xxx.xx.xx
-xxx.java
-res
-drawable
-layout
-xxxx.xml
-values
-strings.xml
-........ //各种资源文件夹
-libs //jar包位置
AndroidManifest.xml //android配置文件
而android studio是使用gradle构建的.studio的目录结构是:
applicationName
-gradle //gradle的目录 studio自动生成
-app //module位置
-build //studio自动生成
-libs //jar包位置
-src //代码资源文件位置
-main
-java //代码位置
-res //资源文件位置
AndroidManifest.xml //android配置文件
build.gradle //module的gradle文件
proguard-rules.pro //混淆文件
-build //编译文件夹,studio自动生成
-libs //引用的工程的存放地方,名字可以不一样
local.properties //填写sdk的位置
settings.gradle //project的配置文件,主要用于组装每一个项目
迁移所要做的就是把Eclipse下的各个文件夹下的内容,转移到android studio下的对应的文件夹下面.通过编译并打包运行.
迁移代码
上面提到过android工程主要包括代码,各种资源文件,引用的jar包,引用的工程.
现在我们先来迁移代码:
- 我们首先在E:建立一个文件夹:MyAppliction(名字随便起),这个名字就是我们工程名字了.(随便建立在哪个盘,一般就建立的android studio 的工作目录下) .
- 在MyAppliction文件夹下面建立: app和libs文件夹:
app文件夹下面在简历 libs和src文件夹,src文件夹下面建立main,然后在main下面建立java和res,最后结构就像:
- 在把eclipse项目下的src目录下的文件代码 全部复制到androud studio目下的java文件内.
这样代码就基本迁移完成了.
迁移资源文件
在把Eclipse项目目录下的res文件内的文件,全部迁移至android studio的main下的res文件夹:
这样资源文件也基本迁移完成.
迁移项目依赖的jar包
把Eclipse目录下的jar包 复制到android studio,app->libs文件夹内.
这样没有完,因为android studio使用的是gradle构建,所以还需要在gradle文件内配置jar的位置才能找到jar包
build.gradle文件内容如下:
apply plugin: 'com.android.application' //是一个android应用
android {
compileSdkVersion 19 //sdk版本
buildToolsVersion '22.0.1'
defaultConfig {
applicationId "com.huiji.ewgt.app" //应用包名和AndroidManifest.xml的 package一致
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
//用于配置代码的目录结构
sourceSets{
main{
//指明aild文件的位置
aidl.srcDirs=['src/main/java/com/huiji/ewgt/app/service']
java.srcDirs=['src'] //可以指明代码位置
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
//大包时需要忽略的文件
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
//用于配置so文件的位置
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
}
//项目所引用的jar包
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])//把libs目录下的所有后缀为.jar的文件应用为jar包
compile project(':PullToRefresh') //引用的其他项目
compile project(':ViewPagerIndicator')
}
迁移依赖的项目
我们把项目依赖的其他项目复制到MyAppliction目录下的libs里面 如图:
因为androidstudio使用的是gradle构建,所以我们需要告诉gradle我们的工程包含哪些项目,去哪里找,这些项目时以什么方式存在的,怎么编译所以在每一个引用的项目下都要加入build.gradle文件如图:
build.gradle内容如下:
apply plugin: 'com.android.library' //这是一个库
android {
compileSdkVersion 19
buildToolsVersion "23.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
}
//配置项目的目录结构
sourceSets{
main{
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs=['src']
res.srcDirs=['res']
}
}
}
每一个引入的工程都需要加上build.gradle文件.如果这个工程引用了其他jar包可以在build.gradle文件最后加入:
dependencies {
compile 'com.android.support:support-v4:19.0.0'
}
填写需要应用的jar包.
最后步奏
需要在整个工程的build.gradle文件下加入:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
mavenLocal()
maven{
name 'oschina'
url "http://maven.oschina.net/content/groups/public/"
}
maven{
url "http://maven.oschina.net/content/repositories/thirdparty/"
}
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
maven{
name 'oschina'
url "http://maven.oschina.net/content/groups/public/"
}
maven{
url "http://maven.oschina.net/content/repositories/thirdparty/"
}
jcenter()
}
}
配置仓库位置,方便引用包的时候下载.
还有就是在settings.gradle文件下告诉gradle我们有哪些项目,项目在哪里,叫什么名字,内容如下:
include ':app',':PullToRefresh',':ViewPagerIndicator',':wheel',':androidCompat-v7' //表示我们有以上这些项目
project (':PullToRefresh').projectDir = new File('libs/pulltorefresh') //项目叫什么名字,在什么位置
project(':ViewPagerIndicator').projectDir=new File('libs/ViewPagerIndicator')
project(':wheel').projectDir=new File('libs/wheel')
project(':androidCompat-v7').projectDir=new File('libs/androidCompat-v7')
上面的文件配置完成后就可以在App的gradle文件下以这样的方式引用我们的项目了:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':PullToRefresh')
compile project(':ViewPagerIndicator')
compile project(':wheel')
compile project(':androidCompat-v7')
}
经过以上的步奏,项目基本就迁移完成了.下面记录一下迁移过程中遇到难点.
难点
在引用的其他项目的时候比较麻烦.因为是使用gradle构建,所以在每个引用的项目下都需要加入build.gradle文件,并在文件内配置工程的目录建构:
apply plugin: 'com.android.library' //这是一个库
android {
compileSdkVersion 19
buildToolsVersion "23.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
}
//配置项目的目录结构
sourceSets{
main{
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs=['src']
res.srcDirs=['res']
}
}
}
配置完成这个后需要在settings.gradle文件下,这样配置:
include ':app',':PullToRefresh',':ViewPagerIndicator',':wheel',':androidCompat-v7' //表示我们有以上这些项目
project (':PullToRefresh').projectDir = new File('libs/pulltorefresh') //项目叫什么名字,在什么位置
project(':ViewPagerIndicator').projectDir=new File('libs/ViewPagerIndicator')
project(':wheel').projectDir=new File('libs/wheel')
project(':androidCompat-v7').projectDir=new File('libs/androidCompat-v7')
然后才可以通过我们的app->build.gradle下面用下面的方式应用:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':PullToRefresh')
compile project(':ViewPagerIndicator')
compile project(':wheel')
compile project(':androidCompat-v7')
}
就是在使用aidl文件和so文件的时候需要单独配置:
如果使用aidl的话在需要在build.gradle文件指明aidl的位置,编译的时候才能找到:
sourceSets{
main{
aidl.srcDirs=['src/main/java/xxx/xxx/xxx']
}
}
也可以在main下面建立aidl文件夹:
放入aidl文件.
这样在编译的时候就能找到aidl文件了.
如果项目中有so文件的时候
因为gradle构建,所以要把so文件放到指定的文件夹下面,系统才能找到.
可以采取下面的这个办法
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
在build.gradle文件里面加入上面的代码,意思就是添加一个任务,在编译的把so文件都拷贝到lib目录下面.这样就能把so文件都编译到apk里面了.项目打包就能正常运行了.