Appiumで”Make sure it exists and is a launchable activity”と怒られた

Appiumで急にこう怒られた。

Original error: Activity name ‘.com.squareup.leakcanary.internal.DisplayLeakActivity’ used to start the app doesn’t exist or cannot be launched! Make sure it exists and is a launchable activity

ログ全体はこんな感じ。

Selenium::WebDriver::Error::UnknownError:
  An unknown server-side error occurred while processing the command. 
  Original error: Cannot start the 'com.daipresents' application. Visit https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md for troubleshooting. 
  Original error: Activity name '.com.squareup.leakcanary.internal.DisplayLeakActivity' used to start the app doesn't exist or cannot be launched! 
  Make sure it exists and is a launchable activity

LeakCanaryはメモリリーク検出用のライブラリだけど、アプリを起動するときにそんなActivityを起動したいわけではない。

解決に3日かかったので結論だけ書くと・・・Appiumのログにはこういうログが出ていた。

[AndroidDriver] Parsing package and activity from app manifest
[ADB] Using 'apkanalyzer' from '/Users/daipresents/Library/Android/sdk/tools/bin/apkanalyzer'
[ADB] Starting '/Users/daipresents/Library/Android/sdk/tools/bin/apkanalyzer' with args ["-h","manifest","print","/Users/daipresents/sample.apk"]
[ADB] Using the alternative activity name detection method because of: Command '/Users/daipresents/Library/Android/sdk/tools/bin/apkanalyzer -h manifest print /Users/daipresents/sample.apk' exited with code 1
[ADB] Using 'aapt' from '/Users/daipresents/Library/Android/sdk/build-tools/29.0.1/aapt'
[ADB] Extracting package and launch activity from manifest
[ADB] Package name: 'com.daipresents'
[ADB] Main activity name: 'com.squareup.leakcanary.internal.DisplayLeakActivity'

どうやら apkanalyzer をつかってAndroidManifest.xml を解析しているのだけどそれがエラーとなり、かわりに aapt を使ったけど結果的にMain activity を間違っているみたい。

間違えんなよ!

ためしに問題のコマンドを叩いてみるとこうなる。

$ /Users/daipresents/Library/Android/sdk/tools/bin/apkanalyzer -h manifest print /Users/daipresents/sample.apk
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
at com.android.repository.api.SchemaModule$SchemaModuleVersion.(SchemaModule.java:156)
at com.android.repository.api.SchemaModule.(SchemaModule.java:75)
at com.android.sdklib.repository.AndroidSdkHandler.(AndroidSdkHandler.java:81)
at com.android.tools.apk.analyzer.ApkAnalyzerCli.getAaptInvokerFromSdk(ApkAnalyzerCli.java:277)
at com.android.tools.apk.analyzer.ApkAnalyzerCli.main(ApkAnalyzerCli.java:129)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
… 5 more

stack overflow にも似たような問題が書かれている。

参考: Failed to install android-sdk: “java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema”

どうやら Javaのバージョンに問題があるみたいなので、JDK8を入れる必要がありそうで、入れ直したらなおった!

Java 8はライセンスの関係で利用できないので、Brewを使うなら「brew cask install adoptopenjdk8」 とかが使える。