강의노트

[Andriod] 안드로이드 플랫폼 2일차 -주말 10/1(토)

GS_Park 2016. 10. 1. 10:18


아침에 일어났는데 이래저래 몸이 좋지 않습니다. 그럼에도 불구하고!!! 수업을 들으러 가산디지털단지역으로!!! 그리고 Kosta 교육장으로!! 약간 늦었고 열심히 수업이 진행되고 있었습니다.



=========================================      1      ============================================

( 10 : 10 ~ 11 : 03 )


서비스!

서비스에 대한 내용 설명이 계속 진행되었습니다.

안드로이드 서비스의 분류 및 특징을 설명하셨습니다.

서비스는 공통적으로(해당 엑티비티 외의 엑티비티도) 사용할 수 있도록 하는 것이좋다고 하셨습니다. 그렇게 하기 위해서는 엑티비티와 따로 동작할 수 있도록 프로세스를 하나 추가로 생성하여 서비스가 동작할 수 있도록 해 주는것을 권장하셨습니다. 또한 서비스를 만들기 위해서는 Service를 상속받아야 한다고도 하셨습니다.

app에서 프로세스를 분리할지 아닐지 몰라서 두가지 모두 대비하기 위해서는 AIDL을 구현을 해 두는것이 좋습니다. 또한 프로세스를 분리하는 것 역시 AIDL을 구현해야합니다.
 외부 프로세스의 함수를 호출할 수 있는 것이 바인더IPC입니다. IPC의 대부분은 Data에 접근하는 기능을 합니다. 주로 함수호출을 하지는 않습니다. 하지만 객체지향 프로그래밍에서는 함수호출을 통해서 Data 접근을 하기 때문에 바인더 IPC가 필요 한 것입니다. 

 안드로이드 프로세스(안드로이드 어플)의 경우 Android java의 함수를 호출하기 위해서는 역시 커널을 통하면 됩니다. 만약 C나 C++에서 System Call을 통해서 자바의 프로세스를 접근하기가 어렵습니다.. 그 이유는 자바는 커널과 독립적으로 설계가 된 언어이기 때문입니다. 따라서 VM이 커널과의 중제(?)를 해야 하지만 그 윗단에 App Framework에서 구현을 하여 처리를 하고 있습니다.
 Proxy와 Stub, AIDL은 바인거 Proxy와 바인더 Stub Code를 생성 해 주는 것입니다. 

 Native 단에서 BpBinder가 VM의 JNI를 이용하여 바인더 프록시의 요청(?)을 커널로 전달을 해 줍니다. 

 "항상 정답은 코드에 있다." 라는 이야기를 해 주셨습니다. 이론이 중요하지 않은 것은 아니지만, 이론이 100% 완벽하게 구현이 된 코드가 거의 없기때문에 코드를 분석 할 필요가 있습니다. 



=========================================      2      ============================================

( 11 : 20 ~ 12 : 17 )


강사님께서 잊으셨던 소개를 진행해주셨습니다.


그리고 안드로이드 스튜디오를 켜서 코드설명을 진행 해 주셨습니다.






...





리싸이클 함수는 객체를 다 쓴 후 자원회수를 하는 것으로 100%, 완전 회수는 아니지만 다른 Method에서는 사용할 수 있도록 하지만 해당 부분에서는 더이상 사용하지 않을 때 사용한다고 하셨습니다.


바인더 처리를 하기 위해서는 RPC code와 바인더를 넘


stub code에서 onTransact를 확인 해 주면 수행 과정을 확인할 수 있습니다.


  결과값을 받아야 하는경우 Thread간 비동기 통신을 구현해야 합니다. 


Proxy는 클라이언트 쪽에 연결되는 객체이고, Stub은 서비스쪽에 만들어지는 객체입니다.


page 41!  바인더의 동작원리!



=========================================      3      ============================================

( 12 : 30 ~ 13 : 08 )


56 page 


안드로이드 IPC 메커니즘의 종류를 설명을 하시면서 IPC라는 약어를 쓰는 두가지 IPC에 대해 설명을 해 주셨습니다. 저희 수업에 나왔건 내용은 인터 프로세스 커뮤니케이션으로 PC안에서 프로세스간의 통신을 의미하는 것이고, 후자로 추가설명을 해 주셨던 부분은 인터 프로세서 커뮤니케이션으로 PC와 PC의 통신을 의미하는 것 이라고 하셨습니다. 


갑자기 교육 커리큘럽에 대한 몇몇 다른 강의에 대한 설명을 진행 해 주시면서 라즈베리 OS에 코딩을 하고싶다면 파이썬이라는 언어를 사용하기를 권장하셨습니다. 드라이버를 몰라도 쉽게 프로그래밍을 할 수 있다고 하셨습니다.


 바인더가 필요한 근본적인 이유는 메모리 영역을 공유하지 않는 프로세스간의 통신이 필요하기 때문입니다.




=========================================      4      ============================================

( 14 : 22 ~ 15 : 27 )



PPID가 139이면 자바 어플리케이션입니다.


http://androidxref.com/  : 안드로이드 OS의 code를 찾아볼 수 있는 site


OS는 크게 커널과 파일시스템으로 나눌 수 있습니다.

Parcelable은 parcel에 실을 수 있도록 하여 Binder로 활용할 수 있도록하는 것입니다.

(약간 설명이 어설픈 것 같은데 조금 이해가 부족합니다. 추가로 찾아보시기 바랍니다.)


 컨택스트 메니져가 시스템서비스의 객체 포인터를 가지고 있습니다. 따라서 시스템서비스를 이용하고자 하면 서비스메니져(컨텍스트메니져)에 요청을 하야 합니다.

 시스템서비스를 관리하는 컨택스트메니져는 시스템서비스 리스트 테이블을 갖고 있으며 이름과 객체포인터등의 정보를 갖고 있습니다.


 Shell cmd 에서 시스템서비스 리스트를 확인하면 아래와 같습니다.


지금 위에서 확인 된 결과는 94개의 List 목록을 확인할 수 있습니다.


시스템서비스를 개발하고 싶다면 구현을 하고 AddService를 활용하여 서비스를 컨택스트 매니저의 서비스리스트에 등록하여야 합니다.




handle은 Ref pointer의 index! handle은 이론적인 용어일 뿐





=========================================      5      ============================================

( 15 : 43 ~ 16 : 28 )


플렛폼과 관련해서 대새를 바로 따르고 들어갈 수 있도록 기본 지식과 준비에 대한 중요성을 시작으로 5번째 시간 수업을 시작하셨습니다.


 Intent를 사용하는 이유는 바인더 때문이라고 하셨습니다. 프로세스가 분리되어있기 때문에 직접 수행이 불가능 하다는 것은 여러번 이야기를 하셨었습니다. IPC의 핵심, 바인더를 사용해야 IPC가 가능하고 바인더를 사용하려면 Parcelable해야 하고 Intent가 Parcelable 하기 때문입니다.


 진짜로 객체를 넘기고 싶을 경우에는 인텐트와 같이 Parcelable한 인텐트같은 것을 만들어야 한다고 하셨습니다. 인자로는 int, str, object를 넘겨주어야 한다고 하셨습니다. intent에는 객체를 넣을 수 있지만 프로세스를 넘어가야 하는 경우에는 Parcelable해야 한다고 하셨습니다.


 PutExtra로 넘길 때 Process내부로 넘길 때에는 Parcelable 할 필요는 없지만 넘기는 위치가 Process내부인지 외부인지를 확실히 알 수 없는 경우를 대비하여 Parcelable하게 만들어야 한다고 하셨습니다.


 Code분석을 할 때 Intent를 많이 사용한다고 하셨습니다.


82page AIDL 


바인더를 인터페이스로 바꾸는 법, 인터페이스를 바인더로 바꾸는 법을 배웠습니다. page 87참고.


알람 서비스의 경우 자바에 구현이 되있으므로 getInertface를 하여 얻어올 수 있지만 분석을 하고싶을 경우에 코드를 찾는 방법은 AS(Android Studio)에서 찾아볼 수 있지만 그 범위는 안드로이드 자르(import한 Class묶음을 압축 해 둔것)에 들어온 것만 확인할 수 있다고 하셨습니다. service 구현 코드는 AS에서는 볼 수 없고 http://androidxref.com/ 에서 찾아야 합니다.


아니면 자르를 가져와 포함시키면 AS에서도 볼 수 있다고 하셨습니다.



받아주는 서비스코드를 찾으려면 어떻게 해야 하는가?


search iAlramManager를 상속받고 있는 code를 검색하는 것입니다.

가장 아래쪽의 표시된 것이 찾던 분석을 하려고 하는 code입니다.


한번 그렇다면 Audio 관련 code를 분석하려면 어떻게 해야하는지 쉬는시간에 실습을 해 보라고 하셨습니다.


AIDL이란? 


two way와 oneway가 있습니다. 


AIDL의 특징 - 124page



=========================================      6      ============================================

( 16 : 45 ~ 17 : 42 )


마지막 시간은 수업내용을 정리 해 주시면서 예제를 3개 주셨습니다. 해당 예제는 Camera App 관련 예제로 저희 수업의 기기가 전면 카메라만 있어서 전면카메라가 수행되는 것을 확인하였습니다.







시스템 서비스 구현 page 176


1. Proxy

2. stub

3. Interface

4. Service


를 구현하면 됩니다.


 시스템 서비스를 추가하려면 OS는 재빌드를 해야합니다.

 SDK를 따로 빌드해서 만들어야 하는 경우도 소개를 해 주셨습니다. 예를 들어 통신사인 SKT나 KT의 경우에는 통신사 전용 App 개발을 하기 위해서 해당 회사의 SDK를 빌드하여 써드파티 업체에 배포한다는 이야기를 해 주셨습니다.