ラベル 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. ModuleYukari.Yukari を選択
      2. セクション Keystore pathCreate 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 以上にしないといけないらしい。

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

無心で置換。

targetSdkVersion26 に更新してビルド

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-exvoicegradle.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/releaseYukari/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 環境でビルドしていくのが楽で安定するとおもう。

以上。

参考資料