본문 바로가기

프로그래밍/Android

Android ADT 22.6.0 이후의 변화



안드로이드 Developer 사이트에서 ADT와 이클립스를 묶어 배포했던 버전(20131030 기준)

ADT 22.3 버전이 20140321 기준으로 ADT 22.6.2 버전으로 업데이트 되었습니다.

 

2014년 3월 한달간 총 3차례의 업데이트가 이루어졌습니다.

22.6.0 -> 22.6.1 -> 22.6.2 (현재)

 

가장 큰 변화 몇가지를 살펴 보고자 합니다.

 

 

1. JDK 7 언어 기능에 대한 지원

 - JDK7 컴파일 환경을 지원 하고 JDK7 의 문법 지원 (multi-catch, try-with-resources, diamond operator 등)

(19 이상 Bulid Tools 필요)

단, Try-with-resources 는 minSdkVersion 19 이상 에서만 지원 한다고 합니다.

 

 

JDK7 컴파일 환경으로 프로젝트 변경 방법

ADT 22.6.0 미만 환경에서는 JDK7 컴파일로 변경시 아래와 같은 에러가 발생 합니다.

 Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

 

※ ADT 22.6.0 이상 환경에서 JDK7 컴파일 환경으로 변경 하는 방법

 

 

※ 프로젝트 마우스 오른쪽 버튼 클릭 - Properties 메뉴

 

 

※ Java Compiler 메뉴 - JDK 1.7 선택 후 Apply 클릭후 OK

 

 

 

 

(1-1) Strings in switch Statements

	    //JDK7 미만
	    String str = "드림스타";
	    if (str.equals("드림스타")) {
	    	
	    }
	    
	    //JDK7 이상
	    switch(str) {
	    	case "드림스타":
	    	break;
	    	case "가나다":
	    	break;
	    }

 

JDK6 이하 에서는 switch 구문에서 String 오브젝트를 조건으로 사용할수 없었습니다.

안드로이드 에서 JDK7 환경으로 컴파일이 가능해졌기 때문에 안드로이드 코드 내에서도 switch 문에서

String 오브젝트를 사용할수 있게 되었습니다.

 

 

(1-2) Multi-Catch

   	   //JDK7 미만
	    try {

	    } catch (IllegalArgumentException e) {
	        e.printStackTrace();
	    } catch (NullPointerException e) {
	    	e.printStackTrace();
	    }
		
	   //JDK7 이상
	    try {

	    } catch (NullPointerException | IllegalArgumentException e) {
	        e.printStackTrace();
	    }	

 

JDK6 이하 에서는 try-catch 예외처리시 catch 문에서 반드시 하나의 예외에 대한 처리를 해야만 하였습니다.

안드로이드 에서 JDK7 컴파일 환경을 지원함으로서 catch 하나에서 여러개의 예외를 멀티로 처리할수 있게 되었습니다.  ( | 로 구분)

 

(1-3) Try-With-Resources

	// JDK7 미만
	public String getReadFirstLineFromFile1(String path) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(path));
	    try {
	        return br.readLine();
	    } finally {
	        if (br != null) br.close();
	    }
	} 
	 
	// JDK7 이상
	public int getReadFirstLineFromFile2(String path) throws IOException {
	    try (BufferedReader br = new BufferedReader(path)) {
	        return br.read();
	    }
	}

 

 

JDK7 미만에서는 IO 혹은 스트림 등을 사용후 finally 구문에서 반드시 자원을 반납 (close) 해야 했습니다.

그에 따라 close 된 자원을 다시 사용하여 에러가 나거나 하는 실수가 비번하게 이루어 졌는데,

안드로이드에서 JDK7 컴파일 환경을 지원함으로서 효율적인 코딩방식을 지원하게 되었습니다. (위 소스코드 참조)

단, 자동으로 자원을 반납하는 클래스의 경우 java.lang.AutoCloseable 인터페이스를 구현해야 합니다.

안드로이드 환경에서는 반드시 minSdkVersion 19 환경 이상에서 해당 기능을 사용할 수 있기 때문에

아직은 쓰지 않는것을 권장합니다.

 

(1-4)  Diamond Operator

	
		//JDK7 미만
		ArrayList list = new ArrayList();
		
		//JDK7 이상
		ArrayList list = new ArrayList<>();
	
		

JDK7 미만에서는 제네릭 타입 사용시 반드시 객체 생성시에도 명시적으로 타입을 지정해 주어야 했습니다.

안드로이드에서 JDK7 을 지원함으로서 객체 생성시 타입을 명시적으로 써주지 않고 <> 형태로만 넣어주어도

앞에 데이터타입이 이미 정해져 있기 때문에 또 써주지 않아도 됩니다.

 

 

 

원문 (ADT 22.6.0 업데이트 내용)

Added support for Java 7 language features like multi-catch, try-with-resources, and the diamond operator. These features require version 19 or higher of the Build Tools. Try-with-resources requires minSdkVersion 19; the rest of the new language features require minSdkVersion 8 or higher.

 

 

※ 더 자세한 변경 내용 - http://docs.oracle.com/javase/tutorial/extra/certification/javase-7-upgrade.html

 

 

 

2. v7 appcompat Support Library 포함하는 프로젝트 템플릿 변경

 - ADT 22.6.0 미만의 버전에서 프로젝트를 생성시, Activity 를 상속받는 BlankActivity 를 생성 할수 있었습니다.

하지만 ADT 22.6.0 이상 부터는 v7 appcompat Support Library 를 기본적으로 참조하는 프로젝트로 변경되었으며,

Fragment 로 구성된 ActionbarActvity 를 상속받는 BlankActivity 로 변경되었습니다.

(즉, 앞으로 기본 프로젝트 역시 Fragment 를 사용하게됨.)

템플릿 경로 : sdk/tools/templates/activities/BlankActivity 내용이 바뀌었습니다.

 

v7 appcompat Support Library 에 대해 살펴보겠습니다.

 

안드로이드 2.1 (API 레벨 7) 이상에서 사용하도록 설계된 라이브러리 로서, 

특정 기능을 제공하고, 독립적으로 프로젝트 에 포함될 수 있습니다.

 

  ※ 주의

    해당 라이브러리는 v4 Support Library 에 의존되기 때문에 반드시 포함 되어 있어야 합니다.

 

v7 appcompat Support Library 에 포함된 주요 클래스 간단 소개

 • ActionBar - 상단 액션바에 대한 구현을 제공 (모드 설정 등)

 • ActionBarActivity - v4 Fragment 및 ActionBar 사용 환경 제공

 • ShareActionProvider - 액션바에 포함되는 공유 메뉴 제공 (그림 참조)

 

 

 

ex) ShareActionProvider

 

 

아래 코드를 통해 ActionBar 를 사용할수 있습니다. (v7 ActionBar 를 import 해야 합니다)

import android.support.v7.app.ActionBar;

ActionBar actionBar = getSupportActionBar();


ActionBarActivity 를 사용하면, v4 Fragment 및 ActionBar 를 사용 할 수 있습니다.

(Actionbarsherlock 라이브러리 에서 SherlockFragmentActiviry 를 사용하여 v4 Fragment 및 ActionBar 를

사용한 환경과 동일한 환경)

 

 

결론은, Actionbarsherlock 라이브러리 를 더이상 사용하지 않고, 

안드로이드 API11 에서 기본적으로 제공하는 Fragment, ActionBar 를 구글에서 제공하는 Support Library 를

사용하여 안드로이드 2.1 (API 7) 이상에서도 사용할 수 있다.

 

ADT 22.6.0 이상 에서는 BlankActivity 로 프로젝트 생성시 무조건 해당 라이브러리가 포함되어 생성 되기 때문에

만든 이후에 Activity 로 바꿔서 사용한다 하더라도 appcompat_v7 라이브러리 프로젝트를 참조하고 있지 않을경우 컴파일 에러가 발생된다.

 

 

원문 (ADT 22.6.0 업데이트 내용)

Updated the New Project templates to include the v7 appcompat Support Library.

 

 

 

출처 - Android Developer, JDK7 Tutorials