참고로, HAL의 다양한 부분들은 전형적으로 C/C++로 만들어졌고 각각의 디바이스 밴더는 HAL을 구현하는데 책임이있다고 한다(?)....

전형적인 완전한 HAL을 생성하는 방법은 다음과 같다.

  1. 하드웨어를 컨트롤하기 위한 Linux kernel device driver를 개발 또는 확인한다.
  2. 그 driver의 환경을 설정하고 예시를 하는 Device Tree Overlay를 만든다.
  3. 그 Kernel device driver와 인터페이스 하는 user space libarary를 개발한다.
  4. userspace library를 위한 JNI binding을 개발한다.
  5. 하드웨어와 인터페이를 위한 JIN binding을 사용하는 Android manager를 개발한다.

Android Kernel Vs Linux Kernel

안드로이드 커널은 전형적인 리눅스 커널에서 찾을 수 없는 몇 가지 추가 기능을 포함하고 있다. 그것은 Binder IPC와 low-memory keller이다. 그러나 이것을 제외하고는 안드로이드 커널은 여전히 리눅스 커널이라고 말할 수 있다.

안드로이드 커널이 위의 몇 가지 기능을 제외하고 리눅스 커널과 같다는 것은 커다란 이점이 있다. 그것은 리눅스 커널에 이미 특정 리눅스 드라이버가 존재 한다면, 안드로이드 드라이버가 있다는 것과 동일한 말이다.

카메라, 오디오, 비디오, 버튼 그리고 터치스크린 등등... 이미 존재하는 리눅스 드라이버들을 가져다 이용하는 것은 안드로이드 지원을 더욱 쉽게 만들어 준다.

그러나 전형적인 리눅스 배포판이 어플리케이션들에 많은 다른 디바이스 파일들(/dev filesystem 안에 직접 파일 열기로) direct access를 허용하는 것과는 다르게, 안드로이드는 하드웨어를 직접 접근하는 것을 제한한다.

예를 들어 서로 다른 안드로이드 앱들이 음악 재생 이나 녹음을 위해 오디오 기능을 사용한다면, 안드로이드 아래에 리눅스 커널은 Advanced Linux Sound Archtecture(ALSA) 오디오 드라이버를 통해 이 오디오 기능을 제공한다. 대부분의 경우 한번에 하나의 프로세스만 ALSA 드라이버 자원을 열고 컨트롤 할 수 있다. 만약 각각의 앱들이 ALSA 드라이버 리소스에 접근을 하고 사용을 한다면, 문제가 발생할 것이다. 그 중 하나의 앱이 쉽게 ALSA 드라이버 리소스를 갖을 수 있다면, 그리고 다른 앱들의 접근을 막는다면... 문제가 커질것이다. 이 문제를 해결하기 위해 안드로이드는 managers를 사용 한다.

 

Android managers

매니져들은 모든 app들을 대신 해서 하드웨어 디바이스들을 컨트롤 하는 시스템의 구성 요소이다. 매니져들은 각각의 오디오/비디오/통신 등등의 리소스들과의 인터페이스와 할당을 책임지고, 앱이 그 리소스를 사용할 권한이 있는지를 정의 한다.

리소스를 사용하기 위해서, 입은 반드시 android.content.Context class의 getSystemService() 매써드를 통해 알맞은 매니져를 참조 생성해야 한다.

// Create a reference to the system "location" manager

LocationManager locationManager = (LocationManager) 

  mContext.getSystemService(LOCATION_SERVICE); 

그리고 나서, 이 매니져 레퍼런스를 통해 정보를 만들고 요청들을 컨트롤한다.

// Query the location manager to determine if GPS is enabled

isGPSEnabled = locationManager.

isProviderEnabled(LocationManager.GPS_PROVIDER);

앱들은 Java Android API를 이용해서 매니져들과 상호작용을 한다.

그리고 매니져들은 이런 Java 매써드에 응답하는 동안에, 하드웨어와 직접적으로 상호작용을 하는 native code를 호출하기 위해 결국은 Java native interface(JNI)를 사용해야만 한다. 여기서, 안드로이드 API와 native code를 호출하는 것 사이의 다리는 hardware abstraction layer(HAL)로 알려져 있다.

현재 Android Studio 3.5.2를 사용하고 있다.

간단한 Java 파일을 만들어 컴파일을 하려고 하는데, Error가 발생한다. 그 회피 방법을 구글링 끝에 찾아내어 이렇게 글을 써 본다.

우선, 내가 했던 작업은 다음과 같다.

Project를 하나 생성하고, app→java→com.example.myapplication 내부에 VariableAndType이라는 Java class를 만들었다.

그 다음 다음과 같이 간단한 코드를 입력하고 나서, 오른쪽 버튼 클릭 후 Run을 실행한다.

그랬더니 Error가 다음과 같이 발생한다.

오후 12:14:00: Executing task 'VariableAndType.main()'...

Executing tasks: [VariableAndType.main()] in project D:\01_MS_Work\99_Personal\01_Study\FastCampus\Java\Chapt4


FAILURE: Build failed with an exception.

* Where:
Initialization script 'C:\Users\MSKIM~1\AppData\Local\Temp\VariableAndType_main__.gradle' line: 20

* What went wrong:
A problem occurred configuring project ':app'.
> Could not create task ':app:VariableAndType.main()'.
   > SourceSet with name 'main' not found.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.4.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 0s
오후 12:14:01: Task execution finished 'VariableAndType.main()'.

"SourceSet with name 'main' not found." 라는 키워드로 구글링을 하다 보니 다음 글을 찾을 수 있었다. 물론 번역을 해서 봐야한다. 유럽 국가 언어인거 같은데 자세히는 모르겠음...

http://kodlis.com/sourceset-with-name-main-not-found-hatasi-ve-cozumu/

 

"SourceSet with name 'main' not found." Hatası ve Çözümü | KodLis

Android Studio’nun son sürümünde herhangi bir sınıfı çalıştırdığınızda muhtemelen aşağıdaki hatayla karşılaşacaksınız. What went wrong: A problem occurred configuring project ':app'. Could not create task [...]

kodlis.com

여기에 나온 내용은 다음과 같다.

새로 업데이트된 Android Sutdio에서 앱을 실행하다 보면 내가 본 것과 동일한 Error를 접할 수 있고, 이에 대한 해결책을 알려준다는 것이다.

그 해결책은 먼저, Gradle Scriptsd에서 build.gradle (Module: app)을 열고서, dependencies 부분의 가장 끝에 하기의 문구를 넣으라는 것이다.

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

그래서, 다음과 같이 위의 문장을 다음과 같이 적용해 보았다.

그리고 나서 왼쪽 상단에 "Sync Now'를 클릭.

그 다음 다시 Run을 실행하여 컴파일 진행.

그러나 이전과 동일한 Error가 발생한다.

그 다음 방법으로는 Android Sutdio를 종료 후 해당 프로젝트가 저장된 폴더로 가서 Gradle 폴더만 지우는 것이다.

그 다음 다시 Android Studio를 실행하면 해당 프로젝트가 로딩되면서 Gradle은 자동으로 업데이트 된다.

다시 Run을 실행하여 컴파일을 진행 한다. 그랬던니 Error 없이 결과 값을 정상적으로 출력한다.

- 끝

Ubuntu의 old version을 다운 받기 위해서는 다음 링크로 접속을 한다.

http://old-releases.ubuntu.com/releases/

 

Index of /releases

 

old-releases.ubuntu.com

이곳에서 철지난(?) Ubuntu 버젼들을 만나게 될것이다.

http://www.kernel.org 사이트를 방문하여 리눅스 OS Full source를 받을 수 있다.

가령 Linux3.0.1 버젼의 소스 코드를 다운 받으려면

http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.1.tar.gz 의 링크를 이용하면 된다.

NDK에 관한 보다 상세한 자료는 안드로이드 개발자 사이트 (http://developer.android.com/sdk/ndk/index.html) 참고.

다양한 API, 문서파일 그리고 샘플 어플리케이션이 포함되어 있음.

+ Recent posts