SlideShare a Scribd company logo
1 of 115
안드로이드,
오픈 소스, 그리고 패턴
손영수   EngFlip팀
요즘 업계 흐름은
알고 가시죠 ^^
Google이
  꿈꾸는..

Android의 미래
Google은

왜 MODU의
  특허를
50억에 샀을
   까?
MODU의 Jacket 시스템
이게
왜 중요하지?..
사실 Google의
서비스는 Cloud에..
Android는 Google의 서비스를

(개인, 가정이) 소비하게 만드는 Hub
Android는
   더 이상
Gadget을 위한
 OS가 아니다.
Embedded
  System을
포괄할 OS로 봐야 함.
하지만..
제조사 입장에서
Android@Home
은 독이 든 성배.
Welcome to my
Journey!
Agenda
• 안드로이드 이해
 – Binder (Broker 패턴) 그리고 Intent


• 오픈 소스 그리고 사례
 – Simple Framework (Parameter Object)
 – 불편하지 않은 화면 갱신 (Publisher-Subscriber)


• 분석 방법
 – Localytics 사용법
 – STAN을 이용한 Android App 분석 방법
# 1. Binder..
Contents
Activity
           Provider



           Broadcast
Service
           Reciever
하지만…

   우리가
주목해야 할 것은..
왜 Binder가
중요하지?
Android 내의
  모든 상황을
감독하는 감시관!
갑자기 뚝 하고
나온 녀석이 아니다.

    아주..
일반적인 아키텍쳐일뿐.
Binder Architecture

                        IDL
                        Compiler




                              in args
                              operation()
 Client                                       Object
                  OBJ
                  REF     out args,
                          return



                                             IDL
                                            SKEL
           IDL            Binder
          STUBS         INTERFACE              Object Adapter


Binder
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.aidl



Eclipse에서는 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_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
Registration
        Service, BR, Activity…                     Broker

start
               Initialize()                             main_evnet_loop()




                                   register_service()



                                                            update_repository()

               acknowledgment




               enter_main_loop()
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
사용하기
           힘든 Binder..

    Intent는 Binder를
쉽게 사용할 수 있는 추상화 도구.
Intent를 잘 알면.
 Android를 잘~~
 개발 할 수 있다.
Intent로 Activity 호출

Intent intent =
new Intent(getApplicationContext(), MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);




그런데, Activity 이름이 바뀌면…
그래서 묵시적 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);
# 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..
Stub



Controller          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. Insert



Activity
             1. Register

 XXX
Adapter      3. Notification
                                       Contents
                                       Provider

           4. GetData..
@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();
}
# 5. 분석은 어떻게?
영어발음 트레이너
영어발음 트레이너

사용자의 패턴분석
모바일 어플리케이션
  분석 플랫폼
메인 DASHBOARD
Daypart
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남김
 ");
# 6. 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 (Outgoing Dependencies)
•Ca = Afferent Coupling (Ingoing Dependencies )
Instability




                  Instability I = Ce / (Ca+Ce)
당신의 패키지가 다른 사람이 많이 쓴다면,
즉 Outgoing, Ce가 많다면, 여러분의 패키지는 변경하기 어렵다.

반대로 Outgoing하는 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이 될 가망성이 높은 곳
경고!!!
환자의 외부 증상만
고치는 의사가 되지 말자!!

이러한 정보는 좋은 가이드일뿐!!

숫자에 의존하다가
오히려 아키텍쳐가 무너진다.
# 7. 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예제   색변경
예제 2
android-binding-framework

http://code.google.com/p/android-binding/

http://bit.ly/cxxwCF
Event에 대한 Binding




다음과 같이 버튼에 대한 이벤트
Method OnClick()
Main.xml
CalculateViewModel.java
Option.xml
Main Activity
Main Activity
Q &A

More Related Content

What's hot

[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발NAVER D2
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10hungrok
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10hungrok
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 threadDaeHee Jang
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로NHN FORWARD
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GDG Korea
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10hungrok
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기YoungSu Son
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
안드로이드App개발 09.task
안드로이드App개발 09.task안드로이드App개발 09.task
안드로이드App개발 09.taskDaeHee Jang
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸MoonGyeom1
 
Software Architect day - 웹 프레임워크 종결 - metaworks3
Software Architect day - 웹 프레임워크 종결 -  metaworks3Software Architect day - 웹 프레임워크 종결 -  metaworks3
Software Architect day - 웹 프레임워크 종결 - metaworks3uEngine Solutions
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회beom kyun choi
 

What's hot (20)

Redux
ReduxRedux
Redux
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
안드로이드App개발 09.task
안드로이드App개발 09.task안드로이드App개발 09.task
안드로이드App개발 09.task
 
Xe hack
Xe hackXe hack
Xe hack
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸
 
Software Architect day - 웹 프레임워크 종결 - metaworks3
Software Architect day - 웹 프레임워크 종결 -  metaworks3Software Architect day - 웹 프레임워크 종결 -  metaworks3
Software Architect day - 웹 프레임워크 종결 - metaworks3
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 

Viewers also liked

스마트폰 팁 #3: 스마트폰 해제패턴 풀기!
스마트폰 팁 #3: 스마트폰 해제패턴 풀기!스마트폰 팁 #3: 스마트폰 해제패턴 풀기!
스마트폰 팁 #3: 스마트폰 해제패턴 풀기!Seho Yoon
 
Android 삽질일지
Android 삽질일지Android 삽질일지
Android 삽질일지Hyunho-Cho
 
안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2YoungSu Son
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들Sewon Ann
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드Taeho Kim
 
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서Chansuk Yang
 

Viewers also liked (6)

스마트폰 팁 #3: 스마트폰 해제패턴 풀기!
스마트폰 팁 #3: 스마트폰 해제패턴 풀기!스마트폰 팁 #3: 스마트폰 해제패턴 풀기!
스마트폰 팁 #3: 스마트폰 해제패턴 풀기!
 
Android 삽질일지
Android 삽질일지Android 삽질일지
Android 삽질일지
 
안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
 
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서
안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서
 

Similar to 안드로이드 오픈소스 그리고 패턴

Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발LGU+
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경YoungSu Son
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기OnGameServer
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 SeongHyun Ahn
 
Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Tae Ho Kang
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 
Python server-101
Python server-101Python server-101
Python server-101Huey Park
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)Hankyo
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 SeongHyun Ahn
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2Juwon Kim
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoringJeong-Ho Na
 
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...Amazon Web Services Korea
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
 

Similar to 안드로이드 오픈소스 그리고 패턴 (20)

Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 
Python server-101
Python server-101Python server-101
Python server-101
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoring
 
테스트
테스트테스트
테스트
 
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...
AWS Greengrass, Lambda and ML Inference at the Edge site (김민성, AWS 솔루션즈 아키텍트)...
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 

More from YoungSu Son

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴 YoungSu Son
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningYoungSu Son
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화YoungSu Son
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) YoungSu Son
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)YoungSu Son
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기) YoungSu Son
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 YoungSu Son
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) YoungSu Son
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) YoungSu Son
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) YoungSu Son
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 YoungSu Son
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항 YoungSu Son
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법YoungSu Son
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법 YoungSu Son
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 YoungSu Son
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionYoungSu Son
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 

More from YoungSu Son (20)

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance Tuning
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭)
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기)
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기)
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + Genymotion
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 

안드로이드 오픈소스 그리고 패턴

  • 2. 손영수 EngFlip팀
  • 5. Google은 왜 MODU의 특허를 50억에 샀을 까?
  • 9.
  • 10. Android는 Google의 서비스를 (개인, 가정이) 소비하게 만드는 Hub
  • 11. Android는 더 이상 Gadget을 위한 OS가 아니다.
  • 12. Embedded System을 포괄할 OS로 봐야 함.
  • 16. Agenda • 안드로이드 이해 – Binder (Broker 패턴) 그리고 Intent • 오픈 소스 그리고 사례 – Simple Framework (Parameter Object) – 불편하지 않은 화면 갱신 (Publisher-Subscriber) • 분석 방법 – Localytics 사용법 – STAN을 이용한 Android App 분석 방법
  • 18. Contents Activity Provider Broadcast Service Reciever
  • 19. 하지만… 우리가 주목해야 할 것은..
  • 20.
  • 22. Android 내의 모든 상황을 감독하는 감시관!
  • 23. 갑자기 뚝 하고 나온 녀석이 아니다. 아주.. 일반적인 아키텍쳐일뿐.
  • 24. Binder Architecture IDL Compiler in args operation() Client Object OBJ REF out args, return IDL SKEL IDL Binder STUBS INTERFACE Object Adapter Binder
  • 25. Binder를 느낄 수 있는 예제 AIDL 샘플 참고 http://bit.ly/85E5SV
  • 26. 1. AIDL 파일 생성 package aexp.aidl; // Adder service interface. interface IAdderService { int add( in int i1, in int i2 ); }
  • 27. 2. AIDL 툴로 Java 파일 생성 수동 코드 생성 sdk/platforms/android- <n>/tools/aidl 에 간다 C:Android-projectApiDemossrccomexampleandroidapisapp>aidl -IC:Android- projectApiDemossrc IRemoteService.aidl Eclipse에서는 aidl만 넣고 빌드하면 자동으로 소스 생성 됨
  • 28. 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" ); } }
  • 29. 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>
  • 30. 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" ); } };
  • 31. 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; }
  • 32. 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" ); } } ….
  • 33. 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
  • 34. Registration Service, BR, Activity… Broker start Initialize() main_evnet_loop() register_service() update_repository() acknowledgment enter_main_loop()
  • 35. 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
  • 36. 사용하기 힘든 Binder.. Intent는 Binder를 쉽게 사용할 수 있는 추상화 도구.
  • 37. Intent를 잘 알면. Android를 잘~~ 개발 할 수 있다.
  • 38. Intent로 Activity 호출 Intent intent = new Intent(getApplicationContext(), MyOtherActivity.class); startActivityForResult(intent, SHOW_SUBACTIVITY); 그런데, Activity 이름이 바뀌면…
  • 39. 그래서 묵시적 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);
  • 41. 여러분이 만든 시스템이 죽었다. 미국에서….
  • 44. 먼저 Log Management 패턴부터…
  • 46. Microlog4android 사용법 • http://code.google.com/p/microlog4android/downloads/에서 microlog4android-1.0.0.jar 다운 • Android 프로젝트에 jar 추가 • AndroidManifest.xml에 android.permission.WRITE_EXTERNAL_STORAG​​E 추가
  • 47. 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);
  • 48. 로그를 Network 서버로 보내는 Appender도 있으나 약간의 코딩이 필요.
  • 49. # 3. REST의 귀찮음. Rest is unrest..
  • 50. Stub Controller DAO Proxy REST DTO GET
  • 51. 같이 뭉쳐 다니는 파라메터는 ParameterObject로 묶어라!
  • 52. 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; }
  • 53. Simple Framework를 이용하세요. http://simple.sourceforge.net/
  • 54. 이렇게 됩니다. <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>
  • 55. 이렇게 됩니다. 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; }
  • 56. # 4. 화면 갱신
  • 61. Sync Notificati Service on 2. Insert Activity 1. Register XXX Adapter 3. Notification Contents Provider 4. GetData..
  • 62. @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(); }
  • 63. # 5. 분석은 어떻게?
  • 66. 모바일 어플리케이션 분석 플랫폼
  • 72. 이외에도.. • New vs Returning • Carrier • Country • OS Version
  • 73. 적용방법 • http://www.localytics.com/에서 • 탭 에서 어플리케이션 등록
  • 74. • http://bit.ly/KnZzpx 에서 소스코드 다운 • Android 프로젝트 src/폴더에 소스코드 추가 • AndroidManifest.xml에 퍼미션 추가 <uses-permission android:name="android.permission.INTERNET“>
  • 75. • 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 . . . }
  • 76. • onResume 메소드 Override public void onResume() { super.onResume(); this.localyticsSession.open(); } • onPause 메소드 Override public void onPause() { this.localyticsSession.close(); this.localyticsSession.upload(); super.onPause(); }
  • 78. # 6. 1000 피트의 뷰.
  • 81. 자세히 (0 feet) 봐야 할까?
  • 83. 3만 피트 vs 0 피트의 뷰. 3만 피트 • 다이어그램의 Line의 의미는? • 의존성? • 데이터 흐름? • 버스와 같은 공유자원? 0 피트 • 너무 상세한 정보임. • 전체적인 구조를 보지 못함.
  • 85.
  • 86. STAN (Structure Analysis for Java) STAN - http://stan4j.com/eclipse/eclipse-integration.html
  • 87. Robert C. Martin의 그래프
  • 88. Instability •패키지의 움직일 수 있는 여력을 판단하는 지표 •다른 패키지에 영향을 미치지 않고, 해당 패키지를 쉽게 변경 할 수 있는가? •Instability I = Ce / (Ca+Ce) •Ce = Efferent Coupling (Outgoing Dependencies) •Ca = Afferent Coupling (Ingoing Dependencies )
  • 89. Instability Instability I = Ce / (Ca+Ce) 당신의 패키지가 다른 사람이 많이 쓴다면, 즉 Outgoing, Ce가 많다면, 여러분의 패키지는 변경하기 어렵다. 반대로 Outgoing하는 Ce가 적다면, 여러분의 패키지는 쉽게 변경해도 된다. 즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
  • 90. 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만 있다.
  • 91. 다시 보는 그래프 다른데서 많이 쓰는 녀석이니 조금 더 abstract를 높여야 돼!
  • 92. 그 외 용어 •Tangled Complexity •순환 참조가 있어 Boundary를 깰 때 •Cyclomatic Complexity •분기 문이 많아 hotspot이 될 가망성이 높은 곳
  • 93. 경고!!! 환자의 외부 증상만 고치는 의사가 되지 말자!! 이러한 정보는 좋은 가이드일뿐!! 숫자에 의존하다가 오히려 아키텍쳐가 무너진다.
  • 94. # 7. UI Patterns 다양한 안드로이드 UI 기법을 소개 http://bit.ly/QyDjMV
  • 95. Android UI Pattern App 다양한 안드로이드 UI 기법을 오픈 소스로 공개 http://bit.ly/QyDjMV
  • 98. 예제 1 - android-actionbar
  • 99. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 100. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 101. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 102. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 103. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 104. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 105. colors.xml 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 107. Event에 대한 Binding 다음과 같이 버튼에 대한 이벤트 Method OnClick()
  • 110.
  • 114.
  • 115. Q &A

Editor's Notes

  1. http://myossdevblog.blogspot.com/2009/03/microlog4android.html