Hayden's Archive

[Android] 안드로이드 프로젝트의 구조 및 구성 / 안드로이드 앱의 실행 및 배포 과정 본문

Study/ETC

[Android] 안드로이드 프로젝트의 구조 및 구성 / 안드로이드 앱의 실행 및 배포 과정

_hayden 2021. 5. 17. 01:53

참고 : 한국방송통신대학교 모바일앱프로그래밍 교재( https://press.knou.ac.kr/goods/textBookView.do?condCmdtCode=9788920035999&condLscValue=001&condYr=&condSmst= )

 

안드로이드는 개발의 효율을 높이기 위해 애플리케이션의 실행 부분데이터 파트가 분리되어 있다.

  • 애플리케이션의 실행 부분 : MainActivity.java
  • 데이터 영역 : strings.xml, activity_main.xml
    • 각각 애플리케이션에서 사용되는 문자열과 컴포넌트들을 정의하는 파일
  • 실행과 데이터를 연결하는 파일 : R.java
    • xml 파일로 정의된 데이터들을 실행 코드에서 사용하기 위해 적절한 id로 변환하고 그 값들을 포함

 


activity_main.xml

데이터 부분 중 하나인 화면의 레이아웃은 JAVA 코드에 직접 기술하지 않고 XML에서 기술된다. 

  • 위에서는 RelativeLayout이라는 레이아웃 안에 TextView라는 문자열을 표시하는 Veiw를 배치하고 있음
  • TextView의 android:text 속성에서는 @string/hello_world 값이 지정되어 있음
    • 이 값은 strings.xml에서 정의된 hello_world라는 이름의 문자열 ID로 대치됨

 

strings.xml

데이터 중에 하나인 문자열이 xml 파일에 따로 정의됨. 문자열이 정의되는 xml 파일은 기본적으로 strings.xml 파일이다.

이렇게 문자열을 JAVA 실행 코드로부터 분리하면 영어나 다른 언어로 변환하는 작업(애플리케이션의 국제화)에 매우 효율적임.

  • string 태그를 이용해서 각 문자열을 정의함
  • string 태그 속성인 name = 실행 코드에서 이 문자열을 식별하기 위한 이름
  • 위에서 정의된 문자열 
    • 홈 스크린의 아이콘 아래에 표시하기 위한 문자열 : app_name
    • 레이아웃 리소스로 정의된 TextView에서 참조되고 있는 문자열 : hello_world
    • menu_main.xml에서 사용되는 문자열 " action_settings

 

R.java

리소스 ID를 참조하기 위한 클래스 R을 포함하고 있음.

  • JAVA 프로그램이나 XML 파일에서 참조하는 리소스의 ID는 R.java 파일에서 정의된다.
  • R.java에 있는 R 클래스나 내부의 정수 정의는 개발 툴(AAPT:Android Asset Packaging Tool)에 의해 자동적으로 작성됨.
  • 다른 리소스 파일들을 컴파일 후에 자동으로 리소스 ID를 이 파일에 등록함
  • 툴에 의해 자동적으로 정의되고 사용되는 정보이므로 개발자가 임의로 이 파일의 내용을 변경해서는 안 됨
  • R 클래스의 필드인 R.layout.main은 JAVA 파일(MainActivity.java)의 setContentView가 인수로서 사용됨.

참고 : https://m.blog.naver.com/PostView.naver?blogId=deeperain&logNo=221453640936&proxyReferer=https:%2F%2Fwww.google.com%2F 

 

MainActivity.java

  • 안드로이드 애플리케이션의 시작점이 되는 파일.
  • 일반적인 컴퓨터 프로그램으로 비유할 때 main 함수가 포함된 파일로 비교 가능.(※ 액티비티 : 안드로이드 애플리케이션에서 하나의 창(Window)에 대응되는 개념. )
  • 메인 액티비티에서 애플리케이션의 실행 코드를 작성하게 됨.
    • 안드로이드 앱의 화면을 구성하거나 사용자와 상호작용하는 액티비티 클래스를 상속받아 새로운 액티비티를 생성함
    • 사용자의 요구에 반응하여 새로운 액티비티(화면)을 생성하거나 사용자의 요구사항을 만족시키는 작업 수행

 

AndroidManifest.xml

  • 애플리케이션 구성 정보를 담고 있는 파일. 애플리케이션을 구성하는 전반적인 기능에 대한 명세를 포함.
    • 안드로이드 앱 컴포넌트의 선언
    • 안드로이드 앱 실행을 위한 소유 권한 정의
    • 안드로이드 앱이 필요로 하는 최소한의 API 레벨 정의
    • 안드로이드 앱이 필요로 하는 H/W, S/W 기능 정의
    • 안드로이드 앱이 필요로 하는 API 라이브러리 정의

 


안드로이드에서는 애플리케이션의 레이아웃을 위해 주로 자바 코드보다는 XML 형식을 이용한다.

(XML = eXtensible Markup Language. HTML과 같은 마크업 언어)

 

XML 레이아웃의 장점

  • 실행 코드와 데이터 영역이 분리되어 개발될 수 있으므로 효율적이고 개발자와 디자이너의 작업 분담이 쉬워진다.
    • 애플리케이션의 실행 코드는 자바를 통해 프로그래밍 됨.
    • 애플리케이션의 각 컴포넌트들(이미지, 버튼)은 XML로 작성되므로 개발 난이도를 낮출 수 있고 직관적이며 수정 및 관리가 용이함.
  • 상황과 조건에 따라 레이아웃을 변경하거나 텍스트를 쉽게 변경할 수 있으므로 호환성과 국제화에 유리
  • 유지관리 측면에서 애플리케이션의 레이아웃만 수정해야 할 때에는 JAVA 프로그램을 컴파일하지 않아도 되므로 개발 속도를 높일 수 있음.
  • XML의 포맷을 이용해서 구조와 속성을 함축적으로 기술할 수 있으며 레이아웃 재활용도 가능.
    • XML 파일은 애플리케이션 실행 전에 미리 컴파일되므로 성능상의 영향이 없고, XML 파일 컴파일 결과는 이진 포맷으로 바뀌어 실행 파일에 포함되므로 용량상의 낭비도 없음.

 


안드로이드 앱의 실행 과정

  • 개발자가 작성한 JAVA 코드가 JAVA 컴파일러에 의해 JAVA 바이트 코드로 컴파일 됨
  • 원래 JAVA 환경에서는 컴파일된 JAVA 바이트 코드를 JVM을 통해 실행하지만, 안드로이드는 Dalvik이라는 별도의 가상 머신에서 실행함. 이를 위해 안드로이드 SDK가 제공하는 DEX 변환기를 이용하여 JAVA 바이트 코드를 Dalvik의 실행 포맷인 .dex 파일로 변환함.
  • 변환된 .dex 파일과 리소스 파일들은 설치할 수 있는 .apk 파일로 만들어짐. 배포 및 설치를 위한 apk 파일로 만들어지기 위해서는 AAPT라는 개발 도구를 이용하고, 이 과정을 패키징이라고 함.
  • 패키징 과정이 끝나 만들어진 apk 파일을 플랫폼에 설치하면 런타임에서 실행될 수 있음.
    • 최초 설치시 AOT 컴파일러의 dex2oat를 사용하여 네이티브 코드로 변환한 후 안드로이드 스마트폰에서 실행할 수 있게 함.

 

안드로이드 앱의 배포 과정

안드로이드 애플리케이션은 .apk 파일 확장자로 패키징되어 배포됨.

  • 안드로이드 프로젝트에 대한 코드 컴파일 작업이 수행되면, JAVA 프로그램의 .class 파일 생성
  • .class 파일을 이용하여 안드로이드 실행환경(Android Runtime)에 적합한 .dex 파일 생성 / 컴파일된 리소스 파일(XML)은 resources.arsc라는 파일로 생성 / 안드로이드 앱의 설정 환경을 정의하는 AndroidManifest.xml 파일 생성
  • .dex 파일 + resources.arsc + AndroidManifest.xml + 컴파일되지 않은 리소스 파일(이미지, 아이콘 파일 등) => 함께 패키징하여 .apk 파일 생성
  • Debug Key를 사용하여 .apk 파일에 서명하는 Signing 작업을 함(.apk 파일이 타인에 의하여 위변조되는 것을 방지)
  • Google Play에 개발된 안드로이드 앱의 배포가 준비되면, 자신의 Key 값을 이용하여 Signing 가능
    • Signing 작업에서 사용한 키값은 안드로이드 애플리케이션의 업데이트에서 개발자의 식별에 사용됨
  • 패키징된 apk 파일을 .dex 파일로 변환하여 실행시 Dalvik이나 ART(Android Run-Time)라고 하는 모바일 기기에 적합화된 런타인 가상 머신 사용. 요즘에는 ART를 디폴트로 사용.