🐡

Androidアプリを1から作る時にハマったメモ

2022/08/27に公開

こちらを作る時にハマった点の紹介です。
https://zenn.dev/sobya/articles/0650c7c1ce0b4c

Retrofitのsuspend忘れ

java.lang.IllegalArgumentException: Could not locate call adapter for retrofit2.Response<com.example.network.data.ListScreenReponse>.
  Tried:
   * retrofit2.CompletableFutureCallAdapterFactory
   * retrofit2.DefaultCallAdapterFactory

こんな例外が出て困惑しました。

DI関連は昔作ったプロジェクトから持ってきているし、
Responseのdata classも単純な物なので混乱・・・

Retrofit公式ISSUEでJake神がcroutine対応大変なんだよね〜的な事を言ってるのを見かけて、
suspendが付いてないと気付いて直せました。

NGなコード(suspend忘れ)

interface ListService {
    @Mock
    @MockResponse(body = "{\"location\":\"421 Lewis Ave,aaaaaaaaaaaa\",\"chips\":[{\"id\":0,\"title\":\"TITLE0\"},{\"id\":1,\"title\":\"TITLE1\"},{\"id\":2,\"title\":\"TITLE2\"},{\"id\":3,\"title\":\"TITLE3\"},{\"id\":4,\"title\":\"TITLE4\"},{\"id\":5,\"title\":\"TITLE5\"},{\"id\":6,\"title\":\"TITLE6\"},{\"id\":7,\"title\":\"TITLE7\"},{\"id\":8,\"title\":\"TITLE8\"},{\"id\":9,\"title\":\"TITLE9\"},{\"id\":10,\"title\":\"TITLE10\"}],\"campaign\":{\"title\":\"Unlimited \$0 delivery fees\",\"target\":\"\$0 delivery\"},\"populars\":[{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/000.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE0\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/001.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE1\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/002.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE2\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/003.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE3\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/004.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE4\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/005.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE5\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/006.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE6\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/007.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE7\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/008.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE8\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/009.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE9\",\"time\":\"25-35 mins\"}],\"perks\":[{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/000.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE0\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/001.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE1\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/002.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE2\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/003.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE3\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/004.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE4\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/005.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE5\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/006.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE6\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/007.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE7\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/008.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE8\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/009.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE9\",\"time\":\"25-35 mins\"}]}")
    @GET("localhost/list")
    fun getListScreenData(): Response<ListScreenReponse>
}

kotlinx-serialization指定忘れ

kotlinx.serialization.SerializationException: Serializer for class 'ListScreenReponse' is not found.
Mark the class as @Serializable or provide the serializer explicitly.

Retrofitのsuspend忘れが解決するとJson関連のエラーが出ました。
@Serializableも忘れてないのに不思議だな〜と思っていたのですが、
build.gradleを見ると一度もserializationと言う単語が存在しませんでした。
※dependenciesに指定はしてあったのですが、VersionCatalogsでまとまっていたのでserializationが存在しなかった

Dangerが出んじゃー

/opt/hostedtoolcache/Ruby/2.6.10/x64/lib/ruby/gems/2.6.0/gems/octokit-4.22.0/lib/octokit/response/raise_error.rb:14:in `on_complete': PATCH https://api.github.com/repos/sobaya-0141/sample202207/issues/comments/1224036023: 401 - Requires authentication // See: https://docs.github.com/rest/reference/issues#update-an-issue-comment (Octokit::Unauthorized)

一見401エラーでDangerがコメントを書けて無さそうです。
これはトラップでDangerの古いバージョンを指定して使うと発生します。

こけた時

gem install danger:6.2.0

面倒だったのでバージョン指定を解除して解決

Workload Identity Federation何を指定するの?

- id: 'auth'
  name: 'Authenticate to Google Cloud'
  uses: 'google-github-actions/auth@v0'
  with:
    workload_identity_provider: ${{ secrets.WIF }}
    service_account: ${{ secrets.SERVICE_ACCOUNT }}

secrets.WIFって何を指定すればいいか分かりにくかったのですが、


この画面のidをクリック


この画面のIAMプリンシパルのprojects/〜をコピペすればOKでした。

Discussion