rksoftware

Visual Studio とか C# とかが好きです

Visual Studio なしで .NET で Android アプリを作る

Visual Studio を使って .NET で Android アプリを作る方法を以前に書きました。
rksoftware.hatenablog.com rksoftware.hatenablog.com

今回は、Visual Studio なしでやっていこうと思います。

■ プロジェクトテンプレートのインストール

まず Android のプロジェクトテンプレートをインストールします。
search でテンプレートを探します。

> dotnet new search android
テンプレート名      短い名前                                 作成           言語  パッケージ
                                              ダウンロード
------------------  ---------------------------------------  -------------  ----  ----------------------------------------------------------------------------------  ------------
(省略)
Android Activit...  android-activity                         Microsoft      [C#]  Microsoft.Android.Templates
                                                       55k
Android Applica...  android                                  Microsoft      [C#]  Microsoft.Android.Templates
                                                       55k
Android Class L...  androidlib                               Microsoft      [C#]  Microsoft.Android.Templates
                                                       55k
Android Java Li...  android-bindinglib                       Microsoft      [C#]  Microsoft.Android.Templates
                                                       55k
Android Layout ...  android-layout                           Microsoft      [C#]  Microsoft.Android.Templates
                                                       55k
(省略)

Microsoft.Android.Templates というパッケージだと分かりました。インストールします。

> dotnet new install Microsoft.Android.Templates

次のパッケージがインストールされます:
   Microsoft.Android.Templates

成功: Microsoft.Android.Templates::32.0.476により次のテンプレートがインストールされました。
テンプレート名                短い名前            言語  タグ
----------------------------  ------------------  ----  --------------
Android Activity template     android-activity    [C#]  Android/Mobile
Android Application           android             [C#]  Android/Mobile
Android Class Library         androidlib          [C#]  Android/Mobile
Android Java Library Binding  android-bindinglib  [C#]  Android/Mobile
Android Layout template       android-layout      [C#]  Android/Mobile
Android Wear Application      androidwear         [C#]  Android/Mobile

インストールできました。

■ プロジェクトを作成

テンプレートをインストールしたのでプロジェクトを作成します。

> dotnet new android

出来上がったファイル群を見てみます。

> ls


    ディレクトリ: C:\XXXXXXXXXXXX\Android\AndroidApp1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2022/10/19      0:32                Resources
-a----        2022/10/19      0:32            492 AndroidApp1.csproj
-a----        2022/10/19      0:32            386 AndroidManifest.xml
-a----        2022/10/19      0:32            356 MainActivity.cs

きちんとできています。Activity のコードを見てみます。

> cat .\MainActivity.cs
namespace AndroidApp1;

[Activity(Label = "@string/app_name", MainLauncher = true)]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
    }
}

ちゃんと .NET で書かれた Activity ですね。間違いないです。

■ ビルド

ビルドしてみます。

> dotnet build
MSBuild version 17.4.0-preview-22428-01+14c24b2d3 for .NET
  復元対象のプロジェクトを決定しています...
C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.ImportWorkloads.targ
ets(38,5): error NETSDK1147: このプロジェクトをビルドするには、次のワークロードをインストールする必要があります: android [C:\XXXXXXXXXXXX\Android\AndroidApp1\AndroidA
pp1.csproj]
C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.ImportWorkloads.targ
ets(38,5): error NETSDK1147: これらのワークロードをインストールするには、次のコマンドを実行します: dotnet workload restore [C:\XXXXXXXXXXXX\Android\AndroidApp1
\AndroidApp1.csproj]

ビルドに失敗しました。

C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.ImportWorkloads.targ
ets(38,5): error NETSDK1147: このプロジェクトをビルドするには、次のワークロードをインストールする必要があります: android [C:\XXXXXXXXXXXX\Android\AndroidApp1\AndroidA
pp1.csproj]
C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.ImportWorkloads.targ
ets(38,5): error NETSDK1147: これらのワークロードをインストールするには、次のコマンドを実行します: dotnet workload restore [C:\XXXXXXXXXXXX\Android\AndroidApp1
\AndroidApp1.csproj]
    0 個の警告
    1 エラー

経過時間 00:00:00.99

ワークロードのインストールをしろと言われました。インストールします。

> dotnet workload restore
ワークロードをインストールしています: android

(省略)

進捗表示が文字化けしていましたが特に何も起こらず無事完了しました。結構かかります。
もう一度ビルドチャレンジ。

> dotnet build
MSBuild version 17.4.0-preview-22428-01+14c24b2d3 for .NET
  復元対象のプロジェクトを決定しています...
(省略)
�o�ߎ��� 00:00:39.00

文字化けしていますが成功しました。

■ 実行

このコマンドで実行できないとは分かりつつ、まずは普通に run してみます。

> dotnet run
MSBuild version 17.4.0-preview-22428-01+14c24b2d3 for .NET
  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInferen
ce.targets(219,5): message NETSDK1057: プレビュー版の .NET を使用しています。https://aka.ms/dotnet-support-policy をご覧ください [C:\XXXXXXXXXXXX\An
droid\AndroidApp1\AndroidApp1.csproj]
  AndroidApp1 -> C:\XXXXXXXXXXXX\Android\AndroidApp1\bin\Debug\net6.0-android\AndroidApp1.dll
C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.465\tools\Xamarin.Android.Common.Debugging.targets(611
,5): error XA0010: No available device. [C:\XXXXXXXXXXXX\Android\AndroidApp1\AndroidApp1.csproj]

ビルドに失敗しました。

C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.465\tools\Xamarin.Android.Common.Debugging.targets(611
,5): error XA0010: No available device. [C:\XXXXXXXXXXXX\Android\AndroidApp1\AndroidApp1.csproj]
    0 個の警告
    1 エラー

経過時間 00:00:02.99

動きません。別の方法をとります。

■ adb でインストール

まずはビルドした結果の apk ファイルを探します。

> ls .\bin\Debug\net6.0-android\


    ディレクトリ: C:\XXXXXXXXXXXX\Android\AndroidApp1\bin\Debug\net6.0-android


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/10/19      2:05           5632 AndroidApp1.dll
-a----        2022/10/19      2:05          11772 AndroidApp1.pdb
-a----        2022/10/19      2:05           1011 AndroidApp1.runtimeconfig.json
-a----        2022/10/19      2:05            136 AndroidApp1.xml
-a----        2022/10/19      2:06        9425880 com.companyname.AndroidApp1-Signed.apk
-a----        2022/10/19      2:05        9413369 com.companyname.AndroidApp1.apk

ありました。

次に adb でインストールするデバイスを確認します。今回はエミュレータです。
adb は Visual Studio の ツール > Android > Android Adb コマンド プロンプト... で使えます。

>adb devices
List of devices attached
emulator-5554   device

エミュレータ一つが見つかりました。このエミュレータにインストールします。
※次の手順ではうまくいきませんでした。どうもデバイスを指定しない (-s オプションを使わない) 場合はうまくいきそうです。

>adb -s emulator-5554 install "C:\XXXXXXXXXXXX\Android\AndroidApp1\bin\Debug\net6.0-android\com.companyname.AndroidApp1-Signed.apk"
Performing Streamed Install
Success

インストールできました。

アイコンタップで起動します。

アプリが実行されました。しかし、一瞬でアプリが落ちてしまいます。画面中央も真っ白です。

きちんと起動すれば次の画面になるはずです。

成功するインストールコマンドはこちら。-s オプションのデバイス指定をしていません。なぜデバイス指定するとうまくいかないのかは、ちょっと分かっていません......。

>adb install "C:\Sample\Android\AndroidApp1\bin\Debug\net6.0-android\com.companyname.AndroidApp1-Signed.apk"
Performing Streamed Install
Success

■ デバイス指定について

デバイス指定をせずにインストールできるのは、デバイスが一つしかつながっていない場合です。例えば二つつながっていると次のようにエラーになります。

>adb devices
List of devices attached
127.0.0.1:58526 device
emulator-5554   device

>adb install "C:\XXXXXXXXXXXX\Android\AndroidApp1\bin\Debug\net6.0-android\com.companyname.AndroidApp1-Signed.apk"
adb.exe: more than one device/emulator

そんなときはデバイスはコマンドから接続を切れるので、一つを残して切断してしまいましょう。

>adb disconnect 127.0.0.1:58526
disconnected 127.0.0.1:58526

■ 簡単ですね

簡単ですね。