迁移Eclipse到Android Stuido的地牢项目教程

迁移Eclipse到Android Stuido的地牢项目教程

准备工作:

Ready Work需要的东西Need Files主要的文件目标
软件方面Android Studio第1个文件build.gradleEclipse项目
文件方面非Gradle的地牢项目第2个文件gradlew转换到
脑子方面灵活思考,举一反三第3个文件settings.gradleAndroid Studio
电脑方面电脑尽量不要太卡第4个文件gradlew.batBy JDSALing

概要说明:

众所周知,Eclipse 是一款已经过时的 ADT 构建工具。对于构建安卓项目,现在首选绝 对是 Android Studio。但是地牢的结构比较特殊,且部分源码包也不是非常完整的 Eclipse 项目包,而且 Android Studio 的自动转换会出现很多问题。 因此,这里我将经验总结,这会方便大家对 Eclipse 地牢项目转 AS 的迅速和方便性质!


一、构建Model:

众所周知,AS 必须构建 Model 后才能打包。 那么将 Eclipse 地牢项目转成 AS 项目,就必须想办法构建 Model。 这里以我汉化的自然之神的像素地牢为例子!!!
自然之神的源码的原始样子:


上面的项目结构Android Studio是无法直接识别的,我们要改为AS识别的样子,如下图所示:

首先,从上面的几张截图中,我们不难看出 AS 结构下的目录更加简洁,且效率更 高。那么,要迁移 Eclipse 项目首先保证你工程的根目录有四个文件。 即:build.gradle, gradlew, 和 settings.gradle, gradlew.bat!!! 另外在app文件夹也有一个build.gradle

List(全部文件列表)需求文件
Root-File(根目录)build.gradle gradlew settings.gradle gradlew.bat
App-File(app目录)build.gradle
Src-File(src目录)AndroidManifest.xml

根目录的build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

}

allprojects {
    ext {
        gdxVersion = '1.9.10'
    }
    repositories {
        jcenter()
        google()
    }
}

根目录的gradlew:

#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

根目录的setting.gradle

include ':app', ':core', ':android'

根目录的gradle.bat

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega

当然,有了这 4 个只是一个开始。接下来,我们需要迁移游戏核心代码! 下方的截图是自然之神的原始源代码:

从上方的截图,我们不难看出,Eclipse 地牢项目的主目录在 src 文件夹里面,如下图所示:

那么,接下来,我们需要将里面的代码进行迁移。 在你迁移的项目的根目录里面新建一个app文件夹,我们所有的东西都会在这里!

打开“app”文件夹,在里面新建 src 文件夹,build.gradle 可以直接获取下面的!

App 文件夹下的-build.gradle 内容:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    //TODO 这里设置为你自己拥有的SDK版本
    buildToolsVersion "30.0.2"
    //TODO 这里设置为你自己拥有的Tool版本

    defaultConfig {
        applicationId "com.avmoga.dpixel.ling"
        //TODO 设置为自己的新包名
        minSdkVersion 14
        //TODO 最小SDK版本
        targetSdkVersion 29
        //TODO 目标SDK版本
    }

    allprojects {
        repositories {
            maven { url 'https://jitpack.io' }
            //TODO maven库导入
        }
    }

    buildTypes {
        //TODO 保持默认 不要修改
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    //TODO UCE-Handler崩溃采集器(需要Jcenter前置支持)
    dependencies {
        implementation 'com.github.RohitSurwase.UCE-Handler:uce_handler:1.4'
    }
}

新建好 src 文件夹和上面的 build.gradle 后,现在就是迁移工程的时候了! 打开 src 文件夹,并新建一个 main 文件夹!打开 main 文件夹,新建下面截图的所有文件 夹。AndroidManifest.xml原始源代码存在该文件则直接拉过来,否则,请使用博客里面的!
三个文件夹和 AndroidManifest.xml 文件的对照关系为:


AndroidManifest.xml(参考):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.avmoga.dpixel"
    android:versionCode="512"
    android:versionName="0.1.7"
    android:installLocation="auto">
    xmlns:tools="http://schemas.android.com/tools"
    <uses-permission android:name="android.permission.VIBRATE"/>
    <!--package:设置你的包名-->
    <!--android:versionCode="512" 
    安卓版本代码 高版本代码不能覆盖低版本代码
    (不能降级安装,除非有Root权限)-->
    <!--android:versionName="0.1.7" 安卓版本号 安装的时候显示的版本号-->
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8"/>
    <!--SDK配置-->
    <uses-feature
        android:glEsVersion="0x00020000"/>

    <supports-screens
        android:smallScreens="false"
        android:normalScreens="true"
        android:largeScreens="true"/>
        <!--android:xlargeScreens="true"-->

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
        android:allowBackup="false" android:isGame="true">
        <activity
            android:label="@string/app_name"
             <!--App名称,自动同步,无需修改-->
            android:name="com.avmoga.dpixel.ShatteredPixelDungeon"
            <!--如果上面报红,那么请改为对应的启动类-->
            android:screenOrientation="portrait">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    android:debuggable="true"
        tools:replace="android:icon, android:theme">
    </application>


</manifest>

做到这一步后,恭喜你,老旧的地牢 ADT 项目已经成功转换为 AS 项目!
Gradle 的话, Android Stuido 自己知道配置,你无需添加 gradle 文件夹!!!


二、 常见错误更正

即使成功迁移,一些 Model 错误也会让开发者十分恼火。
这里总结常见的错误更正方法!

No.1—- Plugin with id ‘com.android.application’ not found

问题截图事项:

分析:出现这个问题是你没认真听讲,恼!
你的 settings.gradle 在根目录不存在或者是放错路径了!


No.2—-Unable to find Gradle tasks to build: [:].

分析:出现这个问题是因为你可能没有打开 app 文件夹,但部分地牢是可以直 接打开上一级文件夹的并能成功构建的,这个根据实际情况而定! 解决方法:打开项目的时候选择 app 文件夹!


No.3—- Cannot resolve method ‘cos’ in ‘FloatMath’

分析:FloatMath 的旧版写法,AS3.0 以上已不再支持该写法
解决方法:

am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 2);

TIPS:可以使用 Ctrl+Shift+R 进行全局替换!!!


No.4—- Not Found Android.v4 v7 v14 More……

分析:由于 AndroidV4 V7 已经过时,AS 不再支持自动读取这些依赖库!你需 要在 app 文件夹下的依赖库列表里面添加:

dependencies {
 implementation 'com.github.RohitSurwase.UCEHandler:uce_handler:1.4'
 //TODO 下面添加V4 V7 安卓支持库
 implementation 'com.android.support:supportannotations:28.0.0'
 implementation 'com.android.support:support-compat:28.0.0'
 implementation 'com.android.support:support-coreutils:28.0.0'
 implementation 'com.android.support:support-core-ui:28.0.0'
 implementation 'com.android.support:appcompat-v7:28.0.0'
 implementation 'com.android.support:preference-v7:28.0.0'
 implementation 'com.android.support:preference-leanbackv17:28.0.0'
}

其中 28.0.0 是 compileSdkVersion 后面的值相对应!
我这里是 28!!!因此使用的是 28 的包!!!


No.5—- 打包成功的游戏闪退崩溃!

如果上面的区域发红,则说明启动项有问题! 分析:这可能是 AndroidManifest.xml 的 Actively 没有改为这个地牢的启动 Actively!也可能是其他问题!无论如何,请尽量不要删除 UCE_Handler 这个崩 溃抓取器。里面的详细日志会为你带来便利!
解决方法:在 AndroidManifest.xml 修正 onCreate 第一启动项或者根据错误日志进行修复。


三、 其他说明

完成了上述操作后,你应该可以获得一个正常运行的 apk 包! 至此,Eclipse 迁移成 AndroidStuido 就完成了。 有了 AS 的效率后,对于渲染文本显得不是那么复杂。 对多语言系统的处理只是时间的问题!!! 只需要迁移早期破碎的文本渲染(推荐参考版本低于破碎 0.7.4d) 因为在这之后破碎使用了 LibGdx!!!所以还需要这个库,但这是没必要的! 愿这篇文章能给你带来帮助,感谢你的阅读


参考资料

Manifest merger failed with multiple errors 最终极的解决方式
AndroidStudio 导入 v4、v7、v14、v17 包

By JDSA Ling-Ling Book Blog


声明:若要转载此文章,请注明出处,非常感谢


Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注