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

2022年8月28日日曜日

Windows Subsystem for Android で Yukari for Android を動かす

shibafu528/Yukari: Twitter/Mastodon Client for Android を Windows Subsystem for Android で動かしたい。

Twitter TL と Mastodon TL をひとつのカラムで混ぜて見れて、さらに TL の自動更新ができるアプリ、Yukari for Android しか知らないので、これを Windows で動かしたかった。

前提

Windows Subsystem for Android の有効化

Windows Insider Program の有効化

※ 2022/8/25 から、 Windows Insider Program への参加は不要になったようだ

  1. スタート -> 設定 -> Windows Update -> Windows Insider Program
  2. 使用を開始する ボタン押下
  3. ウィザードに従って情報入力
    1. アカウントと紐づけ
      • Microsoft アカウントに紐づけ
    2. Insider チャネルを選択
      • ベータ チャネル を選択
      • WSA はDev またはベータで使える
    3. デバイスの契約をレビューする
      • 利用規約とプライバシーステートメントを読む
    4. このデバイスを再起動して作業を完了します
      • 今すぐ再起動 を押下

Amazon アプリストアをインストール

スタート -> Microsoft Store -> Amazon アプリストア で検索し、 Amazon アプリストア を選択し、インストール。

開発者モードをオン

adb コマンドで WSA に接続できるようにするため、開発者モードをオンにする。

  1. スタート -> Android™用 Windows サブシステム設定 を実行
  2. 開発者 -> 開発者モード をオンにする

Yukari for Android のインストール

adb で WSA に接続

adb は、Android Studio をインストールしていれば ~/AppData/Local/Android/Sdk/platform-tools に入っているはず。

WSA が起動していないと、 adb で接続できないので、 Android™用 Windows サブシステム設定 を起動しておくこと。

Android™用 Windows サブシステム設定 を起動したうえで、以下コマンドで接続。

> C:\Users\mikoto\AppData\Local\Android\Sdk\platform-tools\adb.exe connect 127.0.0.1:58526
* daemon not running; starting now at tcp:5037
* daemon started successfully
failed to authenticate to 127.0.0.1:58526

ADB のデバッグを許可しますか? のダイアログが出るので、 許可 を押下。

adb で apk をインストール

以下コマンドで、署名済みの apk ファイルを転送・インストール。

C:\Users\mikoto\AppData\Local\Android\Sdk\platform-tools\adb.exe install .\Yukari\Yukari\stable\release\Yukari-stable-release.apk

以上。

Yukari for Android の設定をインポートしたいなら、設定ファイル一式を abd push で WSA のファイルシステムへ転送できる。

参考資料

Yukari for Android をビルドする(2022/8/29 版)

shibafu528/Yukari: Twitter/Mastodon Client for Android をビルドする。

前提

  • OS: Windows 11 Pro 21H2 ビルド: 22000.856

Android Studio のインストール

Android Studio のインストール  |  Android デベロッパー  |  Android Developers からダウンロードし、インストールする。

GitHub の Personal Access Token を作成

Package info.shibafu528.yukari.yukari-exvoice · shibafu528/yukari-exvoice パッケージをインストールするために、 GitHub パッケージを読み込みできるトークンを作成する。

read:package パーミッションの付いた Personal Access Token を作成し、トークンをメモ。

Yukari のビルド

  1. Android Studio に、 Yukari のプロジェクトをインポート

  2. Yukari/local.properties に、以下 2 行を追加

    gpr.user=mikoto2000
    gpr.key=<read:package のパーミッションを設定した Personal Access Token>
  3. メニューの Build -> Generate Signed Bundle or APK を選択

    1. Generate Signed Bundle or APK のダイアログが開くので、 APK を選択して Next ボタン押下
    2. 必要事項を記入して Next ボタン押下
      1. Module に Yukari.Yukari を選択
      2. セクション Keystore path の Create new... ボタンを押下、必要事項を記入して OK ボタン押下
    3. 必要事項を記入して Finish ボタン押下
      • Destination Folder : apk の出力パス。今回は /PATH/TO/Yukari/Yukari を設定。
      • Build Variants : stableRelease を選択

これで、 /PATH/TO/Yukari/Yukari/stable/release/Yukari-stable-release.apk が生成される。

2022年1月19日水曜日

Yukari for Android をビルドしてみる

Windows 11 に Android アプリを実行する機能があるので、試しに Twitter/Mastodon クライアントである shibafu528/Yukari: Twitter/Mastodon Client for Android をビルドしてインストールしてみたいのだが、 Insider Program が必要のようだ。

メイン PC が Insider Program に入れないので試せないが、とりあえず APK をビルドするところまでやってみる。

前提

以下、インストール・設定済み。

  • OS: Windows 11 Pro 21H2 22000.434
  • Java: java version “1.8.0_201”
  • AndroidStudio: 2020.3.1 Patch 2
  • MSYS2 をインストールして、 sed.exe をパスにいれる
  • Docker: Docker version 20.10.12, build e91ed57

Yukari ビルドチャレンジ

ソース取得

git clone --recurse-submodules https://github.com/shibafu528/Yukari
cd Yukari

とりあえず gradlew build

> ./gradlew build
...(snip)
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':gl-helpers'.
> SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local properties file at 'C:\Users\mikoto\project\Yukari\local.properties'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 22s

…せやろな。 gl-helpers でエラー。環境変数 ANDROID_SDK_ROOT が必要なようだ。 追加して gradlew build。

環境変数 ANDROID_SDK_ROOT を追加してビルド

> $Env:ANDROID_SDK_ROOT="C:\\Users\\mikoto\\AppData\\Local\\Android\\Sdk"
> ./gradlew build
...(snip)
> Task :twpfparser:test FAILED

info.shibafu528.twpfparser.TwiProfileImplTest > testGetTweetPerDay FAILED
    java.lang.AssertionError at TwiProfileImplTest.java:168

info.shibafu528.twpfparser.TwiProfileImplTest > testGetElapsed FAILED
    java.lang.NumberFormatException at TwiProfileImplTest.java:173

info.shibafu528.twpfparser.TwiProfileImplTest > testGetFavoritesCount FAILED
    java.lang.NullPointerException at TwiProfileImplTest.java:152

29 tests completed, 3 failed

> Task :Yukari:preAlphaDebugBuild FAILED

FAILURE: Build completed with 2 failures.

1: Task failed with an exception.

テスト失敗。とりあえずテスト無視してみようか。

テストをスキップしてビルド

> ./gradlew build -x test
...(snip)
> Task :gl-helpers:lint
Ran lint on variant debug: 1 issues found
Ran lint on variant release: 1 issues found
Wrote HTML report to file:///C:/Users/mikoto/project/Yukari/gl-helpers/build/reports/lint-results.html
Wrote XML report to file:///C:/Users/mikoto/project/Yukari/gl-helpers/build/reports/lint-results.xml

> Task :Yukari:preAlphaDebugBuild FAILED

FAILURE: Build failed with an exception.
...(snip)

lint でもエラーになるっぽい。これも無視。

lint をスキップしてビルド

> ./gradlew build -x test -x lint
...(snip)
  Errors found:

  C:\Users\mikoto\project\Yukari\gl-helpers\build.gradle:9: Error: Google Play requires that apps target API level 26 or higher.
   [ExpiredTargetSdkVersion]
          targetSdkVersion 19
...(snip)

ターゲットは 26 以上にしないといけないらしい。

これリリース時はどうやっているんだろうか?

無心で置換。

targetSdkVersion を 26 に更新してビルド

sed.exe -i -e "s/targetSdkVersion 26/targetSdkVersion 19/g" gl-helpers/build.gradle

そしてビルド。

> ./gradlew build -x test -x lint
...(snip)
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':Yukari:preAlphaDebugBuild'.
> Could not resolve all files for configuration ':Yukari:alphaDebugCompileClasspath'.
   > Could not find info.shibafu528.yukari:yukari-exvoice:20210923.011845.
     Required by:
         project :Yukari
...(snip)

yukari-exvoice をビルドする必要があるようだ。

yukari-exvoice ビルドチャレンジ

Yukari/gradle.properties を更新してビルド

yukari-exvoice は gradle.properties で、ビルドする・しないを切り替えられるようになっている。

sed.exe -e "s/yukari.exvoice.build=false/yukari.exvoice.build=true/g" gradle.properties

またビルド。

> ./gradlew build -x test -x lint
...(snip)
NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory.  It is currently set to C:\Users\mikoto\AppData
\Local\Android\Sdk\ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.


FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':yukari-exvoice'.
> java.lang.NullPointerException (no error message)
...(snip)

oh… java.lang.NullPointerException (no error message)。

yukari-exvoice, よく見ると、 Dockerfile とか入っているし、 Gradle とは別にビルド手順がありそう。

Docker 環境で yukari-exvoice をビルド

多分 Dockerfile で作ったイメージからコンテナ作って、その中で gradlew build する感じ。

cd yukari-exvoice
docker build -t mikoto2000/y4a-buildkit .

…これ Yukari 自体のビルドもこのコンテナでやっちゃえるのでは???

後で試す。

> docker run -it --rm --mount type=bind,source=$(pwd),target=/work --mount type=bind,source=$HOME/.gradle,target=/root/.gradle --workdir /work mikoto2000/y4a-buildkit ./gradlew build
...(snip)
FAILURE: Build failed with an exception.

* What went wrong:
Could not create service of type FileHasher using GradleUserHomeScopeServices.createCachingFileHasher().
> java.io.IOException: Input/output error
...(snip)

Windows のキャッシュが悪さしている???

Windows 側の .gradle のバインドを止めてみる。

あと、試行錯誤しそうなので bash でコンテナを起動。

> docker run -it --rm --mount type=bind,source=$(pwd),target=/work --workdir /work mikoto2000/y4a-buildkit bash

起動したコンテナ内でビルド。

# ./gradlew build
...(snip)
> Task :mrubyBuild FAILED
build: [exec] ./bootstrap
./bootstrap: 3: exec: autoreconf: not found
rake aborted!
./bootstrap failed
...(snip)

autoconf をインストールして再挑戦。

# apt-get install -y autoconf
# ./gradlew build
configure.ac:56: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1

libtool をインストールして再挑戦。

apt-get install -y libtool
./gradlew build

ログとりわすれたが成功した。

Windows に戻ってビルド再挑戦

Docker コンテナでビルドしたビルド成果物を、 Windows のローカル Maven リポジトリへパブリッシュする。

> ./gradlew publishToMavenLocal
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':yukari-exvoice'.
> java.lang.NullPointerException (no error message)

うーん?

コンテナに戻って publishToMavenLocal を試す。

# ./gradlew publishToMavenLocal
Configuration(s) specified but the install task does not exist in project :.

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

成功してしまった…。

こっちの成果物を Windows 側にコピーするか。

Windows 側で docker cp を実行。

> docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS NAMES
de2371b0e6d5   mikoto2000/y4a-buildkit   "bash"                   56 minutes ago   Up 56 minutes         elegant_merkle
> docker cp de2371b0e6d5:/root/.m2/repository/info/shibafu528 ${HOME}/.m2/repository/info/shibafu528

すでにビルド済みなので、 yukari-exvoice のビルドフラグを false に戻してビルド再挑戦。

> cd ..
> sed.exe -i -e "s/yukari.exvoice.build=true/yukari.exvoice.build=false/g" gradle.properties

yukari-exvoice のバージョンが、ビルド年月日時分秒になっているので、 build.gradle 内のバージョン番号を修正。

> cd Yukari
> ls ${HOME}/.m2/repository/info/shibafu528/yukari/yukari-exvoice
> $EXVOICE_VERSION=$(ls ${HOME}/.m2/repository/info/shibafu528/yukari/yukari-exvoice)[0].Name
> sed.exe -i -e "s/20210923.011845/${EXVOICE_VERSION}/g" build.gradle
> cd ..
> ./gradlew build -x test -x lint
...(snip)
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':Yukari:preAlphaDebugBuild'.
> Could not resolve all files for configuration ':Yukari:alphaDebugCompileClasspath'.
   > Could not find info.shibafu528.yukari:yukari-exvoice:20220119.054547.
     Required by:
         project :Yukari
...(snip)

見つからないそうです。

Gradle のキャッシュは ~/.m2 じゃなくて ~/.gradle の中か…。

Gradle のローカルキャッシュへの Publish や参照の仕組みを調べるのが面倒だったので、とりあえず依存をファイルパスで指定するように修正。…負けた。

> sed.exe -i -e 's#implementation \"info.shibafu528.yukari:yukari-exvoice:\$exvoiceVersion\"#implementation files (\"../yukari-exvoice/build/outputs/aar/yukari-exvoice-release.aar\")#g' Yukari/build.gradle
> ./gradlew build -x test -x lint

Yukari/build/outputs/apk/stable/release と Yukari/build/outputs/apk/stable/debug に、 apk ファイルが生成されていた。

動作確認

adb コマンドで、デバッグ用 apk ファイルを実機にインストール。

> cd .\Yukari\build\outputs\apk\stable\release\
> ~\AppData\Local\Android\Sdk\platform-tools\adb.exe install .\Yukari-stable-debug.apk
Performing Streamed Install
Success

とりあえず、アカウント追加画面が表示されることを確認できた。

これ多分ルートの Yukari ディレクトリをコンテナにマウントして、全部 Linux 環境でビルドしていくのが楽で安定するとおもう。

以上。

参考資料