【 Android アプリ開発 】環境構築 ～「Hello World！」を実行するまでの手順

#はじめに 
Androidのカメラアプリを作成することになったので、Androidを一から勉強してみた。
(※よって、本稿はAndroid初心者向けの記事になっている。)(2017/5/15[Mon]執筆)

#目次
1. Androidとは？  
 1-1. 開発環境  
 1-2. バージョンについて
2. Android初心者が「Hello World!」を実行するまで！  
 2-1. プロジェクトの新規作成
3. [参考] Hello World!に辿り着くまでのメモ


#Androidとは？
__Android__ は、Googleによってスマートフォンやタブレットなどの携帯情報端末を
主なターゲットとして開発されたプラットフォームである。[(Wikipedia抜粋)](https://ja.wikipedia.org/wiki/Android)
<font color="gray">→2016年現在、スマートフォン用のOSとして世界No.1のシェアを誇る。</font>

##開発環境
1. __アプリケーション開発用__  
```Android SDK(Software Development Kit)```  
2. __ランタイム[^1]__と__ライブラリの開発用__  
  ```Android NDK(Native Development Kit)```

####今回の開発環境
- OS __(Windows 10 Pro)__
- AndroidStudio __(v 2.3.1)__
- JDK __(v 1.8.0)__

##バージョンについて
歴代のコードネームのうち、1.5からは頭文字がバージョンの発表順にCからのアルファベット順で
始まる菓子の名前が付けられており、それぞれにbugdroidがコードネームの菓子に扮している。
ちなみに、```最新版は、Android 7.1 (Nougat)```。

#Android初心者が「Hello World!」を実行するまで！

Androidの開発を行うためには、事前に下記の準備をする必要があります。
<font color = "red">(※本稿は、開発環境の準備については割愛させていただきます。)</font>  

__1. <font color="SeaGreen">JDK[^2]をダウンロード・インストールする。</font>__
__2.   <font color="SeaGreen"> AndroidStudioをダウンロード・インストールする。</font>__
__3.   <font  color="SeaGreen"> 開発したプログラムを試すエミュレーター[^3]を追加する。</font>__

この記事では、AndroidStudioで新規プロジェクトを立ち上げ、
Hello Worldをエミュレーターを使って、表示するところまでの手順をまとめています。

##プロジェクトの新規作成 
####1.AndroidStudioを立ち上げ、<font color="red">__「Start a new Android project」__</font>をクリックします。

![image.png (29.2 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/80105cf6-3cf4-4a49-94d7-9c675e152c02.png)

####2.<font color="red">__「Application name」__</font>と<font color="red">__「Company domain」__</font>を入力します。

![image.png (41.3 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/1aab4743-3fdc-4580-a84b-db024df05972.png)

ここで入力する__「Application name」__は__アプリ名というより<font color="red">「プロジェクト名」__</font>と理解してください。
ランチャーなどのホーム画面などで表示されるアプリ名は、<font color="red">__「string.xml」__[^4]</font>にて設定することが可能です。

__「Company Domain」__に関してですが、こちらを入力すると、入力された内容に応じて自動で__Packege name__が記述されます。
><font color="black">__[Note] Javaクラスの一意性__</font>
Javaでは、作成したクラスが世界中で一意となるように名前をつける慣習があります。
その際、単なるクラス名では一意は実現できませんので、「パッケージ名 + クラス」(完全修飾子)で一意となるようにします。__その一番簡単な方法が、所有ドメインを逆順にしたものを起点とし、そこにプロジェクト名やサブシステム名などを加えてパッケージ名を決めることです。__[(→参考サイト)](https://codezine.jp/article/detail/9341)

入力が完了すると、__「Next」__ボタンをクリックします。

####3.開発するAndroidのバージョンを指定します。

![image.png (56.1 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/a413c18a-98e2-4efb-b2d7-51f107a0b317.png)

今回は、「Hello World」を実行するだけなので、最新バージョンの```API25: Android7.1.1 (Nougat)```を指定します。

><font color="black">__[Android] APIレベルとOSプラットフォーム__</font>
AndroidはOSのバージョンがたくさんあります。それに応じてAPIが新しく開発されたり、使い勝手の悪いAPIは非推奨にするなどしています。アプリを開発する際は、APIレベルでの細かな調整が必要になります。



|Platform|API Level|Code Name|
| --- | --- | --- |
|Android 1.0 |1|BASE|
|Android 1.1|2|BASE_1_1|
|Android 1.5|3|CUPCAKE|
|Android 1.6|4|DOUNUT|
|Android 2.0|5|ECLAIR|
|Android 2.0.1|6|ECLAIR_0_1|
|Android 2.1.x|7|ECLAIR_MR1|
|Android 2.2.x|8|FROYO|
|Android 2.3|9|GINGERBREAD|
|Android 2.3.1|9|GINGERBREAD|
|Android 2.3.2|9|GINGERBREAD|
|Android 2.3.3|10|GINGERBREAD_MR1|
|Android 2.3.4|10|GINGERBREAD_MR1|
|Android 3.0.x|11|HONEYCOMB|
|Android 3.1.x|12|HONEYCOMB_MR1|
|Android 3.2|13|HONEYCOMB_MR2
|Android 4.0|14|ICE_CREAM_SANDWICH
|Android 4.0.1|14|ICE_CREAM_SANDWICH
|Android 4.0.2|14|ICE_CREAM_SANDWICH
|Android 4.0.3|15|ICE_CREAM_SANDWICH_MR1
|Android 4.1.2|16|JELLY_BEAN
|Android 4.2.2|17|JELLY_BEAN_MR1
|Android 4.3.1|18|JELLY_BEAN_MR2
|Android 4.4.2|19|KITKAT
|Android 4.4W.2|20|[Android Wear]
|Android 5.0.1|21|Lollipop
|Android 5.1.1|22|Lollipop
|Android 6.0|23|Marshmallow
|Android 6.0.1|23|Marshmallow
|Android 7.0|24|Nougat
|Android 7.1.x|25|Nougat|

開発するアプリに応じたAPIレベルを選択し、__「Next」__ボタンをクリックします。

####4.必要なコンポーネントを自動的に読み込みます。
![image.png (72.7 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/1b0f2bdf-76eb-481f-9bef-9fd453650485.png)

必要なコンポーネントが自動的に読み込まれます。
読み込みが完了すると、__「Next」__ボタンをクリックします。

####5.開発するアプリに応じたActivityを設定します。
![image.png (57.6 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/e3a937b7-0d0c-4396-8626-42ef8a7003b5.png)

今回は、Hello World！を行うだけなので、<font color="red">__「Empty Activity」__</font>を選択し、__「Next」__ボタンをクリックします。

><font color="black">__Activityについて__</font>
Androidでは処理をJavaクラスに、画面構成をxmlファイルに記述します。
つまり、Javaクラスとxmlファイル(レイアウトファイル)のペアで一つの画面が作られていることになります。
↑このJavaクラスのことを「アクティビティ」といい、Activityクラス(または、その子クラス)を継承して作ります。

####6.作成されたフォルダ構成、ファイルを確認する。
![image.png (144.8 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/ef1bacd1-687e-4bd8-9723-62eeebfdf00c.png)

__[MainActivityファイルパス(.java)]__
 ```プロジェクト名``` > ```app``` > ```src``` > ```main``` > ```java``` > ```逆ドメイン+プロジェクト名``` > ```MainActivity```

__[レイアウトファイル(.xml)]__
 ```プロジェクト名``` > ```app``` > ```src``` > ```main``` > ```res``` > ```layout``` > ```activity_main.xml```

※5.で設定したアクティビティが上記2ファイルにあたる。

####7.activity_main.xmlファイルを書き換える。
![image.png (63.7 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/c2ca0eeb-751d-405e-8677-8a247ea09d15.png)
```activity_main.xml
<TextView
 android:text="Hello World" //変更前
 android:text="Hello World (Mr.xxx)" //変更後
 />
```

※右下のタブが「Text」になっているか確認する。

####8.エミュレーターを追加する。
AndroidStudioのツールバーに再生ボタン(画面下赤抜き部分)をクリックすると、
__「Select Deplyment Target」__ウィンドウが立ち上がるので、<font color="red">__「Create New Virtual Device」__</font>をクリックし、
新規エミュレーターを追加する。(本稿では、上記手順を割愛する。) 

![image.png (106.7 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/cfcafad4-bfe2-4a44-b817-301412935523.png)

既存のエミュレーターを使用して、実行してみる。

![image.png (25.1 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/403d8414-d4c8-4f17-904a-1240d6a7ef43.png)

__「OK」__ボタンをクリックすると、、。

![image.png (37.5 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/85cc94d3-0b7b-4bdb-a7de-66cd8dae811c.png)

なにやらエラーが出ているようだ。

><font color="black">[Troubleshoot]</font>
Intel HAXM is required to run this AVD.
VT-x is disabled in BIOS.  
Enable VT-x in your BIOS security settings (refer to documentation for your computer).

どうやらBIOS内のVT-xの設定が無効になっているようだ、、。
><font color="black">そもそも「VT-x」とは？</font>
CPU x86アーキテクチャの仮想化技術[^5]です。従来、OSはデバイスドライバやメモリ管理などハードウェアに自由にアクセスするために特権命令を使用します。しかし、仮想マシンのようにOSが複数あると特権命令がいくつも発生してしまうという不具合が生じます。VMM（仮想マシン・マネージャ）ではゲストOSの特典命令を監視し、特典命令をエミュレーションしますが、VT-xではこれらの処理を特別な動作モード（VMX rootとVMX non-root）で処理することが可能となります。

[VT-xのエラー解消方法について](http://kiyotatsu.com/android_vtx/)

上記サイトの手順を実行し、再度エミュレーターでアプリを実行してみる。

<font color="red">まだ、同じエラーが続くので、Intel HAXMが何なのか調べてみることに。</font>
>Intel Hardware Accelerated Execution Manager (Intel🄬 HAXM)
→Androidエミュレータを高速化するためのハードウェア支援環境

[ Intel🄬 HAXMダウンロードページ](https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager-end-user-license-agreement)

上記、ソフトをインストールし、再度AndroidStudioでRun 'app'を実行する。

![image.png (121.8 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/c8672f01-7ae5-4f0c-b6f8-8b0fb120ac1d.png)

エミュレータウィンドウが開き、エミュレータ上で作成したAndroidアプリの動作を確認することができます。

####というわけで、Hello World！成功です！

最後までお読みいただき、ありがとうございました。

以下、個人的に気になった点等まとめております、
もしよろしければご参考までにご覧ください。

#[参考] Hello World!に辿り着くまでのメモ
##様々なファイルをダウンロードするときに見かけるx64とx84について
なぜ、32bitがx86で、64bitはx64なのか？普通に考えたら32bitはx32になるはずだろうと、、
思いつつ、なぜそうなのかまで考えられていなかったので、この機会に調べてみることに。

>「x86」の86は、```現在の主流CPUの祖先にあたるインテル16bit CPU「8086」の下2桁```「86」です。
「8086」にはじまる```CPUのアーキテクチャ(基本設計)```を<font color="red">「x8086」</font>といいます。
Windowsは、x86アーキテクチャ[^6]のCPUの発展(高性能)とともに発展してきました。
x86(32bit)を64bitに拡張したのが、x64です。「x64」は、本来「x86-64」と表記されるべきなのですが、
「x64」と略記されることが多いです。

1. ```32bit``` -----> ```x86```
2. ```64bit ``` -----> ```x64```


##AndroidStudioについて
まず、```AndroidStudio```は、Googleが提供する
公式のAndroidアプリのIDE(Integrated Development Environment:統合開発環境)です。
ビルドシステムとして「Gradle」を採用。
>ビルドシステムといえば現在までにMakeやAnt,Mavenあたりがよく使われていたようである。
[「ビルドスクリプトの基本」より引用。](http://qiita.com/shoma2da/items/367d0682a1b8c91f5531)

###そもそも今までビルドを意識していなかった
<font color="tomato">__Build (ビルド)__</font>とは、```「アプリケーションやライブラリを出荷できる状態に構築すること」```である。
<font color="tomato">__Gradle (グレイドル)__</font>は、OSS(Open Source Software)の```ビルドツール```。

###Gradle(基本編)
Gradle(グレイドル)は、Androidに限らす様々なビルドができる<font color="red">__ビルドシステム__</font>です。
<font color="red">__Groovyというスクリプト言語__</font>を使ってビルドのカスタマイズができます。
Gradleのビルドスクリプトは、javaと極めて近い文法を持つ「Groovy」というスクリプト言語で記述できます。

→Groovyでは、Javaと同じように次のコードを実行できます。

```sample.gradle
public class Sample {
 public static void main (String[] args) {
  System.out.println("Hello");
 }
}
```

#AndroidStudioのファイル基本構成
![image.png (56.0 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/04/28/10862/dec56539-d5d4-43f1-b4dd-d5d9bfb58fb4.png)

主に「```Androidビュー```」と「```Projectビュー```」を使い分けて開発を行うようです。
__Androidビュー__ : 同じ種類のリソースをまとめて表示したもの。<font color="DeepPink">※実際のフォルダ構成とは異なります。</font>
__Projectビュー__ : 実際のフォルダ構成通りに表示される。


##1.まずは、AndroidManifest.xml を見るべし
まずプロジェクトを理解するにあたりマニフェストファイルを見るのが良いとのこと。
Manifest.xmlファイルにはアプリの__エントリポイント__(アプリを起動したとき最初に起動する画面)が記述されているため。
XML形式で記載されていますが、「intent-filter」に注目します。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kdl.video.walker.movie">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

上記のように、「<font color="Crimson">android.intent.action.MAIN</font>」、「<font color="Crimson">android.intent.category.LAUNCHER</font>」が設定されている
__<font color="red">「MainActivity」</font>__がエントリポイントになります。

このファイルでは、以下のような```アプリの様々な項目```を設定することができます。
1. <font color="DeepSkyBlue">アプリの名前</font>
2. <font color="DeepSkyBlue">アイコン</font>
3. <font color="DeepSkyBlue">動作するAndroidのバージョン</font>
4. <font color="DeepSkyBlue">アプリ起動時に実行するActivity(MainActivity)</font>
5. <font color="DeepSkyBlue">アプリが利用する機能(ex.インターネット、カメラ等)</font>

etc

[(以下省略..)](http://qiita.com/okuhiiro/items/4436e46e066ef655be3a)

[^1]: ランタイムとは、開発・実行の両方の機能を兼ね備えたソフトウェアから開発の機能を除き、実行の機能のみ取り出したプログラムのこと。

[^2]: JDK(Java Development Kit)とは、プログラミング言語のJavaでソフトウェアの開発を行うのに必要なソフトウェアを一つにまとめたパッケージ。(Javaの開発元であるOracle社が無償で配布しており、誰でも自由に入手・使用することができる。)

[^3]: コンピューターを含む機械装置の動作・昨日を模倣することをエミュレート(動詞)又はエミュレーション(名詞)といい、エミュレート/エミュレーションする装置、あるいはソフトウェアのことをエミュレータ(Emulator)という。

[^4]: Androidでは、文字列を```res/values/strings.xml```の中に定義します。 

[^5]: 1台の物理PC上に、複数の仮想的なPC (仮想マシン)をソフト的に構築する技術であり、サーバー等を中心に導入が進んでいます。

[^6]: アーキテクチャとは、コンピュータにおける(特にハードウェア)基本設計・設計思想などを意味する。