phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

【Android】API16のuiautomatorでNoSuchMethodError


uiautomatorでNoSuchMethodErrorが発生して困っていた問題が解決したのでメモ。

発生までの流れ

http://www.atmarkit.co.jp/ait/articles/1410/07/news029.html

に従ってテストプロジェクトを作り、ターゲットは、API16(4.1, 4.1.1)としていた。 そして(Android SDK)/platforms/android-16のuiautomator.jarを使っていた。

このテストプロジェクトでテストを作成し、API 17(4.2)の端末で実行したところ、NoSuchMethodErrorが発生してしまっていた。


原因

UiScrollableのsetAsVerticalList()の定義がAPI16とAPI17で変わっていた。

//4.1.1
public void setAsVerticalList()

//4.2
public UIScrollable setAsVerticalList()

参考:http://stackoverflow.com/questions/15204154/uiautomator-failing-on-4-1-2-device



今回はScrollViewの中身のViewを取得するために、UiScrollableのインスタンスを作り、setAsVerticalList()を設定していた。

UiScrollable scrollableView = new UiScrollable(new UiSelector().className(ScrollView.class.getName()).scrollable(true));
if (!scrollableView.exists()) {
    fail("scrollview does not exist");
}
scrollableView.setAsVerticalList();


メソッド名が同じで返り値を使っていたわけではないので、ビルドは普通に通る。 だがAPI17で実行しようとするとビルド時の定義と実際に呼ばれるメソッドが異なるためNoSuchMethodErrorが出ていたのかと思われる。

おわりに

悩んだ理由として、Android Developerのページには特にAPI Levelが書いていなくて困った。

変更したことを書いていて欲しい。

http://developer.android.com/tools/help/uiautomator/UiScrollable.html#setAsVerticalList%28%29