Android関連のことを調べてみた2020年08月10日

Android関連のことを調べてみた2020年08月10日

Android向けにstraceをクロスコンパイルする方法

Android向けにstraceをクロスコンパイルする方法に苦戦したので自分用メモ。

####ビルド環境
Ubuntu 20.04 LTS

#### arm対応gcc等のインストール
“`sh
sudo apt install g++-arm-linux-gnueabihf g++-aarch64-linux-gnu autoconf
“`

####ソースのダウンロード
“`sh
git clone https://github.com/strace/strace.git
“`

#### コンパイラ設定
“`sh
#armの場合
export CC=/usr/bin/arm-linux-gnueabihf-gcc
export CFLAGS=”-O2 -static”
export LDFLAGS=”-static -pthread”
#aarch64の場合
export CC=/usr/bin/aarch64-linux-gnu-gcc
export CFLAGS=”-O2 -static”
export LDFLAGS=”-static -pthread”
`

元記事を表示

Ghidra ARM32 全関数がARMモードかThumbモードかを出力する

ARM32のアプリの解析を行っているとき、正確に逆アセンブルした状態で各関数がARMモードかThumbモードなのかを判定したいという状況はあると思います。
そんな時のための備忘録的メモ。

## 設定
コンソールの出力文字制限を50000->1000000程度にします。
Edit->Tool Options…->Console->Character Limitの値を1000000に変更。

|![options.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255281/7e1a7d24-9c42-6eac-e078-8fbeb9beafd7.png)|
|:-:|

## Script

“`python:thumb_or_arm.py
def isThumbFunction(func):
r = currentProgram.getRegister(“TMode”)
value = currentProgram.programContext.getRegisterValue(r

元記事を表示

ConstraintLayout入門その5 – 「制約に合致」 (0dp) とは

ConstraintLayoutを使用するための設定については、[ConstraintLayout入門その1](https://qiita.com/yamadacsa/items/a4fcf4de9982111cdb7c)をご覧ください。

## 制約に合致 (MATCH_CONSTRAINT)

以下の2つのレイアウトXML記述例では、 “`“` の垂直方向の長さはともに「親Viewと同じ」になります。

“`xml:linear_layout_1.xml



“`

“`xml:constraint_layout_1.xml

元記事を表示

ImageViewにDataBindingをする方法

# はじめに

今回はImageViewにDataBindingをする方法を解説していきます。

# やりたかったこと

“`xml

“`

こんな感じでImageViewにリソースIDをDataBindingをしたかったのですが、なぜか上手くいきませんでした。

# 改善
“`xml

“`

これでできました!

なんでできないんだろうって考えていたんですが、公式のBindingAdapterを見て、そりゃできないなって思いました。
ちなみにこちらが既に用意されているBindingAdapterです。

元記事を表示

ShapeableImageViewで真ん丸や角丸の画像を手軽に作ってみる

真ん丸や角丸の画像を作る方法としてPiccasoなどのライブラリを使う方法[^1]や、手軽な方法としてCardViewを用いたやり方[^2]などがありますが、Material Components 1.2.0に追加された`ShapeableImageView`を使ったやり方を紹介してみます。

下のような画像を手軽に作成できます。

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/3f96c7cc-cb2d-56fb-1da9-edaba7240d2d.png)

## 準備

Material Components 1.2.0を追加しておきます。

“`
dependencies {
implementation “com.google.android.material:material:1.2.0”
}
“`

## 使い方
使い方としては、styleを定義して`ShapeableImageView`の`app:shapeAppearanceOverlay`属性

元記事を表示

【Android/Kotlin】インターネット接続の確認とNetworkInfo非推奨の解消

## 開発環境
* macOS 10.15.5
* Android Studio 4.0
* Kotlin 1.3.72

## やりたいこと
サーバーとの通信の前に端末がインターネットに接続されているかどうかを確認したい。

##`NetworkInfo`を使う方法

デベロッパーガイドの[接続ステータスの特定と監視](https://developer.android.com/training/monitoring-device-state/connectivity-monitoring?hl=ja)(2020/08/09アクセス)によると、`ConnectivityManager`を使用すれば、インターネットに接続されているか、接続されている場合はどのようなタイプかを確認できるそうです。

ということで、ボタンが押されると接続状況が確認され、接続のタイプを表示する簡単な実装を行いました。
(マニフェストファイルにパーミッションを追加するのを忘れないようにしましょう)

“`AndroidManifest.xml
MemuエミュレーターにXposedを入れてみた

#XposedをMemuエミュレーターに入れるには

MemuエミュレーターにXposedを入れてみた。

基本的にしたのURLに方法は書いていますが

How to Install Xposed on MEmu Lollipop Beta

この#6 Go into terminal emulatorがどこにあるのかわからなかったのでメモします

###注意:
MemuエミュレーターはデフォルトでAndroidバージョン7です(2020/8/9現在)

なので上記サイトではxposed-v85-sdk22-x86を入れていますが
xposed-v89-sdk25-x86を入れてください

環境はWindows10です

“`cmd
where Memu
>>> C:\Program Files (x86)\Microvirt\MEmu\MEmu.exe
cd C:\Program Files (x86)\Microvirt\MEmu
memuc.exe -i 0 execcmd cd /storage/emulated/0/Download/xposed-v85-sdk22-x86

元記事を表示

KotlinのJUnitTestにおけるアサーションライブラリはKluentがとても良い感じ

## JUnitのアサーションを快適に書きたい

KotlinでUnitTestを書いていて、今までさして調べずメジャーだからと言う理由で[Hamcrest](http://hamcrest.org/)を使ってたんですが、もともとJavaのライブラリなのでKotlinだと微妙に使いにくい部分がありました。

例えば型判定のアサーションを記述したいときは↓のように書きますが

“`kotlin
val value = 10
assertThat(value, `is`(instanceOf(Int::class.java)))
“`

Kotlinでは`is`が予約語に指定されているため“` ` “`で括る必要もあるのと、`is`と`instanceOf`がネストしているのも微妙に書きにくい&読みにくく、クラス指定も`::class.java`まで記述する必要があって、当たり前ですが`KClass`で記述できないのでJavaの世界観に引きづられている印象を受けます。

また細かいところだと、`is`メソッド一つとっても[Hamcrest](http://hamcrest.org/

元記事を表示

実践・新規モバイルアプリ開発の手順(iOS)

久しぶりに新規アプリ開発をしていて、改めて手順を確認しました。

## 前提

実際の開発では多くの場合、要件定義、設計、API開発、デザインがある程度並行で走るため、仕様がフワフワした状態で着手することが多いです。
その際にどのように立ち回るのがよいか。また、複数人で開発する場合にどのように作業分担するか書いてきます。
なお、設計方針はオーソドックスなMVCで、アプリの構成は一般的なAPI通信をするサービス系アプリと想定します。
設計方針やアプリの構成が異なる場合は読み替えてください。

このフローは何案件かで新規開発を行った人であれば頭の中で構築しているのでしょうけど、言語化されてるのはあまり見かけません。

## 利用方法

– どういうタスクが存在するか確認
– 今の状態でできることは何かを見つける
– 今やってるタスクの意味を理解する
– 今やってるタスクが他のタスクとどう繋がっているか確認する
– 残タスクに対して何の資料や仕様か、何がブロック要因なのか確認する
– 進捗の目処を立てる

## iOSアプリの新規開発フロー

既に仕様が全て揃っている状態からスタートする場合

元記事を表示

【Android/Kotlin】RecyclerViewでオーバースクロールした際のエフェクトを消す

RecyclerViewやListView、ScrollViewなどで端までスクロールするとエフェクトが出る。これを消すには`overScrollMode`プロパティに`View.OVER_SCROLL_NEVER`を指定する。

指定できる値

* `OVER_SCROLL_ALWAYS` (デフォルト)
* `OVER_SCROLL_IF_CONTENT_SCROLLS`
* `OVER_SCROLL_NEVER`

“`kotlin
val recyclerView = findViewById(R.id.recyclerView)
recyclerView.overScrollMode = View.OVER_SCROLL_NEVER
“`

元記事を表示

Koinを使っているマルチモジュールプロジェクトをHiltに移行してみた

# はじめに

[会社のアプリ](https://play.google.com/store/apps/details?id=jp.r_n_i.code.point.app)も[個人的なアプリ](https://github.com/tfandkusu/quickecho)もマルチモジュールプロジェクトでDIフレームワークには[Koin](https://insert-koin.io/)を使っています。Googleさんお勧めの[Dagger](https://github.com/google/dagger)は難解でメンバーへの展開が難しかっため、直感的に理解しやすいKoinの方を採用していました。

しかし、[Android Studio 4.1(執筆時点ではBeta)ではDaggerに対応したソースコードのナビゲーション機能が追加された](https://medium.com/androiddevelopers/dagger-navigation-support-in-android-studio-49aa5d149ec9)らしく、Koinではこのようなことはできないので、Koin

元記事を表示

【Flutter】Pigeon を使ってネイティブコードを型安全に呼ぶ

## はじめに
先日の、 [ Flutter 1.20 のリリース記事 ](https://medium.com/flutter/announcing-flutter-1-20-2aaf68c89c75)で、[ Pigeon ](https://pub.dev/packages/pigeon) というパッケージの紹介がありました。
本来 Flutter 側からネイティブコードを呼ぶには、関数名や引数などを文字列ベースで合わせる必要があるなど、少し大変ですが、このパッケージを使うことで、

* ネイティブ側と__型安全に通信__
* 自動生成よる__手書きコード量の削減__

が可能になります。

本投稿では、このパッケージを使って、__swift / Kotlin で実装した単純な add メソッド__を Flutter 側 から呼ぶ方法を見ていきます。サンプルプロジェクトは[こちら](https://github.com/nskhei/flutter_pigeon_practice)で公開しています。

## Pigeon が行うこと
Dart 側で定義した、引数や戻り値の情報を

元記事を表示

【Android/Kotlin】SharedPreferencesでデータを永続化する

## やりたいこと
ユーザーの入力(EditText)を永続化し、アプリ起動のたびに初期化されないようにしたい。
## 開発環境
* macOS 10.15.5
* Android Studio 4.0
* Kotlin 1.3.72

## SharedPreferencesとは?
SharedPreferences とは、boolean, float, int, long, string などのデータ型について、キーと値のペアを読み書きできるAPI。キーと値のペアは内部ストレージにxmlファイルとして保存される。初回アクセス以降はメモリ上に展開されたキャッシュからデータを取得するため、高速にアクセスできる。

API名「SharedPreferences」から誤解されることもあるが、厳密には「ユーザー設定」を保存するためのものではなく、ユーザーのハイスコアなどの単純なデータを保存する際に使われる。↓ デベロッパーガイドより
> 注: [SharedPreferences](https://developer.android.com/reference/android/content

元記事を表示

Android 端末内にデータを保存する際の指針

# 概要
Android 端末内にデータを保存する際の指針をまとめました。

# 包括的情報
[Data and file storage overview](https://developer.android.com/training/data-storage) 参照のこと。

# ストレージ選択の指針
![Android Storage Selection Chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219474/ff1a87ea-c816-bcb8-857a-9670d3c56f09.png)

**アプリ内のみで利用されアンインストール時に削除される**かどうか?

– 他のアプリとデータを共有する場合は **no**, それ以外は **yes**。[^3]

**内部ストレージが好ましい**かどうか?

– 存在の保証[^2]が必要なデータは内部ストレージにすることが必須。
– アプリの基本的な機能[^1]から必要とされるデータは内部ストレージが好ましい。
– 大量のデータを保

元記事を表示

kotlinでJSONObjectを簡単作成

kotlinで、変数から `JSONObject` を作成したかったのですが、 まずはオブジェクト作って〜とかputして〜とか面倒だったのでパーサーを作りました。
自分用ですが、忘れないように残しておきます。

# パーサー作成

“`kotlin:JsonObjectBuilder.kt
internal fun json(build: JsonObjectBuilder.() -> Unit): JSONObject {
return JsonObjectBuilder().json(build)
}

internal class JsonObjectBuilder {
private val deque: Deque = ArrayDeque()

fun json(build: JsonObjectBuilder.() -> Unit): JSONObject {
deque.push(JSONObject())
this.build()
return deque.pop()

元記事を表示

HttpURLConnectionでPATCHリクエストを投げる

Androidアプリ作成時にAPI通信を行いたいとき、訳合ってOSSライブラリを使用せずに実装する必要がありました。
そのため、 `HttpURLConnection` を使って独自に通信部分を作成しました。

しかし、PATCHリクエストを送りたいときにエラー発生。
なんと、 `HttpURLConnection` はPATCHリクエストを投げられないらしいです。
うそ…だろ…。

`X-HTTP-Method-Override` ヘッダーを使って偽装する方法もありますが、サーバー側の依存もあり確実では無いようです。
https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch

OSSライブラリはどうやってるんだ?
ということで、 [Jersey](https://eclipse-ee4j.github.io/jersey/) というHTTPクライアントライブラリの[公開されているコード](https://github.com/jersey/jersey)を参考にして

元記事を表示

Flutterで作成したアプリをAndroid用でリリースビルドする手順を解説してみる

# 本記事の内容
* Flutterで作成したアプリをAndroid用でリリースビルドする手順を解説

# 前提
* Flutterでアプリが作れていて、シミュレータで動作確認が済んでいること
* GoogleDeveloper登録が済んでいること(リリースするときは結局必須なので・・・)

# 目次
* [keystoreファイル(署名するときの設定ファイル)を作成](#keystoreファイル署名するときの設定ファイルを作成)
* [android/app/build.gradleを編集](#androidappbuildgradleを編集)
* [AndroidManifest.xmlを編集](#androidmanifestxmlを編集)
* [ターミナルでコマンドを叩く](#ターミナルでコマンドを叩く)

## keystoreファイル(署名するときの設定ファイル)を作成

①Macのターミナルで以下のコマンドを叩く。

**`alias`** に指定した文字はあとから使うので覚えておく(以下の場合、最後の「key」の部分)

“`
keytool -genkey

元記事を表示

DialogFragmentの大きさを自由に変えたい

## 背景

ダイアログは基本小さめの画面なことが多いが、カスタムUIでフルスクリーンで表示したり画面比率何%で表示したり自在に操りたいなと思ったので実装してみた備忘録です

・androidX環境
・色々なサイズで使いたい
・xmlはConstraintLayoutで中身を書きたい

stackoverflowはじめ古い記事を見ていると、ParentをRelativeLayoutやLineaLayoutにしようとか、Styleを定義しようと書かれていましたがこちらが簡単かな?と思ったので書くことにします

## フルスクリーン

### 実装

“`FullScreenDialogFragment.kt
package com.example.coroutines

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.f

元記事を表示

Andorid Native + Flutterのビルドに便利なDocker Imageを作る

Androidアプリのビルドによう使うツールをインストールしたDocker Imageの作り方を説明する(Android SDK, Flutter SDK, GCloud, Bundler, Firebase tools)。
Dockerを使ったことはあるが、実用的なDocker Imageを作ったことはない人向けの説明。

## Docker Imageを作る手順
### 1. Dockerfileを記述する

“`Dockerfile
# BaseはCircle CIのものにする。android sdk, gcloudが既に入っているので楽。
FROM circleci/android:api-29-node

# Install firebase tools
RUN sudo curl -sL https://firebase.tools | bash

# Install tools for easylauncher
RUN sudo apt-get update && sudo apt-get install -y fontconfig ttf-dejavu

# Inst

元記事を表示

[Android]エミュレータで Screen Pinning (画面の固定) を解除する方法

# 問題

Screen Pinning(画面の固定)の解除は 戻るボタンとタスクボタンを長押しすることで解除できるが、エミュレータではマルチタップが上手くできなくて解除できない。ちなみに Screen Pinning (画面の固定)とは次のように戻るボタンやタスクボタンなどを効かなくして他のアプリを起動できなくするモードのことです。

| 画面固定設定を変更する | アプリを画面固定する | ボタンが効かなくなる |
| ——- | ——- | ——- |
| Image from Gyazo |

  • OTHERカテゴリの最新記事