guava

|

http://code.google.com/p/guava-libraries/

 

http://blog.outsider.ne.kr/710

 

--------------------------------------------

얼마전에 올렸던 List에서 중복요소 제거한 List로 만들기에서 많은 댓글이 오가면서 반농담삼아 그냥 Guava를 쓰자라는 결론(?)에 이르르면서 최근에 Guava를 좀 찾아서 써보면서 Insightful Logic이라는 런던의 스타트업회사의 회사의 블로그에서 작성한 5 Reasons to use Guava라는 글을 보고 Guava를 파악해보기 위해서 번역한 글을 포스팅합니다. 이 내용은 Insightful Logic에 번역허락을 받고 올립니다.





Guava는 구글이 작성한 자바 오픈소스 라이브러리입니다. 개발자라면 이전에 한번정도는 스스로 작성해 보았거나 필요했지만 작성할 시간이 없었을만한 유용한 유틸리티 함수와 클래스들을 다양하게 제공하고 있습니다. 여기에 Guava를 사용하면 좋은 5가지 이유가 있습니다.


1. 컬렉션 초기화와 유틸리티
동질한 제너릭 컬렉션(제너릭 호모지니어스 컬렉션)은 자바가 가진 좋은 기능입니다. 하지만 때때로 컬렉션의 생성하기 아주 거추장 스럽습니다.

1
2
// 컬렉션 생성
final Map<String, Map<String, Integer>> lookup = new HashMap<String, Map<String, Integer>>();

Java 7에서는 이 문제를 정말 제너릭한 방법으로 해결했는데 제한된 타입추론의 형식을 형식에 구애받지 않고 다이아몬드 오퍼레이터로 참조할 수 있도록 하였습니다다. 그래서 위의 예제를 다음처럼 작성할 수 있습니다:

1
2
// in Java 7
final Map<String, Map<String, Integer>> lookup = new HashMap<>();

이전의 자바버전에서도 생성자없는 메서드생성자가 아닌 메서드를 통해서 이러한 추론은 사실상 가능했습니다. 그리고 Guava는 이미 존재하는 자바 컬렉션에 생성자를 만드는 준비를 위해 많을 것을 제공합니다. 위의 예제는 다음처럼 작성할 수 있다:

1
2
// in Guava
final Map<String, Map<String, Integer>> lookup = Maps.newHashMap();

또한 Guava는 많은 유용한 유틸리티 함수가 Maps, Sets등의 컬렉션에 들어있습니다. 특별히 제가 좋아하는 것은 Sets.union과 Sets.intersection메서드인데 이는 값을 재계산하지 않고 sets의 뷰를 리턴합니다.



2. 제한된 함수형 스타일의 프로그래밍
Guava는 함수형 스타일로 메서드를 전달하기 위한 일반적인 메서드들을 제공합니다. 예를 들어 많은 함수형 언어가 가지고 있는 map이 Collections2.transform 메서드의 형식으로 존재합니다. 또한 Collections2는 컬렉션에서 어떤 값을 제한하도록 하는 filter 메서드를 가지고 있습니다. 예를 들어 컬렉션에서 null인 요소들을 제거하고 다른 컬렉션에 저장하기 위해서 다음처럼 사용할 수 있습니다:

1
2
// Collections2.filter
Collection<?> noNullsCollection = filter(someCollection, notNull());

존재하는 컬렉션을 수정하는 대신에 새로운 컬렉션을 리턴하고 계산된 컬렉션은 Lazy하게 계산된다는 것을 알아야 합니다.



3. 멀티맵(Multimaps)과 바이맵(Bimaps)
단일키에 여러 값을 저장하는 것등은 Map의 정말 일반적인 사용입니다. 일반적으로 표준 자바 컬렉션의 사용은 값타입처럼 또 다른 컬렉션을 사용함으로써 이루어집니다. 이것은 안타깝게도 결국에는 컬렉션 초기화같은 반복되는 많은 형식를 포함하게 됩니다. 멀티맵(Multimaps)은 이것을 아주 깔끔하게 만들어줍니다.

1
2
3
4
5
Multimap<String, Integer> scores = HashMultimap.create();
scores.put("Bob", 20);
scores.put("Bob", 10);
scores.put("Bob", 15);
System.out.println(Collections.max(scores.get("Bob"))); // prints 20

또한 다른 방향의 바이맵(Bimaps) 클래스가 있습니다. 바이맵은 키처럼 값의 유일함을 강제합니다. 값도 유일하기 때문에 바이맵은 반대로 값을 키처럼 사용할 수도 있습니다.



4. 쉬운 해쉬코드와 비교자(Comparators)
자바에서 필드들의 해쉬코드로 클래스의 해쉬코드를 생성하는 것은 아주 일반적입니다. Guava는 이것을 위해서 Object 클래스에 유틸리티 메서드를 제공합니다. 다음은 그 예제입니다:

1
2
3
4
5
6
7
int foo;
String bar;
  
@Override
public int hashCode() {
  return Objects.hashCode(foo, bar);
}

해쉬코드 메서드를 정의했다면 equals 계약을 유지하는 것을 잊지 말아야 합니다.

비교자(Comparator)는 오퍼레이션의 순서를 연결하는 것을 포함해서 자주 작성하게되는 또 다른 예입니다. Guava는 이 과정을 쉽게 하기 위해서 ComparisonChain 클래스를 제공합니다. 여기 int와 String클래스의 예제가 있습니다.

1
2
3
4
5
6
7
int foo;
String bar;
  
@Override
public int compareTo(final GuavaExample o) {
  return ComparisonChain.start().compare(foo, o.foo).compare(bar, o.bar).result();
}



5. 방어적 코딩
메서드의 형식을 위해서 어떠한 필수조건들을 작성하는 것에 대해서 스스로 찾아본 적이 있습니까? 때때로 이것은 불필요하게 거추장스럽게 되거나 의도를 직접적으로 전달하는데 실패할 수 있습니다. Guava는 Preconditions 클래스를 일반적인 필수조건의 시리즈로 제공합니다.

필수조건을 위해서 if문과 명시적인 예외를 던지는 예제가 있습니다.

1
2
3
if (count <= 0) {
  throw new IllegalArgumentException("must be positive: " + count);
}

명시적으로 필수조건을 작성할 수 있습니다.

1
2
// in Guava
checkArgument(count > 0, "must be positive: %s", count);



결론
존재하는 라이브러리 클래스를 Guava로 교체하는 것은 유지보수를 위해 필요한 많은 양의 코드를 줄여주고 잠재적으로 생산성을 높여줍니다. 예를 들어 Apache Commons 프로젝트의 대안이 될 수 있습니다. 당신은 이미 이러한 라이브러리를 알고 있거나 사용할 수도 있고 Guava의 접근과 api를 선호할 수도 있습니다. Guava는 Idea Graveyard를 가지고 있습니다. Idea Graveyard 구글 엔지니어들이 라이브러리의 제한과 나쁜 디자인 결정에 대해서 무엇을 이해하고 있는가에 대한 아이디어를 줍니다. 자신만의 라이브러리 클래스를 작성하는 것으로 다시 돌아간다는 점에서 이러한 결정에 개인적으로 동의하지 않을 수도 있습니다. 그럼에도 불구하고 Guava는 간결하고 적은 형식을 장려하고 Guava의 몇몇 적절한 애플리케이션의 많은 자바 프로젝트에 도움이 될 수 있습니다.

 

 

 

'개발/활용정보 > Java' 카테고리의 다른 글

singleton pattern  (0) 2017.06.29
BundleActivator와 BundleContext  (0) 2014.12.16
osgi 공부 ^^;;;  (0) 2013.07.10
osgi shell command  (0) 2013.02.21
uncaughtException  (0) 2012.07.19
And

git 사용법

|

http://blog.hibrainapps.net/18


----------------------------------------




And

cts

|
출처 : http://blog.sangwookim.me/10

안드로이드 API / Application 호환성 검증을 위해 구글에서 제공하는 자동화된 테스트 툴이다.
CTS 통과는 곧 안드로이드 마켓에 등록된 어플리케이션이 정상적으로 동작될 수 있음을 나타낸다.
안드로이드 폰을 출시하고자 하는 휴대폰 제조사는 일정수준 이상의 점수로 CTS를 통과하여야 Market, Gmail, Google Map 등을 포함한 GMS (Google Mobile Service)를 휴대폰에 탑재할 수 있다.
CTS는 리눅스에서 실행되는 CTS엔진과, 타겟디바이스에 설치, 실행되는 개별 테스트 케이스들 (apk로 되어있다)로 구성된다.
Eclair (Android 2.1) 버전의 CTS는 총 23,107개의 시험 테스트 케이스로 구성되어 있으며, 테스트를 완료하는데도 상당한 시간이 걸린다. (타겟 디바이스의 CPU속도에 따라 많이 좌우된다)

CTS 테스트 과정

CTS를 돌리기 위한 방법은 간단하지만, 쉽지만은 않다.
(AOSP사이트를 참조: 사이트 내용이 부실하여 많은 참고는 안된다.)

1. CTS를 다운로드 받는다. (http://source.android.com/compatibility/downloads.html)
여러 버전의 테스트가 올라와 있으므로 원하는 버전의 CTS를 다운로드 받는다.
android-cts/tools/startcts 스크립트를 아래와 같이 수정한다. (SDK PATH를 설정해야 한다)
vim <YOUR_ANDROID_CTS_PATH>/android-cts/tools/startcts
startcts 스크립트 중,
SDK_ROOT = /root/android-sdk-linux_x86 (android sdk가 존재하는 위치)

2. 테스트할 기기를 컴퓨터에 연결한다.
테스트는 리눅스에서 진행된다.
대부분은 윈도우즈 PC를 사용하고 있을 것이므로 VMWare등에 설치된 리눅스를 이용하면 될 것이다. 자세한 설명은 생략한다. (별도의 문서 참조)
기기를 연결하기 위해서는 adb가 필요할 것이다. adb가 준비되어 있지 않다면 별도의 문서를 참조하여 adb를 연결하도록 한다.

3. 기기를 설정한다.
몇가지 준비할 사항이 있는데, Finger Print, Client ID등을 설정해야 한다.
SD카드, USIM카드 삽입, IMEI등록
WIFI및 3G망 접속 가능하도록 설정
USB디버깅 ON 
테스트 바이너리는 eng, user 무관
Fingerprint (폰이 마켓에 접속할때 인증이되는 값) 설정
안드로이드 2.2 이상을 사용한다면 이 외에 기기에서 특별히 설정해야 하는 것은 없다.
CTS 2.1 R2 이전 버전의 경우는 AOSP 사이트의 Compatibility Section을 참조하여 추가 설정을 하도록 한다.

문제가 있을 시 시도해볼 수 있는 옵션들 :
타겟의 USB ADB 인터페이스가 재대로 작동하는지 확인
타겟 data 파티션 영역이 25MB 이상인지 확인
adb reboot을 실행시 정상적으로 리부팅 되는지 확인 
폰에 IMEI 및 SIM카드가 들어있는지 확인
Data통신이 가능한 상태인지 확인(3G, WiFi)
SD카드 리셋
언어 영어로 변경
screen timeout을 30분으로 변경
TTS 음성 데이터 설치

4. CTS를 실행한다.
기기가 adb를 통해 연결가능한 상태여야 한다.
간혹 adb devices 명령을 통해 기기를 확인하였을때, 퍼미션이 없다고 나오는 경우는 root권한으로 adb server를 시작해주면 된다.
cts를 실행할 때도 root권한으로 실행해 주어야 기기나 adb를 재시작할때에 정상적인 권한으로 동작시킬 수 있다.
sudo ./startcts
start --plan CTS
p12522@SWKim-Ubuntu:~/android-sdk-linux_86/android-cts/tools$ sudo ./startcts
[sudo] password for p12522: 
Android CTS version 2.2_r2
Device(EF10S01110118000291) connected
cts_host > start --plan CTS
항목별로 테스트가 끝날 때마다 기기를 리부팅하게 되는데, VMWare를 이용해서 테스트를 하고 있다면, 기기가 자꾸 Vmware내의 리눅스가 아닌, PC에 붙으려고 할 것이다. 따라서 테스트 과정 중에 지속적인 감시가 필요하다.
테스트에는 약 10시간 이상이 소요되므로 이틀정도 시간을 잡는 것이 좋다. 혹은 오전 일찍부터 테스트를 시작하도록 한다.

테스트 이후의 작업

1. 테스트 결과 확인
테스트 결과는 xml파일 형태로 생성된다. android-cts/repository/results/<테스트시작시간>/testResult.xml 을 열어보면 결과를 확인할 수 있다.
android-cts/repository/results/<테스트시작시간>.zip 파일도 볼 수 있는데 이는 CTS결과 리포트 계정을 통해 구글에 전달할때 사용한다.
CTS는 20,000개 이상의 항목을 테스트하므로 한번에 완벽하게 통과하기란 쉽지 않을 것이다.
테스트에서 Fail 처리된 항목 중에서는 다시 (여러번) 테스트할 경우 통과하는 경우도 있다. CTS는 부분 테스트가 가능하므로 에러가 난 부분을 반복적으로 테스트하여 정말 문제가 있어서 Fail이 된 것인지, 일시적인 문제로 Fail이 된 것인지 알아내도록 한다.
testResultxml파일이 열리지 않을때.
에디터를 이용하여 xml을 연 후, &#0; 스트링을 찾아서 삭제하도록 한다. Fail항목에 대한 정보를 기록시 parsing이 안되는 문자가 잘못 기입되는 것 같다. 

부분테스트 방법
개별 package 시험 startcts스크립트 실행 후,
start --plan CTS -p <java_package_name>
예) start --plan CTS -p android.location

package이름은 ls -p로 확인 가능하다.
개별 테스트케이스 실행
Fail항목을 수정 후 재시험하거나 할때 유용할 것이다.
start --plan CTS -t <test pull name>
예) start --plan CTS -t android.app.cts.ActivityManagerMemoryInfoTest#testDescribeContents


2. 시험결과 분석 및 디버깅
시험 결과에는 error종류 및 기대값, 시험값, 오류가 발생한 함수, 파일 위치가 표시된다.
또한 xml을 웹브라우저로 열지 않고 에디터로 열게 되면 오류가 발생한 부분의 stack trace를 볼 수 있다.

Fail이 나오는 이유는 여러가지가 있겠지만 해당 부분을 잘못된 방법으로 수정한 경우가 많다.
Fail인 부분의 코드를 살펴보고 수정하도록 하자.
Known problem인 항목들은 구글에 문의 후 skip 혹은 수정하도록 한다.


3. 결과 등록 및 구글 CTS인증
CTS결과 서버 등록한다.
http://sites.google.com/a/android.com/compatibility/Home

GMS launch checklist를 작성한다.
http://sites.google.com/a/android.com/compatibility/Home

checklist 서버 업데이트.

GMS build approval submission 를 작성한다.
https://sites.google.com/a/google.com/gms_distribution/

구글에 인증을 요청한다.  - 인증 승인까지는 약 14일이 소요된다. 


국내의 안드로이드 개발자들에게 도움을 주고자 작성한 글이며, 상업적 이용은 금지합니다

'Android 개발' 카테고리의 다른 글

android app memory 최적화  (0) 2014.03.10
android version  (0) 2012.06.28
garbage collection  (0) 2012.03.15
configure LMK killer  (0) 2012.02.02
android porting on real target  (0) 2011.12.27
And