Android関連のことを調べてみた2022年02月17日

Android関連のことを調べてみた2022年02月17日
目次

Android, Gradle: Version Catalog と PluginManagement を使って Gradle プラグインを利用する

Gradle Version Catalog を使って、Gradle Plugin を利用する方法を解説します。

## 前提

* Gradle 7.2 以上
* Gradle 7.2 から Version Catalog に `[plugins]` セクションを使えるようになりました
* Gradle Kotlin DSL 使用
* 解説は Kotlin DSL とします

## 実装

### buiildscript ブロックの削除

build.gradle.kts に buildscript ブロックを定義している場合は、削除してください。新しい Plugin DSL では classpath() 定義が不要になりました。

`(project root)/build.gradle.kts`

“`diff
-buildscript {
– repositories {
– google()
– mavenCentral()
– gradlePluginPortal()
– }
– depende

元記事を表示

Google Play を導入せずに Windows Subsystem for Android を最大限活用する

#はじめに
2021年10月にリリースされた Windows 11 の目玉機能の一つが Windows Subsystem for Android (WSA) です。WSA によって、サードパーティ製のエミュレータなしで Android アプリを Windows 上で実行することが可能になりました。
日本国内での利用も、2022年2月現在ではマイクロソフト公式の方法ではできないものの、外部サイトを介してパッケージを直接ダウンロードすることで可能となりました。
しかしながら、現状の WSA にはパッケージの改変なしに Google Play を導入することができないという欠点があります。また、Google Play 開発者サービスのオープンソース互換アプリである microG を導入してもなかなかうまく行かない状況にありました。
そこで、本稿ではパッケージそのものを改変することなく Windows Subsystem for Android を最大限活用できるように、以下のことを目指していきたいと思います。

– Google Play 開発者サービスなしでは動かないアプリを動かす

元記事を表示

[Kotlin]スクロールするとヘッダーに収納されるTextViewを力技で作成してみた。[Android]

#はじめに
スクロールするとヘッダーに収納されるマーキーのタイトルを作りたくて始めた結果、力技で実装することにしました。

__やりたいこと__
![無題94.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520502/de486da4-6316-820b-6503-3cb2a36ac2b8.png)
スクロールすると左画像の[ハチワレ女王]が右画像のようにヘッダーに収納される

__力技に至った経緯__
1. CollapsingToolbarLayout + Toolbarで実装しよう!
> Toolbarにマーキーがない
2. マーキーするToolbarをカスタムビューで作ろう!
> リフレクションでTextView引っこ抜いてマーキーする設定にしたけどマーキーしない

↓ とりあえず実装させた

Android: Github Actions で Gradle build daemon disappeared unexpectedly が発生するときの対処

Github Actions で Android Gradle プロジェクトをビルドするとき、プロジェクトが大きくなってくると Gradle daemon がクラッシュすることがあります。

メモリ不足により OOM (Out Of Memory) で Gradle Daemon プロセスが Kill されると以下のエラーメッセージが表示されます。

“`shell
FAILURE: Build failed with an exception.

* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
“`

## 対応: メモリサイズの調整

Gradle Daemon が使用するメモリサイズを調整します。Github Actions の workflow の `GRADLE_OPTS` 環境変数に `-Dorg.gradle.jvmargs` を渡します。

`.github/workflows/{workflow

Raspberry Pi4をAmazonプライムビデオ専用機に2

# Raspberry Pi4をAmazonプライムビデオ専用機に2

なんのことはないですが、1年ほど使用していて動作が不安定になってきたので
最新のLineageOSを再導入してみました。
目的は、Raspberry Pi4をAmazonプライム専用機として最導入しただけです。

## 1.Raspberry PiにLineageOSを導入

### 1.1 LineageOSのダウンロード
[LineageOS 18.1 (Android 11) for Raspberry Pi 4](https://konstakang.com/devices/rpi4/LineageOS18/)

上記サイトから「lineage-18.1-20210214-UNOFFICIAL-KonstaKANG-rpi4.zip」をダウンロードして、展開しておきます。

### 1.2 MicroSDカードへの書き込み

前回、同様にこのimgファイルをMicroSDカードに焼くには、[balenaEtcher](https://www.balena.io/etcher/)を使います。(v1.5.109

Android Studio でプロジェクトを作成後にリネームする

ささいなことではあるのですが
Android Studio でプロジェクト作成後に,
ちょっと気に入らないとか typo を後で発見したという理由で,
プロジェクト全体の名前をリネームしたいときがあるかもしれません.

実際,適当なプロジェクトをつくって
名前を変えたいなと後で思ったのですが,
実際のところ意外と面倒であるということが分かったので,
あまりオススメされないとは思うものの
どんなものかメモとして書き残そうと思います.

## まず,そのままリファクタしてみよう

`myproject1` というプロジェクトを `mysuperproject1` にリネームすることを考えます.

プロジェクトとしてルートモジュールを `Refactor` > `Rename…` からリネームできそうなので試みるのですが,
実はこれはできないということがわかります:

![myproject1_–_MainActivity_kt__myproject1_app_-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c

onNewIntentで状態を更新する(Jetpack Compose)

# はじめに
Jetpack Composeを使用している状況でActivityの`onNewIntent`や`onActivityResult`でアプリの画面状態を更新する方法についての記事となります。
Jetpack Composeでは状態を`MutableState`として保持し、`remember`を使用することで再Compose後も状態を保持することができます。ただしこれら基本的に特定のComposable関数以下のスコープ内に制限されてしまい、`onNewIntent`や`onActivityResult`からどうやって更新すればいいんや~だったたのでコードを書いてみたという流れになります。

# やったこと

方針としては`MutableState`をActivityのメンバとして保持し、その値を`remember`でComposable関数に記憶させます。

1.Activityのメンバ変数に`MutableState`で変数を持たせる。
ここで定義した値を`onNewIntent`や`onActivityResult`で更新し、それらを読みこむComposable関数

Ubuntu 20.04でCommand line toolsのダウンロードからAndroidエミュレーターを動かすまで

## はじめに

Android Studio経由の説明が多いので、Command line toolsのダウンロードからAndroidエミュレーターを動かすまでの手順を残しておく。

## 環境変数ANDROID_SDK_ROOTの設定

Command line toolsはじめ、sdkをインストールするフォルダのルートをANDROID_SDK_ROOTとして環境変数に設定する。

例えば、/home/user/android/sdkを環境変数に設定する場合は、以下の通り。
~/.bashrcに書いておく。

“`bash
$ export ANDROID_SDK_ROOT=/home/user/android/sdk
“`

## javaのインストール

aptコマンドを使って、openjdkをインストールする。今回はopenjdk-17を使用した。
あとはPATHを通しておく。

“`bash
JAVA_HOME=”/usr/lib/jvm/java-1.17.0-openjdk-amd64″
“`

## Command line toolsのダウンロード

以下か

Jetpack Compose チュートリアルをただやってみるだけの記事 #1

# 初めに
この記事は、Jetpack Compose未経験のしがないAndroidエンジニアが[チュートリアル](https://developer.android.com/jetpack/compose/tutorial?hl=ja)をやってみるだけの記事です。
先日のメルカリのイベント [Android Office Hours〜2022年の技術トレンド大予想!〜](https://www.youtube.com/watch?v=8-ifCGQ20tg)でも、Jetpack Composeは今後Android開発においてデファクトスタンダードになっていくだろうと予想されていました。
Android開発で食べていく以上触っておかないといけないだろうと思い、とりあえずチュートリアルをやってみることにしました。

# Jetpack Composeとは
Jetpack Composeは、GoogleがリリースしているAndroidのUI実装のツールで宣言的なUIフレームワークであるという特徴があります。
宣言的UIとは状態をUIに変換するという考え方です。
従来のXMLを用いた開発で

Android のパッケージの公開設定

パッケージの公開設定について、ハマったので記事にしておきます。

###### 問題の発生状況

Android 11 より前ではバインドできていたサービスが、下記の warning が出て見つからなくなった。

“`console
02-13 17:21:00.089 542 3921 W ActivityManager: Unable to start service Intent { act=com.ykato.sampleservice.ISampleService pkg=com.ykato.sampleservice } U=0: not found
“`

###### アプリの構成
サービス (com.ykato.sampleservice)は apk としてインストールしてあり、それを テスターのサンプルアプリ(com.ykato.sampleservicetester
)からバインドして使っていました。

###### 原因
下記に、記載がある通り Android 11 から自動的に公開されるアプリが制限されました。

https://developer.

Android: Github Actions での最適な Gradle ビルドキャッシュ戦略

Github Actions で Android Gradle プロジェクトをビルドするときの最適な Cache 戦略をまとめます。

Android Gradle の Cache 戦略について解説していますが、Cache の種類 (Build Tool Cache, Dependencies Cache, Build Cache) の考え方は他の種類のプロジェクトにも通用します。

## 前提

以下の構成を前提とします。

* Gradle Kotlin DSL (build.gradle.kts / settings.gradle.kts)
* Gradle Version Catalog 使用
* buildSrc 使用
* Kotlin Multiplatform 使用
* Kotlin Native Compiler 設定だけに影響します

## Github Actions Cache 設定

週次 Cache クリアを採用した場合の Cache 設定はこちらです。

“`yml

jobs:
build:
runs-on: ubuntu-la

MotionLayoutの例を試してみる(ImageFilterView)

前回はカスタム属性をやりました。
[カスタム属性](https://qiita.com/yuta317/items/a1fe49c5b705d442d484)

今回はImageFilterViewを試していこうと思います。

# 公式リファレンス
https://developer.android.com/training/constraint-layout/motionlayout/examples?hl=ja

https://developer.android.com/training/constraint-layout/motionlayout/ref?hl=ja

# ImageFilterView

今回はビューの移動に伴ってビューの彩度の値を変更しようと思います。

リンク先に公式サンプルがあります。
[ImageFilterView](https://developer.android.com/training/constraint-layout/motionlayout/examples?hl=ja#imagefilterview_-_image_transiti

マテリアルなUIを単独で使用する方法

# はじめに
マテリアルなUIがかなり浸透してきていて、画像を丸く表示する為のShapeableImageViewや、枠などを設定できるMaterialCardViewなどを使用したいケースが多くなってきていますよね。
UIに枠や角丸をつけたいが故に、Drawableを大量生産している、、、歴史のあるプロジェクトではよく見かける例な気がします。
そんな時に、単独でマテリアルなUIを使用したいと思っても、基本はstyleから変えなければならず改修範囲が広く使えない、そんな経験あるのではないでしょうか?

もしかしたらご存知の方も多いのかもしれませんが、styleを変更しなくてもマテリアルなUIを使用できる方法がありますので、ご紹介しようと思います。

# 設定内容

設定は非常に簡単です。
対象のマテリアルなUI、もしくは親のレイアウトに以下を付与するだけです。

“`
android:theme=”@style/Theme.MaterialComponents”
“`

上記を設定する事で、本来styleのparentにMaterialの設定を行わなければならない所を上記設定のみで

接続中の複数のAndroidデバイスに一括でadb installするコマンド

# 経緯
接続中の複数のAndroidデバイスに、同一のapkを一括でインストールしたい際にStack Overflowの以下の記事の

java – How can I adb install an apk to multiple connected devices? – Stack Overflow
https://stackoverflow.com/questions/8610733/how-can-i-adb-install-an-apk-to-multiple-connected-devices
この回答のワンライナーで元気に暮らしていたのですが
https://stackoverflow.com/a/8610829/2227705

Android 11以降で `adb pair` コマンドで接続したデバイスはSerial Numberが長いせいか(詳細不明)xargsまわりが正常に動作してくれなくなりました。

Wi-Fi 経由でデバイスに接続する(Android 11 以降)
https://developer.android.com/studio/command-li

Androidの画面分割で固定指示してた画面が勝手に回転してさらにアクティビティが勝手に再生させられてしまう件

画面を縦向きに固定したければ
マニュフェストのactivityのところに

android:screenOrientation=”portrait”

と書けば確かにそうなるのだが、画面分割で2画面表示にしたとき、スマホを横向きにすると、上記の設定にしているにも関わらず勝手に回転する(完全に防ぐにはOS側でrotationをoffにする必要があるがめんどくさい)。
で、回転それ自体は別に害はないのだが、回転すると、activityが再生されて計測がリセットされるのがとにかく困った。調べてみると、再生を防ぐには、同じくマニュフェストに

android:configChanges=”keyboardHidden|screenSize|orientation”

などというふうに書けば良いとあり、これで解決しましたのでメモしておきます。
回転を止めるにはどうしたら良いのだろう。

Android開発のSDKでつまづいた

環境
Mac M1チップ

アプリをビルドしようとすると色々エラーがでてくる

#つまづきポイント1
buildToolsVersion 31 と 32 は
なぜかSDKファイルが壊れている云々のエラーが出た(M1だから?)
なので安定バージョンを選択

“`build.gradle
buildToolsVersion “30.0.2”
“`

#つまづきポイント2

・SDKとはなんぞや?

でつまづいた。Xcodeで必要なかった設定を初期設定として色々やらなければいけなかった
Android SDKからAPI Level 23 と最新API Level 32 をインストール

APILevelとはiOS開発でいうXcodeのバージョン?Swiftのバージョン?として考えるとイメージがしやすいのかな?(間違ってる気がする)

例えば
APILevel 23で開発行うとAndroid 6.0(Marshmallow) <- iPhoneで言うiOS 以前のスマホへは動作が確証されない? 逆にAPILevel32(現時点での最新)で開発を行うと23にはなかった新機能は使えるがA

Android12でFLAG_IMMUTABLEでクラッシュする件の対応

###自作Androidアプリで謎のクラッシュが発生

あまり今までアプリのクラッシュは発生していなかったのですが、
急に同じエラーが発生し始めたので調べてみました。
対象機種はすべてAndroid12です。

“`
exception.class.missing._Unknown_: Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags (PendingIntent.java:375)
at android.app.PendingIntent.getBroadcastAsUser (PendingIntent.java:645)
at android.app.PendingI

Androidアプリエンジニアがよく見るサイトとチュートリアル

Android アプリエンジニアがよく見るであろうサイトや、Android アプリ開発を勉強するときにどこから手をつければいいのか学習のチュートリアルを紹介しようと思います。  

## 公式ドキュメント
– [Android の公式ドキュメント](https://developer.android.com/)
– 日本語のページは情報が古く更新されていない時がよくあるため、公式ドキュメントのページを見るときは `?hl=en` をつけて極力英語のページを見るようにしましょう
– [Kotlin の公式ドキュメント](https://kotlinlang.org/)
– [Material Design の公式ドキュメント](https://material.io/)

## 開発環境
– [Android Studio](https://developer.android.com/studio?hl=en)
– プレビュー版は[こっち](https://developer.android.com/studio/preview?hl=en)

## 情報収集

CardViewの影をxmlで消す

#初めに一言

CardViewではを使うと指定もしていないのに、デフォルトでViewに影が付きます
その影を消す方法をGoogleで、「CardView 影 消す」などと調べてみましたが、
(デフォで付いてるはずだが)特定の条件での影が付かない場合の対処や別のViewについてが出てきて
探すのに苦労したので 自分の備忘録として残しておきます。

#早速

“`
app:cardElevation=”0dp”
“`
この一文を影を消したい対象のCardViewに追加するだけです。

#説明
簡単に説明をしておきます
CardViewに影が付いているのは、立体的に見たときに高さがあるためです。
なので、その高さ(Elevation)を0に設定してあげれば影がなくなります。

Compose Material3におけるComponentの対応状況

Jetpack Compose の Material 3 の Component の対応表です。
Jetpack Compose のプロジェクトで Material 3 を導入を検討する時にでも活用ください。

|Component|material-component(1.5.0)|Compose Material3(1.0.0-alpha05)|
|:–:|:–:|:–:|
| Backdrop | – | × |
| Badge | ◯ | ◯ |
| Bottom app bar | ◯ | × |
| Bottom sheet | ◯ | × |
| [Button](https://m3.material.io/components/buttons/overview) | ◯ | ◯ |
| [Card](https://m3.material.io/components/cards/overview) | ◯ | ◯ |
| Checkbox | ◯ | ◯ |
| [Chip](https://m3.material.io/components/chips