android studioの魅力
TRANSCRIPT
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
12
いろいろあって…
13
14
どうしてこうなった
自己紹介
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
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
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