C-LIS CO., LTD.
自己紹介
Android Studio本
3
2014年11月21日発売
技術評論社刊
Android Studio 0.8.6
http://amzn.to/1HYRp32
4
5
改訂版が出ます(2016年1月上旬)
改訂版の原稿を送ったのが11月16日
7
11月20日
8
Android Studio 1.5 Release
サンプルコードのプロジェクトを

Android 1.5用に調整したのが11月23日
11月24日
10
Android Studio 2.0 Preview
著者校正を終えたのが
12月7日
12
2016年 1月 48日発売
技術評論社刊
Android Studio 1.5
13
著者校正中の出来事
15
16
17
18
わかったこと
19
• Android Developersは、日本語版のサイトと英語版のサイトで配布
しているバイナリが違う
• 英語版のサイトでは 1.5 を、日本語版では1.4を配布している
• 英語のURLにアクセスしても、下部の「言語設定」で日本語を選択し
ていればサイト側が日本語サイトに自動的にリダイレクトする(コン
トロール不能)
続く!
Android Studio開発講座
2015/12/12
日本Androidの会 香川支部
今日のお題
22
Android Studioは、2013年に発表された
Androidアプリ向けの新しい開発環境
IntelliJ IDEAのCommunity Editionをベー
スに開発されている
Googleは、ADT(Android Developer
Tools)について、2015年末で開発サポート
を停止することをアナウンスしている
Android Studioの便利なところを紹介するよ!
エラーの訂正
23
エラーに飛ぶ(Jump to Next Error)
F2
Option + return
修正候補を選択する
(Show the list of available intention actions.)
Alt + return
Shift + F2
文字列リソースの作成
24
Option + return
Alt + return
レイアウトの作成
25
Option + return
Alt + return
Code Generation
Command + N
Alt + insert
26
public static class PlaceholderFragment extends Fragment {



private boolean mClickFlag;

Code Generationの憂鬱
27
public static class PlaceholderFragment extends Fragment {



private boolean mClickFlag;



public boolean ismClickFlag() {

return mClickFlag;

}

Code Generationの憂鬱
28
Naming Prefixの設定
29
[Preferences] → [Editor] → [Code Style]
→ [Java] → [Code Generation] → [Naming]
public static class PlaceholderFragment extends Fragment {



private boolean mClickFlag;



public boolean isClickFlag() {

return mClickFlag;

}

Field Prefixの設定
30
ライブラリの追加
31
apply plugin: 'com.android.application'



android {
…

}



dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

testCompile 'junit:junit:4.12'

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.jakewharton:butterknife:7.0.1'


}

app/build.gradle
Android Studioのライブラリは、Maven CentralやjCenterなどから追加
する(libsディレクトリに追加することもできる)
リファクタリング
インラインの記述をローカル変数に移動
33
Command + Option + V
Control + Alt + V
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

new PlaceholderFragment(), "main")

.commit();

}

変数をフィールドに移動
34
Command + Option + F
Control + Alt + F
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



Fragment fragment = new PlaceholderFragment();

getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

fragment, "main")

.commit();

}

変数をフィールドに移動
35
private Fragment fragment;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



fragment = new PlaceholderFragment();

getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

fragment, "main")

.commit();

}

処理をメソッドへ切り出す
36
Command + Option + M
Control + Alt + M
private void initializa() {

placeholderFragment = new PlaceholderFragment();

getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

placeholderFragment, "main")

.commit();

}

変数・メソッド・クラス名を変更
37
Shift + F6
Shift + F6
private void initialize() {

placeholderFragment = new PlaceholderFragment();

getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

placeholderFragment, "main")

.commit();

}

変数・メソッド・クラス名を変更
38
Shift + F6
Shift + F6
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



Fragment fragment = new PlaceholderFragment();

getSupportFragmentManager()

.beginTransaction()

.add(android.R.id.content,

fragment, "main")

.commit();

}

ユニットテスト(JUnit4)
android {

…


defaultConfig {

applicationId "io.keiji.tryandroidstudio"

minSdkVersion 15

targetSdkVersion 23

versionCode 1

versionName "1.0"



testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
…

}



dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs')

testCompile 'junit:junit:4.12'

compile 'com.android.support:appcompat-v7:23.1.1'

compile 'com.jakewharton:butterknife:7.0.1'



androidTestCompile 'com.android.support:support-annotations:23.1.1'

androidTestCompile 'com.android.support.test:runner:0.3'

}

build.gradleの編集
40
ユニットテストの置き場所
41
Userクラス
public class User {



private long id;



private String name;



private boolean isMegane;

// setter, getter省略
}
42
UserTestクラス
import android.support.test.runner.AndroidJUnit4;



import org.junit.Assert;

import org.junit.Test;

import org.junit.runner.RunWith;



@RunWith(AndroidJUnit4.class)

public class UserTest {



@Test

public void 眼鏡をかけている() throws Exception {

User user = new User();

Assert.assertTrue(user.isMegane());

}

}

43
テストを実行
io.keiji.tryandroidstudio.UserTest > 眼鏡をかけている
[Nexus_5_API_18(AVD) - 4.3.1] [31mFAILED [0m
java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:86)
:app:connectedDebugAndroidTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task
':app:connectedDebugAndroidTest'.
> There were failing tests. See the report at:
file:///Users/keiji_ariyama/Desktop/
TryAndroidStudio/app/build/reports/androidTests/
connected/index.html
44
package io.keiji.tryandroidstudio;



import android.support.test.runner.AndroidJUnit4;



import org.junit.Assert;

import org.junit.Test;

import org.junit.runner.RunWith;



@RunWith(AndroidJUnit4.class)

public class UserTest {



@Test

public void 眼鏡をかけている() throws Exception {

User user = new User();

Assert.assertTrue(user.isMegane());

}

}

Androidに依存したテスト?
45
ユニットテスト(JVM)の置き場所
46
import android.support.test.runner.AndroidJUnit4;



import org.junit.Assert;

import org.junit.Test;

import org.junit.runner.RunWith;



@RunWith(AndroidJUnit4.class)

public class UserTest {



@Test

public void 眼鏡をかけている() throws Exception {

User user = new User();

Assert.assertTrue(user.isMegane());

}

}

UserTestクラス
47
テストを実行
:app:testDebugUnitTest
io.keiji.tryandroidstudio.UserTest > 眼鏡をかけている
FAILED
java.lang.AssertionError at UserTest.java:11
2 tests completed, 1 failed
:app:testDebugUnitTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:testDebugUnitTest'.
> There were failing tests. See the report at:
file:///Users/keiji_ariyama/Desktop/
TryAndroidStudio/app/build/reports/tests/debug/
index.html
* Try:
Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log
output.
BUILD FAILED
Total time: 2.389 secs
C-LIS CO., LTD.
各製品名・ブランド名、会社名などは、一般に各社の商標または登録商標です。
本資料中では、©、®、™を割愛しています。
本資料は、有限会社シーリスの著作物であり、
クリエイティブコモンズの表示-非営利-継承 3.0 Unported ライセンスの元で公開しています。
寄せられた質問
Android Studioで
フリーザより強いという人造人間は倒せま
すか?
51
倒せるか倒せないかというより、悟空(ADT)は

死んだので、これからはAndroid Studioが頑張る
しかありません。
今日一番の豆知識
52
"人造人間編では連載中に試行錯誤が見られた。当初は19号と20号のみを登
場させる予定だったが、すでに担当編集を外れていた鳥嶋和彦が鳥山の家に
電話をかけてきて「やっと敵が出てきたとおもったらジジイとデブじゃない
ですか」と文句を言われ、仕方なく17号と18号をデザイン。しかし、鳥嶋
が再び家に電話をかけてきて「なんだ今度はガキですか」と再び文句を言わ
れ、当初は登場する予定すらなかったセルが登場することになった。"
Wikipedia 人造人間(ドラゴンボール)
https://ja.wikipedia.org/wiki/%E4%BA%BA%E9%80%A0%E4%BA%BA
%E9%96%93_(%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%83%9C%E3%83%BC
%E3%83%AB)
AndroidからMySQLのDBサーバーにアク
セスしたいのですが、実際の方法セキュリ
ティなどで注意することなどあれば
53
AndroidからMySQLのDBサーバーにアクセスする
と何が起こるかわからないので、めんどうでもAPI
を設計・実装した方がいいです。
Gradle で apk を暗号化するコマンドライ
ンから実行できる自前のビルドタスクを作っ
たのですが、それを Android Studio から
実行したり、 Android Studio のビルド時
に自動で実行できるようになりませんでしょ
うか?
54
task samplePreprocess << {

println("この処理を先にする");

}



assembleDebug.dependsOn(samplePreprocess)
build.gradle - dependOn
既存のプロジェクトを
インポートする際のポイントについて
56
http://techbooster.github.io/c89/
Copyright TechBooster
58
ADT - Android Studio
完全移行マニュアル(仮題)
• ADT - Android Studioへの移行
• Gradle 101

Android Studio開発講座