Instant Run (Android Studio 2.0)


Google Post: About Instant Run

Android Studio 2.0에 Instant Run이라는 새로운 기능이 추가되었다.
전체를 compile해서 APK를 생성하는것이 아닌 변경된 Dex파일만을 컴파일해서 reload하는 방식이다.
당연히 기존 방법보다 더 빠른 재실행 시간을 보장한다.

사용을 위해서는 다음의 조건을 만족 해야 한다.

  • Android Studio to 2.0 or higher
  • Android Plugin for Gradle version 2.0.0 or higher
  • minSdkVersion to 15 or higher. 최대의 성능을 위해서는 API level 21 이상을 추천한다

설정이 정상적으로 이뤄지면 노란색 tunderbolt icon이 Run 과 Debug 버튼 위에 나타나게 된다.
이 뜻은 다음 부터는 새로운 APK를 빌드하는 대신에 새롭게 변경된 부분은 푸쉬하겠다는 뜻이다.

발생된 코드와 resource 변화에 대해서 어떻게 반영할지에 대해서는 hot swapwarm swapcold swap으로 구분 한다.
각각의 swap타입의 결정은 자동으로 일어난다.
자세한 정보는 Google Deverloper's Video를 참조하자.

  • hot swap: method call과 관련됨. Object를 재 초기화 하지 않는다.
Change implementation code of an existing method
  • warm swap: 현재 activity만을 restart한다. resource 변화를 반영한다. 약간의 깜빡임(flicker) 정도의 screen 변화로 변경사항이 반영 되게 된다.
Change or remove an existing resource
  • cold swap: API level 21 이상에서 동작한다. 상대적으로 가장 느린 swap이다. 비록 새로운 APK를 생성하는 것은 아니지만, 전체적으로 code structure가 변경 되었다면 App을 restart해야되기 때문이다. 그마져도, API level 20 이하라면 full APK build 과정도 발생 시키므로 사실상 Instant Run의 이점은 사라진다.
Structural code changes, such as:
    Add, remove, or change:
        an annotation
        an instance field
        a static field
        a static method signature
        an instance method signature
    Change which parent class the current class inherits from
    Change the list of implemented interfaces
    Change a class's static initializer
    Reorder layout elements that use dynamic resource IDs 
  • manifest 또는 resources referenced by the manifest를 변경할경우에는 자동으로 deploys a new build를 실행 한다. 이러한 이유는app nameicon resources, and intent filters같은 경우가 manifest에서 변경되었다면 APK자체를 새로 설치해서 Android OS에 등록 시켜야 하기 때문이다.
Change the app manifest
Change resources referenced by the app manifest
Change an Android widget UI element (requires a Clean and Rerun)

UI widget을 변경했다면 Clean and Rerun을 실행해야 한다. 왜냐하면 onCreate()를 새로 실행 시켜야 하기 때문이다.
메뉴는 Run > Clean and Rerun 'app`에 위치한다.

실행 방법

  1. File > Settings
  2. Build, Execution, Deployment > Instant Run
  3. 아래와 같이 모두 체크한다. 

이렇게 모두 설정하면 Run 버튼이 와 같이 번개 모양이 뒤에 달리게 된다.

실제 간단한 Toast message로 테스트 해보면 Instant Run을 할때에는 2초 이내로 실행 되고
Restart App 기존 방식으로하면 20초 이내로 걸리게 된다.
많은 변화라고 할 수 있다.


Android Suuport Libraries (Android Studio)


서로 다른 안드로이드 버전에서 app이 부드럽게 이동하기 위한 방법

1.Overview

UI 엘리먼트
form factors
Miscellaneous utility functions
Android Studio는 Android Support Repository
Android Support Libraries는
<sdk>/extras/android/support에 저장 된다.

Backward-compatibility

상위 버전에서 개발된 앱은 더 낮은 버전에서 동작해야 한다.

예를들면 5.0 (API level 21) 이상에서 개발된 앱이 그 이하의 Android Framework에서 동작해야 한다.
하지만 그 5.0이아에서는 material design element가 없다. 이럴때 Support Library's appcompat library에 의해서 이것이 적절하게 대체되어 표현 될 수 있다.

Support for General Layout Patterns

User Interface를 지원 한다.
DrawerLayout같은 meterial desgin에 나오는 것들을 4.4 version에서 동작하게 한다.

Support for Different Form Factors

Tv, wearable과 같은 것들에서 동작하게 한다.

General Utilities

backward-compatible utility function을 지원 한다.

2.Support Library Features

Support library package는 다양한 라이브러리들을 포함한다.
일반적으로 v4 supprot와 v7 appcompat을 추천 한다고 한다.
왜냐하면 가장 대중적인 UI pattern을 지원하기 때문이다.

v4 Support Library

Android 1.6 (API level 4) 이상에서 쓰기 위해서 설계됨.
기능 내용: click
라이브러리 위치: <sdk>/extras/android/support/v4/ directory
Gradle dependecy identifier는 다음과 같다.

com.android.support:support-v4:23.3.0

Multidex Support Library

함수가 65536개 이상일 경우 사용하는 것이다.
위치: <sdk>/extras/android/support/multidex/ directory

com.android.support:multidex:1.0.0

v7 Support Libraries

Android 2.1 (API level 7) 이상에서 사용되어지게 구현 되었다.

v7 appcompat library
Action Bar와 meterial desgin을 위해서 구현되었다.

v4에 의존적이다. 그렇다고 v4를 import할 필요는 없다.
이미 v7 folder에는 v4가 포함 되어 있다.

위치 <sdk>/extras/android/support/v7/appcompat/ directory
해당 라이브러리는 User Interface resource가 포함되어 있다.

com.android.support:appcompat-v7:23.3.0

v7 cardview library
card view를 지원하며 이것은 material design 스타일이다.
TV app을 위한 것이다.
위치 <sdk>/extras/android/support/v7/cardview/ directory
리소스 포함됨

com.android.support:cardview-v7:23.3.0

v7 gridlayout library
GridLayout을 사용하기 위해서 구현 되었다.
위치: <sdk>/extras/android/support/v7/gridlayout/
리소스가 포함되어있다.

com.android.support:gridlayout-v7:23.3.0

v7 mediarouter library

Google cast를 지원 하기 위함이다. 이와 관련 class들은
MediaRouter, MediaRouteProvide 이다.
위치: <sdk>/extras/android/support/v7/mediarouter/
리소스 라이브러리

com.android.support:mediarouter-v7:23.3.0

v7 palette library
v7 recyclerview library
v7 recyclerview library

v7 Preference Support Library

CehckBoxPreFerence와 ListPreference등과 같은 UI setting 컴포넌드들을 지원한다.
위치: <sdk>/extras/android/support/v7/preference

com.android.support:preference-v7:23.3.0

v8 Support Library

Android 2.2 (API level 8) 이상에서 사용되기 위해서 디자인 되었다.

v8 renderscript library
RenderScript를 지원하기 위함이다.

v13 Support Library

Android 3.2 (API level 13) 이상에서 사용되기 위해서 개발됨.
Fragment pattern를 지원 한다.
리소스 없
위치:<sdk>/extras/android/support/v13/

com.android.support:support-v13:23.3.0

v14 Preference Support Library

skip

v17 Preference Support Library for TV

skip

v17 Leanback Library

UI for TV

Annotations Support Library

skip

Custom Tabs Support Library

skip

Percent Support Library

skip

App Recommendation Support Library for TV

skip

Support Library Setup

사용에 필요한 Android Support Libraries의 결정은 
어떤 기능들을 사용할지와 얼마만큼의 version을 포괄 할지에 달려 있다.

TargetSDK를 uppper-bound로 설정하고 minSDK를 lowerbound로 설정 해야 한다.

다운로드 방법

  1. SDK Manager를 시작한다.
  2. Extras folder에서 Android Support Library를 선택 한다.

    단 Android Studio에서 개발할경우 Android Support Repository를 선택 한다.

  3. 설치 버튼을 누른다.

라이브러리 설치 경로는 <sdk>/extras/android/support/이다.

root@jemin-virtual-machine:~/Android_Application_Tools/android-sdk-linux_r24/extras/android/support# ls

annotations  graphics    package.xml  recommendation     v13  v4
customtabs   multidex    percent      samples            v14  v7
design       NOTICE.txt  README.txt   source.properties  v17

Support Libraries 선택

어떤 기능을 사용할지 정해야 한다.
어떤 버전까지 backward-compatability를 수용할지 정해야 한다.

Adding Support Libraries

Support Libraries는 resource를 포함하고 있다.

v7 appcompat과 같은 라이브러리들은 image들 또는 XML file들과 같은 resource들을 포함하고 있다.
여기서 Eclipse와 차이점이 존재 한다.

Eclipse ADT의 경우 library가 resource를 사용한다면, 해당 resource는 반드시 어떠한 Project로써 workspace안에 Import되어 있어야 한다. resource가 연결된게 없다면 그냥 libs folder에 해당 라이브러리 추가하고 build path만 설정하면 된다.

Android Studio, gradle의 경우 이 with, without resources 과정이 동일하다. 즉 더 간단해졌다.
아래와 같이 build system에 dependencies만 설정해 주면 된다.

Adding libraries without resources

To add a Support Library without resources to your application project:

Make sure you have downloaded the Android Support Repository using the SDK Manager.
Open the build.gradle file for your application.
Add the support library to the dependencies section. For example, to add the v4 support library, add the following lines:

dependencies {
    ...
    compile "com.android.support:support-v4:18.0.+"
}

Adding libraries with resources

To add a Support Library with resources (such as v7 appcompat for action bar) to your application project:

Make sure you have downloaded the Android Support Repository using the SDK Manager.
Open the build.gradle file for your application.
Add the support library feature project identifier to the dependencies section. For example, to include the appcompat project add compile "com.android.support:appcompat-v7:18.0.+" to the dependencies section, as shown in the following example:

dependencies {
    ...
    compile "com.android.support:appcompat-v7:18.0.+"
}

Using Support Library APIs

support library 이름과 api level 이름의 숫자는 동일 하다.
android.supprot class package 또는 *compat suffix 스타일을 가지기 때문이다.

예제
Caution: When using classes from the Support Library, be certain you import the class from the appropriate package. For example, when applying the ActionBar class:

android.support.v7.app.ActionBar when using the Support Library.
android.app.ActionBar when developing only for API level 11 or higher.

추가로 ProGuard를 반드시 사용하는게 좋다. 난독화를 통환 soruce code 보호 뿐만 아니라 
supprot library로 인한 dead code들이 많이 생성되므로 이것을 ProGuard가 모두 제거해주는 기능도 한다.

Manifest Declaration Changes

Eclipse 환경이면 아래의 minSdkVersion을 수정해야 한다.

  <uses-sdk
      android:minSdkVersion="7"
      android:targetSdkVersion="17" />

위 말은 Android 2.1 (API level 7) 이상에서만 설치가 가능 하다는 것이다.

Android Studio 환경이라면 Gradle Build 시스템을 수정 하면된다.
API level 8 이면 Android 2.2이므로 따라서 support librarylevel을 7이나 4를 선택해야 한다.

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        minSdkVersion 8
        ...
    }
    ...
}

Code Samples

아래의 샘플들은 일단 모두 Eclipse 기반으로 작성 되어 있다.
Each Support Library includes code samples to help you get started using the support APIs. The code is included in the download from the SDK Manager and is placed inside the Android SDK installation directory, as listed below:

4v Samples: /extras/android/support/samples/Support4Demos/
7v Samples: /extras/android/support/samples/Support7Demos/

minsdk 7
target sdk 21

13v Samples: /extras/android/support/samples/Support13Demos/
App Navigation: /extras/android/support/samples/SupportAppNavigation/

필자는 7v Sample을 실행해 볼려고 했으나 Gradle Build script가 없어서 안된다.
아래의 과정을 따라한다.

  1. Gradle import
  2. build.sciprt 수정
dependencies {
    compile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:cardview-v7:23.1.0'
    compile 'com.android.support:gridlayout-v7:23.1.0'
    compile 'com.android.support:palette-v7:23.1.0'
    compile 'com.android.support:mediarouter-v7:23.1.0'
    compile 'com.android.support:recyclerview-v7:23.1.0'
}

참고사이트: http://stackoverflow.com/questions/33293283/cannot-build-support7demos-on-recent-android-studio-install-on-windows


Android Studio에 Library 추가하기


Gradle의 장점은 쉽게 라이브러리를 연결 할 수 있다는 것이다.

Extenral Library 추가 방법

  1. File -> New -> Import Module
  2. 적절한 Module name을 정하고 finish 클릭 (기본적으로 디렉토리 이름이 Moudle 이름이다.)
  3. Gradle Scropts에 해당 Moudle Gradle 설정 파일이 생성 된다.
  4. File -> Project Structure

아래와 같은 화면에서 +버튼을 눌러서 Moudle dependency를 클릭해서 module을 추가할 수 있다.

이렇게 추가를 하면 최종적으로 Gradle 파일에 아래와 같이 추가가 되어 진다.

dependencies {
    compile project(':SensorDataManager')
    compile project(':SensorManager')
    compile 'com.android.support:support-v4:23.0.0'
}

이렇게 하고 Main Activity에서 코드 자동완성이 발생하는지 확인해 본다.


Migrating from Eclipse Project to Android Studio Project (vice versa)


방법은 크게 두가지이다.

  • Importing the Eclipse project directly into Studio.

    • 선호 되어지는 방법이다.
  • Exporting the Eclipse project from Eclipse as a Gradle project.

    • 호환성 문제를 야기할 수 있다.
    • 장점
      • 만약 Graddle Porject와 Eclipse Project를 둘다 유지하고 싶을때 이렇게한다.
      • 같은 파일 구조를 가지게 된다.

Android Studio에서 직접 import 방법

  1. File -> New -> Import Project
  2. 위자드에 따라서 작업을 수행 한다.
  3. import-summary.txt를 보면 자동으로 발생한 과정들을 확인 한다.
  4. 자동 변환은 완벽하지 않으므로 SDK등이 빠져서 error를 발생 시킬 수 도 있다.

Eclipse ADT에서 Gradle project (android studio) 불러오기

자동화된 기능은 없다. 하지만 수작업으로 조금 해주면 된다.

  1. Eclipse에서 Android empty project를 생성 한다.
  2. res folder와 AndroidManifest.xml 파일을 생성하고 overwirte 한다.
  3. java/ folder의 content를 복사한 다음 Eclipse의 src folder에 복사 한다.
  4. 필요한 libraries를 링크 한다.

Eclipse에서 Andtoid Stduio로 이동 시킬 때 발생 하는 주요 변화

  • Project files: module 기반의 구조를 가진다.
  • Manifest settings: 이전 처럼 설정 파일을 의미한다.
  • Dependencies: 외부 의존 파일들을 설정하기 위함이다.
  • Test code: Android Test 코드
  • Gradle-based build system: ant는 xml에 기반해서 build하는 것이다.
  • User interface: IntelliJ IDEA에 기반해서 직관적인 interface를 제공 한다.
  • Developer tools versioning: Android Studio updates independently of the Gradle-based build system.


Android Studio 2.0: new features


Android Studio 2.1 is required to try out new features and APIs of the Android N developer preview including the new Jack compiler and Java 8 language support. It also includes performance improvements to Instant Run, and a number of bug fixes and stability improvements.

Android Studio 2.1 is now available to download through the Stable release channel.

Find out more about Android Studio 2.1 feature here: http://goo.gl/dE76Li

Learn more about Android Studio with Android Tool Time with Reto Meier: https://goo.gl/mAitOr

Subscribe to the Android Developers channel at http://goo.gl/GEh1ds

Instant run

  • Not all code changes are supported by instant Run currently.

accelerated build and deployment

  • overall build steps
    1. dx
    2. proguard
    3. AAPT
    4. Deploy and Install
  • improve building time
    • Quadratic dx merger algorithm
    • shrinking in proguard is improved
    • improving AAPT packaging times

Next-generation emulator

To improve deploy times, we improved the ADB push-pull protocol, making it very fast to deploy to an emulator, which seems like a really good reason to improve the emulator UX and make it really.

Basically, emulator is running on typical dev hardware is faster than using a physical Android device.

How they improved performance of emulator
hardware optimization.
- SMP support for host multi-core
- OPtimized GPU & CPU performance
- Improve IO speeds
they completely rebuilt the emulator UI.

New features
1. toolbar to enable actions
2. supprot for deploying APKs through drag and drop
3. rescale the emulator frame by dragging a corner
4. modify device hardware changes like GPS
- cellular network conditions
- battery state
- incoming phone calls or texts

GPU Profiler

  • we can record and replay the entire GPU stream frame by frame.
  • It allows us to insepct the GPU state at each stage and help us understand what caused each specific rendering outcome.

Built on IntelliJ 15

We can use all good things supported by IntelliJ15.


+ Recent posts