- 1. 【Android】OkHttpによるHTTP通信時のコネクションの再利用
- 2. AndroidのNavigationコンポーネントで親Fragmentを取得する方法
- 3. Android NDK で静的ライブラリを最小構成で作成する
- 4. Androidテスト全書 第1章 テスト入門
- 5. ViewModelの実装方法まとめ
- 6. Jetpack Composeで簡単な画面遷移を行う
- 7. Android enumではなくIntDefを使ってdata classを組み立てる
- 8. やらかし:AndroidのNavigationコンポーネントのSafe Argsを使っててnavArgs()がUnresolved referenceになった
- 9. dronekit-androidをビルドしてみる(2021年10月版)
- 10. Unityビルドにハマった時に見る備忘録
- 11. [Kotlin] data class と普通のクラスの違い
- 12. 汎用デシジョンテーブルIMSが新たに追加になりました。
- 13. AmazonアプリストアにAndroidアプリを登録してみた
- 14. Action名やExtraのKey名はどうやって定義するのがよいか?
- 15. API31以上をターゲットにした時の変更点をざっくりと(UXについて)
- 16. Flutter 2.5.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)
- 17. Jetpack ComposeのSlotTableへの変更の適応のコードリーディング
- 18. 【Android】Jetpack Composeでwakelock対応(スリープさせない)をする【Tips】
- 19. Activityの起動処理は起動されるActivityで実装すべし
- 20. 【Android】Repositoryの役割・メリットを考えてみる
【Android】OkHttpによるHTTP通信時のコネクションの再利用
## 概要
[OkHttp](https://square.github.io/okhttp/)のOkHttpClientオブジェクトを再利用することによる通信処理の効率化について記載します。
[iOS(Swift)についてはこちら](https://qiita.com/cwan/items/a1d169152fc65520bf3b)
## 障害事象
弊社が開発しているAndroidアプリのデータ転送量が多すぎるのではないかという報告を受けました。データ転送量を測定してみると、HTTPリクエスト・レスポンスのヘッダーおよびボディサイズの合計の2.5倍程度の量が発生していました。
※このアプリの外部への通信はすべてOkHttp (ver.4) を使用して実装されています。
## 調査方法
Android StudioのProfilerを使用して、通信状況を調べてみることにしました。
1. Androidシミュレーター (AVD) でアプリを起動する
1. ツールバー > [View] > [Tool Windows] > [Profiler]
1. [SESSION] の
AndroidのNavigationコンポーネントで親Fragmentを取得する方法
# 解決策
“` kotlin
val navHostFragment = parentFragment as NavHostFragment
val parent = navHostFragment.childFragmentManager.fragments[0]
if (parent is MainFragment)
// …略
“`
`Fragment#getParentFragment()`が`NavHostFragment`なのでDialogFragmentなどを実装している時、呼び出し元のFragmentにコールバックさせるのがひと手間いる。
`NavHostFragment`の子Fragmentを覗いてみたら“`
[呼び出し元のFragment, 呼び出されたFragment, …]
“`
という風になっているので上記の内容で呼び出し元のFragmentを取得できた。:::note warn
ただし、バックスタックがたくさんある場合はfragments[0]が呼び出し元のFragmentとは限らない。
:::# 別の解決策
https://s
Android NDK で静的ライブラリを最小構成で作成する
## ことの発端
他のプラットフォームで `C++` を使って開発したコード(所謂`共有コード`)を `Android` で使いたい。
小規模ならば `AndroidStudio` で自動生成された `CMakeLists.txt` にソースコードを追加して終了なのだが、`共有コード`が巨大(またはビルドに相当な時間が掛かる)だと色々と厄介。
なので、`共有コード`を独立してビルドして、後でガッチャンコしたい。## `共有コード`のビルド
いきなり巨大な`共有コード`だと大変なので、まずは簡単な構成でやってみましょう。
### 1. ファイル・フォルダ構成
“`:ファイル・フォルダ構成
/
src/
sub.cpp
sub.h
CMakeLists.txt
build.sh
“`### 2. `CMakeLists.txt` を作る
お好きな感じで `CMakeLists.txt` を作ります。
“`cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)projec
Androidテスト全書 第1章 テスト入門
## はじめに
私はAndroidエンジニア一年目になります。
今まで全くと言っていいほどテストコード書かずにいました。
どう書けばいいかもわからない中「[Androidテスト全書](https://peaks.cc/books/android_testing)」を読み始めました。
アウトプットのため各章をまとめさせていただけたらと思います。書籍については以下になります。
Androidテスト全書
https://peaks.cc/books/android_testing
### なぜテストが必要なのか– 未然にクラッシュ防ぎ、開発プロセスに強固なテスト基盤を構築することは品質を確保する必要があるから
– Play Storeで星1のレビューのついたアプリを解析したところ、42%もの割合のアプリがクラッシュを含む安定性の問題があった
– Googleは低品質なアプリをPlay Storeのランキングや検索結果の上位には表示されないようにアルゴリズムを改良した
– テストは動く仕様書であり資産である### Androidのテストの種類と方法
– ブ
ViewModelの実装方法まとめ
前回は`Navigation`に関しての記事を書きましたが、今回は`kotlin`における`ViewModel`の実装方法、`LiveData`の使い方、`DataBinding`の適用方法についてまとめていきます。
# この記事の内容
公式の[ドキュメント](https://developer.android.com/guide/navigation?hl=ja)やトレーニング「[Android Kotlin の基礎](https://developer.android.com/courses/kotlin-android-fundamentals/overview?hl=ja)」のレッスン5「アーキテクチャ コンポーネント」を参考に実装のポイントとエッセンスをまとめていきます。
`ViewModel`とは何か、また`MVVM`デザインパターン等については触れません。### 前提知識
* kotlinの基礎的な文法
* AndroidStudioの使い方/アプリの作り方
* 画面や画面部品の配置方法
* `Navigation`の実装方法(前回記事参照)### 開発環境
Jetpack Composeで簡単な画面遷移を行う
単純なコンポーザブル関数が用いられている2画面間の遷移(のようなもの)をする方法の一つです。
build.gradle(:app)に以下のような依存関係を追加してください。“`gradle:build.gradle(:app)
// いろんなやつdependencies {
// いろんなやつ
implementation “androidx.navigation:navigation-compose:2.4.0-alpha09”
}
“`:::note warn
注意
compileSdkVersion が 30以下だと後の処理でエラーが出る可能性があります。
:::今、以下のような `FirstScreen` と `SecondScreen`を移動する場合を考えます。
“`kotlin
@Composable
fun FirstScreen(navController: NavController){
Column {
Text(text = “1つ目の画面”)
Button(onClick = { navCo
Android enumではなくIntDefを使ってdata classを組み立てる
# 環境
Android Studio Arctic Fox | 2020.3.1 Patch 2
Kotlin 1.5.31# 概要
列挙型の値を使うときに、`@IntDef`を生かしてdata classを組み立ててみます。
# なぜenumではなくIntDefを使うのか
Google I/O 19で、`Build apps for the next billion users` という動画があります。
この中の、`Reduce your app size`に挙げている項目で、`
やらかし:AndroidのNavigationコンポーネントのSafe Argsを使っててnavArgs()がUnresolved referenceになった
# 結論
結果から言うとただの勘違いでした。:::note warn
実装方法は間違えてないのに解決できない方はこちら
:::# 起こったこと
“` kotlin:DetailFragment.kt
class DetailFragment : Fragment() {
companion object {
private val args: DetailFragmentArgs by navArgs() // navArgs Unresolved reference.fun newInstance() {
// …略
}
}
private var _binding: DetailFragmentBinding? = null
private val binding get() = _binding!!// …略
}
“`
何さがしてもUnresolved referrenceが解
dronekit-androidをビルドしてみる(2021年10月版)
# はじめに
最近、[Herelink](http://www.japandrones.com/shopdetail/000000000169/)を筆頭にAK82、MK15などMAVLink対応スマートコントローラの国内販売が相次いでいます。これらにはAndroid OSが載っているのでカスタムアプリ開発手段の一つとして[dronekit-android](https://github.com/dronekit/dronekit-android) のニーズが出てくる可能性があります。そこで、Androidの経験が浅い人向けに2021年10月時点最新のAndroid Studioを使って[dronekit-android](https://github.com/dronekit/dronekit-android)をビルドする手順をまとめました。dronekit-androidは2018年以降更新が止まっていることもあり、作業内容はほぼツールのバージョンの整合性合わせとなります。
* サンプルアプリからの機体(シミュレータ or 実機)への接続確認が取れていないため、そちらの確認が取
Unityビルドにハマった時に見る備忘録
#最初に
これらは備忘録でざっと書いているので日本語がおかしかったりこの方法で直らない可能性があることをご了承ください#Unityビルドに失敗する場合
##エラーが100個以上大量に出ている場合
エラーの量で雑に分類します。
エラーメッセージを見る。
### Duplicate class com.google.android.gms.ads.identifie … と言われてる場合例えばこのエラーメッセージの場合
java.lang.RuntimeException: Duplicate class com.google.android.gms.ads.identifier.AdvertisingIdClient found in modules classes.jar (:com.google.android.gms.play-services-ads-identifier-17.0.0:) and classes.jar (:play-services-ads-identifier-17.0.0:)
[Kotlin] data class と普通のクラスの違い
# 事の発端
師匠に突っ込まれたので。
まだまだ、思考が浅かったです。data classと普通のclassの違いはなんですか?
— どすこい@Software Engineer (@dosukoi_android) October 3, 2021
# データクラスとは?
データクラスとは、Kotlin特有の仕様で、データを保持するだけのクラスはdataマークをつけることで定義されます。
データクラスとして成り立たせるには、– プライマリコンストラクタに引数を一つは持たせること。
– val or var でイミュータブルか否かを明示すること
– 抽象クラス、openクラス,シールドクラス、インナークラスであってはならないが必要です。
Javaでは、フレームワークに依存していない無添加なオブジェクトによって、(いわゆるPOJO)データを保持するだけのクラスは作れますが、かなりボイラープレート多いです。
# 普通のクラスとの違い
上記3つの縛りはあるものの、確かに違いは何かと言われるとちゃんと考えていなかった。
恐らく、dataマークを付与することでデータを保持するのに特化した仕様になるのだろうが、何が違うの
汎用デシジョンテーブルIMSが新たに追加になりました。
#はじめに
ifLinkマイクロサービスを開発している八教と申します。
新たにデシジョンテーブルにより判定して結果を送信するフィルターIMS
「汎用デシジョンテーブルIMS」が追加されましたので、紹介させていただきます。#ifLinkとは
https://iflink.jp/#汎用デシジョンテーブルIMSについて
IMSのデータがデシジョンテーブルに合致するか判定し、
最初に合致したデシジョンテーブルの結果を返却します。デシジョンテーブルってなに?という方は以下参照
https://medium-company.com/%E6%B1%BA%E5%AE%9A%E8%A1%A8/例えば入力に乗車駅、降車駅、支払いを出力するIMSがあった場合、
それらの入力を受け取ってデシジョンテーブルより運賃を算出。
算出結果をトーストに表示することができます。IF-THEN のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/f5ea05a6-b607-e1ff-
AmazonアプリストアにAndroidアプリを登録してみた
# 概要
[Amazonアプリストア](https://www.amazon.co.jp/Android%E3%82%A2%E3%83%97%E3%83%AA/b?node=2381130051)に自作アプリ[CIFS Documents Provider](https://f-droid.org/packages/com.wa2c.android.cifsdocumentsprovider/)を登録してみたので、その内容について書きます。
# Fire OSとAmazonアプリストアについて
Amazonでは、[Fire タブレット](https://www.amazon.co.jp/Fire-タブレット-ファイア-Amazon/b?ie=UTF8&node=3933931051)という、電子書籍リーダ向けのタブレット端末が販売されています。これはE-ink画面のKindleとは異なり、Fire OSというAndroidをベースとしたOSが搭載されています。AndodroidとFire OSのバージョンの対応関係は、次のページに書かれています。
[Fire OSの概要 \|
Action名やExtraのKey名はどうやって定義するのがよいか?
Intentに付与するAction名やExtraのKey名をアプリ独自で定義する場合、どういう値を定義すればいいのか、独自なのでどうとでも定義できてしまうため悩んでしまいますよね。
また、外部に公開する場合、アプリ間プロトコルの定義になりますので、一度適用してしまうと変更不可能という、取り返しのつかない設計要素です。将来を見据えて慎重に決める必要があります。というわけで、どうやって決めればいいのかを説明しようと思います。
# アプリ外部に公開する場合
Intentを使ったインターフェースをアプリ外部に提供し、独自のActionを定義する場合は、他のAction名と重複しないように、**パッケージ名などをプレフィックスとしてつけた名前を定義する**のが良いでしょう。アプリ外部に提供する場合、それが機能を識別するためのIDになりますので、他のアプリで使用される名前と衝突すると問題が発生してしまいますからね。
プレフィックスの後の名前は自由につけて良いです。アプリ内のシンボル名として、ACTION_HOGEHOGEという名前で定義することが多いと思うので、それをそのままつけても良い
API31以上をターゲットにした時の変更点をざっくりと(UXについて)
# まもなくAndroid12!
最終beta版がリリースされて、いつリリースなのか推測が色々なされています。
QAエンジニアとのコミュニケーションで必要になってくる場合もあるのでチェックしておこうと思います。
今回はAPI31以上をターゲットにした時のUX変更点に関していくつかピックアップしたいと思います。# UXの変更点
### ピクチャー イン ピクチャーの動作の改善
ピクチャーインピクチャーとは、Android8から導入された機能で、メイン画面でActivityを操作しながら別のActivityを画面の片隅に表示させられるというものです。GoogleMapなどで体験したことある人多いと思います。
これに関して、いくつか動作変更が起きました。
例えば、PIPモードに入る時のジェスチャーナビゲーションは、ホームに戻るアクションを検知してからでしたが、新しくできたAPI `PictureInPictureParams` によりコールバックを待たずして `setPictureInPictureParams` を呼び出せるようになりました。
かなりスムーズな遷移が出来そうで
Flutter 2.5.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)
# なぜこの記事を書いているか?
自分の参画していたプロジェクトで、FlutterおよびXcodeのバージョンの違いに悩まされていたので、違いを吸収する方法は無いかと色々調べていたら以下の方法にたどり着きました。その備忘録です。
# 環境(2021/10/03現在)
– MacBook Pro (Intel Mac)
– macOS Big Sur (11.6)
– Flutter (2.5.2)
– Android Studio (Arctic Fox | 2020.3.1 Patch 2)
– Xcode (13.0)# インストール
## Homebrew
今回は色々な物をHomebrewでインストールするので、以下を実行します。
“`bash
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`## Google Chrome
なにはともあれ、Chrome。
“`bash
brew install –ca
Jetpack ComposeのSlotTableへの変更の適応のコードリーディング
https://qiita.com/takahirom/items/8e978eeb6d85bf48a330
の続きです。
今度まとめた記事を書く予定なので、この記事は読まなくていいです。
前回までで、recomposeの実装を読んでいくことができました。
SlotTableに反映していくところつまり、4を呼んでいきます。1: recordComposerModificationsLocked() を呼ぶ。Recomposer.snapshotInvalidationsを見て、IdentityScopeMapを使って変更点に対しての影響を受けるスコープを取得し、Recomposer.compositionInvalidationsやComposition.invalidationsというフィールドに変更を入れる。
2: compositionInvalidationsをtoRecomposeに入れる。
3: toRecomposeに対して、performRecompose(composition, modifiedValues)、(内部でdoCompose())することでt
【Android】Jetpack Composeでwakelock対応(スリープさせない)をする【Tips】
個人的なメモも兼ねて
## 概要
Androidアプリにおいて、何らかの都合で画面をスリープ状態にさせないようにする場合は専用の実装が必要です。
Android公式の推奨方法は`FLAG_KEEP_SCREEN_ON`をActivityから呼ぶ実装です。https://developer.android.com/training/scheduling/wakelock
“`kotlin
// コードで呼ぶ例
class MainActivity : Activity() {override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
Activityの起動処理は起動されるActivityで実装すべし
Androidアプリの開発を始めたら、かなり初期に習得するであろう他のActivityを起動する方法ですが、いわゆる入門書とかに書かれているような実装方法はよろしくない。って話をしようと思います。
最近はNavigation Component使っているしSingle Activityだから使う機会が無い?知らんがな。MainActivityからMainActivity2を起動する例を考えます。
# 入門書の延長
意外とよく見かけるのが以下のように呼び出し元でIntentをつくってstartActivityをコールする方法。入門書に書いてある感じです。ExrtaのKeyをConstantsに定数定義しているのもあるあるですね。
“`kotlin:MainActivity.kt
findViewById(R.id.button).setOnClickListener {
startActivity(Intent(context, MainActivity2::class.java).also {
it.putExtra(Constants.
【Android】Repositoryの役割・メリットを考えてみる
## はじめに: アーキテクチャに関する一般的な原則について
本題に入る前に、「関心の分離」についておさらい。
認識すべきこと:すべてのコードを 1 つの Activity または Fragment に記述するのはよろしくない。### すべてのコードを1つのActivityに記述したときに起こりうるデメリット
**①開発コスト高**
コード量が肥大化し、他人(未来の自分を含む)が理解しづらくなり、修正も困難に。。。**②メモリ不足**
ActivityやFragmentは画面回転したりアプリをバックグラウンドに移したりするだけでLifecycleが終了するため、表示するたびに全ての処理を実行しなければいけなくなる。
高負荷な処理を連続で行うとメモリ不足になってしまうことも。。。### 解決策: 関心の分離をする
関心の分離とは主にデータの管理(データの取得・保存)に関して、各クラスの関心を分離させるべきと言う考え方。
要するに、各クラスの役割を定め、自らの役割を全うさせることで効率的で、洗練されたアプリを作成しようということ。本題:今回はViewModelを補佐す