이번에는 과연 안드로이드 자바가 어떤 식의 메커니즘으로 동작하는 지에 대해서 내 맘대로(^^) 알아보도록 하겠습니다 저번 글에도 말씀 드렸듯이 아무 사이트나 뒤져서 맘에 드는 코드를 사용해서 만들어 보도록 하겠습니다.
여기서 한가지 이 글의 첫 도입부에 말씀 드려야 했겠지만 사실 지금 이 글을 보는 사람은 자바라는 언어를 알고 리눅스나 유닉스 환경에 대해서 약간의 지식을 가지고 있으며 안드로이드로 Hello world!를 함 찍어 본 사람이라는 가정하에 작성하고 있습니다 (물론 잘 몰라도 되지만…. )
여하튼 사이트를 찾아보다 http://www.vogella.de/articles/Android/article.html 라는 곳을 발견 했는 데 여기에 있는 소스 한 개를 긁어다 사용해 보겠습니다
package de.vogella.android.temperature; //<- 온도재는 프로그램인가 보네..
/*상속 받을 꺼는 받고*/
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; /*이놈이 텍스트 필드인가 보네*/
import android.widget.RadioButton;
import android.widget.Toast;
public class Convert extends Activity {
private EditText text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (EditText) findViewById(R.id.EditText01);
}
// called by button click because we assigned the name to the
// "On Click property" of the button
public void myClickHandler(View view) {
switch (view.getId()) {
case R.id.Button01:
RadioButton celsiusButton = (RadioButton) findViewById(R.id.RadioButton01);
RadioButton fahrenheitButton = (RadioButton) findViewById(R.id.RadioButton02);
if (text.getText().length() == 0) {
Toast.makeText(this, "Please enter a valid number", Toast.LENGTH_LONG).show();
return;
}
float inputValue = Float.parseFloat(text.getText().toString());
if (celsiusButton.isChecked()) {
text.setText(String.valueOf(convertFahrenheitToCelcius(inputValue)));
} else {
text.setText(String.valueOf(convertCelciusToFahrenheit(inputValue)));
}
// Switch to the other button
if (fahrenheitButton.isChecked()) {
fahrenheitButton.setChecked(false);
celsiusButton.setChecked(true);
} else {
fahrenheitButton.setChecked(true);
celsiusButton.setChecked(false);
}
break;
}
}
// Converts to celcius
private float convertFahrenheitToCelcius(float fahrenheit) {
return ((fahrenheit - 32) * 5 / 9);
}
// Converts to fahrenheit
private float convertCelciusToFahrenheit(float celsius) {
return ((celsius * 9) / 5) + 32;
}
}
위의 소스에 대해서는 별말씀 드리지 않겠습니다 사실 소스의 분석을 하자는 것이 아니라 어떻게 돌아가는 것이 궁금한 것이도 하고
별 설명이 필요없는 소스이기도 해서 본론으로 들어 가겠습니다
일단 에뮬레이터까지 설치 하였다는 가정하에 시작하겠습니다. 그리고 보통 개발에서 이클립스가 필수불가결한 요소로 자리잡은 지금 그런 건 이클립스로 세팅이 가능하기 때문에 우선 소스에 집중해 보면 우선 원하는 패키지를 만들고 Ant로 인스톨하는 과정만 거치면 될 거 같네요 (좀 더 자세한 내용은 다음에 하기로 합니다)
원하는 패키지를 만들 때 저는 C:\Android\documents\내꺼 밑에 TobeeTest로 만들겠습니다
만드는 명령어는 다음과 같습니다
android create project
--target 2
--name TobeeTest
--path C:\Android\documents\내꺼\Apps --activity Convert
--package de.vogella.android.temperature
android create project ^
--target 2 ^
--name TobeeTest ^
--path C:\Android\documents\내꺼\Apps --activity Convert ^
--package de.vogella.android.temperature
위의 소스에서 Activity는 Convert이고 패키지 명은 de.vogella.android.temperature 이군요
자 그럼 다음과 같은 폴더가 생성된 것을 볼 수 가 있습니다
순서대로 보자면 폴더 이름은 잘 지어진 거 같은데 특이점은 res 폴더 및에 있는 layout과 values 폴더 인데요 각각 main.xml과 string.xml이 생성 되어 있는 것을 확인 할 수 있습니다
Layout은 말 그대로 전체적인 UI 프레임 등의 뼈대를 설정하는 xml이고 strings.xml은 각 각 UI 컴포넌트에 대한 id 및 리소스에 대한 설명 속성 및 전역으로 쓰이는 이름 등이 들어 가 있는 파일 들인 것 같습니다 물론 각 파일의 어트리뷰트나 엘리먼트의 용도 및 설명은 구글 안드로이드 개발자 사이트를 뒤져 보면 되리라 생각이 드네요
물론 당연한 결과지만 … 잘 만들었네요.
위의 소스를 현재 아무것도 없는 Convert.java에 다 엎어치겠습니다(언어순화가 안되네ㅡ.ㅡ;;)
그리고는
Ant debug 라고 치면 끝이겠지요
C:\Android\documents\내꺼\Apps>ant debug
Buildfile: build.xml
[setup] Android SDK Tools Revision 6
[setup] Project Target: Android 1.6
[setup] API level: 4
[setup] WARNING: No minSdkVersion value set. Application will install on all
Android versions.
[setup] Importing rules file: platforms\android-4\ant\ant_rules_r2.xml
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
[mkdir] Created dir: C:\Android\documents\내꺼\Apps\gen
[mkdir] Created dir: C:\Android\documents\내꺼\Apps\bin\classes
-resource-src:
[echo] Generating R.java / Manifest.java from the resources...
-aidl:
[echo] Compiling aidl files into Java classes...
compile:
[javac] Compiling 2 source files to C:\Android\documents\내꺼\Apps\bin\classes
[javac] C:\Android\documents\내꺼\Apps\src\de\vogella\android\temperature\Co
nvert.java:17: cannot find symbol
[javac] symbol : variable id
[javac] location: class de.vogella.android.temperature.R
[javac] text = (EditText) findViewById(R.id.EditText01);
[javac] ^
[javac] C:\Android\documents\내꺼\Apps\src\de\vogella\android\temperature\Co
nvert.java:25: cannot find symbol
[javac] symbol : variable id
[javac] location: class de.vogella.android.temperature.R
[javac] case R.id.Button01:
[javac] ^
[javac] C:\Android\documents\내꺼\Apps\src\de\vogella\android\temperature\Co
nvert.java:26: cannot find symbol
[javac] symbol : variable id
[javac] location: class de.vogella.android.temperature.R
[javac] RadioButton celsiusButton = (RadioButton) findViewById(R.id.RadioButton01);
[javac]
^
[javac] C:\Android\documents\내꺼\Apps\src\de\vogella\android\temperature\Convert.java:27: cannot find symbol
[javac] symbol : variable id
[javac] location: class de.vogella.android.temperature.R
[javac] RadioButton fahrenheitButton = (RadioButton) findViewById(R.id.RadioButton02);
[javac]
^
[javac] 4 errors
BUILD FAILED
그런 다음 다시 명령을 치면
-resource-src:
[echo] Generating R.java / Manifest.java from the resources...
[null] C:\Android\documents\내꺼\Apps\res\layout\main.xml:2: error: Error:
No resource found that matches the given name (at 'background' with value '@color/myColor').
[null] C:\Android\documents\내꺼\Apps\res\layout\main.xml:8: error: Error:
No resource found that matches the given name (at 'text' with value '@string/celsius').
[null] C:\Android\documents\내꺼\Apps\res\layout\main.xml:10: error: Error:
No resource found that matches the given name (at 'text' with value '@string/fahrenheit').
[null] C:\Android\documents\내꺼\Apps\res\layout\main.xml:13: error: Error:
No resource found that matches the given name (at 'onClick' with value '@string/buttonHandler').
[null] C:\Android\documents\내꺼\Apps\res\layout\main.xml:13: error: Error:
No resource found that matches the given name (at 'text' with value '@string/calc').
BUILD FAILED
헉! 이런 …. 사실 한가지 우리가 간과 한게 있다면 안드로이드에서 생성시켜주는 파일을 하나 잊어 먹고 있다는 사실이 있겠지요
원래 xml 파일로 작성되고 이 xml 파일로부터 리소스들을 받아서 처리하는 R.java라는 것이 있는 데
이 자바 파일에는 현재 자바파일에 있는 리소스가 없다는 에러가 떳다는 거죠(그럼 어쩌라고….!!)
방금 전에 소스를 긁은 사이트로 가서 main.xml을 엎어 치겠습니다(아 왜!) layout 폴더 밑에 main.xml을 교체하면 에러는 없을 것으로 생각 됩니다.
그리고 다시 ant debug 명령으로 빌드를 시작하면 또 아래와 같이 몇몇 에러가 뜨는 데 main.xml만 복사했지 strings.xml을 엎어 치지 않아서 나는 오류 이기 때문에 strings.xml을 다시 엎어 칩니다
그제서야 모든 빌드 과정이 끝나는 것 같습니다.
단지 ant debug만 친 거 뿐인데 사실 안드로이드는 위의 컴파일 오류에서 보았듯이 여러가지를 만들고 일을 하고 있습니다 대략적으로 한 것을 살펴보면
1. R.java 를 생성하고
2. 자바 파일들을 컴파일하고
3. 달빅(Dalvik)용으로 변환하고
4. package file 만들고
5. 최종적으로 디버깅용 디폴트 값으로 패키지를 signing
하는 것이였습니다.
여기서도 아파치의 ant가 쓰여 졌네요 ant….라 어려운 툴이라 제가 일일이 세세한 설명을 하는 것 보다는 http://ant.apache.org/ 사이트를 함 탐험해보시는 것도 좋을 거 같습니다만….. 책도 많고
여기서 마지막 터치를 위해서 일단 에뮬레이터를 띄웁니다 에뮬레이터를 띄우기 위해서는 avd 환경을 구축해야 하는 데 Android SDK를 사용해서 금방 할 수 있습니다
저는 수동으로 만들었기 때문에 수동으로 만드는 방법은 다음에 설명하기로 하고
http://www.androidpub.com/35413 를 참고 해보심이 좋을 듯 하네요
마지막으로
ant install 하면…..
그림 1
다음과 같은 화면이 뜨겠지요 ….
에뮬에서 확인해 보면 다음과 같이 생겼군요….
실행 시키면 다음과 같습니다
제대로 뜨는 군요 음… 하지만 내가 진정으로 원한 것 우리가 원한 건 고작(?!) 이런 것이 아니였다는 것이죠……
바로 지금부터 시작이라는 거죠
그럼, 지금 만든 apk 파일이 어디로 갔는지 추적을 시작해 보겠습니다
방금 전에 ant install 명령어로 install 했을 때 (그림1) 커맨드 윈도우에 /data/local/tmp 디렉토리로 TobeeTest-debug .apk 파일을 옮겼다고 되어 있었습니다.
그럼 쉘을 띄워서 /data/local/tmp 디렉토리로 들어가면 분명히 TobeeTest-debug .apk 있어야 하겠지요….
그럼 제대로 들어 갔는지 확인해 보겠습니다….
쉘을 띄우고 /data/local/tmp/ 디렉토리로 가서 보니 ….
아~무것도 없습니다
하지만 일단 data/local 디렉토리로 복사가 된다는 것은 파악 했으니까 이 디렉토리를 나름 분석해 보겠습니다 …
다음에…
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
내 멋대로 안드로이드 - 6 (0) | 2022.07.20 |
---|---|
내 멋대로 안드로이드 - 5 (0) | 2022.07.19 |
내 멋대로 안드로이드 - 4 (0) | 2022.07.18 |
내 멋대로 안드로이드 - 2 (0) | 2022.07.16 |
내 멋대로 안드로이드 - 1 (0) | 2022.07.15 |