unagirabbit's blog

気づいたことをメモしています

【Jenkins】シングルクォート変数展開

シングルクォートは通常だと変数展開できないが、
withEnvでを使うことで環境変数として定義することができる。
外部プログラムや秘密テキスト類を使うときに利用する。

withEnvを利用する

www.jenkins.io

withEnv(["hoge=${params.BRANCH}", "fuga=user/home/fuga"]) {
    sh 'echo $hoge $fuga'
}

{name}={value}の形式で指定し、複数指定することが可能です。
Credentialsのテキストをダブルクォートで展開しようとすると以下の警告が表示されます。

The following steps that have been detected may have insecure interpolation of sensitive variables (click here for an explanation):

そういう際にwithEnvを使うようにしましょう。

pipeline {
    agent any
    parameters {
        string defaultValue: 'develop', name: 'BRANCH'
    }
    stages {
        stage("hoge") {
            steps {
                withCredentials([usernamePassword(credentialsId: "my_account", usernameVariable: 'ID', passwordVariable: 'PW')]) {
                    withEnv(["_branch=${params.BRANCH}"]) {
                        sh 'hoge.sh $_branch $ID $PW'
                    }
                }
            }
        }
    }
}

www.jenkins.io

【Jenkins】Pipelineの[Lightweight checkout]が機能しないブランチ指定

要約

refs/heads/ブランチ名で指定しましょう。

なぜなのか

Lightweight checkoutskipDefaultCheckoutをONにしているのにスクリプトがcloneされて困りました。 調べるとこちらのIssuesで同じような事例があがっておりました。

issues.jenkins.io

記載通りにデフォルトのブランチを指定すると問題なく動作しました。
また、refs/heads/ブランチ名でも同様です。
そもそもブランチ名の指定はrefs/heads/*が推奨されていました。
git-plugin Documentation
以上、説明はちゃんと読みましょうでした。

UnityでAndroid App Bundleが150MBを超えた時の対応

2021年8月より、Google Playでの新規アプリの公開はAndroid App Bundleで行う必要があります。
新規アプリのサイズが 150 MB を超える場合は、
Play Asset Delivery または Play Feature Delivery のいずれかを使用する必要があります。

developer.android.com

apkならobbで楽に行えるのですがaabはobbが使えないのでそう簡単にはいきません。
未対応で150MB超えていると、PlayConsoleアップ時に以下のエラーとなります。

App Bundle に含まれている設定(ARM64_V8A)で、初期インストールのサイズは 150 MB 以下である必要があります。

developer.android.com

Play Asset Deliveryを利用することで、アプリ内包(BuiltIn)しているAssetBundleをAsset Packとして扱うようにします。
そのAssetBundleはサイズから除外してくれるので150MBを超えててもOKになります。
StreamingAssetsにおいてたものをAssetPackに移動させるイメージです。
このために実装を切り分けないといけないのは辛い所です。

非対応な構成

公式だと現時点ではAddressablesは非対応です。
対応されている方もいらっしゃるので以下参考にどうぞ。
Android App Bundle with Addressable #14

また、Gradleプロジェクトを出力してのビルドも非対応です。
Build app bundle in android studio with asset packs of Unity project #31
その場合はJavaネイティブアプリとして対応すれば可能なのか?
https://developer.android.com/guide/app-bundle/asset-delivery/build-native-java?hl=ja

環境

Unity: 2019.4.21f1
Android: Pixel 4a(11)

Google Play Asset Delivery: 1.3.0
Google Play Common: 1.3.0
Google Play Core: 1.3.0
Google Android App Bundle: 1.3.0

対応

公式ドキュメントはこちらです。
読み進めれば問題なく対応できました。
https://developer.android.com/guide/app-bundle/asset-delivery?hl=ja

プラグインをインストールする

unitypackageでインポートすることもできますが、管理しやすいUPMでインストールします。
Packages/manifest.jsonGoogleレジストリを追加します。

"scopedRegistries": [
    {
      "name": "Game Package Registry by Google",
      "url": "https://unityregistry-pa.googleapis.com",
      "scopes": [
        "com.google"
      ]
    }
  ]

Unityが2018の方は利用できないので以下からpackageを入手しましょう。
https://github.com/google/play-unity-plugins

必要なパッケージは以下です。
Google Play Asset Delivery
Google Play Common
Google Play Core
Google Android App Bundle

AssetBundleをAssetPackに含めるよう設定する

UIでの設定もできますが使いづらいのでスクリプトで行います。
UIからだとAssetBundleManifestがないとエラーになります。
依存が関係ないようなAssetBundleであればスクリプトで設定しましょう。
異なるAssetPackに同じファイルが存在するとビルドエラーになります。

今回はBuiltInなアセットなのでDelivery ModeはすべてInstall Timeにします。

using Google.Android.AppBundle.Editor;
using Google.Android.AppBundle.Editor.AssetPacks;

private static void AssetDeliverySettings()
{
    var assetPackConfig = new AssetPackConfig();
    // AssetBundle以外のものをAssetPackに含めたい場合はこちら
    // ひとつのAssetPackに指定フォルダ以下にあるファイル全てを含めます
    assetPackConfig.AddAssetsFolder("{AssetPack名}", "{対象フォルダ相対パス}", AssetPackDeliveryMode.InstallTime);

    // AssetBundleを個別に追加する場合はこちら
    // AssetPack名=AssetBundle名になる
    assetPackConfig.AddAssetBundle("{AssetBundle相対パス}", AssetPackDeliveryMode.InstallTime);

    // 設定を保存
    AssetPackConfigSerializer.SaveConfig(assetPackConfig);
}

設定ファイルはLibrary/PlayAssetPackConfig.jsonに保存されます。

AssetPackからロードするように実装する

AssetPackとAssetBundleを指定してAssetBundleを取得し、Assetをロードします。
AssetPack名を設定した場合はpackとbundleの両方名が必要です。

// AssetPack名とAssetBundle名が同じ場合はAssetPack指定を省略できる
private void LoadAsset1(string assetBundleName, string fileName)
{
  var bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(assetBundleName);
  bundleRequest.Completed += request => {
      if(request.Status == AssetDeliveryStatus.Loaded ||
      request.Status == AssetDeliveryStatus.Available) {
          var prefab = request.AssetBundle.LoadAsset<GameObject>(fileName);
          Instantiate(prefab);
      }
  };
}
// 異なる場合は別途指定
private void LoadAsset2(string assetPackName, string assetBundlePath, string fileName)
{
  var packRequest = PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName);
  packRequest.Completed += request => {
      if(request.Status == AssetDeliveryStatus.Loaded ||
      request.Status == AssetDeliveryStatus.Available) {
          var bundleCreateRequest = packRequest.LoadAssetBundleAsync(assetBundlePath);
          bundleCreateRequest.completed += _ => {
              var prefab = bundleCreateRequest.assetBundle.LoadAsset<GameObject>(fileName);
              Instantiate(prefab);
          };
      };
  };
}

Android App Bundleをビルドする

設定をロードしてaabをビルドします。
Unityのメニューから[Google]->[Build Android App Bundle...]でビルドできます。
aabが150MBを超える場合は警告が表示されます。
[PlayerSettings]->[Warm about App Bundle size]で非表示にできます。

スクリプトで行う場合はこちら。

private static void BuildAndroidAppBundle()
{
    var assetPackConfig = AssetPackConfigSerializer.LoadConfig();
    // 良しなに設定する
    var options = new BuildPlayerOptions(){
        locationPathName = "application.aab",
        target = BuildTarget.Android,
        targetGroup = BuildTargetGroup.Android
    };
    Bundletool.BuildBundle(options, assetPackConfig);
}

動作確認する

端末を繋いでいれば、Unityのメニューから[Google]->[Build and Run]でaabのビルドとAssetPackのインストールが行えます。
ビルドしたaabをコマンドラインからインストールするにはこちらからどうぞ。
developer.android.com

参考ページ

deep-verdure.hatenablog.com

github.com

github.com

Mac x Unity x VScodeでデバッグ

新しいPCで環境構築した時にUnityへAttachできなかったのでメモ。
Mono Developのバージョンが良くなかった。

環境

Mac: Catalina 10.15.6
VSCode: 1.49.0
Unity: 2019.4.5f1

必要なもの

手順

Unityはとくに何もする必要ありません。

Debugger for UnityをVSCodeにインストール

marketplace.visualstudio.com

.Net Coreをインストール

dotnet.microsoft.com

Mono Developeをインストール

www.mono-project.com previewではなくstableを使うのが良いです。
現時点でpreview6.12.xはAttachできませんでした。

UnityへのAttach

VSCodeの[実行]からlaunch.jsonを作成する。
(ない状態で[Unity Attach Debuger]してもコマンドがないと怒られる)
再生ボタンを押下して終わり。

Androidの共有機能で特定アプリだけに共有する

ゲーム内で撮ったSSを、特定SNS以外に投稿したかったメモです。
C#(Unity)だけだと厳しく、事例みてもうまくいかなかったのでまとめました。

共有はAndroid Sharesheetを使います。
developer.android.com 除外の必要がなければShareCompatを使うのが楽です。
ShareCompatは中でIntent.createChooserをラップしているだけです)

環境

Android Studio: 4.0.1
Android: 4.4.1、9
Compile SDK: 30
Build Tools: 30.0.1

実装

プラグインを作成する

こちらを参考に特定Activityは除外するようにします。
ただしAPI.24前は除外ではなく、表示するアプリを制限するようにします。
yuki312.blogspot.com

除外を判定する部分はやりたいことに合わせて実装してください。

android share post excluded

プラグイン化(aar)はこちらを参考にしました。
sites.google.com

FileProviderの実装についてはこちらを参考にしました。
developer.android.com

Unity 2018/2019 AndroidXに移行する

Unity 2018/2019でAndroidXへの移行メモです。

2019.3.7からgradle.propertiesbuild.gradleGUIで選択できる。

AndroidStudioでAndroidXへの移行を自動的にやってくれるそうですが、
No Usages Found in the Projectとエラーになりました。

developer.android.com

環境

Unity: 2018.4.29f1、2019.4.5f1

テンプレートに書き加える

2019.4なら[Player Settings] -> [Publishing Settings] -> [Build]で
カスタムしたいファイルにチェックを入れるとAssets/Plugins/Androidにテンプレートが生成されます。
今回はCustom Main Gradle TemplateCustom Gradle Properties Templateをカスタムします。

2018.4はCustom Gradle Properties TemplateがないのでAssets/Plugins/AndroidgradleTemplate.propertiesを自作する。

Custom Main Gradle Template

dependenciesandroidx.coreを追加します。
利用するバージョンは必要に応じて変更してください。

developer.android.com

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.core:core:1.3.1' // add
**DEPS**}

Custom Gradle Properties Template

プロパティを2つ追加します。

android.useAndroidX=true // add
android.enableJetifier=true // add

実装時の注意点

MinifyがProguardだとAndroidJavaClassでクラスが見つからないエラーになる。
サポートライブラリは除外するようにしておきましょう。

monry.hatenablog.com

参考

developer.android.com

docs.unity3d.com

Ad-hocのProvisioningProfileではTestFlightが使えない?

久しぶりにTestFlightでAd-hocのアプリを配布しようとしたら詰まったメモ
いつの間にかTestFlightはApp-storeのProfileじゃないと使えなくなってる?

環境

Xcode 11.2.1
Build Version 11B500

調査

Ad-hocのProfileを使い、
XcodeのOrganizerで作成したipaではとくに警告が表示されませんでしたが、
xcodebuildでexportしたipaではValidateで以下の警告が表示されます。

WARNING ITMS-90191: "Missing beta entitlement.
Your app does not include the beta-reports-active entitlement.
If you intend to distribute this build via TestFlight for beta testing,
please re-build this app with an App Store Distribution provisioning profile.
Do not use ad-hoc profiles."

どちらのアプリをアップロードしても、ステータスが[処理中]から変化ありません。
半年ほど前はAd-hocでもTestFlightが使えたと思うのですが、何か変わったのでしょうか?

このipaを再署名でbeta-reports-active = 1に書き換えると以下のエラーになります。
※exportOptionsでbeta-reports-activeを設定しても効果ありません。

ERROR ITMS-90163: "Invalid Code Signing Entitlements.
The entitlements in your app bundle signature do not match the
ones that are contained in the provisioning profile.
The bundle contains a key that is not included in the
 provisioning profile: 'beta-reports-active' in 'Payload/hoge.app/hoge'."

再署名についてはこちら
https://shashikantjagtap.net/ios-code-signing-4-provisioning-profiles/shashikantjagtap.net

Entitlementsについてはこちら Apple Developer Documentation - Entitlements
Entitlements | Apple Developer Documentation

App-storeのProfileでexportしたアプリは問題なくテスト可能な状態になりました。
AppStoreConnectから配信だからApp-storeのProfileじゃないとダメという事なのでしょうか。