Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

안드로이드 개발자에 필요한 오픈소스이야기 Slide 1 안드로이드 개발자에 필요한 오픈소스이야기 Slide 2 안드로이드 개발자에 필요한 오픈소스이야기 Slide 3 안드로이드 개발자에 필요한 오픈소스이야기 Slide 4 안드로이드 개발자에 필요한 오픈소스이야기 Slide 5 안드로이드 개발자에 필요한 오픈소스이야기 Slide 6 안드로이드 개발자에 필요한 오픈소스이야기 Slide 7 안드로이드 개발자에 필요한 오픈소스이야기 Slide 8 안드로이드 개발자에 필요한 오픈소스이야기 Slide 9 안드로이드 개발자에 필요한 오픈소스이야기 Slide 10 안드로이드 개발자에 필요한 오픈소스이야기 Slide 11 안드로이드 개발자에 필요한 오픈소스이야기 Slide 12 안드로이드 개발자에 필요한 오픈소스이야기 Slide 13 안드로이드 개발자에 필요한 오픈소스이야기 Slide 14 안드로이드 개발자에 필요한 오픈소스이야기 Slide 15 안드로이드 개발자에 필요한 오픈소스이야기 Slide 16 안드로이드 개발자에 필요한 오픈소스이야기 Slide 17 안드로이드 개발자에 필요한 오픈소스이야기 Slide 18 안드로이드 개발자에 필요한 오픈소스이야기 Slide 19 안드로이드 개발자에 필요한 오픈소스이야기 Slide 20 안드로이드 개발자에 필요한 오픈소스이야기 Slide 21 안드로이드 개발자에 필요한 오픈소스이야기 Slide 22 안드로이드 개발자에 필요한 오픈소스이야기 Slide 23 안드로이드 개발자에 필요한 오픈소스이야기 Slide 24 안드로이드 개발자에 필요한 오픈소스이야기 Slide 25 안드로이드 개발자에 필요한 오픈소스이야기 Slide 26 안드로이드 개발자에 필요한 오픈소스이야기 Slide 27 안드로이드 개발자에 필요한 오픈소스이야기 Slide 28 안드로이드 개발자에 필요한 오픈소스이야기 Slide 29 안드로이드 개발자에 필요한 오픈소스이야기 Slide 30 안드로이드 개발자에 필요한 오픈소스이야기 Slide 31 안드로이드 개발자에 필요한 오픈소스이야기 Slide 32 안드로이드 개발자에 필요한 오픈소스이야기 Slide 33 안드로이드 개발자에 필요한 오픈소스이야기 Slide 34 안드로이드 개발자에 필요한 오픈소스이야기 Slide 35 안드로이드 개발자에 필요한 오픈소스이야기 Slide 36 안드로이드 개발자에 필요한 오픈소스이야기 Slide 37 안드로이드 개발자에 필요한 오픈소스이야기 Slide 38 안드로이드 개발자에 필요한 오픈소스이야기 Slide 39 안드로이드 개발자에 필요한 오픈소스이야기 Slide 40 안드로이드 개발자에 필요한 오픈소스이야기 Slide 41 안드로이드 개발자에 필요한 오픈소스이야기 Slide 42 안드로이드 개발자에 필요한 오픈소스이야기 Slide 43 안드로이드 개발자에 필요한 오픈소스이야기 Slide 44 안드로이드 개발자에 필요한 오픈소스이야기 Slide 45 안드로이드 개발자에 필요한 오픈소스이야기 Slide 46 안드로이드 개발자에 필요한 오픈소스이야기 Slide 47 안드로이드 개발자에 필요한 오픈소스이야기 Slide 48 안드로이드 개발자에 필요한 오픈소스이야기 Slide 49 안드로이드 개발자에 필요한 오픈소스이야기 Slide 50 안드로이드 개발자에 필요한 오픈소스이야기 Slide 51 안드로이드 개발자에 필요한 오픈소스이야기 Slide 52 안드로이드 개발자에 필요한 오픈소스이야기 Slide 53 안드로이드 개발자에 필요한 오픈소스이야기 Slide 54 안드로이드 개발자에 필요한 오픈소스이야기 Slide 55 안드로이드 개발자에 필요한 오픈소스이야기 Slide 56 안드로이드 개발자에 필요한 오픈소스이야기 Slide 57 안드로이드 개발자에 필요한 오픈소스이야기 Slide 58 안드로이드 개발자에 필요한 오픈소스이야기 Slide 59 안드로이드 개발자에 필요한 오픈소스이야기 Slide 60 안드로이드 개발자에 필요한 오픈소스이야기 Slide 61 안드로이드 개발자에 필요한 오픈소스이야기 Slide 62 안드로이드 개발자에 필요한 오픈소스이야기 Slide 63 안드로이드 개발자에 필요한 오픈소스이야기 Slide 64 안드로이드 개발자에 필요한 오픈소스이야기 Slide 65 안드로이드 개발자에 필요한 오픈소스이야기 Slide 66 안드로이드 개발자에 필요한 오픈소스이야기 Slide 67 안드로이드 개발자에 필요한 오픈소스이야기 Slide 68 안드로이드 개발자에 필요한 오픈소스이야기 Slide 69 안드로이드 개발자에 필요한 오픈소스이야기 Slide 70 안드로이드 개발자에 필요한 오픈소스이야기 Slide 71 안드로이드 개발자에 필요한 오픈소스이야기 Slide 72 안드로이드 개발자에 필요한 오픈소스이야기 Slide 73 안드로이드 개발자에 필요한 오픈소스이야기 Slide 74 안드로이드 개발자에 필요한 오픈소스이야기 Slide 75 안드로이드 개발자에 필요한 오픈소스이야기 Slide 76 안드로이드 개발자에 필요한 오픈소스이야기 Slide 77 안드로이드 개발자에 필요한 오픈소스이야기 Slide 78 안드로이드 개발자에 필요한 오픈소스이야기 Slide 79 안드로이드 개발자에 필요한 오픈소스이야기 Slide 80 안드로이드 개발자에 필요한 오픈소스이야기 Slide 81 안드로이드 개발자에 필요한 오픈소스이야기 Slide 82 안드로이드 개발자에 필요한 오픈소스이야기 Slide 83 안드로이드 개발자에 필요한 오픈소스이야기 Slide 84 안드로이드 개발자에 필요한 오픈소스이야기 Slide 85 안드로이드 개발자에 필요한 오픈소스이야기 Slide 86 안드로이드 개발자에 필요한 오픈소스이야기 Slide 87 안드로이드 개발자에 필요한 오픈소스이야기 Slide 88 안드로이드 개발자에 필요한 오픈소스이야기 Slide 89 안드로이드 개발자에 필요한 오픈소스이야기 Slide 90 안드로이드 개발자에 필요한 오픈소스이야기 Slide 91 안드로이드 개발자에 필요한 오픈소스이야기 Slide 92 안드로이드 개발자에 필요한 오픈소스이야기 Slide 93 안드로이드 개발자에 필요한 오픈소스이야기 Slide 94 안드로이드 개발자에 필요한 오픈소스이야기 Slide 95 안드로이드 개발자에 필요한 오픈소스이야기 Slide 96 안드로이드 개발자에 필요한 오픈소스이야기 Slide 97 안드로이드 개발자에 필요한 오픈소스이야기 Slide 98 안드로이드 개발자에 필요한 오픈소스이야기 Slide 99 안드로이드 개발자에 필요한 오픈소스이야기 Slide 100 안드로이드 개발자에 필요한 오픈소스이야기 Slide 101 안드로이드 개발자에 필요한 오픈소스이야기 Slide 102 안드로이드 개발자에 필요한 오픈소스이야기 Slide 103 안드로이드 개발자에 필요한 오픈소스이야기 Slide 104 안드로이드 개발자에 필요한 오픈소스이야기 Slide 105 안드로이드 개발자에 필요한 오픈소스이야기 Slide 106 안드로이드 개발자에 필요한 오픈소스이야기 Slide 107 안드로이드 개발자에 필요한 오픈소스이야기 Slide 108 안드로이드 개발자에 필요한 오픈소스이야기 Slide 109 안드로이드 개발자에 필요한 오픈소스이야기 Slide 110 안드로이드 개발자에 필요한 오픈소스이야기 Slide 111 안드로이드 개발자에 필요한 오픈소스이야기 Slide 112 안드로이드 개발자에 필요한 오픈소스이야기 Slide 113 안드로이드 개발자에 필요한 오픈소스이야기 Slide 114 안드로이드 개발자에 필요한 오픈소스이야기 Slide 115 안드로이드 개발자에 필요한 오픈소스이야기 Slide 116 안드로이드 개발자에 필요한 오픈소스이야기 Slide 117 안드로이드 개발자에 필요한 오픈소스이야기 Slide 118 안드로이드 개발자에 필요한 오픈소스이야기 Slide 119 안드로이드 개발자에 필요한 오픈소스이야기 Slide 120 안드로이드 개발자에 필요한 오픈소스이야기 Slide 121 안드로이드 개발자에 필요한 오픈소스이야기 Slide 122 안드로이드 개발자에 필요한 오픈소스이야기 Slide 123 안드로이드 개발자에 필요한 오픈소스이야기 Slide 124 안드로이드 개발자에 필요한 오픈소스이야기 Slide 125 안드로이드 개발자에 필요한 오픈소스이야기 Slide 126 안드로이드 개발자에 필요한 오픈소스이야기 Slide 127 안드로이드 개발자에 필요한 오픈소스이야기 Slide 128 안드로이드 개발자에 필요한 오픈소스이야기 Slide 129 안드로이드 개발자에 필요한 오픈소스이야기 Slide 130 안드로이드 개발자에 필요한 오픈소스이야기 Slide 131 안드로이드 개발자에 필요한 오픈소스이야기 Slide 132 안드로이드 개발자에 필요한 오픈소스이야기 Slide 133 안드로이드 개발자에 필요한 오픈소스이야기 Slide 134 안드로이드 개발자에 필요한 오픈소스이야기 Slide 135 안드로이드 개발자에 필요한 오픈소스이야기 Slide 136 안드로이드 개발자에 필요한 오픈소스이야기 Slide 137 안드로이드 개발자에 필요한 오픈소스이야기 Slide 138 안드로이드 개발자에 필요한 오픈소스이야기 Slide 139 안드로이드 개발자에 필요한 오픈소스이야기 Slide 140 안드로이드 개발자에 필요한 오픈소스이야기 Slide 141
Upcoming SlideShare
Reactive android application architecture
Next
Download to read offline and view in fullscreen.

44 Likes

Share

Download to read offline

안드로이드 개발자에 필요한 오픈소스이야기

Download to read offline

안드로이드 개발에 필요한 오픈소스

Related Books

Free with a 30 day trial from Scribd

See all

안드로이드 개발자에 필요한 오픈소스이야기

  1. 1. 안드로이드 개발자를 위한 오픈 소스 이야기
  2. 2. SW 아키텍트 포럼 모바일 분과 fHalo 팀 손영수 Filpboard 팀 ligbuf 팀
  3. 3. 요즘 업계 흐름은 알고 가시죠 ^^
  4. 4. Google이 꿈꾸는.. Android의 미래
  5. 5. Google은 왜 MODU의 특허를 50억에 샀을까?
  6. 6. MODU의 Jacket 시스템
  7. 7. 이게 왜 중요하지?..
  8. 8. 갈수록 증가하는 모바일 Traffic 2010 2011 2012 2013 2014 2015 6253991 3805989 2197563 1162950 546050 236676 Cisco (2012), Cisco Visual Networking Index 단위 TB/월
  9. 9. 사실 Google의 서비스는 Cloud에..
  10. 10. Android는 Google의 서비스를 (개인, 가정이) 소비하게 만드는 Hub
  11. 11. Android는 더 이상 Gadget을 위한 OS가 아니다.
  12. 12. Embedded System을 포괄할 OS로 봐야 함.
  13. 13. 하지만..
  14. 14. 제조사 입장에서 Android는 독이 든 성배..
  15. 15. 오픈소스의 개방성 Android Qt Symbian Meego Mozilla Webkit Linux Eclipse 84 68 71 65 58 58 61 23 Openness Vision Mobile Report July, 2011- http://bit.ly/oTmEmF
  16. 16. 오픈 소스 이긴 한데.. 구글러가 아니면 할수 있는게 없다…
  17. 17. 정리하면.. 버그만 잡아줘..
  18. 18. Android의 단점을 극복할 대체제들을 잘써야 한다. UI android-binding android-actionbar actionbar shelock side-navigation android ui patterns Network Simple gson (json) Facebook (fhalo) (REST) Common Android billing microlog (In app purchase) roboguice 4android sensing BaaS User Behavior USERGRID Analytics (BaaS Open Source)
  19. 19. Welcome to my Journey!
  20. 20. Agenda • 안드로이드 이해 – Binder (Broker 패턴) 그리고 Intent • 오픈 소스 그리고 사례 – Simple Framework (Restful) – microlog4android – 불편하지 않은 화면 갱신 (Publisher-Subscriber) – android-actionbar (+ actionbar sherlock) – Android Binding Framework – fHalo (facebook client famework) • 분석 방법 – Localytics 사용법 – STAN을 이용한 Android App 분석 방법
  21. 21. # 1. Binder..
  22. 22. Contents Activity Provider Broadcast Service Reciever
  23. 23. 하지만… 우리가 주목해야 할 것은..
  24. 24. 왜 Binder가 중요하지?
  25. 25. Android 내의 모든 상황을 감독하는 감시관!
  26. 26. 갑자기 뚝 하고 나온 녀석이 아니다. 아주.. 일반적인 아키텍쳐일뿐.
  27. 27. Binder Architecture IDL Compiler in args operation() Client Object OBJ REF out args, return IDL SKEL IDL Binder STUBS INTERFACE Object Adapter Binder
  28. 28. Binder를 느낄 수 있는 예제 AIDL 샘플 참고 http://bit.ly/85E5SV
  29. 29. 1. AIDL 파일 생성 package aexp.aidl; // Adder service interface. interface IAdderService { int add( in int i1, in int i2 ); }
  30. 30. 2. AIDL 툴로 Java 파일 생성 수동 코드 생성 sdk/platforms/android- <n>/tools/aidl 에 간다 C:Android-projectApiDemossrccomexampleandroidapisapp>aidl -IC:Android- projectApiDemossrc IRemoteService.aidl Eclipse에서는 aidl만 넣고 빌드하면 자동으로 소스 생성 됨
  31. 31. 3. Service Class 구현 …… public class AdderServiceImpl extends Service { @Override public IBinder getBinder() { return mBinder; } @Override public void onCreate() { super.onCreate(); Log.d( "ADDERSERVICEIMPL","onCreate" ); } /** The IAdderService is defined through IDL */ private final IAdderService.Stub mBinder = new IAdderService.Stub() { public int add( int i1, int i2 ) { return i1+i2; } }; @Override protected void onDestroy() { super.onDestroy( Log.d( "ADDERSERVICEIMPL","onDestroy" ); } }
  32. 32. 4. Manifest에 서비스 등록 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="aexp.aidl"> <application> <activity class=".AIDLServiceActivity" android:label="AIDLServiceActivity"> <intent-filter> <action android:value="android.intent.action.MAIN" /> <category android:value="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service class=".AdderServiceImpl"/> </application> </manifest>
  33. 33. 5. Client에 호출을 위해 Binder로 이름 찾는 로직 class AdderServiceConnection implements ServiceConnection { public void onServiceConnected(ComponentName className, IBinder boundService ) { service = IAdderService.Stub.asInterface((IBinder)boundService); Log.d( "ADDERSERVICECLIENT","onServiceConnected" ); } public void onServiceDisconnected(ComponentName className) { service = null; Log.d( "ADDERSERVICECLIENT","onServiceDisconnected" ); } };
  34. 34. 6. 시작, 해제 로직 넣을 것 private void initService() { conn = new AdderServiceConnection(); Intent i = new Intent(); i.setClassName( "aexp.aidl", "aexp.aidl.AdderServiceImpl" ); bindService( i, null, conn, Context.BIND_AUTO_CREATE); } private void releaseService() { unbindService( conn ); conn = null; }
  35. 35. 7. 클라이언트에서 서비스 호출하기 private void invokeService( int i1, int i2 ) { TextView t = (TextView)findViewById(R.id.invokeserv_result); if( service == null ) t.setText( "Service not available" ); else { try { int result = service.add( i1,i2 ); t.setText( Integer.toString( result ) ); } catch( DeadObjectException ex ) { t.setText( "Service invocation error" ); } } ….
  36. 36. Broker transfer transfer message message Client-side Broker Server-side Proxy Proxy main_event_loop pack_data pack_data update_repository uppack_data uppack_data register_service send_request call_service acknowledgment return send_response find_server Find_client calls Forward_request Forward_response uses API calls uses API calls Client Bridge Server pack_data initialize call_server uppack_data enter_main_loop start_task forward_message run_service use_Broker_API transmit_message use_Broker_API
  37. 37. Registration Service, BR, Activity… Broker start Initialize() main_evnet_loop() register_service() update_repository() acknowledgment enter_main_loop()
  38. 38. Sending Request Client Client-Side Broker Server-Side Server Proxy Proxy call_server send_request pack_data forward_request find_server call_service unpack_data run_service forward_response pack_data return find_client unpack_data result
  39. 39. 사용하기 힘든 Binder.. Intent는 Binder를 쉽게 사용할 수 있는 추상화 도 구.
  40. 40. Intent를 잘 알면. Android를 잘~~ 개발 할 수 있다.
  41. 41. Intent로 Activity 호출 Intent intent = new Intent(getApplicationContext(), MyOtherActivity.class); startActivityForResult(intent, SHOW_SUBACTIVITY); 그런데, Activity 이름이 바뀌면…
  42. 42. 그래서 묵시적 Intent Manifest 파일에 Intent Filter 등록 <activity android:name="DirectoryDialog" android:theme="@android:style/Theme.Translucent"> <intent-filter> <action android:name="filemanager.action.PICKFILES" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> Activity 만 되는 </activity> 호출 Intent filemanager = new Intent("filemanager.action.PICKFILES"); 게 아님 startActivity(filemanager);
  43. 43. # 2.아직도 Logcat?
  44. 44. 여러분이 만든 시스템이 죽었다. 미국에서….
  45. 45. Logcat 보러 출
  46. 46. 새로운 log.. 4
  47. 47. 먼저 Log Management 패턴부터…
  48. 48. log4xxx
  49. 49. Microlog4android 사용법 • http://code.google.com/p/microlog4android/downloads/에서 microlog4android-1.0.0.jar 다운 • Android 프로젝트에 jar 추가 • AndroidManifest.xml에 android.permission.WRITE_EXTERNAL_STORAG​​E 추가
  50. 50. public class LogtestActivity extends Activity { static public Logger logger = LoggerFactory.getLogger(); @Override public void onCreate(Bundle savedInstanceState) { PatternFormatter formatter = new PatternFormatter(); formatter.setPattern( " %d{ISO8601} [%P] %m %T " ); logger.setLevel(Level.INFO); // write to LogCat LogCatAppender logCatAppender = new LogCatAppender(); logCatAppender.setFormatter(formatter); logger.addAppender(logCatAppender); // write to text file of SD-card. FileAppender fileAppender = new FileAppender(); fileAppender.setAppend( true ); fileAppender.setFileName( "microlog4android.log" ); fileAppender.setFormatter(formatter); logger.addAppender(fileAppender);
  51. 51. 로그를 Network 서버로 보내는 Appender도 있으나 약간의 코딩이 필요.
  52. 52. # 3. REST의 귀찮음. Rest is unrest..
  53. 53. Stub Controller DAO Proxy REST DTO GET
  54. 54. 같이 뭉쳐 다니는 파라메터는 ParameterObject로 묶어라!
  55. 55. XML 파싱 이렇게?? while(true) { <categoryList> int eventType = xpp.nextTag(); <categorys> if(eventType == XmlPullParser.START_TAG) { <category> String tag = xpp.getName(); <id>1</id> if("id".equals(tag)) { <name>AA</name> category.setId(Integer.parseInt(xpp.nextText())); <date>2011-11-01</date> }else if ("name".equals(tag)) { </category> category.setName(xpp.nextText()); <category> }else if ("date".equals(tag)) { <id>2</id> category.setDate(xpp.nextText()); <name>BB</name> }else{ <date>2011-12-10</date> if(XmlPullParser.TEXT == xpp.next()) </category> xpp.nextTag(); </categorys> } </categoryList> } else break; }
  56. 56. Simple Framework를 이용하세요. http://simple.sourceforge.net/
  57. 57. 이렇게 됩니다. <categoryList> @Root <categorys> public class CategoryList { <category> <id>1</id> @ElementList <name>fruit</name> private ArrayList<Category> categorys; <date>201110051200</date> </category> public void setCategorys(ArrayList<Category> categorys) <category> { <id>2</id> this.categorys = categorys; <name>animal</name> } <date>201110051200</date> </category> public ArrayList<Category> getCategorys() { <category> return categorys; <id>3</id> } <name>food</name> } <date>201110051200</date> </category> </categorys> </categoryList>
  58. 58. 이렇게 됩니다. while(true) { int eventType = xpp.nextTag(); if(eventType == XmlPullParser.START_TAG) { String tag = xpp.getName(); if("id".equals(tag)) { category.setId(Integer.parseInt(xpp.nextText())); Serializer serializer =}else if ("name".equals(tag)) { new Persister(); Reader reader = newcategory.setName(xpp.nextText()); StringReader(xmlData); CategoryList categoryList if ("date".equals(tag)) { }else = serializer.read(CategoryList.class, reader, false); category.setDate(xpp.nextText()); }else{ if(XmlPullParser.TEXT == xpp.next()) xpp.nextTag(); } } else break; }
  59. 59. # 4. 화면 갱신
  60. 60. My Market을 기억하시나요?
  61. 61. 시작하자마자 Loading.. 화면이 뜨면 누가 접속하나요??
  62. 62. 시작하자 마자 화면이 나오 게.
  63. 63. 그럼. 사용자가 직접 당겨서 동기화를?
  64. 64. Sync Notificati Service on 2. Insert Activity 1. Register XXX Adapter 3. Notification Contents Provider 4. GetData..
  65. 65. @Override public Uri insert(Uri uri, ContentValues values) { String tableName; Uri contentUri; long id; switch(matcher.match(uri)){ case SITES: tableName = Bookmark.sites._TABLENAME; ContentValues values = new ContentValues(); contentUri = Bookmark.sites.CONTENT_URI; values.put(Bookmark.sites.NAME, stk[i][0]); break; values.put(Bookmark.sites.ADDRESS, stk[i][1]); default: getContentResolver().insert(Bookmark.sites.CONTENT_URI, values); throw new IllegalArgumentException(); getContentResolver().notifyChange(Bookmark.sites.CONTENT_URI, null) ; } id = mDB.insert(tableName, null, values); if(id > 0){ Uri itemUri = ContentUris.withAppendedId(contentUri, id); return itemUri; }else throw new SQLException(); }
  66. 66. # 5. UI Patterns 다양한 안드로이드 UI 오픈소스들을 소 http://bit.ly/QyDjMV
  67. 67. Android UI Pattern App 다양한 안드로이드 UI 기법을 오픈 소스로 공개 http://bit.ly/QyDjMV
  68. 68. Android UI Pattern App
  69. 69. Android UI Pattern App
  70. 70. 예제 1 - android-actionbar
  71. 71. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  72. 72. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  73. 73. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  74. 74. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  75. 75. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  76. 76. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  77. 77. colors.xml 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  78. 78. 예제 2 android-binding-framework http://code.google.com/p/android-binding/ http://bit.ly/cxxwCF
  79. 79. Event에 대한 Binding 다음과 같이 버튼에 대한 이벤트 Method OnClick()
  80. 80. Main.xml
  81. 81. CalculateViewModel.java
  82. 82. Option.xml
  83. 83. Main Activity
  84. 84. Main Activity
  85. 85. # 6. fhalo framework facebook framework Project
  86. 86. 세계에서 가장 큰 서비스 (약 8억5천만) 854,750,780
  87. 87. 가장 오랜시간 이용하는 서비스
  88. 88. 을 개발하려면… 너무 많은 것을 알아야 한다. Social Plugin ? Open Graph ? Social Channels ? Authentication ? Graph API ?
  89. 89. 그래서 우리는.. framework facebook framework Project 를 시작했습니다.
  90. 90. Facebook 기본 개념 - 소셜 그래프 94
  91. 91. About Graph API • Graph API – 소셜 그래프의 Object(친구, 페이지, 사진 등)를 다루는 API • Graph API의 구조 – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE • ID는 사용자, 페이지, 이벤트, 사진 등의 Object ID – 약 20개의 Object를 지원 – 모든 Object의 ID는 unique하다 – JSON 형태로 응답을 받는다 95
  92. 92. Graph API Example • https://graph.facebook.com/100001066448386/ 신재명 ID • https://graph.facebook.com/40796308305/ 코카콜라 페이지 ID 96
  93. 93. Graph API - Connection • Graph API의 구조 – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE • Connection이란 ? – Object의 연관(관계) 개념 • User object의 Connection 종류 – Family, friends, album, likes, posts … – User object 경우 약 25개의 Connection 을 제공 – https://developers.facebook.com/docs/reference/api/user/ 참고 97
  94. 94. Connection - Example • Graph API 예시 – https://graph.facebook.com/100001066448386/friends 그럼 보안문제는 ??? 98
  95. 95. Access Token • 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다. • Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 99
  96. 96. About Graph API • Graph API Explorer – Access Token 받을 수 있다 – 각종 Graph API를 테스트 해볼 수 있다 https://developers.facebook.com/tools/explorer#!/tools/explorer
  97. 97. 사용법 Step1 Step2 Step3 Step4 Import fHalo.jar Get access token Create instance Using API 101
  98. 98. Access Token • 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다. • Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 102
  99. 99. 친구 리스트 가져오기 (페이스북 API)
  100. 100. 친구 리스트 가져오기 – Rest FB • Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class); – fHalo • Connection<Friends> friends = user.friends();
  101. 101. 피드 올리기(페이스북 API)
  102. 102. 피드 올리기 – Rest FB • FacebookType publishMessageResponse = facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", "RestFB test"), Parameter.with(“caption", “caption test"), Parameter.with(“description", “description test"),); – fHalo • Feed feed = new feed(); feed.setMessage("Message Test"); feed.setCaption("Caption Test"); feed.setDescription("Description Test"); user.publishFeed(me, feed);
  103. 103. # 7. 분석은 어떻게?
  104. 104. Sleep If you can.
  105. 105. Thanks 신재명
  106. 106. Issue..
  107. 107. 월드 와이드 앱
  108. 108. 모바일 어플리케이션 분석 플랫폼
  109. 109. 메인 DASHBOARD
  110. 110. Daypart
  111. 111. Device (국내는…)
  112. 112. Device (월드 와이드 앱은..)
  113. 113. App Version
  114. 114. TagEvent (사용자가 많이쓰는 기능)
  115. 115. 사용자가 어떤 화면을 많이 사용하는지 (유료기능)
  116. 116. 이외에도.. • New vs Returning • Carrier • Country • OS Version
  117. 117. 적용방법 • http://www.localytics.com/에서 • 탭 에서 어플리케이션 등록
  118. 118. • http://bit.ly/KnZzpx 에서 소스코드 다운 • Android 프로젝트 src/폴더에 소스코드 추가 • AndroidManifest.xml에 퍼미션 추가 <uses-permission android:name="android.permission.INTERNET“>
  119. 119. • Main Activity에 Import import com.localytics.android.*; • 클래스 내부에 session object 추가 private LocalyticsSession localyticsSession; • OnCreate 함수에 아래 소스 추가 public void onCreate(Bundle savedInstanceState) { . . . this.localyticsSession = new LocalyticsSession(this.getApplicationContext(), "APP KEY FROM STEP 2"); this.localyticsSession.open(); // open the session this.localyticsSession.upload(); // upload any data . . . }
  120. 120. • onResume 메소드 Override public void onResume() { super.onResume(); this.localyticsSession.open(); } • onPause 메소드 Override public void onPause() { this.localyticsSession.close(); this.localyticsSession.upload(); super.onPause(); }
  121. 121. • TagEvent남기기 localyticsSession.tagEvent(“TagEvent남김 ");
  122. 122. # 8. 1000 피트의 뷰.
  123. 123. 높이 (30000 feet)봐야 할까?
  124. 124. 높이 봐야 할까?
  125. 125. 자세히 (0 feet) 봐야 할까?
  126. 126. 자세히 봐야 할까?
  127. 127. 3만 피트 vs 0 피트의 뷰. 3만 피트 • 다이어그램의 Line의 의미는? • 의존성? • 데이터 흐름? • 버스와 같은 공유자원? 0 피트 • 너무 상세한 정보임. • 전체적인 구조를 보지 못함.
  128. 128. 해결책은.. 적절한 1000 피트의 뷰
  129. 129. STAN (Structure Analysis for Java) STAN - http://stan4j.com/eclipse/eclipse-integration.html
  130. 130. Robert C. Martin의 그래프
  131. 131. Instability •패키지의 움직일 수 있는 여력을 판단하는 지표 •다른 패키지에 영향을 미치지 않고, 해당 패키지를 쉽게 변경 할 수 있는가? •Instability I = Ce / (Ca+Ce) •Ce = Efferent Coupling (Ingoing Dependencies) •Ca = Afferent Coupling (Outgoing Dependencies )
  132. 132. Instability Instability I = Ce / (Ca+Ce) 당신의 패키지가 다른 사람이 많이 쓴다면, 즉 Outgoing, Ca가 많다면, 여러분의 패키지는 변경하기 어렵다. 반대로 Outgoing하는 Ca가 적고, Ingoing(다른 패키지만 사용만 하는) Ce, 여러분의 패키지는 쉽게 변경해도 된다. 즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
  133. 133. 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만 있다.
  134. 134. 다시 보는 그래프 다른데서 많이 쓰는 녀석이니 조금 더 abstract를 높여야 돼!
  135. 135. 그 외 용어 •Tangled Complexity •순환 참조가 있어 Boundary를 깰 때 •Cyclomatic Complexity •분기 문이 많아 hotspot이 될 가망성이 높은 곳
  136. 136. 경고!!! 환자의 외부 증상만 고치는 의사가 되지 말자!! 이러한 정보는 좋은 가이드일뿐!! 숫자에 의존하다가 오히려 아키텍쳐가 무너진다.
  137. 137. Q &A
  • innurman

    Feb. 5, 2018
  • hoyuo

    Jun. 13, 2016
  • JasonjJang

    Mar. 18, 2016
  • chjin

    Aug. 5, 2015
  • gavin612

    Jul. 20, 2015
  • OhWook

    Jun. 25, 2015
  • Sangkyun

    Mar. 11, 2015
  • ssuser4a734e

    Mar. 6, 2015
  • ThomasSangJoonKim

    Feb. 28, 2015
  • ssuser6ed138

    Feb. 23, 2015
  • ssuserd2afba

    Feb. 23, 2015
  • cwdoh

    Feb. 23, 2015
  • hyeongdolee

    Feb. 22, 2015
  • denexus

    Feb. 22, 2015
  • taehwandev

    Feb. 22, 2015
  • drcarter82

    Feb. 22, 2015
  • tongjang75

    Feb. 10, 2015
  • tagnee

    Jan. 26, 2015
  • dongseopkim1

    Jan. 20, 2015
  • jjmahoni

    Dec. 11, 2014

안드로이드 개발에 필요한 오픈소스

Views

Total views

14,335

On Slideshare

0

From embeds

0

Number of embeds

121

Actions

Downloads

206

Shares

0

Comments

0

Likes

44

×