본문 바로가기
TIL/Android

안드로이드 기초

by J1-H00N 2024. 3. 19.

애플리케이션 프레임워크 - 같은 양식의 코드를 사용해 가독성과 유지보수성을 높인다.

ART 가상머신 - 자바로 짜여진 코드를 설치된 단말기에 최적화된 기계어로 변환하면서 설치해 더 빠르게 실행된다. 기존에는 dalvik 가상머신을 사용했는데 이는 실행할 때마다 기계어로 번역해야 했기에 느렸었다.

OPEN GL ES 3.x 기반 3D 그래픽 지원

SQLite 데이터베이스 지원 - 단말기에 내장되어있는 데이터베이스를 통해 데이터를 관리한다.

Android Studio IDE 제공 - 안드로이드 전용 개발 도구

안드로이드 구조

  • 리눅스 커널
  • HAL: 리눅스 커널과 하드웨어 기기간의 인터페이스 부분으로 단말기 제조사가 드라이버를 구현할 수 있도록 제공하는 계층
    • OS와 기기를 둘 다 자기들이 만드는 애플과 달리 안드로이드는 제조사가 다양해 단말기의 하드웨어와 OS가 소통하기 위해 필요하다.
    • OS가 HAL을 통해 명령어를 전달한다.
  • Android 런타임: 안드로이드 애플리케이션을 구동하기 위한 가상머신이다. 5.0 이상은 ART를 사용한다.
  • Native C/C++: 안드로이드 OS가 애플리케이션 및 기능들을 구동하기 위해 사용하는 라이브러리. 개발자가 JAVA나 Kotlin으로 구현한 API를 이용해 여기에 있는 C 코드를 작동한다.
  • Java/Kotlin API: 개발자가 애플리케이션을 제작할 때 사용하는 라이브러리.
    • 공식 언어는 Kotlin이지만 JAVA도 지속적으로 지원하고 있다.
  • 시스템 앱: OS 내부에 저장되어 있는 애플리케이션으로 개발자가 애플리케이션을 개발할 때 일부 기능을 가져다 사용할 수 있다. (카메라, 달력 등)
  • Java/Kotlin API와 시스템 앱으로 개발한 컨텐츠가 ART 가상머신 위에서 동작하고, 이 API는 C/C++ 코드를 동작시켜 실행한다. 
    • C/C++을 사용하는 이유는? => C 언어가 하드웨어와 더 가까운 언어라 더 빠르게 실행되어 성능이 향상되기 때문이다.

 

Android X 라이브러리

안드로이드는 지속적인 업데이트로 인해 하위 버전과 상위 버전의 OS 간 차이가 심하게 나타난다.

이에 상위 버전에서 추가된 기능 중 일부를 하위 버전에서도 사용할 수 있도록 애플리케이션에 추가된 라이브러리를 Support 라이브러리라고 한다.

그런데 이 라이브러리도 버전별로 차이가 너무 나 안드로이드 버전 10부터는 Android X라는 라이브러리로 통합되었다. 

따라서 개발할 때 라이브러리 중 android로 시작하는 것은 해당 버전에서만 사용할 수 있기 때문에 조심해야 한다.

Android X가 애플리케이션에 기본으로 들어가기 때문에 기존보다 용량은 커졌으나, 개발은 쉬워졌다.

 

안드로이드 4대 구성 요소

  • Activity: 눈에 보이는 화면을 관리하는 실행 단위
  • Service: 화면을 가지지 않는 실행 단위, 백그라운드 프로세싱
  • Broadcast Receiver: OS가 메시지를 받으면 실행되는 실행 단위
  • Content Provider: 저장된 데이터를 제공하기 위해 실행되는 실행 단위
  • 안드로이드 애플리케이션은 위 구성요소들을 통합 관리하는 번들 개념이다.

 

Android Studio 환경

최신 버전 설치 후 new project를 클릭하면 여러 선택지들이 있는데, 공통적으로 붙는 activity는 실행 단위라고 한다. 선택지들은 여러 기본 기능이 추가되어있는 팜플릿이라고 생각하면 된다.

Name: 애플리케이션 하단에 적히는 앱 이름(중복 상관X)

Package Name: 앱스토어, 단말기 등에서 애플리케이션을 구분할 수 있는 이름(중복 절대 X)

Minimum SDK: help me choose를 누르면 오른쪽 창이 나오는데, 예를 들어 API Level 23을 선택하면 23보다 낮은 api level을 가지는 버전에서는 서비스 할 수 없지만(98.2 % 서비스 가능), 23 이하의 버전에 있는 기능들만 사용할 수 있다. 그래서 보다 높은 버전의 기능을 사용하기 위해 코드 내에서 api level이 ?? 이상이라면 아래 코드를 실행시키도록 분기를 만들 수도 있다. 그래서 더 많은 기능을 사용할 수 있도록 점유율이 낮은 버전은 빼고 만들도록 추천한다. 보통 6.0 이후가 android가 안정된 이후라고 여겨 marshmallow를 선택한다고 한다. 물론 이 버전은 프로젝트 별로 다르기 때문에 상황에 따라 다르게 선택한다.

 

AVD 테스트

AVD는 안드로이드 에뮬레이터이다. 컴퓨터의 가상화 기능을 사용해 매우 빠르게 동작하는데, 만약 컴퓨터가 가상화를 지원하지 않는다면 매우 느리기 때문에 단말기를 사용해 테스트해야 한다.

 

아래에서 3번째 버튼이 device manger이다. 다양한 액정, dpi, 안드로이드 버전을 테스트 할 수 있다.

실제 테스트를 해보면 위와 같이 youtube까지 들어갈 수 있었다.

Setting -> Tools -> Emulator -> Launch in the Runnig Device tool window 체크 해제하면 새로운 창을 띄울 수 있다.

만약 실제 단말기로 테스트를 해야되는 상황이 되거나 하고 싶고, window 10 미만이라면 해당 단말기의 usb 통합 드라이버를 설치해야 한다. window 10 이상, 맥, 리눅스는 필요 없다.

이후 단말기에서 개발자 메뉴를 활성화한다. 기종마다 다르지만, 설정 -> 휴대전화 정보 -> 소프트웨어 정보 -> 빌드 번호를 찾는다.

해당 버튼을 계속 누르면 활성화 된다.

활성화 후 개발자 옵션 -> USB 디버깅 -> 케이블 연결 -> android studio avd 실행 -> usb 디버깅 허용

그러면 device manager에서 단말기를 통해 테스트 할 수 있다.

 

프로젝트의 구조

  • AndroidManifest.xml: 안드로이드 애플리케이션에 관련된 설정 파일
  • java: 개발자가 작성한 소스코드
  • res: 이미지, 사운드, 데이터 등 애플리케이션에서 필요한 리소스
  • generated java, res: 안드로이드 스튜디오가 필요에 의해 자동 생성한 파일
  • Gradle Scripts: 외부 라이브러리, 프로젝트 컴파일 관리
    • build.gradle: 만약 스마트폰 뿐이 아니라 워치, 자동차 등에도 설치 가능한 애플리케이션을 만든다면 각각의 모듈을 분리해 여러개가 생성된다. 라이브러리 등의 정보를 담고 있다.

 

애플리케이션 설치

제작된 애플리케이션은 apk 파일로 압축돼 마켓에 등록된다.

해당 파일을 다운로드하면 자동으로 설치가 완료되고, 안드로이드 OS는 설치가 완료되면 AndroidManifest.xml의 내용을 분석한다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <!--구성요소 확인-->
        <activity 
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

애플리케이션 실행

안드로이드 애플이케이션이 실행되면 안드로이드 OS는 첫 번째 화면을 보여준다. 여기서 첫 번째는 AndroidManifest.xml에 있는 activity 중에서

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

해당 필터가 있는 activity를 첫 번째로 여긴다.

  • 만약 이런 activity가 여러개라면 혹은 없다면?
    • 여러개 있을 경우에는 어떻게 동작할지 따로 정의되어 있진 않고, 가장 먼저 선언된 activity가 메인 화면으로 설정된다고 한다. 그래서 보통 메인 activity를 가장 처음에 위치해둔다고 한다.
    • 기본 AndroidManifest.xml에서 모든 필터를 제거해봤더니 OS가 애플리케이션 자체를 인식하지 못했다. 메인 화면이 없으니 실행되지 않은 것. 

activity를 특정했다면 해당 activity의 name 속성 클래스의 객체를 생성한 후 onCreate 메서드를 호출한다.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main); // res폴더/layout/activity_main.xml
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }

setContentView를 통해 해당 경로 xml을 분석해 화면을 구성한다.

'TIL > Android' 카테고리의 다른 글

Menu  (0) 2024.04.09
권한  (0) 2024.04.05
Adapter View  (0) 2024.04.04
Widget  (0) 2024.03.28
view와 layout  (0) 2024.03.20