C-LIS CO., LTD.
Twitter : #abc2015s
自己紹介
2
大阪市のソフトウェア開発会社

"有限会社シーリス"の代表。
Androidアプリケーションの受託開発や、

Androidに関するコンサルティング業務の傍ら、
技術系月刊誌への記事執筆。
また、AOSP(Android Open Source Project)へ
コントリビュートをしています。
Android Studio とは
3
2013年5月
IntelliJ IDEAベース
単体ソフトとして配布
Android Developer Tools
4
2007年11月
Eclipseプラグイン
後に単体ソフトとして配布
Google I/O 2013
撮影: Shoya Tsukada
5
本を執筆することに
2014年11月21日発売
技術評論社刊
Android Studio 0.8.6
http://amzn.to/1HYRp32
6
Android Studioの変遷 ∼ 1.0
7
2013/05 : I/O Preview
2013/07 : 0.2.0
2013/09/16 : 0.2.9
2013/09/24 : 0.2.10
2013/10/18 : 0.3
2013/12/18 : 0.4
2014/03/06 : 0.5
2014/06/06 : 0.6
2014/06/27 : BETA
2014/07/13 : 0.8.2
2014/10/29 : 0.8.14
2014/10/31 : 0.9
2014/11/20 : RC1
2014/12/08 : 1.0 Release
8
9
10
11
http://blog.keiji.io/2014/12/c87.html
12
いろいろあって…
13
14
どうしてこうなった
http://techbooster.github.io/c88/
Copyright TechBooster
自己紹介
16
2015年 後半の目標

@keiji_ariyama
まじめになる
Android Studioの変遷 1.0 ∼
17
2014/12/08 : 1.0 Release
2015/01/15 : 1.1 Preview 1
2015/01/29 : 1.1 Beta
2015/02/11 : 1.1 RC1
2015/02/18 : 1.1 Release
2015/03/09 : 1.2 Preview 1
2015/04/02 : 1.2 Beta
2015/04/21 : 1.2 RC1
2015/04/30 : 1.2 Release
2015/05/30 : 1.3 Preview 1
2015/06/10 : 1.2.2 Release
2015/06/19 : 1.3 Beta
2015/07/17 : 1.3 RC3
2014/12/08 : 1.0 Release
2015/01/15 : 1.1 Preview 1
2015/01/29 : 1.1 Beta
2015/02/11 : 1.1 RC1
2015/02/18 : 1.1 Release
2015/03/09 : 1.2 Preview 1
2015/04/02 : 1.2 Beta
2015/04/21 : 1.2 RC1
2015/04/30 : 1.2 Release
2015/05/30 : 1.3 Preview 1
2015/06/10 : 1.2.2 Release
2015/06/19 : 1.3 Beta
2015/07/17 : 1.3 RC3
Android Studio 1.3 RC3
ADT
http://android-developers.blogspot.jp/2015/06/an-update-on-eclipse-android-developer.html
19
さようならADT
20
EclipseベースのADTの開発は、
2015年末で終了
Android Studio 3つの誤解
21
Android Studio 3つの誤解
•安定していない
•異なるバージョンで互換性がない
•開発途上である
22
安定していない
23
チェコJetBrains社が開発しているIntelliJ IDEAの
Community Editionがベースです
Android Studioは、登場から2年が経ち、

Release版は十分、安定しています
1.0リリース以降、StudioとAndroid Gradle Pluginの
互換性は保たれています
互換性を損なう場合6ヶ月以上、

可能であれば1年の非推奨期間が

設けられます
異なるバージョンで互換性がない
24
http://tools.android.com/tech-docs/new-build-system/version-compatibility
開発途上である
25
YES
Studioはオープンソースで開発が進んでいるので、
あなたは開発をさらに加速できます
うれしい!
Android Studioの魅力
26
コード補完
27
コード補完
28
Permission Check
29
Parcelable Generation
30
Parcelable Generation
protected WiFiApSetting(Parcel in) {

id = in.readLong();

ssid = in.readString();

security = in.readInt();

password = in.readString();

lastUsedDate = in.readLong();

}



@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeLong(id);

dest.writeString(ssid);

dest.writeInt(security);

dest.writeString(password);

dest.writeLong(lastUsedDate);

}



@Override

public int describeContents() {

return 0;

}



public static final Creator<WiFiApSetting> CREATOR = new Creator<WiFiApSetting>() {

@Override

public WiFiApSetting createFromParcel(Parcel in) {

return new WiFiApSetting(in);

}



@Override

public WiFiApSetting[] newArray(int size) {

return new WiFiApSetting[size];

}

};

31
その他
統合されたSDK Manager
Data Binding Support ( ≧ 1.3 Beta )
NDK Support ( ≧ 1.3 RC3 ) ← New!
32
Performance Tools - CPU monitor
33
Performance Tools - Memory usage
34
LeakCanary
https://github.com/square/leakcanary
35
dependencies {

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

compile project(':wifiapmanager')

compile 'com.android.support:design:22.2.0'

compile 'com.android.support:recyclerview-v7:22.2.0'

compile 'com.android.support:cardview-v7:22.2.0'

compile 'com.jakewharton:butterknife:6.1.0'

compile 'com.github.bumptech.glide:glide:3.6.0'

compile 'de.greenrobot:eventbus:2.4.0'

compile 'io.realm:realm-android:0.80.3'



debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'

releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'

}

LeakCanary
build.gradle
36
Gradle
Java言語用のビルドシステム
StudioはGradleでビルドする
https://gradle.org/
37
GradleでAndroidアプリをビルドするプラグイン
1.3.0-beta 4 (2015/06/29)
CIとの相性 ◎
Android Gradle Plugin
38
39
Gradle で ビルドする
apply plugin: 'com.android.application'



android {

compileSdkVersion 22

buildToolsVersion "22.0.1"



defaultConfig {

applicationId "jp.co.c_lis.kehai.android"

minSdkVersion 15

targetSdkVersion 22

versionCode 32

versionName "0.3.2"

}



buildTypes {

debug {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

release {

minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}



}



dependencies {

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

compile project(':wifiapmanager')

compile 'com.android.support:design:22.2.1'

compile 'com.android.support:recyclerview-v7:22.2.1'

compile 'com.android.support:cardview-v7:22.2.1'

}

build.gradle
40
build.gradle
android {

compileSdkVersion 22

buildToolsVersion "22.0.1"



defaultConfig {

applicationId "jp.co.c_lis.kehai.android"

minSdkVersion 15

targetSdkVersion 22

versionCode 32

versionName "0.3.2"

}
}
build.gradle
41
build.gradle
def gitSha() {

return 'git rev-parse --short HEAD'.execute().text.trim()

}

android {

buildTypes {

debug {

minifyEnabled false

versionNameSuffix ' (' + gitSha() + ')'

proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'

}

release {

minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'

}

}

}
build.gradle
42
build.gradle
/**

* Automatically generated file. DO NOT MODIFY

*/

package io.keiji.kehai;



public final class BuildConfig {

public static final boolean DEBUG = Boolean.parseBoolean("true");

public static final String APPLICATION_ID =
"jp.co.c_lis.kehai.android";

public static final String BUILD_TYPE = "debug";

public static final String FLAVOR = "defaultFlavor";

public static final int VERSION_CODE = 32;

public static final String VERSION_NAME = "0.3.2 (837c123)";

}

BuildConfig
43
build/generated/source/buildConfig/…/BuildConfig.java
android {



defaultConfig {

applicationId "jp.co.c_lis.kehai.android"

minSdkVersion 15

targetSdkVersion 22

versionCode 32

versionName "0.3.2"

buildConfigField "String", "TEST", ""MEGANEKKO""

}
}
BuildConfigのフィールド
44
build.gradle
/**

* Automatically generated file. DO NOT MODIFY

*/

package io.keiji.kehai;



public final class BuildConfig {

public static final boolean DEBUG = Boolean.parseBoolean("true");

public static final String APPLICATION_ID =
"jp.co.c_lis.kehai.android";

public static final String BUILD_TYPE = "debug";

public static final String FLAVOR = "defaultFlavor";

public static final int VERSION_CODE = 32;

public static final String VERSION_NAME = "0.3.2 (837c123)";

// Fields from default config.

public static final String TEST = "MEGANEKKO";

}

BuildConfigのフィールド
45
build/generated/source/buildConfig/…/BuildConfig.java
リソース
android {



defaultConfig {

applicationId "jp.co.c_lis.kehai.android"

minSdkVersion 15

targetSdkVersion 22

versionCode 32

versionName "0.3.2"

resValue "string", "res_value_test", "hello gradle"

}

}
46
build/generated/res/generated/…/values/generated.xml
リソース
<?xml version="1.0" encoding="utf-8"?>

<resources>



<!-- Automatically generated file. DO NOT MODIFY -->



<!-- Values from default config. -->

<string name="res_value_test">hello gradle</string>



</resources>

47
build/generated/source/buildConfig…
Build Variants
48
Build Types
Product Flavors
Build Types
android {

buildTypes {

debug {

minifyEnabled false

versionNameSuffix ' (' + gitSha() + ')'

proguardFiles getDefaultProguardFile('proguard-
android.txt'), 'proguard-rules.pro'

}

release {

minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-
android.txt'), 'proguard-rules.pro'

}

}

}
49
build.gradle
android {



productFlavors {

defaultFlavor {

}

forBetaTesting {

applicationId "io.keiji.kehai.android"

}

}

}
Product Flavors
50
build.gradle
51
Product Flavors
package io.keiji.kehai;



public enum OssLibrary {

MaterialIcons("Material icons", "license_creative_commons-4.0.txt"),

AOSP("Android Open Source Project", "license_aosp.txt"),

V7Support("Android v7 Support Libraries", "license_aosp.txt"),

DesignSupport("Android Design Support Library", "license_aosp.txt"),

Glide("Glide", "license_glide.txt"),

ButterKnife("Butter Knife", "license_butterknife.txt"),

EventBus("EventBus", "license_eventbus.txt"),

Realm("Realm", "license_realm.txt");



public final String name;

public final String fileName;



OssLibrary(String name, String file) {

this.name = name;

fileName = file;

}

}

52
src/main/io.keij.kehai/OssLibrary.java
src/main/io.keiji.kehai/OssLibrary.java
を
src/defaultFlavor/以下に移動
53
src/forBetaTesting/io.keiji.kehai/OssLibrary.java
を
作成
54
Product Flavors
package io.keiji.kehai;



public enum OssLibrary {

Nothing("", "");



public final String name;

public final String fileName;



OssLibrary(String name, String file) {

this.name = name;

fileName = file;

}

}

55
src/forBetaTesting/io.keij.kehai/OssLibrary.java
同じクラスが並列で存在する
src/defaultFlavor/io.keiji.kehai/OssLibrary.java
src/forBetaTesting/io.keiji.kehai/OssLibrary.java
56
Build Variants
StudioからBuild Variantsを切り替える
Product Flavor × Build Type
57
58
defaultFlavorDebug/Release forBetaTestingDebug/Release
android {

splits {

density {

enable true

exclude "ldpi", "tvdpi", "xxxhdpi"

compatibleScreens 'small', 'normal', 'large', 'xlarge'

}

}
}
APK Splits
59
http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
build.gradle
APK Splits Sample
60
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-xxhdpi
APK Splits Sample
apply plugin: 'com.android.application'



android {

compileSdkVersion 22

buildToolsVersion "22.0.1"



defaultConfig {

applicationId "jp.co.c_lis.apkspritsample"

minSdkVersion 15

targetSdkVersion 22

versionCode 1

versionName "1.0"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}



dependencies {

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

}

build.gradle
61
APK Splits Sample
splits {

density {

enable true

exclude "ldpi", "tvdpi", "xxxhdpi"

compatibleScreens 'small', 'normal', 'large', 'xlarge'

}

}



}



dependencies {

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

}

build.gradle
62
APK Splits Sample
$ ./gradlew assemble
Parallel execution is an incubating feature.
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:
:
:app:assembleRelease
:app:assemble
BUILD SUCCESSFUL
63
APK Splits Sample
app-hdpi-debug-unaligned.apk
app-hdpi-debug.apk
app-hdpi-release-unsigned.apk
app-mdpi-debug-unaligned.apk
app-mdpi-debug.apk
app-mdpi-release-unsigned.apk
app-universal-debug-unaligned.apk
app-universal-debug.apk
app-universal-release-unsigned.apk
app-xhdpi-debug-unaligned.apk
app-xhdpi-debug.apk
app-xhdpi-release-unsigned.apk
app-xxhdpi-debug-unaligned.apk
app-xxhdpi-debug.apk
app-xxhdpi-release-unsigned.apk
app/build/outputs/apk
64
APK Splits Sample
app-hdpi-debug-unaligned.apk
65
APK Splits Sample
<?xml version="1.0" encoding="utf-8" standalone="no"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="jp.co.c_lis.apkspritsample"

platformBuildVersionCode="22"

platformBuildVersionName="5.1.1-1819727">

<compatible-screens>

<screen

android:screenDensity="hdpi"

android:screenSize="small" />

<screen

android:screenDensity="hdpi"

android:screenSize="large" />

<screen

android:screenDensity="hdpi"

android:screenSize="xlarge" />

<screen

android:screenDensity="hdpi"

android:screenSize="normal" />

</compatible-screens>

AndroidManifest.xml
66
app-defaultFlavor-hdpi-debug.apk
app-defaultFlavor-hdpi-release-unsigned.apk
app-defaultFlavor-mdpi-debug.apk
app-defaultFlavor-mdpi-release-unsigned.apk
app-defaultFlavor-universal-debug.apk
app-defaultFlavor-universal-release-unsigned.apk
app-defaultFlavor-xhdpi-debug.apk
app-defaultFlavor-xhdpi-release-unsigned.apk
app-defaultFlavor-xxhdpi-debug.apk
app-defaultFlavor-xxhdpi-release-unsigned.apk
app-forBetaTesting-hdpi-debug.apk
app-forBetaTesting-hdpi-release-unsigned.apk
app-forBetaTesting-mdpi-debug.apk
app-forBetaTesting-mdpi-release-unsigned.apk
app-forBetaTesting-universal-debug.apk
app-forBetaTesting-universal-release-unsigned.apk
app-forBetaTesting-xhdpi-debug.apk
app-forBetaTesting-xhdpi-release-unsigned.apk
app-forBetaTesting-xxhdpi-debug.apk
app-forBetaTesting-xxhdpi-release-unsigned.apk
やり過ぎに注意
68
おわりに
Android Studioの今後
dev branch release branch IntelliJ Notes
studio-1.2-dev studio-1.2-release idea14-1.2-dev CLOSED
studio-1.3-dev studio-1.3-release idea14-1.3-dev BUG FIX ONLY
studio-1.4-dev idea14-1.4-dev for 1.4 work
studio-master-dev studio-master-dev idea14-dev for post 1.4 work
http://tools.android.com/build#TOC-Branches
69
• プロジェクトのファイル構成を変更
• main/java/…
• androidTest/java/…
• AndroidManifest.xmlの設定をbuild.gradleに移行
• applicationId / *SdkVersion / versionCode / versionName
• 依存関係をdependenciesに記載
ADT から Studioへの移行
70
http://tools.android.com/tech-docs/new-build-system/migrating-from-eclipse-projects
• ADT側でExport →「Generate Gradle build files」
• Studio側でImport
ADT から Studioへの移行
71
http://tools.android.com/tech-docs/new-build-system/migrating-from-eclipse-projects
• ADT側でExport →「Generate Gradle build files
• Studio側で
http://tools.android.com/tech-docs/new-build-system/migrating-from-eclipse-projects
ADT から Studioへの移行
72
使おう! Android Studio
73
SlideShare
https://goo.gl/vTK1Xn
C-LIS CO., LTD.
各製品名・ブランド名、会社名などは、一般に各社の商標または登録商標です。
本資料中では、©、®、™を割愛しています。
本資料は、有限会社シーリスの著作物です。掲載されているイラストは、特に記載がない場合は根雪れいの著作物です。
本資料の全部、または一部について、著作者から文書による許諾を得ずに複製することは禁じられています。
The Android robot is reproduced or modified from work created and shared by Google and used according to terms
described in the Creative Commons 3.0 Attribution License.
おまけ
トラブル集
75
複数のライブラリに同じファイルがある
android {

packagingOptions {

exclude 'META-INF/LICENCE.txt'

}
}
76
build.gradle
重複するファイルをパッケージから除外する
authoritiesが衝突する
<?xml version="1.0" encoding="utf-8"?>

<manifest>



<application>



<provider

android:provider=".provider.MyProvider"

android:authorities="${applicationId}.MyProvider" />



</application>



</manifest>

77
AndroidManifest.xml
applicationIdを変数で置き換える
意図しないバージョンアップ
dependencies {

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

compile project(':wifiapmanager')

compile 'com.android.support:design:22.2.0'

compile 'com.android.support:recyclerview-v7:22.2.0'

compile 'com.android.support:cardview-v7:22.2.0'

compile 'com.jakewharton:butterknife:6.1.0'

compile 'com.github.bumptech.glide:glide:3.6.0'

compile 'de.greenrobot:eventbus:2.4.0'

compile 'io.realm:realm-android:+'



debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'

releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-
op:1.3.1'

}

78
build.gradle
バージョンは固定すること!
意図しないバージョンアップ
79
io.realm:realm-android:0.80.1 → io.realm:realm-android:0.81.1

Android Studioの魅力