CUIでのapk作成 〜 Unityからビルド編

#はじめに
今回はUnityからのビルドをメインにまとめます。
ビルドに使うLinuxは諸事情からawsでなくsakura :cherry_blossom: のVPSです。

#環境
 - Unityをインストールした端末
 - Android ProjectからapkにビルドするLinux


Android SDKもしくはADTが設定済みである必要があります。
下記を参考にしてください。

:link: CUIでのapk作成 ~ 環境設定編
http://qiita.com/nofrmm/items/d54f4b095026de98bc88

:link: Get the Android SDK
http://developer.android.com/sdk/index.html

##UnityにSDKのパスを未設定の場合
keystore作成やプロジェクトファイルのExport時に設定するようアラートが出ました。

意識して設定する場合は下記の通り設定してください

Unity から Unity > Preferences を選びます
![スクリーンショット 2014-07-14 7.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8ddb0b30-f4b9-d3fe-ddf3-030b849e1ad4.png)


![スクリーンショット 2014-07-14 7.05.48.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8e6bd895-e79b-7cbd-7ba8-b0ec9abaea63.png)


#ビルド対象のプロジェクトファイル
確認したのは下記の方法です。

- androidコマンドで作成
- Eclipseで作成
- Unityで作成

今回はUnityからのAndroidアプリビルドを扱います。

#Unityからプロジェクトファイルを作成
##フロー
- Unityでkeystoreを作る
- UnityからAndroid用にプロジェクトファイルを書き出し
- Linuxサーバでビルド用に変換
- release用apkを作成

##Unityでkeystoreを作成

![スクリーンショット 2014-07-13 20.20.16.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e66256e2-324b-dc6c-7156-6cab255b8d9a.png)

keystore password 、Confirm keystore passwordを入れて :arrow_up: 
Browse Keystoreボタンを押します :arrow_down: 

![browseKeystoreをおす.gif](https://qiita-image-store.s3.amazonaws.com/0/12362/23fcfd52-b95d-ce6a-85dd-811c198d105e.gif)

keystoreをファイルとして保存
![スクリーンショット 2014-07-13 20.56.39.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a776aedb-f967-10ba-4a8d-b64ff0860d85.png)

Aliasから Create a new key を選択
![スクリーンショット 2014-07-13 21.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ee30c96a-34a8-32ef-e359-22dcabf9c611.png)

いろいろ設定したらCreate Keyボタンを押します。※設定値はものすごく適当
![スクリーンショット 2014-07-13 20.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/12362/c2ed9291-9807-66fe-e937-a9183a774019.png)

Aliasが増えました
![aliasができた.gif](https://qiita-image-store.s3.amazonaws.com/0/12362/9f49e983-153d-76a5-61d6-a2cf8cee3e9e.gif)

keystore作成完了

##Android用にプロジェクトファイルを書き出し

Unity から File > Build Settings を選びます
![スクリーンショット 2014-07-13 19.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/12362/09ccd16f-f8fb-b5ed-b784-a7ad37867efa.png)

Google Android Projectを選びます
![スクリーンショット 2014-07-13 19.58.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/fe762984-22fa-ab23-326e-b727f2160c70.png)

Exportするフォルダを選びます
![スクリーンショット 2014-07-14 7.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/12362/daecd8be-016f-ac2e-530d-c25a3c73dbd1.png)

できました
![スクリーンショット 2014-07-14 7.15.47.png](https://qiita-image-store.s3.amazonaws.com/0/12362/1f9b81e5-e975-c3e1-9c03-8968e1e912e9.png)

前準備がながい・・・

#Android Projectをビルド
release版で作成しています。

##プロジェクトファイルのコンバート
AndroidSDKのandroidコマンドを使います。

コマンドの使い方については
> android --help

で確認してください

**参考**
http://qiita.com/nofrmm/items/d54f4b095026de98bc88#2-10

フォルダ名(New Unity Project 4)が適当だったので分かりにくいですが
> $ android update project -p [Android Projectディレクトリ]

例
> $ android update project -p ./New\ Unity\ Project\ 4/

結果の一例です。
>$ android update project -p ./New\ Unity\ Project\ 4/
Updated local.properties
No project name specified, using Activity name 'QCARPlayerNativeActivity'.
If you wish to change it, edit the first line of build.xml.
Added file ./New Unity Project 4/build.xml
Added file ./New Unity Project 4/proguard-project.txt

build.xmlとproguard-project.txtが追加されています。
※ ant.propertiesは後ほど用意します。

#AntでAPKの作成
ant.propertiesがなかったので、新規でProjectファイルを作成してそこから持ってきます。

> $ android create project -t 1 -k [パッケージ名] -p [プロジェクト名] -a [Activity名]

これをコンバートしたAndroidプロジェクトのフォルダの直下に置きます。

![スクリーンショット 2014-07-14 8.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/12362/39e97d38-6690-0617-1e2c-919b2c68f241.png)

##Antの設定

keystoreの置き場所とAlias名を指定します。

```properties:ant.properties
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

key.store=../../keystore/user.keystore
key.alias=testtest
```
このままだと実行時にパスワードを求められます。
それがいや
build.xmlを参考に追加します

###設定ファイルから

```xml:android-sdk-linux/tools/ant/build.xml
    <!-- properties for signing in release mode -->
    <condition property="has.keystore">
        <and>
            <isset property="key.store" />
            <length string="${key.store}" when="greater" length="0" />
            <isset property="key.alias" />
        </and>
    </condition>
    <condition property="has.password">
        <and>
            <isset property="has.keystore" />
            <isset property="key.store.password" />
            <isset property="key.alias.password" />
        </and>
    </condition>
```
より、パスワードのパラメータを追加します

```properties:ant.properties
（略）
key.store=../../keystore/user.keystore
key.alias=testtest
key.store.password=
key.alias.password=
```
これで実行中にパスワードを聞かれることはなくなります。

##Antでビルド
> $ ant release 

###エラーが続出したら

> /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

とか
足りないものは足す感じで設定しました。
※サーバを共有している他のユーザの環境設定には気をつけてください

**参考**
http://qiita.com/nofrmm/items/d54f4b095026de98bc88#3-4

#さいごに
はまりどころは後ほど追記します。

 - UnityからExport時に作成されたAndroidManifest.xmlとAndroidSDKの相違

とかもありました。

ファイルが足りない系は、SDKが64bitを考慮してくれていないところが原因であれば、時間が経てばGoogleで対処してくれると信じます。

開発機でのUnityでもADTはいらないし、SDKを意識する必要はあります。特にAndroid Managerを使うためだけにGUIに頼っているのであれば捨てて良し。

サーバを使う利点としては、作業マシンのリソース保全と
多数メンバーがいる場合は環境構築の無駄時間削減

デメリットも環境構築とUnityやAndroidでの仕様変更対応でしょうね。
CI環境構築が大変なのが想像できました。