• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
안드로이드 오픈소스 어플리케이션 블록 2
 

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

on

  • 4,075 views

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

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


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

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

Statistics

Views

Total Views
4,075
Views on SlideShare
2,262
Embed Views
1,813

Actions

Likes
8
Downloads
63
Comments
2

11 Embeds 1,813

http://arload.wordpress.com 1564
http://plus.url.google.com 106
http://www.hanrss.com 75
http://feedly.com 54
http://222.112.8.34 7
https://arload.wordpress.com 2
http://wordpress.com 1
http://digg.com 1
http://m.arload.wordpress.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

12 of 2 previous next

  • 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