Flutter - APK 빌드

주세환·2024년 6월 29일
0

Flutter

목록 보기
4/9
post-thumbnail

디바이스와 연결하여 테스트 할 때 어떤 동작을 진행하는지 알아보자.

빌드

빌드란?

Android에서의 빌드는 개발자가 소스 코드를 작성한 후 앱 설치 파일 APK를 만들기까지의 실행 과정을 의미한다.

Android는 기본적으로 Linux 커널 위에 여러 소프트웨어 스택이 쌓인 형태로 Linux의 빌드와 동일하다고 생각하면 된다.

  • Linux에서의 빌드는 소스 코드를 기계어로 컴파일 한 후 사용되는 라이브러리와의 Link를 수행하여 실제 실행 파일로 만드는 과정을 의미한다.


빌드 도구

빌드 도구는 외부 라이브러리 추가 및 업데이트 등의 설정 시간을 단축시킨다. 또한 테스트 실행 및 호환성 체크까지 진행한다.

Android에서 사용되는 빌드 도구는 maven, gradle 등이 있으며 구글에서는 gradle 의 사용을 권장하고 있다.

gradle내부의 빌드 스크립트를 작성하여

  • 앱의 의존성
  • 라이브러리
  • 리소스 파일
  • 빌드 설정

등을 진행한다.


빌드 진행

빌드 프로세스는 gradle 빌드 도구가 수행한다. 빌드 프로세스는 앱의 소스 코드와 별도 스크립트를 결합하여 APK 파일을 생성한다.

  1. 코틀린 컴파일러는 .kt 파일/ 자바 컴파일러는 .java 파일을 .class 바이트코드파일로 변환한다.

    가상 머신(Virtual Machine)에서 실행되기 위한 코드다. 바이트코드는 소스 코드와 기계어(머신 코드)의 중간 형태로, 직접 실행 가능한 바이너리 코드보다 더 추상화된 형태를 가지고 있다.

  2. Android SDKdx 도구를 사용하여 .class 파일들을 .dex 파일로 변환한다.

    • dx : Android SDK에 포함된 유틸리티로, Java 바이트코드 파일(.class 파일)을 Dalvik 바이트코드 파일(.dex 파일)로 변환하는 역할을 한다.
  • dex : dex(Dalvik Executable 파일)은 Android 운영체제에서 실행하기 위한 바이트코드 파일이다. Dalvik 또는 ART 가상 머신에서 실행된다.
  1. Dalvik 또는 ART에서 효율적으로 메모리를 관리
  2. 여러 .class 파일의 내용을 포함하여, 애플리케이션의 로딩 시간을 단축
  3. 실행 선능을 향상시키기 위해 다양한 최적화 적용
  1. Android 리소스 패키징 도구(aapt(Android Asset Packaging Tool))와 gradle 사용하여 리소스 파일 및 외부 라이브러리 모듈을 .dex파일과 함께 APK 파일로 패키징합니다.

  2. APK 파일은 서명되어야 Android 디바이스에서 실행될 수 있다. APK 파일에 서명하기 위해서는 디지털 인증서를 사용해야 한다. APK 파일에 서명하는 작업은 빌드 과정에서 gradle에 설정된 값에 따라 자동으로 수행한다.

이렇게 서명된 APK가 만들어질 수 있다.


APK 설치 및 실행

  • 애플리케이션

    • 애플리케이션 : 사용자가 설치하고 실행하는 앱
    • 앱 실행 : 사용자가 앱을 실행하는 단계
  • 애플리케이션 프레임워크

    • 애플리케이션이 동작하기 위해 필요한 기본 서비스와 클래스들이 포함된 계층. 개발자는 이 계층을 통해 시스템 자원과 서비스를 활용한다.
  • 라이브러리 및 Android 런타임

    • 라이브러리 : 애플리케이션이 동작하기 위해 필요한 기본 서비스와 클래스들이 포함된 계층. 개발자는 이 계층을 통해 시스템 자원과 서비스를 활용한다.
    • Android 런타임 : ART(Android Runtime)와 Dalvik 가상 머신이 포함되어 있다. 이 런타임 환경은 앱이 실행되는 동안 바이트코드를 실행할 수 있게 해준다.
  • 하드웨어 추상화 계층 (HAL)

    • 하드웨어와 소프트웨어 간의 인터페이스를 제공한다. HAL을 통해 Android 시스템이 다양한 하드웨어 기능을 제어할 수 있다.
  • 리눅스 운영체제 (커널)

    • Android의 기본 운영체제. 리눅스 커널은 메모리 관리, 프로세스 관리, 네트워크 스택, 드라이버 등 기본적인 시스템 기능을 제공한다.
  • 하드웨어

    • Android 기기의 물리적인 구성 요소. CPU, GPU, 메모리, 센서 등 다양한 하드웨어가 포함된다.
  • APK와 실행파일

    • 설치 파일(APK) : Android 애플리케이션 패키지 파일로, 앱을 배포하고 설치하기 위한 파일 형식이다.
    • AOT (Ahead-Of-Time) : 설치 시점에 APK를 실행 파일로 변환하는 컴파일 방법이다. 이 방식은 애플리케이션이 실행될 때 성능을 향상시킨다.
    • JIT(Just-In-Time) : 실행 시점에 바이트코드를 기계어로 변환하는 컴파일 방법다. 이 방식은 애플리케이션의 실행 속도를 최적화한다.
    • 실행파일 : APK 파일이 AOT 또는 JIT 컴파일을 통해 변환된 파일로, 실제로 Android 기기에서 실행되는 파일이다.

설치된 APK는 안드로이드 런타임과정을 따라 초기 JIT 방식을 활용하여 앱을 설치한 후, 이후 자주 사용하는 앱을 AOT 방식을 활용하여 컴파일하는 방식으로 진행된다.


스마트폰과 연결 (USB)

  1. PC에 USB로 스마트폰과 연결한다.

  2. 스마트폰 설정 메뉴에서 빌드 번호를 검색한다.

  1. 빌드번호를 연속으로 클릭

  1. 설정에 개발자 옵션이 추가되고, 개발자 옵션에서 USB 디버깅을 활성화

  1. flutter doctor 명령을 입력하면 연결된 장치 갯수 표시됨

  1. 안드로이드 스튜디오에서 연결한 기기를 선택 후 실행버튼 클릭

  1. 실제 기기에서 플러터 데모 앱 실행 완료


워치와 연결

  1. 워치 개발자 옵션 활성화

    1. 갤럭시 워치 설정 메뉴 이동
    2. 워치 정보 선택
    3. 소프트웨어 선택
    4. 소프트웨어 버전 선택
    5. 소프트웨어 버전 3번 연타 <개발자 모드를 켰습니다.> 팝업 확인
    6. 설정 메뉴에 개발자 옵션이 생겼다면 개발자 모드 활성화 완료
  2. 개발자 옵션에서 "무선 디버깅" 선택하여 활성화 (와이파이 연결 필수)

  1. "+ 새 기기 등록" 선택

  1. IP주소 및 포트 부분 (예 192.1xx.0xx.xxxxx) / 페어링 번호 확인

    워치 화면이 꺼지거나 와이파이 환경이 재접속 될 경우 포트값과 페어링 번호가 달라질 수 있으니 화면이 꺼지지 않도록 주의

  1. 윈도우 - 실행 - cmd (.../Sdk/platform-tools) 또는 Android Studio 터미널에서

    adb pair IP주소 및 포트 (예 192.1xx.0xx.xxxxx)

    엔터 입력 후 "Enter pairing code:" 에 페어링 코드 확인 후 입력

  1. 워치에서 페어링 확인

출처 - minu님 블로그


  1. APK 파일 생성 및 전송

    • flutter run 명령어를 사용하여 Flutter 프로젝트를 빌드하고 APK 파일을 생성한다.
    • 이 APK 파일은 컴퓨터의 파일 시스템에서 생성되며, 이후 ADB(Android Debug Bridge)를 사용하여 USB로 연결된 Android 기기로 전송된다.
  2. ADB를 통한 설치 및 실행

    • APK 파일이 Android 기기로 전송된 후, ADB를 통해 Android 기기에 설치된다. ADB는 Android SDK의 일부로, 개발자가 Android 기기와 컴퓨터 사이에서 파일 전송 및 명령 실행을 할 수 있도록 지원한다.
    • 설치가 완료되면, Android 기기에서 APK 파일이 실행되어 Flutter 앱이 시작된다.
  3. Flutter 앱 실행

    • Android 기기에서 Flutter 앱이 실행되면, 먼저 Flutter 엔진이 초기화된다. 이 과정에서 Skia 그래픽 엔진과 Dart VM이 활성화된다.
    • Dart VM이 초기화되면 Flutter 프로젝트의 Dart 코드가 Dart VM에서 실행된다. 이 코드는 Flutter의 위젯을 생성하고, 각 위젯의 상태를 관리하여 UI를 렌더링한다.
    • Flutter 엔진은 Skia를 사용하여 Dart 코드로 정의된 위젯 트리를 화면에 그린다. Skia 네이티브 그래픽 API를 호출하여 Android 기기의 실제 화면에 UI를 렌더링한다.

0개의 댓글