android sdk で build-tools を 19.0.0 にあげるとビルドに失敗するようになりました。
ant でビルドしている場合は
project.properties ファイルに
sdk.buildtools=18.1.1
など 19.0.0 以外をしてするようにすれば回避できます。
(SDK Manager で古いバージョンのダウンロードが必要です。)
ant debug などビルドしようとすると
-dex: [dex] input: D:\Projects\test\bin\classes [dex] input: S:\android\sdk-r22.3\tools\support\annotations.jar [dex] Using Pre-Dexed annotations-79464869d4911f69fc74875d267c55d8.jar <- S:\android\sdk-r22.3\tools\support\annotations.jar [dex] Found Deleted Target File [dex] Converting compiled files and external libraries into D:\Projects\test\bin\classes.dex... [dx] [dx] UNEXPECTED TOP-LEVEL EXCEPTION: [dx] java.nio.BufferOverflowException [dx] at java.nio.Buffer.nextPutIndex(Buffer.java:499) [dx] at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296) [dx] at com.android.dex.Dex$Section.writeShort(Dex.java:818) [dx] at com.android.dex.Dex$Section.writeTypeList(Dex.java:870) [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437) [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423) [dx] at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317) [dx] at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423) [dx] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163) [dx] at com.android.dx.merge.DexMerger.merge(DexMerger.java:187) [dx] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) [dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) [dx] at com.android.dx.command.dexer.Main.run(Main.java:230) [dx] at com.android.dx.command.dexer.Main.main(Main.java:199) [dx] at com.android.dx.command.Main.main(Main.java:103)
盛大に失敗しやがります。
Linux でやってみても発生するので根本的なバグだと思います。
上記の project.properties ファイルに sdk.buildtools を指定する方法の探し方
Android SDK に含まれている ant-task.jar がどこからか build-tools のバージョンを取得しているのは
SDK_ROOT/tools/ant/build.xml にマクロ定義として dex-helper があり dex タスクがどこからとも無くバージョンを取得していたからです。
「ant -v」で verbose にして結果を見てみると
-dex: [dex] input: D:\Projects\test\bin\classes [dex] input: S:\android\sdk-r22.3\tools\support\annotations.jar [dex] Using Pre-Dexed annotations-79464869d4911f69fc74875d267c55d8.jar <- S:\android\sdk-r22.3\tools\support\annotations.jar [dex] Found Deleted Target File [dex] Converting compiled files and external libraries into D:\Projects\test\bin\classes.dex... [dx] Current OS is Windows 7 [dx] Executing 'S:\android\sdk-r22.3\build-tools\19.0.0\dx.bat' with arguments: [dx] '--dex' [dx] '--output' [dx] 'D:\Projects\test\bin\classes.dex' [dx] 'D:\Projects\test\bin\classes' [dx] 'D:\Projects\test\bin\dexedLibs\annotations-79464869d4911f69fc74875d267c55d8.jar'
おおう、 build-tools の 19.0.0 がまずいみたいだ
build-tools の指定を設定している箇所は...見当たらねぇ~~~~
しかたないな、Android SDK に含まれる ant-tasks.jar のソースを探すか...
うぉ、どこにあるんだよ~~~
http://tools.android.com/tech-docs/ant-tasks
は見つかったんだが ant-tasks.jar のソースどこなんだよ!!
ぐーぐるで「DexExecTask site:android.googlesource.com」で検索すると android/ platform/sdk の中だとわかったので最新版を見るか...
おろ? master ブランチには anttask なんてサブフォルダがねぇ
https://android.googlesource.com/platform/sdk/+/master
別の箇所に移ったのか?とおもって「DexExecTask site:android.googlesource.com」の検索結果で別のを見てみると
android/ platform/tools/base か...って9日前かよ!!
https://android.googlesource.com/platform/tools/base/+/master/legacy/ant-tasks/
ようやく本題の build-tools のバージョン設定の上書きできないか見てみるか
GetBuildToolsTask.java があるな
https://android.googlesource.com/platform/tools/base/+/master/legacy/ant-tasks/src/main/java/com/android/ant/GetBuildToolsTask.java
String buildToolsVersion = antProject.getProperty(ProjectProperties.PROPERTY_BUILD_TOOLS);
ビルドツールのバージョンはこれか
おい、ProjectProperties は ant-tasks にいない...
えーと
import com.android.sdklib.internal.project.ProjectProperties
めんどくさいのでぐぐって「com.android.sdklib.internal.project.ProjectProperties site:android.googlesource.com」はい、platform/sdk ですか...しかも sdkmanager/libs/sdklib ですか
また master にいねぇ!
で platform/tools/base に sdklib がいたので
やっとたどりついた
https://android.googlesource.com/platform/tools/base/+/master/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectProperties.java
public static final String PROPERTY_BUILD_TOOLS = "sdk.buildtools";
おおう、sdk.buildtools でしていできるのね
local.properties に設定してみるか
きかねぇ!
project.properties に設定してみると
効いたわ
そらそうか PorjectProperties.java なので project.properties に設定せな効かないよな...
という感じで探し当てました。
android ant-tasks は legacy
まあ、gradle に移行するらしいから ant-tasks はレガシーかもしれないが...
gradle を Windows で動かしたときに
ルート直下に「Users/ユーザー名/2.2.0/.slcache」を作成されたので、ないわ
環境変数HOME を無視している箇所があったのと、でかいのが難点なんだよな~
そのうち最新版の gradle を試してみます