ラベル kotlin の投稿を表示しています。 すべての投稿を表示
ラベル kotlin の投稿を表示しています。 すべての投稿を表示

2022年11月23日水曜日

Caused by: org.jetbrains.org.objectweb.asm.MethodTooLargeException: Method too large:

最近 記述言語仕様が緩くなっていたので相当やばい作り方でなければ目にすることのなくなった様なコンパイル時エラーが出てきました。

相当やばい書き方…ちょうどしてますw

本来であればデータファイルやテーブルに落として使用するデータを、表計算のデータを CSV風にテキストにしてArray<Any?>として配列として取り込んでます。

そんな阿漕な配列を使ってデータを捏ね繰り回していました。

読み込み仕様を悩んだ場合は、結局値を直に変数として記述すれば扱えるわけですが、クラスの形で作って記述していたところ、途中でエラーが出てしまいました。

class SrouceData {
    companion object {
        val array_data1 = arrayOf(
            :
            :
        )
        val array_data2 = arrayOf(
            :
            :
        )
        :
    }
}

回避策はないかとクラスの枠を取っ払って(言い方が違ってる気がするが)グローバル変数的にしてみても結果はわからず。扱い上はグローバルレベルで一つのクラスとして扱われている気配。

何をやってもダメそうなので、結局データクラスを分離することでエラーが出なくなりました。

class SrouceData1 {
    companion object {
        val array_data1 = arrayOf(
            :
            :
        )
        :
    }
}

class SrouceData2 {
    companion object {
        val array_data2 = arrayOf(
            :
            :
        )
        :
    }
}

一つの配列の限界が来てしまった場合はどうすればいいのか分かりませんが、今回は一つのktファイル内で2つのクラスに分割するだけで回避できました。

2022年10月26日水曜日

RecyclerViewでViewとbindingでハマる

すごく疲れたので愚痴ですかねぇ。

RecyclerViewを扱うために、Adapter, Holderを用意して、そこから選択状態などを扱おうとしたところからドはまりの旅が…

Android StudioはDolphin 2021.3.1ベースとなっているプロジェクトの雛形は新規に作り出したものなので、それなりに今風の作りになっているので、ActivityやFragmentではbindingを使う形になっていてリソースのレイアウトを作ると自動的にbindingクラスが用意され、コード上からはそれぞれのクラスが参照できる状態になっていました。

RecyclerViewを追加し、コードはViewベースの実装で行っていましたが、ググった参考記事がbindingが前提となっていたので何も考えずViewベースの記述をbinding形式に変更して変更していったのですが、ドはまりに…

ほとんどの部分では問題なかったのですが、どうもbinding.rootが参照できないという状態に。うまい逃げ方を思い浮かばなかったので、リソースの記述を確認し、不要部分を削ったり書き換えたりしました。が、何も変わらず。AdapterやHolderクラスの記述に問題があるのかもしれないと、色々な個所を書き換えてみましたが変わらず。途方に暮れつつ無駄に2,3日経過。私の中でなんとなくbinding系はまだ実装が不完全なのでは?という結論に。

それと、検索した中に「たまにbindingクラスが不安定」という記述を見受けたので、cleanやリビルドを行ってAndroidStudioの再起動をしてみましたが結果は変わらず。

Android Studioで更新チェックを行い更新してみたのですが、空振りし続けているようなので新たに2021.3.1 Patch 1をインストールし直してみました。

その後、更新チェックを行って環境を更新し、プロジェクトを開くとAGPの更新が通知されたのでそのまま(Android Gradle Plugin version 7.3.1.へ)更新してみました。

更新後コンパイルしてみると見慣れないエラーが表示されるように。

> Task :app:mergeDebugResources FAILED

{"msg":"Found \u003clayout\u003e but data binding is not enabled.\n\nAdd buildFeatures.dataBinding \u003d true to your build.gradle to enable it.",

などなど、どうもなにかbuild.gradleに記述が足りていないということで検索してみるとスタックオーバーフローの記事にそのものずばりの記述が

How to solve 'data binding is not enabled' error while using view binding

 buildFeatures {
        viewBinding true
        dataBinding true
 }

plugins {
     id 'kotlin-kapt'
}

機能を有効にして、プラグインも確認してみては?みたいな。

viewBinding trueはやってたけど、dataBinding trueなの見たことないんですがw

有効にしてみると、見事にbinding.rootが有効になっているようで…

2022年9月28日水曜日

Roomで(使う前に)ハマったポイント

データベース操作をするならこれからはRoomを使うのが当たり前みたいな流れなので試してみました。

が、これがもうデータ操作をする前の準備段階で結構痛い目を見ています。

参考にできそうな情報が過去と錯綜しているのと、プレビュー段階の物とか。あと、Googleのドキュメントが結構嘘っぱちすぎて辛いです。

2022/09/28現在、Roomのステーブルバージョンは 2.4.3

この状態で日本語のドキュメントと英語のドキュメントのサンプルコードの差異はほぼない感じ。

で す が

このサンプルがかなりあてにならない。

プロジェクトへの導入部分のコードが誤っているとか何というか…モジュールレベルのbuild.gradleへ追記する必要のある定義で問題

その1kspはなかったことにしよう

dependencies {
    def room_version = "2.4.3"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:2.5.0-alpha03"
}

誤りと言うのは何ともな部分ですが、「ksp "androidx.room:room-compiler:$room_version"」をコメントアウトしないと先に進まない。コメントアウトしても問題が無いのかという判断もできない状態でコメントアウトするのはかなりきつかった。色々見る限り、コンパイル時間が短くなるだけのようなので、不安定になるぐらいならこんなものいらない。ステーブルバージョンとはいったい何なのかと…

その2「implementation "androidx.room:room-paging:2.5.0-alpha03"」

結論から言えば、これが大問題で、バージョンは他と合わせる必要がありました。

なので implementation "androidx.room:room-paging:$room_version" とすれば解決できます。そもそもオプショナルってなっているのでこれもコメントアウトするだけでもいいのかもしれませんが不明。

ちなみに2.5.0-alpha03は現時点でアルファリリース状態のバージョン。

しかもです。こいつが2.5.0ベースのおかげで、SDKレベルも33以上にする必要が出て来てたりこれのおかげでえらい遠回りさせられました。

@ナントかで記述して作法通りに記述する必要があり、いくつかのデータベースプログラミング経験があってもマニュアルがないときつい気がしました。ネット上で探すとそれなりに時間を浪費する。そしてエラーが表示されても文字化けして想像を絶するという。

この文字化けは Android StudioにおけるBuild Outputの文字化けを解消 https://qiita.com/watanaby0/items/bc2459e03c81a4b708c7 で解決できました。Room以外にもたびたび悩まされた文字化けですが、Roomで発生するエラーはコード展開されたあとのコンパイラのエラーなので全く想像つきませんでした。出力は英語のままでもいいのに変なところでローカル化するから…

で表示されたエラーが「(public)より弱いアクセス権限を割り当てようとしました」という感じで、これの英語表記は多分「attempting to assign weaker access privileges; was public」となっていて、これをヒントに検索してみたところ、2.3ベースにすれば解決するっぽい記述が出てたので変更しても変化せず。

悩んだ挙句に「room-paging:2.5.0-alpha03」が原因じゃないかと当たりを付けたところようやく解決したという。

こう言うのがandorid触ってて非常に面倒くさい。windowsも似たようなことはあるのですが、環境設定レベルで動かせないとか知らない人間にとってものすごいハードルが高い気がします。