Androidはワンツーパンチ 三歩進んで二歩下がる

Android卵プログラマーの記録ブログ

"Type mismatch: inferred type is MainActivity but LifecycleOwner was expected"コンパイルエラー対応(AndroidX, support libraly, gradleのtranstive推移的依存関係の解決)

※2019/05/10時点の状況です。
Googleの CodeLabsのAndroid Room with a View - Kotlinを写経した時に遭遇したエラーの覚書です。

実行した環境

参考サイト様

参考にさせていただきました。本当にありがとうございました!

発生した現象

AppCompatActivityを継承したクラス内でデータの変更をobserveするために下記のようなコードを書くとコンパイルエラーが発生しました。 observeメソッドのowner引数にthisを渡している箇所です。

書いたコード(Kotlin)

    wordViewModel.allWords.observe(this, Observer { words ->
        words?.let { adapter.setWords(it) }
    })

f:id:sakura_bird1:20190510004029p:plain:w400

エラーメッセージ

Type mismatch: inferred type is MainActivity but LifecycleOwner was expected

エラー発生時のbuild.gradle(Project)

buildscript {
    ext.kotlin_version = '1.3.21'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

ext {
    roomVersion = '2.1.0-alpha07'
    archLifecycleVersion = '2.1.0-alpha04'
    androidxArchVersion = '2.1.0-alpha02'
    coroutines = '1.2.1'
}

エラー発生時のbuild.gradle(Module:app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "exam.com.sakurafish.room.roomwordsample"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    // Room components
    implementation "androidx.room:room-runtime:$rootProject.roomVersion"
    implementation "androidx.room:room-ktx:$rootProject.roomVersion"
    kapt "androidx.room:room-compiler:$rootProject.roomVersion"
    androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

    // Lifecycle components
    implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.archLifecycleVersion"
    kapt "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion"
    androidTestImplementation "androidx.arch.core:core-testing:$rootProject.androidxArchVersion"

    // ViewModel Kotlin support
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.archLifecycleVersion"

    // Coroutines
    api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.coroutines"
    api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.coroutines"

    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha05'

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

原因

原因:LifecycleOwnerを実装していないクラスを継承していたため(推移的依存関係が絡むので結構やっかい)

エラーメッセージにあるLifecycleOwnerを実装しているのは、実際にはAppCompatActivityの上流のComponentActivityになります。
このComponentActivityの含まれるライブラリのバージョンによってはLifecycleOwnerを実装していないため、このようなエラーメッセージが発生しました。
androidx.appcompat:appcompat:1.0.2となっている箇所のバージョンアップをするか、recyclerview:1.1.0-alpha05をimplementationしている箇所を削除すればコンパイルエラーは解決するのですが、原因がわかるまでややこしかったのでもう少し詳しく説明します。

androidx.core:core1.1.0-beta01がクセモノ?

エラーが発生した時のbuild.gradleのdependenciesではrecyclerview:1.1.0-alpha05をインストールするようにしている箇所があります。

 implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha05'

これはandroidx.core:core1.1.0-beta01@aarを依存するライブラリにしています。
androidx.core:coreは他のところからも依存されていますが、recyclerviewが依存しているのが最新のため、gradleの推移的依存関係の管理により全てに適用してしまいます。
gradleの推移的依存関係の解決

このバージョンのソースコードを見ると、androidx.core.app.ComponentActivity内ではLifecycleOwnerはimplementsされていません。

とてもややこしいことに、androidx.appcompat:appcompat:1.0.2が参照している古いバージョンであるandroidx.core:core1.0.1ではLifecycleOwnerが実装されています。
実装していたりしていなかったりしてるのは何故なのかと疑問に思いました。

ComponentActivityが2つになっていた

ソースコードを眺めてみると、
appcompatのversion 1.0.0-alpha01からandroidx.core.app.ComponentActivityに新しいサブクラス、androidx.activity.ComponentActivityが出来たようです。
パッケージが変わっていますね。
FragmentActivityが新クラスを継承するようになったことから、androidx.core.app.ComponentActivityからLifecycleOwnerの実装が削除されました。
さらにandroidx.activity:activity1.0.0-alpha01@aarのようなライブラリが新しく作られて、新クラスはandroidx.core:coreからは分離されたようです。

appcompatが古かった

図であらわすとこのような感じです。
f:id:sakura_bird1:20190511234735p:plain:w500

androidx.appcompat:appcompat:1.0.2が古いため、androidx.activity.ComponentActivityを継承していないのにもかかわらず参照先ライブラリが新しくなっており既にLifecycleOwnerの実装が削除されていたというわけです。

本来androidx.appcompat:appcompat:1.0.2androidx.core:core:1.0.1に依存していたのがgradleの推移的依存関係の解決により、recyclerview:1.1.0-alpha05が依存するより新しいライブラリで上書きされてしまったのですね。

当エントリはサンプルコードを書いていましたので、バージョンに-alphaとか付いている安定バージョンではないものを使っています。
安定バージョンを使い、依存ライブラリ同士のバージョンをなるべく揃えるようにすれば、AndroidXでもこの状況はそんなに発生しないかなと思っています。

gradleの推移的依存関係の解決

ライブラリが依存しているライブラリが別のライブラリからも依存されていてさらに依存してしまう関係のことを推移的な依存関係といいます。
gradleでは競合してしまうライブラリはその中で一番最新のバージョンが強制的に適用することで推移的依存関係の解決を行っています。
参考サイト様がとてもわかりやすく説明してくださっています。

依存関係は以下のコマンドで表示できます。

 ./gradlew :app:dependencies

androidx.appcompat:appcompat:1.0.2が依存するandroidx.core:core:1.0.1が上書きされているのがわかります。
f:id:sakura_bird1:20190512003747p:plain:w400

自分で推移的依存関係の解決を行いたい時はこちらの参考サイト様が参考になりました。
GradleのResolutionStrategy – Kenji Abe – Medium

解決方法

方法1. appcompatを新しくする

     implementation 'androidx.appcompat:appcompat:1.1.0-alpha05'

recyclerviewに合わせてアップグレードします。
AndroidXのライブラリ同士のバージョンをなるべく揃えるようにします。

方法2. recyclerviewを削除する

 implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha05'

の箇所を削除します。ついでに↓のappcompatも削除しても大丈夫です。

 implementation 'androidx.appcompat:appcompat:1.0.2'

削除しても大丈夫な理由はMaterial Components For Android にはRecyclerViewが最初から入っていたです。
新しいバージョンのライブラリを使いたいというときなどは、バージョンを指定して導入すればよいと思います。

Material Components For Android にはRecyclerViewが最初から入っていた

本エントリの主題からは外れますが、Material Componentsだけで色んなライブラリを含んでいるという話です。

'com.android.support:design'及び'com.google.android.material:material'のMVN Repository を見てみました。
2019/05/10時点の最新バージョンです。

Maven Repository: com.android.support » design » 28.0.0
https://mvnrepository.com/artifact/com.android.support/design/28.0.0

Maven Repository: com.google.android.material » material » 1.1.0-alpha06
https://mvnrepository.com/artifact/com.google.android.material/material/1.1.0-alpha06

recyclerview入っていますね。他にも
annotation, appcompat, cardview, coordinatorlayout, core, fragment, legacy-support-core-ui, legacy-support-core-utils, transition, vectordrawable, viewpager2が入っています。

以上です。

Androidアプリ「インコ発信確認」終了です。優しいユーザー様ありがとうございました。

f:id:sakura_bird1:20190404140310p:plain

Androidアプリ「インコ発信確認」は2015年よりGoogle Playで公開しておりましたが、
2019年3月公開終了となりました。
ご愛顧いただいていたユーザー様にはご迷惑をお詫びするとともに、
今までのご利用に感謝いたします。

現在Google のポリシーが厳しくなってきており、いくつかの権限を使っているアプリはポリシー違反となりました。

インコ発信確認アプリも電話発信に関わるアプリのため、今回ポリシー違反となったセキュリティが危険レベルなパーミッションを許可していただいていました。
Googleの提案する代替案を使ってアプリを修正したくても、現在のアプリとは同じ機能を提供できそうにないため開発を断念いたしました。

せっかくダウンロードして下さり、便利にお使いいただいていたのに申し訳ありません。

ユーザー様のセキュリティを守る観点からは望ましい方向の動きであると思いますので、ご理解いただけますとありがたいです。

私は昔インコと暮らしたこともあってずっとインコが大好きなのですが、ユーザー様も同好の士だったり少なくともインコを憎からず思っていらっしゃる方々だからなのか、心温まる応援をいただいたり心配していただいたりいたしました。
アプリを作る喜びを味あわせていただき、本当に今までありがとうございました!

またどこかでSakurafishのアプリに出会いましたらよろしくお願いいたします。

f:id:sakura_bird1:20190404140545p:plain

【復旧済】Webサイト「ポケット糖質量」現在停止しております。

Webサイト「ポケット糖質量」につきまして。

https://www.pockettoushituryou.com/

ポケット糖質量をご利用いただきありがとうございます。
現在トラブルが発生してアクセスできない状態となっております。
ご迷惑おかけして誠に申し訳ありません。

復旧にはもうしばらくかかる予定でございます。
長くて1週間かかるかもしれません。

スマートフォンアプリ版のポケット糖質量のご使用もご検討くださいませ。

Android

play.google.com

iPhone

ポケット糖質量

ポケット糖質量

  • Yukari Sakurai
  • ヘルスケア/フィットネス
  • 無料

トラブルは、SSL証明書取得に失敗してしまったためです。
現在対応方法を調査中でございます。
よろしくお願いいたします。

iOSのGoogle Admob(Mobile Ads SDK)の設定方法変更への対応(GADInvalidInitializationException & 'configure(withApplicationID:)' is deprecated: Use [GADMobileAds.sharedInstance startWithCompletionHandler:])

Google-Mobile-Ads-SDKのアップデートを行ったらエラー等出たので対応をしました。
2019/03/25現在の情報です。

実行環境

  • Xcode10.2 beta 4 (10P107d)
  • Swift4.2
  • iOS deployment target iOS12.2
  • Mobile Ads SDK (iOS) version 7.42.0 (2019‑03‑15リリース)

公式サイト

発生したエラー

GADInvalidInitializationException

アプリ実行時に
Terminating app due to uncaught exception 'GADInvalidInitializationException'
というエラーメッセージが表示されました。

こちらはSDK7.42.0でSDKの組み込み手順が変更になってInfo.plist ファイルに、GADApplicationIdentifier キーと AdMob App ID の文字列値を追加するようになったためなので、公式サイトのように変更します。
App ID は AdMob の管理画面で確認できます。

f:id:sakura_bird1:20190325125226p:plain:w500

SDKイニシャライズ時の警告

このようにSDKをイニシャライズしていたのですが、

GADMobileAds.configure(withApplicationID: id)

コンパイル時に
'configure(withApplicationID:)' is deprecated: Use [GADMobileAds.sharedInstance startWithCompletionHandler:]
という警告が出るようになりました。

こちらも公式サンプルのように変更しておきます。

GADMobileAds.sharedInstance().start(completionHandler: nil)

以上です。

Surface Goを買ったので開発環境を構築したり安い周辺機器を購入したりした

こんにちは。さくらです。

2019年1月にMicrosoftSurface Goを入手しました。
10インチというタブレットサイズですが、Windows10がフルで使えて画面タッチも出来るので出かけるとき中心に活躍しています。
今のところ持ち歩きやすさが絶妙でとても気に入っています。
サブ機なのでそんなにガッツリ使っていませんが、2ヶ月たった時点での感想を書いてみます。

f:id:sakura_bird1:20190225211644j:plain:w300

購入決定の経緯

最初はお絵描きをやってみたくなって、iPad Proを買おうかと思っていたのですが
見ているうちに、ちょっとしたコードを書けるといいなあと考え出してWindowsの2in1機をチラ見し始めました。
すぐにSurface Goのメモリ8GBのタイプが視界に入っていいなと思いましたが、もっと安いものがないかと中国のメーカーも探してみました。
2018年末ぐらいでしたがメモリ4GBのものがほとんどで、結局Surface Goが値段とスペックのバランスが良く購入決定しました。
発売されてから数ヶ月経っていたのでちょっと安く買えました。
純正キーボードもセットです。

Surface Goは激安というものではないと思うのですが、元々お高いiPad Proの購入を迷っていたので気分的に「安い買い物をした!」という感覚でした。

買ってよかったこと(Windowsへの思いも含む)

  • Windows10が使えるのがすごくいいです。開発が少しは出来るのが嬉しいです。
  • AndroidiOSと違ってファイル管理が楽で制約がないのがとてもよいです。
  • Officeはさすがに快適です。
  • 10インチぐらいのタブレットを持ってなかったので嬉しいし、画面縦横比率が3:2で安定感を感じます。
  • ペン入力ができるのはよいです。しかしお絵描きっぽいことをしてみたいと意気込んで買った割にあまり使ってないです。こんなはずではなかったのですが…この使用状況ならiPadを買ってたら無駄にしてたかも。

微妙なところ(Windowsへの思いも含む)

この中でSurface Goが良くない点は実はそんなにないのですが、まとめて書きます。

  • ストレージが128GBでなくて256GBだと嬉しかったです。128GBだと少なく感じます。クラウドストレージも使うけど同期のコストあるし。
  • 外部機器の接続ハブみたいなやつが必要な局面が結構あるので面倒かも。
  • 寝っ転がって長時間動画を眺めるのはクラムシェルのPCの方が角度的に融通がきくので楽ですね。
  • 画像の処理によく使っているSketchというソフトが使えないのが残念です。 ブラウザで使えるFigmaが気になってます。

開発用途として

普段メインで使っているのは2015年のMacBook Pro15インチでGoはサブ機です。
当然のことながら、プログラミング用としてはCPUパワーが少ないし画面が狭いですね。
キーボードは慣れると思ったより使いやすいです。

Visual Studio Codeが問題なく動くので、WebサイトのUI修正や
サーバーにSSH接続してちょっとした作業など、軽いものに使っています。

Androidアプリ開発Windows機で出来ますが、マシンパワーを必要とするのでAndroid Studioはインストールもしていません。
Macbook Proですら重くてファンがうなりますからね。

Web開発は基本的にローカルに直接開発環境を作らないで、Dockerコンテナ上に開発環境を作るようにしています。
ディスクの空きが少なくなったら気軽に消せますしね。

他は今やブラウザ上でできる作業がかなりあるので、そういうものをやることが多いです。
GitHubプロジェクトに色々書き込んだり、Google Appsのファイルを編集したりなどです。

セットアップでやったこと

箇条書きですが、このようなことをしました。

  • Sモードの解除
  • Home -> Pro アップグレード(13k円ぐらいかかる)
  • Officeアクティベート
  • Google chrome をインストール
  • Google 日本語入力インストール
  • Stationインストール
  • DropBoxインストール
  • WSL(Windows Subsystem for Linux)インストール(Ubuntu18.04 LTS)
  • Docker Desktopインストール
  • DockerをWSLにもインストールしてWindows側を動かすよう設定
  • Visual Studio Codeインストール
  • VSCode内からWSLのシェルを起動できるようにする

参考になった記事

おかげさまで、とても参考になりました。ありがとうございます!

Windows 10 の使い方メモ(Surface go 体験記を読んで思ったこと) - かずきのBlog@hatena
Windows 10でLinuxプログラムを利用可能にするWSLをインストールする(バージョン1803以降対応版):Tech TIPS - @IT
docker for windowsをWSLから呼び出す - Qiita

使っていて気付いたことなど

現時点で使っていて思ったことを並べてみます。Surface Go固有の問題ではなくWindowsをいじって思っていることです。
単に不慣れなので、いい解決法に気がついてないだけかもしれません。

  • スペースが入ったディレクトリ名はWSLのUbuntu18.04 LTSだとコマンドの引数だと解釈される。この辺はMac OSXだとうまく解決されてるらしい。
  • WSLでディレクトリの移動が大変なのでさっさとシンボリックリンクを作成したほうがいい。
  • WSLとWindows両方にDockerをインストールしているのがちょっと気になっている。Windows側にだけインストールしてPowerShellで動かしていた時もあったけど、しばらく経つと何でもWSL上で動かしたくなってしまった。
  • 重い処理をするときChromeを同時に使っていると固まってしまうことがあるが、Edgeを使うと改善することがある。
  • Dockerのイメージなどは、使わないものをこまめに消さないとストレージを圧迫するので注意する。
  • 重いDockerイメージのビルドは自宅で済ませておくことが非常に大切。出先でビルドが失敗すると腹が立つ。

Surface Goのために買ったもの

Surface Go関連で買ったものはこのような感じです。
安い物を探して買ったので、今後トラブルが発生したら報告します。

充電器

出先で使える充電器、PD対応でポートが3つあって安価なOmars製のものを買いました。

Omars USB C PD充電器45W「PSE認証済」3ポートPD対応 急速充電対応 折り畳み式 ACアダプター(usbcケーブル付属 )Macbook/MacBook Pro/ Nintendo Switch/ iPhone X/8/8 plus,Samsung Galaxy S9/S9Plus/S8/S8 Plus/ iPad/iPad pro/iPad mini/S7/S6, Nexus 6P/5X, LG G5,Google Pixel 2 XL, Moto Z , HTC,Sony など対応 (45W 3ポート)

今の所これは買ってよかったです。

  • USB-C PDポートをSurface Go用
  • USB-Aポートが2つあるのでスマホ等用

というように、1つあれば他の充電器を持ち歩かなくて済むようになりました。

USB Type-Cのケーブルも付属しているので出費を抑えられました。

Omarsの充電器は USB-C PDポート最大29W(単体だと最大45W)+USB-Aポート合計12W=3ポートの合計41W
ということなので、Surface Go純正の充電器が24Wなので、あと2台12Wでスマホ充電だと供給量は一応足りてるような気がします。
USB-Aポートは2台接続すると多分充電が急速じゃなくなるのかな。
自信ないので間違ってたらごめんなさい。

ちゃんと検証してないですが、同時充電出来ているようです。

f:id:sakura_bird1:20190316162327p:plain:w400

ペン

純正のペンよりだいぶ安かったので、Heiyoのペンを買いました。
前半でも触れていますが、思ったよりペン入力を使っていないのでレビューはAmazonなどを見た方がいいです。
評判はいいようです。
動作は問題ありませんでした。

f:id:sakura_bird1:20190316181843p:plain:w400

画面保護フィルム

【2枚セット】Surface Go 強化ガラス液晶保護フィルム - HOTCOOL日本製素材旭硝子製 超薄型 3D Touch対応 硬度9H 高透率 耐指紋 耐衝撃保護フィルムMicrosoft Surface Go対応 というものを買ってみました。
貼り付けたらすぐに気泡が消えていい感じです。
ペンの感度が落ちるなどの問題はあまり使用していないため自覚症状がありません。
暗い映像の動画を見ていると、画面に自分が映り込みガッカリするということがあります。

本体カバー

キーボードの裏側が汚れそうな素材だったためこちらのカバーを買いました。

安いし、外出時の不安定な扱いでも安心感があるし、キックスタンドを使わなくても自立するしで大変良い買い物でした。
サイズはぴったりです。
ペンを保持しておく場所などはないのでお気をつけください。

f:id:sakura_bird1:20190316182854p:plain:w300

ハブ

これとほぼ同じものを中古で譲ってもらったのを使っています。
充電しながら使えます。

以上です。

全体として魅力的なサブPCだと思っています。
不具合等あれば追記します。