안드로이드 개발자에 필요한 오픈소스이야기
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 8,697 views

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

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

Statistics

Views

Total Views
8,697
Slideshare-icon Views on SlideShare
8,644
Embed Views
53

Actions

Likes
19
Downloads
114
Comments
1

9 Embeds 53

http://www.heej.net 41
http://munggus.blogspot.kr 2
http://www.mashup.or.kr 2
http://mail.welgate.com 2
http://nigayo.com 2
https://m.facebook.com&_=1368451329290 HTTP 1
http://munggus.blogspot.in 1
https://www.facebook.com 1
http://www.nigayo.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

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

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • 완전 재밌는데요 ^^. 지식공유 시간이나 다른 시간에 해 주세요!
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • http://myossdevblog.blogspot.com/2009/03/microlog4android.html

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

  • 안드로이드 개발자를 위한 오픈 소스 이야기
  • SW 아키텍트 포럼 모바일 분과 fHalo 팀손영수 Filpboard 팀 ligbuf 팀
  • 요즘 업계 흐름은알고 가시죠 ^^
  • Google이 꿈꾸는..Android의 미래
  • Google은 왜 MODU의 특허를50억에 샀을까?
  • MODU의 Jacket 시스템
  • 이게왜 중요하지?..
  • 갈수록 증가하는 모바일 Traffic 2010 2011 2012 2013 2014 2015 6253991 3805989 2197563 1162950 546050 236676 Cisco (2012), Cisco Visual Networking Index 단위 TB/월
  • 사실 Google의서비스는 Cloud에..
  • Android는 Google의 서비스를(개인, 가정이) 소비하게 만드는 Hub
  • Android는 더 이상Gadget을 위한 OS가 아니다.
  • Embedded System을포괄할 OS로 봐야 함.
  • 하지만..
  • 제조사 입장에서 Android는 독이 든 성배..
  • 오픈소스의 개방성 Android Qt Symbian Meego Mozilla Webkit Linux Eclipse 84 68 71 65 58 58 61 23 OpennessVision Mobile Report July, 2011- http://bit.ly/oTmEmF
  • 오픈 소스 이긴 한데..구글러가 아니면 할수 있는게 없다…
  • 정리하면..버그만 잡아줘..
  • 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)
  • Welcome to my Journey!
  • 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 분석 방법
  • # 1. Binder..
  • ContentsActivity Provider BroadcastService Reciever
  • 하지만… 우리가주목해야 할 것은..
  • 왜 Binder가중요하지?
  • Android 내의 모든 상황을감독하는 감시관!
  • 갑자기 뚝 하고나온 녀석이 아니다. 아주..일반적인 아키텍쳐일뿐.
  • Binder Architecture IDL Compiler in args operation() Client Object OBJ REF out args, return IDL SKEL IDL Binder STUBS INTERFACE Object AdapterBinder
  • Binder를느낄 수 있는 예제 AIDL 샘플 참고http://bit.ly/85E5SV
  • 1. AIDL 파일 생성package aexp.aidl; // Adder service interface. interface IAdderService { int add( in int i1, in int i2 ); }
  • 2. AIDL 툴로 Java 파일 생성수동 코드 생성sdk/platforms/android- <n>/tools/aidl 에 간다C:Android-projectApiDemossrccomexampleandroidapisapp>aidl -IC:Android- projectApiDemossrc IRemoteService.aidlEclipse에서는 aidl만 넣고 빌드하면 자동으로 소스 생성 됨
  • 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" ); }}
  • 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>
  • 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" ); } };
  • 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;}
  • 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" ); } } ….
  • 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_clientcalls 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
  • Registration Service, BR, Activity… Brokerstart Initialize() main_evnet_loop() register_service() update_repository() acknowledgment enter_main_loop()
  • Sending Request Client Client-Side Broker Server-Side Server Proxy Proxycall_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
  • 사용하기 힘든 Binder.. Intent는 Binder를쉽게 사용할 수 있는 추상화 도 구.
  • Intent를 잘 알면. Android를 잘~~ 개발 할 수 있다.
  • Intent로 Activity 호출Intent intent =new Intent(getApplicationContext(), MyOtherActivity.class);startActivityForResult(intent, SHOW_SUBACTIVITY);그런데, Activity 이름이 바뀌면…
  • 그래서 묵시적 IntentManifest 파일에 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);
  • # 2.아직도 Logcat?
  • 여러분이 만든 시스템이 죽었다. 미국에서….
  • Logcat 보러 출
  • 새로운 log.. 4
  • 먼저Log Management 패턴부터…
  • log4xxx
  • Microlog4android 사용법• http://code.google.com/p/microlog4android/downloads/에서 microlog4android-1.0.0.jar 다운• Android 프로젝트에 jar 추가• AndroidManifest.xml에 android.permission.WRITE_EXTERNAL_STORAG​​E 추가
  • 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);
  • 로그를Network 서버로 보내는 Appender도 있으나 약간의 코딩이 필요.
  • # 3. REST의 귀찮음. Rest is unrest..
  • StubController DAO Proxy REST DTO GET
  • 같이 뭉쳐 다니는 파라메터는ParameterObject로 묶어라!
  • 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; }
  • Simple Framework를 이용하세요.http://simple.sourceforge.net/
  • 이렇게 됩니다.<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>
  • 이렇게 됩니다. 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; }
  • # 4. 화면 갱신
  • My Market을 기억하시나요?
  • 시작하자마자Loading.. 화면이 뜨면 누가 접속하나요??
  • 시작하자 마자 화면이 나오 게.
  • 그럼. 사용자가직접 당겨서 동기화를?
  • Sync Notificati Service on 2. InsertActivity 1. Register XXXAdapter 3. Notification Contents Provider 4. GetData..
  • @Overridepublic 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();}
  • # 5. UI Patterns 다양한 안드로이드 UI 오픈소스들을 소 http://bit.ly/QyDjMV
  • Android UI Pattern App 다양한 안드로이드 UI 기법을 오픈 소스로 공개http://bit.ly/QyDjMV
  • Android UI Pattern App
  • Android UI Pattern App
  • 예제 1 - android-actionbar
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • colors.xml 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 예제 2android-binding-frameworkhttp://code.google.com/p/android-binding/http://bit.ly/cxxwCF
  • Event에 대한 Binding다음과 같이 버튼에 대한 이벤트Method OnClick()
  • Main.xml
  • CalculateViewModel.java
  • Option.xml
  • Main Activity
  • Main Activity
  • # 6. fhalo framework facebook framework Project
  • 세계에서 가장 큰 서비스 (약 8억5천만) 854,750,780
  • 가장 오랜시간 이용하는 서비스
  • 을 개발하려면…너무 많은 것을 알아야 한다. Social Plugin ? Open Graph ? Social Channels ? Authentication ? Graph API ?
  • 그래서 우리는.. framework facebook framework Project 를 시작했습니다.
  • Facebook 기본 개념 - 소셜 그래프 94
  • 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
  • Graph API Example• https://graph.facebook.com/100001066448386/ 신재명 ID• https://graph.facebook.com/40796308305/ 코카콜라 페이지 ID 96
  • 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
  • Connection - Example• Graph API 예시 – https://graph.facebook.com/100001066448386/friends 그럼 보안문제는 ??? 98
  • Access Token• 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다.• Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 99
  • About Graph API• Graph API Explorer – Access Token 받을 수 있다 – 각종 Graph API를 테스트 해볼 수 있다 https://developers.facebook.com/tools/explorer#!/tools/explorer
  • 사용법Step1 Step2 Step3 Step4Import fHalo.jar Get access token Create instance Using API 101
  • Access Token• 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다.• Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 102
  • 친구 리스트 가져오기 (페이스북 API)
  • 친구 리스트 가져오기– Rest FB • Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class);– fHalo • Connection<Friends> friends = user.friends();
  • 피드 올리기(페이스북 API)
  • 피드 올리기– 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);
  • # 7. 분석은 어떻게?
  • Sleep If you can.
  • Thanks 신재명
  • Issue..
  • 월드 와이드 앱
  • 모바일 어플리케이션 분석 플랫폼
  • 메인 DASHBOARD
  • Daypart
  • Device (국내는…)
  • Device (월드 와이드 앱은..)
  • App Version
  • TagEvent (사용자가 많이쓰는 기능)
  • 사용자가 어떤 화면을 많이 사용하는지 (유료기능)
  • 이외에도..• New vs Returning• Carrier• Country• OS Version
  • 적용방법• http://www.localytics.com/에서• 탭 에서 어플리케이션 등록
  • • http://bit.ly/KnZzpx 에서 소스코드 다운• Android 프로젝트 src/폴더에 소스코드 추가• AndroidManifest.xml에 퍼미션 추가<uses-permission android:name="android.permission.INTERNET“>
  • • 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 . . . }
  • • onResume 메소드 Override public void onResume() { super.onResume(); this.localyticsSession.open(); }• onPause 메소드 Override public void onPause() { this.localyticsSession.close(); this.localyticsSession.upload(); super.onPause(); }
  • • TagEvent남기기 localyticsSession.tagEvent(“TagEvent남김 ");
  • # 8. 1000 피트의 뷰.
  • 높이 (30000 feet)봐야 할까?
  • 높이 봐야 할까?
  • 자세히 (0 feet) 봐야 할까?
  • 자세히 봐야 할까?
  • 3만 피트 vs 0 피트의 뷰. 3만 피트 • 다이어그램의 Line의 의미는? • 의존성? • 데이터 흐름? • 버스와 같은 공유자원? 0 피트 • 너무 상세한 정보임. • 전체적인 구조를 보지 못함.
  • 해결책은..적절한 1000 피트의 뷰
  • STAN (Structure Analysis for Java)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,여러분의 패키지는 쉽게 변경해도 된다.즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
  • 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이 될 가망성이 높은 곳
  • 경고!!!환자의 외부 증상만고치는 의사가 되지 말자!!이러한 정보는 좋은 가이드일뿐!!숫자에 의존하다가오히려 아키텍쳐가 무너진다.
  • Q &A