android sdk の build-tools を切り替える@ant

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 を試してみます

This entry was posted in Android, Android SDK. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>