0

明確化: 私の以前の Android 開発環境は、Git と共にインストールされる MinGW bash シェルを備えたコマンドライン ビルド ツールを使用する Win7 マシンでした。古い W​​inXP マシンで同様の環境を作成しようとしています。

元の質問:

Android 開発環境用に古い Windows XP マシンをセットアップしています。(ええ、私は、新しい Win7 マシン、またはできれば Win8 マシンを購入する手段があればいいのにと思っています。今のところ、持っているもので間に合わせています。) 私の現在の問題はant -f build-android.xml debug、次のエラー:

-dex:
      [dex] Found Deleted Target File
      [dex] Converting compiled files and external libraries into c:\devel\src\java\bbct\bin\classes.dex...
       [dx] ************ java_exe=
       [dx] The system cannot find the path specified.
       [dx]
       [dx] ERROR: No suitable Java found. In order to properly use the Android Developer
       [dx] Tools, you need a suitable version of Java JDK installed on your system.
       [dx] We recommend that you install the JDK version of JavaSE, available here:
       [dx]   http://www.oracle.com/technetwork/java/javase/downloads
       [dx]
       [dx] You can find the complete Android SDK requirements here:
       [dx]   http://developer.android.com/sdk/requirements.html
       [dx]

ちょっとした探偵作業で、-dexターゲットが実行され、その一部が次のように${android.platform.tools.dir}/dx${bat}実行されることがわかりました。..\tools\lib\find_java.bat

rem Useful links:
rem Command-line reference:
rem   http://technet.microsoft.com/en-us/library/bb490890.aspx

rem Check we have a valid Java.exe in the path. The return code will
rem be 0 if the command worked or 1 if the exec failed (program not found).
for /f %%a in ('%~dps0\find_java.exe -s') do set java_exe=%%a
if not defined java_exe goto :CheckFailed

find_java.exe -sコマンドラインから実行すると、

c:/PROGRA~1/Java/JDK16~1.0_3\bin\java.exe

これは、JDK インストールの正しい場所です。forただし、上記のバッチ スクリプト スニペットのコマンドとコマンドの間に echo ステートメントを追加すると、変数が設定されていないか、空ifであることがわかります。java_exeWin7 マシンで Android アプリを正常にコンパイルできたので、for上記のコマンドが WinXP 環境では正しくないことが問題だと思います。WinXP で動作させるにはどうすれば変更できますか? 問題が WinXP に固有のものではない場合、何が問題で、どうすれば修正できますか?

4

2 に答える 2

1

短い答え:

簡単に言うと、WinXPコマンドラインインタープリターにバグが見つかったと思います。少なくとも、Win7の動作はWinXPの動作とは異なります。まず、問題の原因について話し合い、分析します。find_java.bat最後に、 AndroidSDKに付属するスクリプトの修正案を示します。

長い答え:

find_java.bat問題のある行は、実際にはスクリプトのforループです。

for /f %%a in ('%~dps0\find_java.exe -s') do set java_exe=%%a

MSのドキュメントによると、ここで適用される構文は、ファイル名を反復処理するために使用されるforループ用です。

for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]

これを分解してみましょう:

  • 私たちは使用していません"ParsingKeywords"
  • このコマンドをバッチスクリプトで使用する場合%%は、変数名の前に置く必要があります。コマンドラインから実行すると、1つだけ%が使用されます。
  • 私たちの状況で'%~dps0\find_java.exe -s'は、「ファイル名セット」について説明します。これは、runningの出力に評価されるはずfind_java.exe -sです。

    • find_java.exeWinXPマシンでMinGWコマンドラインから手動で実行すると、正しい出力が得られます。
    • 次に、find_java.batファイルを次のように変更しました。

      • rem'@echo off最初にコマンドを実行しました。(これはOPには表示されませんでした。)これにより、実行時にバッチファイルから各コマンドが出力されます。
      • の値を確認するためのechoコマンドを追加しましたjava_exe

      変更したfind_java.batファイルを直接実行するには、ネイティブのWinXPcmdコマンドラインを使用しました。(MinGWのantスクリプトを使用してこれも試す必要があります。)関連する出力は次のとおりです。

      C:\Program Files\Android\android-sdk\tools\lib>for /F %a in ('C:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\FIND_J~1\find_java.exe -s') do set java_exe=%a
      The system cannot find the path specified.
      
      C:\Program Files\Android\android-sdk\tools\lib>echo ************ java_exe=
      ************ java_exe=
      

      ご覧のとおり、java_exeは空です。また、パスC:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\FIND_J~1\find_java.exeが少し奇妙だとわかりました。代わりに、である必要がC:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\find_java.exeあります。さらなる調査により、何が起こっているのかが明らかになりました。

      • %0、%1、%2などはコマンドライン引数を参照します
      • 構文%〜[modifiers] [#]は、コマンドライン引数の処理方法に関する追加の引数を提供します。特に、modifiersここの値には次のものが含まれます

        • d=ドライブ文字を展開します
        • p=パス名を展開します
        • s=短い8.3DOS名を使用して拡張

        このコードが配置find_java.exeされているスクリプトと同じディレクトリにある実行可能ファイルを実行するという考え方です。バッチスクリプトの名前を指します。何らかの理由で、WinXPコマンドラインインタープリターは、バッチスクリプトが配置されているパスを拡張するだけでなく、バ​​ッチスクリプトのファイル名をこの拡張に含めます。パスが正しくないため、実行されることはなく、変数が有効な値に設定されることもありません。一方、Win7はバッチスクリプトのパスだけを拡張し、すべてが正常に実行されます。find_java.bat%0find_java.exejava_exe

    • は、後で別のスクリプトで使用される変数commandの値を設定します。java_exe

解決策:sから修飾子 を削除すると'%~dps0\find_java.exe -s'、ファイル名なしで実行中のバッチファイルのパスが表示されます。ただし、パスにはスペースやその他の特殊文字が含まれている可能性があります。これを修正するには、適切な場所に二重引用符を追加するだけです。コマンドの最終は次のようになります。

for /f %%a in ('"%~dp0\find_java.exe" -s') do set java_exe=%%a

修飾子を削除すると動作が変わるためs、WinXPコマンドラインインタープリターにバグがあると思います。

于 2012-10-05T19:20:14.257 に答える
0

c:/ PROGRA〜1 / Java / JDK16〜1.0_3 \bin\をパス環境変数に追加します

于 2012-10-04T21:38:20.830 に答える