안드로이드 오픈소스 어플리케이션 블록 2
Upcoming SlideShare
Loading in...5
×
 

안드로이드 오픈소스 어플리케이션 블록 2

on

  • 4,505 views

이전 안드로이드 어플리케이션 블록에 이은 추가 오픈소스의 아키텍처, 동기, 사용법등을 정리한 자료입니다. ...

이전 안드로이드 어플리케이션 블록에 이은 추가 오픈소스의 아키텍처, 동기, 사용법등을 정리한 자료입니다.


또한 위 블록을 통해 실제 안드로이드 어플리케이션을 리펙토링하는 사례를 설명 드립니다.

nipa 소프트웨어 공학센터 모바일 참조 모델로 만든 것이며, 추후 더 자세한 문서로 작성한 것들을 공개하도록 하겠습니다.

Statistics

Views

Total Views
4,505
Views on SlideShare
2,589
Embed Views
1,916

Actions

Likes
8
Downloads
71
Comments
2

11 Embeds 1,916

http://arload.wordpress.com 1650
http://plus.url.google.com 106
http://www.hanrss.com 83
http://feedly.com 54
https://arload.wordpress.com 11
http://222.112.8.34 7
http://m.arload.wordpress.com 1
http://wordpress.com 1
http://digg.com 1
http://webcache.googleusercontent.com 1
http://www.feedspot.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

안드로이드 오픈소스 어플리케이션 블록 2 안드로이드 오픈소스 어플리케이션 블록 2 Presentation Transcript

  • ! 안드로이드
  •   오픈소스
  •    어플리케이션
  •   블럭
  •   2
  • NHNNEXT
  •    손영수 LG전자
  •    오유환 GumiKorea
  •    김현종 메타빌드
  •    주윤회 KT
  •    진성주 딜라이트룸
  •    신재명 말랑스튜디오
  •    김영호
  • http://www.slideshare.net/
 arload/ss-15706807 3 
  •   
  • http://goo.gl/QEKgaM
  • 갈수록
  •   증가하는
  •   모바일
  •   Traffic 2010 2013 2011 2014 2012 2015 6253991 3805989 2197563 236676 546050 1162950 1 Cisco
  •   (2012),
  •   Cisco
  •   Visual
  •   Networking
  •   Index 단위
  •   TB/월
  • 어플리케이션
  •   블럭이란..
  • Android
  •   Application
  •   Block UI Network Common BaaS UI Pattern (Un)Marshaller Logging User Behavior UI Binding Actionbar (Un)Marshller + Dispatcher DI User Log + Crash Log Hybrid SNS Lightweight DI Notification Open Source BaaS
  • Android
  •   Application
  •   Block UI UI Pattern Network Common BaaS Testting Release Engineering UI Binding (Un)Marshaller Logging User Behavior MonkeyRunner Maven Actionbar Hybrid Aquery SNS Volley (Un)Marshller + Dispatcher DI Lightweight DI User Log + Crash Log Notification Robotium Jenkins Otto Open Source BaaS UrQA Git, Gitflow, Jgitflow
  • Welcome
  •   to
  •   my
  •   Journey!
  • 1장.
  •   Aquery
  •    ! ! Light-weight
  •   library
  •   for
  •   
  •    Async
  •   task
  •   &
  •   manipulating
  •   UI
  • 복잡한
  •   안드로이드
  •   코딩을
  •    
  •   쉽고
  •   간단하게
  •   하자!
  •    ! 1.Less
  •   code(UI
  •   manipulation)
  •    2.Asynchronous
  •   task
  •    3.Image
  •   loading
  •    4.Authentication
  • 
  •   1.
  •   Less
  •   code(UI
  •   manipulation) write-less/do-more
  • 
  •   2.
  •   Async
  •   callback(Json) Facebook
  •   이름
  •   가져오기
  • 
  •   2.
  •   Async
  •   callback(Bitmap,File) Bitmap File
  • 2.
  •   Synchronous
  •   call(Block) Fetching
  •   “Obama
  •   news”
  •   data
  • 3.
  •   Image
  •   loading Load
  •   image Cache
  •   control
  •    Down
  •   sampling
  •    Fallback
  •   image
  •    Preloading
  •    Progress
  •    Animation
  •    Rounded
  •   corner
  • 3.
  •   Image
  •   loading Cache
  •   control
  •    ! Caching
  •   적용
  •   여부
  •   control가능
  •   
  • 3.
  •   Image
  •   loading Down
  •   sampling
  •    (Handling
  •   huge
  •   image)
  •    ! -2의
  •   배수로
  •   sampling
  •    -200~399
  •   px의
  •   width
  • 3.
  •   Image
  •   loading Fallback
  •   Image
  •    ! image
  •   loading
  •   실패시
  •   control가능
  •    (default
  •   이미지
  •   혹은
  •   visibility
  •   설정)
  • 3.
  •   Image
  •   loading Preloading
  •    ! 낮은
  •   해상도
  •   이미지부터
  •   loading..
  • 3.
  •   Image
  •   loading progress
  •    ! Image
  •   loading
  •   완료까지
  •   자동
  •   progress
  •   설정
  • 3.
  •   Image
  •   loading Rounded
  •   corner
  •    ! 코드상에서
  •   이미지를
  •   Rounded
  •   corner처리
  •    (성능이슈로
  •   작은
  •   이미지에서만
  •   적합)
  • 4.
  •   Authentication Google,
  •   Twitter,
  •   Facebook
  •   auth
  •   지원
  •    ! Supported
  •   google
  •   service
  • 4.
  •   Authentication Facebook
  •   SSO
  • Architecture
  • Aquery
  •   사용하기 https://code.google.com/p/android-query/
  • Aquery
  •   사용하기 다운받은
  •   jar
  •   파일
  •   lib에
  •   추가
  • 2장.
  •   Volley
  • Listview
  •   +
  •   메타데이터
  •   UI
  •   
  • 기존의
  •   문제점.. • • • • 쓰레드풀
  •   관리
  •    화면
  •   회전시
  •   호출
  •   취소
  •    ImageView의
  •   재활용
  •    네트워크
  •   정보
  •   캐싱
  •    ! 다양한
  •   버전에서
  •   높은
  •   성능으로
  •   버그없이!
  • 전형적인
  •   Flow 1. 2. 3. 4. 목록조회
  •   API
  •   호출
  •    결과
  •   데이터
  •   파싱
  •    ListView에
  •   display
  •    각
  •   item의
  •   이미지주소로
  •   이미지
  •    요청
  •    5. 이미지
  •   디코딩
  •   후
  •   ImageView에
  •    display
  • 샘플
  •   어플리케이션
  • 일반적인
  •   구현 Adapter
  •   loads
  •   data
  •   from
  •   getView()
  •   
  • 일반적인
  •   구현
  •   ­–
  •   loadMoreData()
  • 일반적인
  •   구현
  •   ­–
  •   Back
  •   in
  •   getView()
  • 일반적인
  •   구현
  •   ­–
  •   LoadImage
  •   Task
  • Problems
  •   &
  •   solutions
 
 
 
 일반적인
  •   방법
 vs
 Volley
  •   사용
 
  •   

  • Problems 모든
  •   네트워크
  •   요청이
  •   Serial
  •   하게
  •   처리됨
  • Problems 화면
  •   회전시
  •   데이터
  •   네트워크에서
  •   reload
  • Problems View의
  •   재활용을
  •   방해하는
  •   AsyncTask
  • Problems Froyo
  •   에서의
  •   호환성
  •   문제
  • Volley를
  •   이용한
  •   방법 Setup
  • Volley를
  •   이용한
  •   방법 loadMoreData()
  • Volley를
  •   이용한
  •   방법 ImageLoader를
  •   통한
  •   이미지로딩
  • Volley를
  •   이용한
  •   방법 NetworkImageView
  •   사용
  • Volley
  •   사용하기 1. Clone
  •    ! ! 2. 코드
  •   import
  •    ! ! 3. Volley.newRequestQueue(context)
  • 3장.
  •   Otto
  • BroadcastReceiver/Intent vs • Uses
  •   standard
  •   Java
  •   classes
  •   as
  •   events
 • 보다
  •   편리한
  •   API
  •   제공
  •    ! • Intent
  •   전송을
  •   준비하기
  •   위한
  •   번거로움
  •   해결
 • 기존
  •   Intent
  •   사용보다
  •   훨씬
  •   낮은
  •   Overhead Otto
  • Parcelable
  •   Interface public class { private private private ! UserInfo implements Parcelable String mName; int mAge; String mEmail; //생성자 public UserInfo(String name, int age, String email) { this.mName = name; this.mAge = age; this.mEmail = email; } // 각 값을 넘겨주기 위한 getter 생성 public String getName() { return mName; } public int getAge() { return mAge; } } public String getEamil() { return mEmail; } ! ! !
  • Parcelable
  •   Interface 번거롭다!!!!!! // Parcelable를 생성하기 위한 생성자 Parcel를 파라메타로 넘겨 받음 private UserInfo(Parcel source) { mName = source.readString(); mAge = source.readInt(); mEmail = source.readString(); } // Parcelable을 상속 필수 Method @Override Intent intent = new Intent(); public int describeContents() intent.setAction("ACTION_NAME"); { intent.putExtra("UserInfo", userInfo); return 0; sendBradcast(intent); } // Parcelable의 write를 구현하기 위한 Method @Override public void writeToParcel(Parcel parcel, int arg1) { parcel.writeString(mName); parcel.writeInt(mAge); parcel.writeString(mEmail); } // Parcelable 객체로 구현하기 위한 Parcelable Method ArrayList구현 등.. public static final Parcelable.Creator<UserInfo> CREATOR = new Parcelable.Creator<UserInfo>() { …………………………… …………………………… ! ! !
  • Otto public class { private private private ! UserInfo String mName; int mAge; String mEmail; // Parcelable를 생성하기 위한 생성자 //임의 생성 public UserInfo(String name, int age, String email) { this.mName = name; this.mAge = age; this.mEmail = email; } // 각 값을 넘겨주기 위한 get터 생성 public String getName() { return mName; } public int getAge() { return mAge; } } public String getEamil() { return mEmail; } ! ! ! 기본
  •   클래스
  •   사용
  • Otto @Override protected void onResume() { super.onResume(); BusProvider.getInstance().register(this); } ! @Override protected void onPause() { super.onPause(); BusProvider.getInstance().unregister(this); } @Produce public UserInfo produceUserInfo() { return new UserInfo("yunhoi", 24, "yunhoi129@gmail.com") } Fragment#1
  •    Fragment#2 ! Fragment#1 @Subscribe public void onUserInfoProduced(UserInfo info) { //Do Something } Fragment#2 public void sendData() { BusProvider.getInstance().post(produceUserInfo()); }
  • Introduction • Otto
  •   forked
  •   from
  •   google
  •   “Guava(EventBus)”
  •    ! • Optimized
  •   to
  •   Android
  •   Platform
  •   
  •    ! • Event
  •   기반의
  •   Publish
  •   ­–
  •   Subscribe
  •   모델
  • Who
  •   is
  •   Otto
  •   for? • Activity/Fragment
  •   
  •   간의
  •   통신을
  •   자주
  •   사용해야
  •   하는
  •   어플 리케이션
 • 발생한
  •   Event에
  •   대해서
  •   내부적으로
  •   다양하게
  •   처리해야
  •   하 는
  •   경우
  •    ! • 보다
  •   쉽게
  •   Object
  •   전송을
  •   통해
  •   통신하고
  •   싶은
  •   경우
 • Package
  •   간의
  •   의존성을
  •   줄이고
  •   싶은
  •   경우
  • 일반적인
  •   구조
  •   복잡하다!!! I/F Activity
  •   #2 Activity
  •   #1 I/F I/F
  •    Service/Helper Fragment
  •   #1 Fragment
  •   #2 Thread
  • Otto를
  •   사용한
  •   구조
  •   깔끔하다!! Activity
  •   #2 Activity
  •   #1 Otto Service/Helper Fragment
  •   #1 Fragment
  •   #2 Thread
  • C&C
  •   View O"o <<Component>>   DeadEvent <<Component>>   Bus Publisher   (Ac1vity/Fragment) Post() Event Subscriber   Proxy <<Component>>   AnnotatedHandlerFinder <<Component>>   EventProducer <<Component>>   EventHandler Stub Event (Ac1vity/Fragment) [범례] component Func;on  call
  • EventChannel
  •   패턴 • Supplier(Publisher)
 
  •   상태변화를
  •   알리는
  •   객체
  •    ! • Consumer(Subscriber)
 
  •   상태변화를
  •   전달받는
  •   객체
  •    ! • 객체간의
  •   다대다
  •   관계에서
  •   효율적
  •   통신
  •   가능
  • Sample •Buttons
  •   Fragment
  •    ! •Map
  •   Fragment
  •    ! •ListView
  •    Fragment
  • 기존
  •   방법
  •   (Broadcast
  •   Receiver) @Override public void onReceive(Context context, Intent intent) { @Override ! public { } void onResume() String actionName = intent.getAction(); if (actionName.equals(LocationActivity.LOCATION_CHANGED)) { super.onResume(); float latitude = IntentFilter(); IntentFilter filter = new intent.getFloatExtra("latitude", LocationActivity.DEFAULT_LAT); filter.addAction(LocationActivity.LOCATION_CHANGED); float longitude = intent.getFloatExtra("longitude", filter.addAction(LocationActivity.LOCATION_CLEAR); LocationActivity.DEFAULT_LON); getActivity().registerReceiver(locationReceiver, filter); String str = "(" + latitude + " , " + longitude + ")"; locationEvents.add(0, str); if (adapter != null) @Override adapter.notifyDataSetChanged(); public void onPause() { } else if (actionName.equals(LocationActivity.LOCATION_CLEAR)) { super.onPause(); ......... getActivity().unregisterReceiver(locationReceiver); ......... } } !
  • 기존
  •   방법
  •   (Broadcast
  •   Receiver) findViewById(R.id.move_location).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { ! ! } }); lastLatitude += (RANDOM.nextFloat() * OFFSET * 2) - OFFSET; lastLongitude += (RANDOM.nextFloat() * OFFSET * 2) - OFFSET; Intent intent = new Intent(LOCATION_CHANGED); intent.putExtra("latitude", lastLatitude); intent.putExtra("longitude", lastLongitude); sendBroadcast(intent);
  • Otto
  •   사용 1. 2. 3. 4. 5. Register Activity/Fragment to Bus! Event 객체 정의! produce, subscribe 함수 정의! Bus를 통하여 기 정의한 event 객체 publishing! Subscribing event (전달 받은 event 처리) • Register Activity/Fragment
  • • Event 객체 정의 public class LocationChangedEvent { public final float lat; public final float lon; ! } public LocationChangedEvent(float lat, float lon) { this.lat = lat; this.lon = lon; } ......... .........
  • • Produce 함수 정의 및 Publish findViewById(R.id.move_location).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { lastLatitude += (RANDOM.nextFloat() * OFFSET * 2) - OFFSET; lastLongitude += (RANDOM.nextFloat() * OFFSET * 2) - OFFSET; BusProvider.getInstance().post(produceLocationEvent()); } });
  • • Produce 함수 정의 및 post @Subscribe public void onLocationChanged(LocationChangedEvent event) { locationEvents.add(0, event.toString()); if (adapter != null) adapter.notifyDataSetChanged(); } ! @Subscribe public void onLocationCleared(LocationClearEvent event) { locationEvents.clear(); if (adapter != null) adapter.notifyDataSetChanged(); }
  • Otto
  •   세부
  •   기능들 • ThreadEnforcer
 
  •   
  •   -
  •   메인
  •   Thread에서
  •   동작하도록
  •   설정할
  •   수
  •   있는
  •   기능
 
  •   
  •   -
  •   UI
  •   처리가
  •   필요할
  •   시
  •   사용 Bus eventbus = new Bus(ThreadEnforcer.ANY); //모든 thread에서 동작 Bus eventbus = new Bus(ThreadEnforcer.MAIN); // 메인 thread에서만 동작 • IntentWrapping
 
  •   
  •   -
  •   정보
  •   전달
  •   시
  •   Intent에
  •   정보를
  •   담아
  •   전송
 
  •   
  •   -
  •   Memory
  •   leak
  •   현상으로
  •   인한
  •   어플리케이션
  •   크래쉬
  •   현상
  •   방지
  • Otto
  •   단점 • Annotaion
  •   사용
  •    
  •   
  •   
  •   
  •   
  •   -
  •   실제
  •   프로그래밍한
  •   개발자가
  •   아니면
  •   이해하기
  •   힘듬
  •    
  •   
  •   
  •   
  •   
  •   -
  •   EventBus(GreenRobot)
  •   NameConvention
  •   
  •   방식
  •   사용
  •    
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   (ex
  •   :
  •   onEvent
  •   (…⋯.)
  •   /
  •   onEventMainThread(…⋯.)
  •   )
  •    ! • Event
  •   class
  •   에
  •   대한
  •   정의
  •   필요
  •    
  •   
  •   
  •   
  •   
  •   -
  •   Event
  •   class
  •   에
  •   대하여
  •   모두
  •   정의해
  •   주어야
  •   함
  •    
  •   
  •   
  •   
  •   
  •   
  •   
  •   (ex
  •   :
  •   changedEvent,
  •   clearedEvent,
  •   newEvent
  •   .…⋯..
  •   )
  •    ! • Data
  •   양이
  •   적을
  •   시
  •   불필요
  •    
  •   
  •   
  •   
  •   
  •   -
  •   Integer,
  •   String,
  •   Long…⋯..
  • 4장. Testing(Robotium) 
  •   
  • 어플리케이션의
  •   품질
  • 대부분
  •   UI
  •   테스트는
  •   반복
  •   노가다..
  • 기존
  •   앱
  •   개발자들에게
  •   테스트
  •   자체가
  •   고역 앱
  •   개발
  •   후
  •   배포를
  •   하기
  •    전에
  •   테스트를
  •   일일이
  •    다
  •   하는
  •   건
  •   리소스가
  •   많 이
  •   드는
  •   작업
  •   이다.
  •    Today
  •   Breaker,
  •   스터디
  •   플래너앱
  •   개발자
  •    Gple
  •   Lab
  •   개발팀장
  • 단위
  •   테스트 (Unit
  •   Test) 
  •   
  • White
  •   Box
  •   Test
  • Black
  •   Box
  •   Test
  • UI
  •   Testing
  •   Tool MonkeyRunner 
  •   
  • 하지만... 1. X,
  •   Y
  •   좌표를
  •   직접
  •   입력
  •   하여
  •   이벤트
  •   핸 들링..
  •    2. 테스트
  •   결과를
  •   육안으로
  •   직접
  •   확인..
  •    3. Java가
  •   아닌
  •   Jython
  • 1. 객체
  •   단위로
  •   이벤트
  •   핸들링..
  •    2. Junit
  •   지원
  •    3. Java
  • 데모
  •   영상
  • C&C
  •   View
  • • MonkeyRunner의
  •   뷰
  •   클릭 
  •   
  •   
  •   #
  •   Clicks
  •   on
  •   Button
  •    
  •   
  •   
  •   device.touch(385,
  •   1200,
  •   MonkeyDevice.DOWN_AND_UP)
  •    
  •   
  •   
  •   MonkeyRunner.sleep(2) • Robotium의
  •   뷰
  •   클릭 
  •   
  •   
  •   //Clicks
  •   on
  •   Button
 
  •   
  •   
  •   solo.clickOnView(solo.getview(“R.id.Button”));
  •    OR
  •    
  •   
  •   
  •   View
  •   v=
  •   findViewById(R.id.plus);
  •    
  •   
  •   
  •   solo.clickOnView(v);
  • • MonkeyRunner의
  •   메뉴
  •   버튼
  •   클릭 
  •   
  •   
  •   #
  •   Presses
  •   the
  •   Menu
  •   button
  •    
  •   
  •   
  •   device.press('KEYCODE_MENU',
  •   MonkeyDevice.DOWN_AND_UP)
  •    
  •   
  •   
  •   MonkeyRunner.sleep(2)
  •    
  •   
  •   
  •   #
  •   Clicks
  •   on
  •   menu
  •   item
  •    
  •   
  •   
  •   device.touch(385,
  •   1200,
  •   MonkeyDevice.DOWN_AND_UP)
  •    
  •   
  •   
  •   MonkeyRunner.sleep(2) • Robotium의
  •   메뉴
  •   버튼
  •   클릭 
  •   
  •   
  •   //In
  •   text
  •   field
  •   0,
  •   enter
  •   Note
  •   1
  •    
  •   
  •   solo.clickOnMenuItem("Add
  •   note");
  • • MonkeyRunner의
  •   텍스트
  •   입력 
  •   
  •   
  •   #
  •   Input
  •   text
  •   Note
  •   1
  •    
  •   
  •   
  •   device.type('Note')
  •    
  •   
  •   
  •   device.press('KEYCODE_SPACE',
  •   MonkeyDevice.DOWN_AND_UP)
  •    
  •   
  •   
  •   device.type('1')
 • Robotium의
  •   텍스트
  •   입력 
  •   
  •   
  •   solo.enterText(0,
  •   "Note
  •   1");
  • • Junit
  •   지원
  • • 단점은
  •   없나? 1.
  •   간단한
  •   테스트에만
  •   사용가능
  •    2.
  •   해당
  •   application만
  •   테스트
  •   가능
  •    3.
  •   자잘한
  •   버그가
  •   존재
  • UrQA
 Mobile
  •   QA
  •   System
  • Bug
  •    Information
  • Why
  •   need
  •   UrQA
  •   ?
  • Android
  •   developer
  •   Bug
  •   Report OS버전은? 센서
  •   상태는? 로그데이터는?
  • BugSense 좀더
  •   나은
  •   정보제공 하지만?? 웹
  •   UI
  •   제공
  • BugSense
  • BugSense
  • Application
  •   Crash
  •   Report
  •   for
  •   Android
  •   
  • Not
  •   use
  •   
  •    90%
  •    
  •   
  •   
  •   Why?!!!!
  • ACRA
  •   -
  •   Application
  •   Crash
  •   Report
  •   for
  •   Android
  •    역시나
  •   제한적이다
  •   
  •   
  •   
  • ACRA
  •   -
  •   Application
  •   Crash
  •   Report
  •   for
  •   Android
  •    버그
  •   리포팅
  •   정보 ReportTime
  •   
  •    
  •    Model
  •   
  •    
  •    National
  •   
  •    
  •    ErrorName
  •   
  •    
  •    ErrorClassName
  •    Line
  •   
  •    
  •    
  •    AppVersion
  •   
  •    
  •    OSVersion
  •   
  •    
  •    GPS
  •   
  •    
  •    
  •    WiFi
  •   
  •    
  •    
  •    MobileNetwork
  •   
  •    ScreenWidth
  •   
  •    ScreenHeight
  •   
  •    CallStack
  •   
  •    
  •    Log
  •   
  •    
  •    
  •    에러
  •   발생
  •   시간
  •    스마트폰
  •   모델명
  •    발생
  •   국가
  •    에러
  •   이름
  •    에러
  •   클래스
  •   이름
  •    에러
  •   라인
  •    앱버전
  •    OS버전
  •    GPS상태
  •    WiFi
  •   상태
  •    3G상태
  •    스크린
  •   크기
  •    스크린
  •   크기
  •    콜스택
  •   정보
  •    로그
  •   정보
  • Native
  •   Crash
  •   Report?
  • A Q Ur Demo
  •   &
  •   Tutorial
  • A Q Ur Architecture
  • ARCA
  •   Server view Bug Report ARCA
  •   Client
  •    browser browser log Admin tables tables 
  •    
  •    Bug
  •    browser
  •   
 ctrl util
  •    Report
  •    browser
  •   ctrl 
  •    Report
  •   
  •    detail
  •   
  •   ctrl control Dashboard
  •    ctrl Account
  •    ctrl Analyzer
  •    ctrl Analyzer
  •    event Communicator
  •   (Json) service Report
  •   store Couch
  •   DB user log Detail
  •    Detail Admin
 ctrl Dash
  •    board Monsterid common sender annotation collector
  • ACRA
  •   =
  •   Couch
  •   DB
  •    • Document-oriented
  •   Database
  •    ! • Documents
  •    ! • Schema
  •   Free
  •    ! 
 • RESTful
  •   HTTP
  •   API
  •   
  • ACRA
  •   =
  •   Couch
  •   DB
  • ACRA
  •   =
  •   Couch
  •   DB
  • ACRA
  •   =
  •   Couch
  •   DB • Insert
  •   가
  •   많아
  •   질수록
  •   느리다.
  •    
  •   
  •   (MongoDB
  •   보다
  •   빠르다고
  •   하지만
  •   500
  •   건
  •   이상
  •   부터는
  •   느 려짐)
  •    ! • Big
  •   Couch,
  •   Couch
  •   Lounge
  •   경우
  •   cache
  •   server
  •   별 도로
  •   구성
  •   해야
  •   함.
  •    ! • 실시간
  •   갱신
  •   시
  •   Conflict
  •   가
  •   자주
  •   발생
  •   함.
  •    ! • 
  •   Clustering
  •   기술을
  •   지원
  •   하지
  •   않음
  • URQA
  •   Architecture
  •   
  • UrQA는
  •   모바일
  •   앱
  •   개발팀에게
  •    VALUE 크래시를
  •   빠르게
  •   대응 Person-hour
  •   절약 차별화된
  •   기술력 가치를
  •   제공하는데 FEATURE 실시간으로
  •   에러를
  •   
  •    등급화하여
  •   리포팅 Crash
  •   이벤트
  •   경로
  •    시각화 네이티브
  •   크래시
  •   리포트 를
  •   통해서
  •   이루어
  •   진다.
  • 최근에러
  •   10개만
  •   보여주는
  •   데시보드
  • 아이콘과
  •   색을
  •   
  •    이용한
  •   버그의
  •   등급
  •   ,
  •   갯수표시
  • UrQA
  •   ­–
  •   Event
  •   Path 버그를
  •   발생시킨
  •   Crash경로를
  •   
  •    시각화해서
  •   보여줌 CRASH
  • Native
  •   Crash
  •   Report
  • Tutorial
  •   ! http://www.ur-qa.com/static/tutorial/tutorial.html
  •    ! http://www.youtube.com/watch?v=TEwS0c1shdU
  • Tutorial
  •   ! Step1
  •   “urqa.jar”
  •   Download
  •   and
  •   Import
  •   urqa.jar
  •   
  • Tutorial
  •   ! Step2
  •   Android
  •   manifest
  •   file
  •   setting Step3
  •   Create
  •   instance
  • Tutorial
  •   ! Step4-1
  •   create
  •   a
  •   JNI
  •   folder
  •   within
  •   the
  •   project
  • Tutorial
  •   ! Step4-2
  •   copy
  •   the
  •   Jni
  •   folder
  •   from
  •   this
  •   file
  •   
  •    
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   Please
  •   make
  •   mk
  •   files
  •   
 
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   'Application.mk'
  •   and
  •   'android.mk'
  • Tutorial
  •   ! Now
  •   you
  •   will
  •   be
  •   able
  •   to
  •   get
  •   Native
  •   Crash
  •   Report!!
  • 결론 UrQA는
  •   버그리포트를
  •   강화하여
 QA역할
  •   자동화를
  •   목표로
  •   한다.
 크래시& 로그정보 자동 수집
  •    ! 사용자의 앱 사용패턴, 이벤트정보 수집
  •    ! 크래시 패턴 분석 & 보고
  •    ! 빠르게 크래시 수정 App
  •   품질
  •   향상
  • 5장.
  •    Android
 Release
  •    Engineering http://www.flickr.com/photos/jakuza/
  • 개발
  •   도구 SCM(Source
  •   Code
  •   Management
  •   system)
  •    • 중앙
  •   관리형
  •    • • • CVS
  •    SVN
  •    분산
  •   관리형
  •    • Git
  •    • Mercurial
  • 개발
  •   도구 이슈트래커
  • 개발
  •   도구 위키(WIKI)
  • 안드로이드앱
  •   현실
  •    다양한
  •   오픈소스
  •   결합 • ActionBarSherlock
  •    • ... • HoloEverywhere
  •    • PullToRefresh
  •    • Facebook
  •    • Twitter4J
  •    • Google
  •   play
  •   service
  •    • GCM
  •    • Gson
  •    • Volley
  •    • JUnit
  •   
  • 안드로이드앱
  •   현실
  •    해상도
  •   파편화와
  •   테스트
  • 안드로이드앱
  •   현실
  •    다양한
  •   마켓!
  • 자동화 http://www.flickr.com/photos/72782662@N00/1485491742/in/ photolist-3ggwWA-4bG9Qy-4vgXCn-4x7bZV-4x7c5B-4M6c9A-4MXpR3-53TDco-5gkkDN-5AApwJ-5AAqfJ-5AMaTh-5HhuZU-5Hhv1b-5TBzC6-5TFU9s-5TFUzL-5TFWjQ-5X2DDb-5XvnSv-61EFAV-62b cBq-6fZP2W-6pkBeE-6qezaZ-6rwFka-6sioFV-6sivHR-6vwvxt-6vwvNM-6vwvRX-6vAH2j-6vAH3d-6vAH49-6vAH6C-6vAH8w-6Ci6vw-6Q2wAG-72T2K9-78tKwT-78tL1i-7eiuud-7eRUA6-7j9hPN-7kTR6s7tzXRR-7tDQUN-8u67LN-e546PL-bF7fBn-dX2FY1
  • 안드로이드앱
  •   배포에
  •   필요한
  •   것
  •    1. Versioning,
  •   Release
  •   Note
  •    2. Automated
  •   Test
  •   and
  •   Build
  •    3. Managing
  •   3rd
  •   Party
  •    Framework
  •   Version
  • 안드로이드앱
  •   배포에
  •   필요한
  •   것
  •    현실
  •    1. 수동
  •   Versioning,
  •   수동
  •   
  •    Release
  •   Note
  •    2. 수동
  •   Test
  •   and
  •   Build
  •    3. 수동
  •   Managing
  •   3rd
  •   Party
  •    Framework
  •   Version
  • 그래서
  •   적용하려고
  •   하는
  •   것은!
  •    1. Git,
  •   Gitflow
  •    2. Semantic
  •   Versioning
  •    3. Maven
  •   외부라이브러리
  •   관리
  •    4. 자동화
  •   빌드(Jenkins)
  •    5. 이슈트래커
  •   활용한
  •   릴리즈
  •   노 트
  • 1. Git,
  •   Gitflow
  • 1. Git,
  •   Gitflow
  • 1. Git,
  •   Gitflow
  • 2. Semantic
  •   Versioning
  • X.Y.Z (Major.Minor.Patch) 중요 업데이트 : 1.0.0 -> 2.0.0! 마이너 업데이트 : 1.1.0 -> 1.2.0! 버그 개선 버전 : 0.1.1 -> 0.1.2! 최초 개발 버전 : 0.1.0! 선행배포 : 0.X.0-alpha, 0.X.0-beta! 빌드버전 : 0.1.1+build.29 114
  • 3. Maven
  •   외부라이브러리
  •   관리 121
  • 3. Maven
  •   외부라이브러리
  •   관리 ROOT
  •    |-
  •   gen
  •    |-
  •   res
  •    |-
  •   drawable
  •    |-
  •   src
  •    
  •   
  •   
  •   |-
  •   main
  •    
  •   
  •   
  •   
  •   
  •   
  •   |-
  •   java
  •    
  •   
  •   
  •   
  •   
  •   
  •   |-
  •   resources
  •    
  •   
  •   
  •   |-
  •   test
  •    
  •   
  •   
  •   
  •   
  •   
  •   |-
  •   java
  •    
  •   
  •   
  •   
  •   
  •   
  •   |-
  •   resources
  •    |-
  •   AndroidManifest.xml
  •    pom.xml
  •    project.properties
  • 3. Maven
  •   외부라이브러리
  •   관리 <dependencies>
  •    
  •   
  •   <dependency>
  •    
  •   
  •   
  •   
  •   <groupId>com.squareup.dagger</ groupId>
  •    
  •   
  •   
  •   
  •   <artifactId>dagger</artifactId>
  •    
  •   
  •   
  •   
  •   <version>1.1.0</version>
  •    
  •   
  •   </dependency>
  •    
  •   
  •   <dependency>
  •    
  •   
  •   
  •   
  •   <groupId>com.squareup.dagger</ groupId>
  •    
  •   
  •   
  •   
  •   <artifactId>dagger-compiler</artifactId>
  •    
  •   
  •   
  •   
  •   <version>1.1.0</version>
  •    
  •   
  •   
  •   
  •   <optional>true</optional>
  •    
  •   
  •   </dependency>
  •    </dependencies>
  • 3. Maven
  •   외부라이브러리
  •   관리 jgitflow를
  •   사용하여
  •   javamaven
  •   프로젝트
  •   릴리즈를
  •    쉽게하는-법
  •    goo.gl/04MQmO
  • 3. Maven
  •   외부라이브러리
  •   관리 안드로이드는
  •   레파지토리
  •   구축
  •   필요
  •    https://bintray.com
  • 3. Maven
  •   외부라이브러리
  •   관리 안드로이드는
  •   레파지토리
  •   구축
  •   필요
  •    http://stackoverflow.com/questions/14013644/ hosting-a-maven-repository-on-github
  • 4. 자동화
  •   빌드(Jenkins) Jenkins(
  •   http://jenkins-ci.org
  •   )
  • 4. 자동화
  •   빌드(Jenkins)
  • 4. 자동화
  •   빌드(Jenkins) 117
  • 5. 이슈트래커
  •   활용한
  •   릴리즈
  •   노트
  • ! 아키텍쳐
  •   사례
  • 
  •   
  •   
  •    Architecture
  •    Visualization
  • 높이
  •   (30000
  •   feet)봐야
  •   할까?
  • 
  •   뭐가
  •   보이시나요??
  • 자세히
  •   
 (0
  •   feet)
  •   봐야
  •   할까?
  • 제한된
  •   코드로
  •   프로젝트가
  •   
 잘되고
  •   있는지
  •   판단은?
  • 3만
  •   피트
  •   vs
  •   0
  •   피트의
  •   뷰. 3만
  •   피트
  •    • • • • 다이어그램의
  •   Line의
  •   의미는?
  •    의존성?
  •    데이터
  •   흐름?
  •    버스와
  •   같은
  •   공유자원? 0
  •   피트
  •    • 너무
  •   상세한
  •   정보임. ! • 전체적인
  •   구조를
  •   보 지
  •   못함.
  • 해결책은..
 적절한
  •   
  •   1000
  •   피트의
  •   뷰
  • STAN
  •   (Structure
  •   Analysis
  •   for
  •   Java) emo D STAN
  •   -
  •   http://stan4j.com/eclipse/eclipse-integration.html
  • Robert
  •   C.
  •   Martin의
  •   그래프
  • Instability •패키지의
  •   움직일
  •   수
  •   있는
  •   여력을
  •   판단하는
  •   지표
  •    ! •다른
  •   패키지에
  •   영향을
  •   미치지
  •   않고,
  •   
  •    
  •   해당
  •   패키지를
  •   쉽게
  •   변경
  •   할
  •   수
  •   있는가?
  •    ! •Instability
  •   I
  •   =
  •   Ce
  •   /
  •   (Ca+Ce)
  •    ! •Ce
  •   =
  •   Efferent
  •   Coupling
  •   (Ingoing
  •   Dependencies)
  •    •Ca
  •   =
  •   Afferent
  •   Coupling
  •   (Outgoing
  •   Dependencies
  •   )
  • Instability 를
  •   
  •    
  •    키지 다면 의
  •   패 고
  •   있 당신 이
  •   쓰 다. 많 가
  •    
  •   쉽지
  •   않 누군 꾸기 ! 바 Instability
  •   I
  •   =
  •   Ce
  •   /
  •   (Ca+Ce)
  •    ! 당신의
  •   패키지가
  •   다른
  •   사람이
  •   많이
  •   쓴다면,
  •   
  •    즉
  •   Outgoing,
  •   Ca가
  •   많다면,
  •   
  •   
  •   여러분의
  •   패키지는
  •   변경하기
  •   어렵다.
  •   
  •    ! 반대로
  •   Outgoing하는
  •   Ca가
  •   적고,
  •   Ingoing(다른
  •   패키지만
  •   사용만
  •   하는)
  •   
  •   Ce,
  •    여러분의
  •   패키지는
  •   쉽게
  •   변경해도
  •   된다.
  •    !
  • Abstractness Interface(Abstract)
  •   와
  •   Concrete
  •   Class를
  •   비교
  •    ! ! 
  •   A
  •   =
  •   (#abstract
  •   classes
  •   /
  •   total
  •   #
  •   of
  •   classes)
  •    ! •Abstract
  •   class
  •   =
  •   interface,
  •   abstract다
  •   포함
  •    •Total
  •   #
  •   class
  •   
  •   =
  •   abstract
  •   class
  •   +
  •   concrete
  •   class
  •    ! •0
  •   이면
  •   concrete
  •   class만
  •   있다.
  •   
  •    •1
  •   이면
  •   abstract
  •   class만
  •   있다.
  •   
  • 다시
  •   보는
  •   그래프 다른데서
  •   많이
  •   쓰는
  •   녀 석이니
  •   조금
  •   더
  •   abstract 를
  •   높여야
  •   돼!
  • 그
  •   외
  •   용어 •Tangled
  •   Complexity
  •    •순환
  •   참조가
  •   있어
  •   Boundary를
  •   깰
  •   때
  •    ! •Cyclomatic
  •   Complexity
  •    •분기
  •   문이
  •   많아
  •   hotspot이
  •   될
  •   가망성이
  •   높은
  •   곳
  • 경고!!! 환자의
  •   외부
  •   증상만
  •   
  •    고치는
  •   의사가
  •   되지
  •   말자!!
  •    ! 이러한
  •   정보는
  •   좋은
  •   가이드일뿐!!
  •    
  •   
  •    숫자에
  •   의존하다가
  •   
  •    오히려
  •   문제가
  •   보이지
  •   않게
  •   된다.
  • 사례
  •   :
  •   
  •    “HOW
  •   ABOUT”
  •   
  •   APP
  •    17
  • 이거
  •   어때
  •   ­–
  •   How
  •   About https://github.com/recomio/howabout-android
  • 두
  •   가지의
  •   스트리밍
  •   서비스를
  •   이용해
  •   음악
  •   재생.
  • 이거
  •   어때
  •   앱
  •   아키텍처 
  •   spring-android
  •   
  •    (RESTful) 
  •   ViewPagerIndicator
  •   
  •    (뷰페이저) 
  •   RoboGuice
  •   
 (인스턴스
  •   인젝션) 
  •   Jackson
  •   
  •    (JSON) ActionBarSherlock
  •   
 (액션바) 
  •   Flurry
  •   
  •    (트래픽
  •   분석) Universal
  •   Image
  •   Loader
  •   
  •    (이미지
  •   로딩) 
  •   adlibr
  •   
  •    (광고) 
  •   RoboSpice
  •   
  •    (비동기
  •   네트워킹)
  • 이거
  •   어때
  •   ­–
  •   오염도
  • 이거
  •   어때
  •   ­–
  •   Tanbled
  •   (Circular
  •   Dependency)
  • 이거
  •   어때
  •   ­–
  •   Cyclomatic
  •   Complexity
  • 이거
  •   어때
  •   ­–
  •   Distance
  • 이거
  •   어때
  •   ­–
  •   Distance
  • 이거
  •   어때
  •   ­–
  •   Logger
  •   정보
  •   부재 Lo er
  •   정 gg !!!! 보! 다!!! 
  •   수
  •   없 
  •   
  •   볼
  • 안드로이드
  •   전체
  •   앱중
  •   
  •    크래시
  •   리포트를
  •   사용하는
  •   비율 Bugsense Critticism ACRA Zubhium HockeyApp not
  •   use 90.25 6.69 2.68 0.25 0.07 0.04
  • 아키텍처
  •   개선하기 28
  • 이거
  •   어때
  •   앱
  •   아키텍처 
  •   spring-android
  •   
  •    (RESTful) 
  •   ViewPagerIndicator
  •   
  •    (뷰페이저) 
  •   RoboGuice
  •   
 (인스턴스
  •   인젝션) 
  •   Jackson
  •   
  •    (JSON) ActionBarSherlock
  •   
 (액션바) 
  •   Flurry
  •   
  •    (트래픽
  •   분석) Universal
  •   Image
  •   Loader
  •   
  •    (이미지
  •   로딩) 
  •   adlibr
  •   
  •    (광고) 
  •   RoboSpice
  •   
  •    (비동기
  •   네트워킹)
  • 외부
  •   오픈소스의
  •   변화를
  •   흡수
  •   시켜라
  • 새롭게
  •   아키텍처
  •   계층화
  •   적용
  • Facebook
  •   App의
  •   문제점과
  •   해결
  •   방법
  • Reversing
  •   하기
  •    *.java *.class dex Resources library *.apk
  • 리버싱한
  •   결과들
  • 리버싱한
  •   결과들
  • Facebook
  •   아키텍쳐
  •   -
  •   Stan4J
  • FACEBOOK
  •   아키텍쳐
  •   -
  •   STAN4J
  • Facebook
  •   아키텍쳐
  •   -오염도 순환참조 크기가 큰 Class
  • Tangled (순환 참조) 1. Package 간 의존성 증가! 2. 모듈 중 일부분 변화로 인하여 전체적인 영향을 미칠 수 있음 1. 새로운 Pacakge 생성! 2. Interface 를 통한 변화 상쇄
  • Distance Over Engineering 인프라성 Code Element 추상화 정도 (Interface 의 사용)
  • Facebook 외부 라이브러리
  • Facebook 외부 라이브러리 • Jackson! ! • Jayway/JsonPath (JSON)
 • json-simple(JSON)
 • Google Inject
 • ACRA ! ! • FindBugs

  • Facebook 외부 라이브러리 참조구조 ORCA Jackson Jayway/jsonpath KATANA Json-simple Google-inject acra Findbugs
  • 개선점 선정 • 새로운 Package 생성을 통하여 순환참조 해결! ! • 중복된 외부 라이브러리 통합 (Wrapper Class 생성)! ! • 패키지 간의 의존성을 낮추기 위한 Interface 생성!
  • 외부 라이브러리 Wrapping Framework Marshaller/
 Unmarshaller Jackson Jayway/jsonpath Json-simple BugCrash/
 Report acra findbugs I.o.C Google-inject
  • 기존 C&C View
  • 개선된 C&C View
  • 감사합니다.
  • Q&A