Android Studioの魅力

Post on 14-Aug-2015

8.934 views 0 download

Transcript of Android Studioの魅力

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 Tsukada5

本を執筆することに

2014年11月21日発売

技術評論社刊

Android Studio 0.8.6http://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();} @Overridepublic void writeToParcel(Parcel dest, int flags) { dest.writeLong(id); dest.writeString(ssid); dest.writeInt(security); dest.writeString(password); dest.writeLong(lastUsedDate); } @Overridepublic 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 assembleParallel 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