구글링과 주관적인 생각이 들어있어 틀린 답들이 있습니다 정중히 댓글, 수정 부탁드립니다
약 10개식 정리할 예정입니다.
1. 안드로이드 애플리케이션 클래스는 무엇인가요?
> 안드로이드의 Application Class 는 액티비티 및 서비스와 같은 다른 모든 구성 요소(액티비티(Activity), 서비스(Service), 방송수신자(Broadcast receiver), 콘텐츠 제공자(Content provider), 인텐트(Intent))에 접근 가능한 기본 클래스입니다. 또한 애플리케이션 프로세스가 생성될 때, 가장 먼저 초기화 됩니다. 그렇기 때문에, 보통 앱 전역에서 일관성있게, 사용하는 요소들을 등록하여 사용하곤 합니다.
2. 컨텍스트란 무엇인가요?
Context
> Context 는 리소스에 접근하거나, 데이터베이스나 프리퍼런스에 접근하는 등 기타 등등 역할들을 제공한다. 앞으로 비교할 다른 Context 와 다른 중요한 점은 애플리케이션에서 현재 실행되고 있는 환경을 가지고 있다는 것이다.
Application Context
> 애플리케이션 라이프 사이클에 종속되어 있다.(애플리케이션이 만들어지고 유지되다가, 종료될 때 없어진다) 애플리케이션 컨텍스트는 라이프사이클이 현재 컨텍스트와 상관없는 다른 컨텍스트가 필요하거나 액티비티 활동 범위를 벗어난 컨텍스트를 필요할 때 사용할 수 있습니다.
Ex) Dialog 는 액티비티 Context 가 필요하고, Toast 는 Application Context 로 사용할 수 있다. (Toast 는 액티비티와 별개로 Window 를 가지고 있다)
Activity Context
> 액티비티 안에서 사용할 수 있는 Context 로 액티비티 라이프 사이클에 종속되어 있다. 액티비티의 라이프사이클과 맞물리는 작업에서 필요할 때 사용한다. 제일 많이 사용하는 화면이동에서 A 에서 B 로 이동할 경우, 이때 A 의 액티비티 컨텍스트가 필요하다. 물론 Application Context 로도 화면을 실행시킬 수 있지만, 이때는 인텐트에 Intent.FLAG_ACTIVITY_NEW_TASK 플래그가 필요하다
3. ARM64-v8a(64), ARMv7, ARMx86 등.. ABI(Application binary interface)가 무엇인가요?
> 안드로이드 디바이스는 다양한 CPU 를 사용하여 만들고, CPU에서 제공하는 명령셋은 다양하다, 대표적인것이 ARMv7 이 있고, 우리가 작성한 코드가 javac에 의해 바이트 코드(.class)로 바뀌고, Dalvik VM(현재는 ART VM) 안에서 JIT 컴파일을 통해 기계어로 번역 되는데, 이때 이 기계어를 해석하고 명령하는데, 이때 CPU 마다 명령을 실행하는 방법이 다르고, 실행 가능한 바이너리 형식, 명령 집합 등이 정의되어 있는 것이 애플리케이션 바이너리 인터페이스(ABI) 이다.
4. 바이트 코드를 안드로이드에서 바로 실행할 수 있나요 ?
> 바로 실행할 수 없다. Java 바이트 코드를 실행하려면 JVM (Java Virtual Machine)이 필요하지만, 안드로이드는 JVM 대신 Dalvik VM 을 사용하여, 메모리, 배터리 수명 및 성능에 더 초점을 맞춰 개발이 되었기 때문에 실행할수 없다.(라이센스 문제도 있었다고 한다.) 또한 dx 라는 안드로이드 도구를 사용하여 Java 클래스 파일을 Dalvik 실행 파일(.dex 파일)로 바꿔 실행한다.
Dalvik VM : 32비트만 지원 (JIT 컴파일러 - 실행하면 만들어 놓고)
ART VM : 32비트, 64 비트 모두 지원 (AOT 컴파일러 - 미리 만들어 놓고)
5. 빌드타입이 무엇인가요?
> 빌드타입이란 현재 사용하고 있는 라이브러리, 모듈 등의 빌드 방법을 정의하는 것이다. 안드로이드 앱이 패키징 되고, 빌드 될 때 그래들을 사용하여 빌드 타입을 정의할 수있다. 빌드할 때 추가되어야하는 리소스를 분리하여 적용할 수 있다. 또한 build variant 와 다양하게 조합해서 제품의 flavours 나 build type 을 정의할 수 있다.
Ex) flavor = [local, dev, stage, real]
Ex) buildType = [debug, release]
localDebug, localRelease, devDebug, devRelease, stageDebug, stageRelease, realDebugm realRelease 등.
6. 안드로이드 빌드 프로세스에 대해 간략하게 설명해보세요.
> 첫째로 Android asset packaging tool (AAPT) 를 사용하여 리소스(/res 이하 파일들)를 컴파일한다. 이때 R.java 라고 불리는 하나의 클래스로 컴파일 되어진다.
두번째로 .java 파일들이 javac 로 부터 .class 파일로 컴파일 된다. 그리고 클래스 파일들은 dx 툴(Android SDK tools 아래 포함되어 있다)에 의해 달빅 바이트 코드(classes.dex)로 변환된다.
마지막으로 APKbuilder 에 의해 apk(android packagin key) file이 만들어 진다. 현재는 각 디바이스의 해상도, 언어, abi 타입등으로 나눠 들어가 있는 apks 로 제공되어 나중에 디바이스에 필요한 리소스만 가지고, 애플리케이션을 만드는 AAB(android app bundle) 로 사용되기도 한다
7. 액티비티가 무엇인지 한줄로 정의해보세요
액티비티는 기본적으로 컨테이너의 역할을 하고, 사용자 인터페이스 화면을 구성하는 컴포넌트이다.
8. 액티비티 라이프 사이클에 대해 말해주세요.
onCreate() : 뷰가 처음 만들어 질 때 호출된다. 보통 뷰를 만들고, 초기화 하거나 번들로부터 데이터를 받아오는 코드를 많이 작성한다.
onStart() : 액티비티가 유저에게 가시적일 때 호출된다. 더 나아가 액티비티가 포그라운드로 오면, onResume 이 호출되고, 내려가면 onStop 이 호출된다.
onRestart() : onStop() 이 호출되었던 액티비티가 포 그라운드로 돌아오면 호출되는 메서드 이후 onStart() 를 호출한다.
onResume() : 액티비티가 유저와 상호작용하고 있을 때 호출된다. 액티비티 스택에서 가장 위에 있는 액티비티는 유저의 입력을 받을 수 있다.
onPause() : 액티비티가 백그라운드로 가기전 상황으로 부분적으로 가려질 때 호출된다. 아직 Killed 되지 않은 상황이다.
onStop() : 액티비티가 보여지지 않게 되었을 때 (백그라운드로 갔을 때) 호출된다. 더 나아가 액티비티가 종료되면 OnDestroy 가 호출되고, 포 그라운드로 돌아오면 onRestart() 가 호출된다.
onDestroy() 액티비티가 종료될 때 호출된다.
9. onCreate() 와 onStart 는 어떤 점이 다른가요 ?
> onCreate() 메소드는 애플리케이션이 시작되거나, 액티비티가 삭제된후 재생성될 때, 액티비티 사이클에서 한번만 호출된다. (앱의 구성요소 (언어, Orientation, 등) 가 변경되어 액티비티가 부서지고 다시 생성될 때 등)
> onStart() 메소드는 언제든지 액티비티가 유저에게 보여줄 준비가 되었을 때(가시적일때) 호출될 수 있다. 전형적으로 onCreate() 이후나, onRestart() 이후에 호출된다.
10. 액티비티에서 onPause 나 onStop 이 호출되지 않고 onDestroy 가 호출되는 경우는 언제인가요 ?
onCreate() 함수 안에서, finish() 를 호출할 경우 시스템은 직접 onDestroy() 를 호출한다.
11. LMK 가 무엇인가요 ?
LMK(Low Memory Killer) 안드로이드에서 가용 메모리(available memory)가 부족할 때 프로세스들을 죽이는 동작이다.
LMK의 목적
LMK의 목적은 바로 가용 메모리를 확보하는 것이다. 이것이 부족하면, PC나 휴대폰 등과 같은 시스템들의 성능이 크게 떨어집니다. 무지무지 느려지는 거죠. 심하면 앱 하나 띄우는데 몇 초 이상의 시간이 걸릴 수도 있습니다. 이런 문제를 방지하기 위해서 안드로이드는 사용하지 않는 프로세스들을 메모리에서 지워야 합니다. 여러분들이 가지고 계시는 안드로이드 폰들에서 LMK가 바로 이러한 역할을 수행하고 있습니다.
LMK 의 Priority
LMK 는 우선순위를 가지며 우선순위가 낮은 경우 부터 메모리에서 해제된다. (아래로 갈수록 우선순위가 낮다)
foreground process(현재 포그라운드에 올라온 애플리케이션, 현재 동작하고 있는 서비스)
visible process(사용자가 화면에서 볼 수 있지만 포그라운드가 아닌 경우 ex. 다이얼로그 에 가려진 onPause 상황 )
service process (직접 화면에 보이지는 않지만, 백그라운드에서 동작하는 데이터 업로드 또는 다운로드 경우, 오랫동안 동작한 서비스)
cached process (현재 사용하지는 않지만, 메모리에 적재되어 있는 프로그램)
OOM Killer와 LMK
안드로이드는 먼저 LMK 로 진행하다가, 더 이상 내릴 프로그램이 없을 때 OOM 순서를 밟는다.
'Android > Interview Question' 카테고리의 다른 글
안드로이드 면접 질문 6 (0) | 2019.11.05 |
---|---|
안드로이드 면접 질문 5 (1) | 2019.11.05 |
안드로이드 면접 질문 4 (0) | 2019.11.05 |
안드로이드 면접 질문 3 (0) | 2019.11.05 |
안드로이드 면접 질문 2 (0) | 2019.10.31 |