質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

92.00%

  • Xamarin

    196questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Xamarin.AndroidのBeforeBuildの実行タイミングについて

解決済

回答 1

投稿 2016/12/05 13:37

  • 評価
  • クリップ 0
  • VIEW 296
退会済みユーザー

退会済みユーザー

Xamarin.Android用のプロジェクトを自動生成して使っています。

Nativeライブラリを含むプロジェクトは、以下URLを参考にして

http://qiita.com/hIDDEN_xv/items/177ac7ba756afde6ddfe#%EF%BC%94%E3%83%93%E3%83%AB%E3%83%89%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B

<Target Name="BeforeBuild">
  <Exec WorkingDirectory="jni" Command="$(AndroidNdkDirectory)\ndk-build" />
</Target>

を追加しています。

プロジェクトファイルではNativeライブラリはパス及びファイル名は記述されていますが、実体(libs\arm64-v8a\libopenjpeg-dotnet.soなど)が存在しない状態です。

この時に、Xamarin Studioからすべてビルドを実行すると以下のようなエラーが出てビルドできません。
BeforeBuildによってNativeライブラリがコンパイルされ、所定の位置にインストールされ、ビルドが通ることを期待しています。

エラー抜粋

ターゲット _CreateNativeLibraryArchive:
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018: "CreateNativeLibraryArchive" タスクが予期せずに失敗しました。\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018: System.IO.DirectoryNotFoundException: パス 'libs\arm64-v8a\libopenjpeg-dotnet.so' の一部が見つかりませんでした。\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 Xamarin.Android.Tools.Files.CopyIfChanged(String source, String destination)\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 Xamarin.Android.Tasks.CreateNativeLibraryArchive.Execute()\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()\r
    C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1149,5): error MSB4018:    場所 Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
プロジェクト "OpenMetaverse.Android.csproj" 内のターゲット "_CreateNativeLibraryArchive" のビルドが終了しました -- 失敗。

プロジェクト "OpenMetaverse.Android.csproj" のビルドが終了しました -- 失敗。

実体が存在しない事によるエラーと考え、
回避策として、ビルドする前に一度ndk-buildをすると、実体が存在するため、以下のように

ターゲット _SetupApplicationJavaClass:
    Application Java class: android.app.Application
ターゲット BeforeBuild:
    C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r11c\ndk-build
    [armeabi] Install        : libopenjpeg-dotnet.so => libs/armeabi/libopenjpeg-dotnet.so
    [armeabi-v7a] Install        : libopenjpeg-dotnet.so => libs/armeabi-v7a/libopenjpeg-dotnet.so
    [arm64-v8a] Install        : libopenjpeg-dotnet.so => libs/arm64-v8a/libopenjpeg-dotnet.so
    [x86] Install        : libopenjpeg-dotnet.so => libs/x86/libopenjpeg-dotnet.so
    [x86_64 Install        : libopenjpeg-dotnet.so => libs/x86_64/libopenjpeg-dotnet.so
ターゲット ResolveProjectReferences:

インストールされ、ビルドも完了します。


質問:
BeforeBuildより前に、_CreateNativeLibraryArchiveがあり、Nativeライブラリが何かされている(zipとしてアーカイブされるところまではわかりました。)ということは、BeforeBuildにおいて、コンパイルされ、所定の位置にインストールされたものは、そのビルド時の生成物に含まれないということなのでしょうか?

もし、そうなら<Target Name="BeforeBuild">を追加せずに運用しようと思っておりますが、挙動がよくわからないので質問させていただきました。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問に回答があった場合に通知・メールを受け取ることができます。

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

MSBuildの一般的な知識として読んでいただければと思いますが、BeforeBuild/AfterBuildは実行順序を保証しない、外部からのターゲット実行の追加方法として利用できる機能なので、BeforeBuildで自分の手元で指定したターゲットよりXamarinのビルドタスクが先に実行される可能性があることは、否定できません。詳しくはコチラ:
http://sedodream.com/2013/02/12/MSBuildDependsOnTargetsVersusBeforeTargetsAfterTargets.aspx

ビルドターゲットの実行順序を保証できるやり方としては、BuildDependsOnなどの既定のMSBuildプロパティ(変数)を拡張して、自分のタスクを滑りこませるやり方です:

<PropertyGroup>
<BuildDependsOn>MyTargets;$(BuildDependsOn)</BuildDependsOn>
</PropertyGroup>

BuildDependsOnはだいぶ粒度の粗いレベルでの実行順序指定プロパティなので、場合によってはもっと細かいプロパティを探す必要があるかもしれません。基本的に、Xamarin.Android.Common.targets では、プロパティ名が '_' で始まっているものは第三者がタスク追加可能なものとみなしても良いので(Xamarin.Android.Binding.targetsはそうでもない)、どんなプロパティが拡張可能かはtargetsファイルを追っかけてもらえればと思います。

投稿 2016/12/05 16:40

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/12/05 17:05

    回答ありがとうございます!
    期待しない結果が得られる理由がわかりました。
    MSBuildについて詳しく見ていきながら、Xamarin.Android.Common.targetsの中身をのぞき、どのように対処するのか考えたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

92.00%

関連した質問

同じタグがついた質問を見る

  • Xamarin

    196questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

閲覧数の多いXamarinの質問