2012년 11월 27일 화요일

안드로이드와 수행시간((Elapsed time) 측정

작성자: 박영기
작성일: 2012-11-28


일반적으로 리눅스에서 수행시간 측정을 위해 사용하는 함수는 gettimeofday()입니다.

안드로이드에서는 수행시간 측정을 위해 SystemClock.elapsedRealtime()를 사용합니다.
System.currentTimeMillis()함수는 측정용으로 사용하면 안되는데, 그 이유는 일반적으로 보여주기위한 용도이기 때문에 정확도가 떨어지기 때문입니다.

----------------------------------------------

한동안 시간 처리가 제대로 된다고 생각했습니다.
그런데 SystemClock.elapsedRealtime()역시 시간측정이 제대로 되지 않는군요.
일단 현재까지는 JNI로 gettimeofday()를 호출하는 함수를 따로 만들어야 되지 않을까 하는 생각이 들구요.
좋은 방법을 찾으면 이 글을 갱신하도록 하겠습니다.

참조


2012년 11월 26일 월요일

안드로이드와 이클립스(eclipse) 그리고 AndroidManifest.xml

작성자: 박영기
작성일: 2012-11-27



안드로이드 샘플코드 중 BluetoothChat을 eclipse로 열었을 때 일어난 일이다. 소스코드에 온통 빨간줄이 생기면서 에러표기되는데 Eclipse > Menu > Project > Clean 을 실행하면 잠시동안은 에러표기되는 문제가 사라진다. 하지만 근본적인 해결책은 되지 않았다.

그래서 근본적인 문제를 확인해 보았는데, AndroidManifest.xml파일 때문이었다. xml 파서가 스마트하지 않아서 충돌이 일어난 것인데 이것을 해결하려면 uses-sdk 태그의 속성인 minSdkVersion 앞에 'android:'를 써줘야한다.

올바르게 수정한 코드는 아래와 같은 모습이다.


이상.
업무참조 바란다.

2012년 11월 22일 목요일

안드로이드와 이클립스(eclipse) 그리고 R.java

작성자: 박영기
작성일: 2012-11-23





소스코드는 정상인데 안드로이드 어플이 죽는 현상을 해결하는 방법과
이클립스에서 R.java를 생성하지 못해서 발생하는 에러를 해결하는 방법을 소개하고자 한다.

가장 먼저 할 일은 위 그림에서와 같이 Menu-Project-Clean를 실행해 보는 것이다. 필자는 이걸 실행한 후 어플이 비정상 종료되지 않고 정상적으로 동작하였다. 하지만 소스코드를 편집하는 중에 멀쩡한 코드에서 에러 알림이 계속 발생한다면 다음 과정도 시도해 보길 바란다.

멀쩡한 코드에 대하여 이클립스의 에러 알림이 계속된다면, 이것은 R.java파일과 관련된 문제일 가능성이 높다. 이것을 해결하는 방법은 2가지가 있다.

첫 번째, 프로젝트 네비게이터의 res 폴더에 대문자로 된 파일이 존재하는지 확인한다. 있다면 소문자로 바꿔준다.

두 번째, 아래 그림에서와 같이 Project Property - Java Build Path - Order and Export Tab 에서  Android 버전의 순서를 최상위로 옮겨준다.

여기까지 진행했다면 에러는 더이상 발생하지 않을 것이다.




참조

블루투스와 라이브러리

안드로이드 장비간 블루투스 통신에서 약간의 문제를 확인했다.
페어링을 할 때 팝업으로 버튼을 눌러줘야하는데
입력장치가 없는 장비는 팝업을 눌러줄 수 없다.

한쪽은 임베디드 리눅스를 쓰는 수 밖에 없을 것 같다.

리눅스에서 블루투스를 사용할 수 있는 라이브러리가 있다.
이름은 BlueZ 인데, ODROID-X의 장치명도 BlueZ인걸 보면 같은 것을 사용했나보다.

아래 링크를 참조하면 더 많은 정보를 얻을 수 있을 것 같다. :)


2012년 11월 20일 화요일

Hello Android - Bluetooth 3

작성자: 박영기
작성일: 2012-11-21

이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


discoverability 활성화 시키기 (Enabling discoverability)



용어가 다소 혼동스러울 수 있어서 쉽게 풀어서 설명하겠다. 예를들어, 안드로이드폰과 블루투스 키보드가 있다고 치자. 안드로이드폰은 블루투스 키보드를 발견(discover)할 수 있다.그리고 블루투스 키보드는 안드로이드폰에게 자신을 노출시킬 수 있는 능력(discoverability)를 갖고있다. 이 능력(discoverability)은 On/Off 가능하다. On 상태일 때를 다른말로  discoverable 모드가 활성화 되어있는 상태라고도 한다. 우리말로 설명하면 약간 애매하므로 지금부터 discover와 discoverability, discoverable을 영어 그대로 사용하겠다.

discoverability를 활성화 시키기 위해서는 startActivityForResult(Intent, int) 함수에 ACTION_REQUEST_DISCOVERABLE 액션 인텐트를 사용한다. 이 메소드는 discoverable 모드를 활성화 하도록 시스템에 요청을 보낸다. 기본적으로 디바이스는 120초 동안 discoverable 될 수 있다. 이 시간은 EXTRA_DISCOVERABLE_DURATION 인텐트 엑스트라를 추가하는 것으로 변경할 수 있다. 이 값의 단위는 초이다. 범위는 1부터 3600까지고, 0이 의미하는 것은 항상 discoverable 상태에 있도록 한다는 의미이다. 0보다 작고 3600보다 큰 값은 자동으로 120초로 설정된다. 300초로 설정하는 예제는 다음과 같다:

Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);


//
// ODROID-X에서 discoverable 모드가 동작하지 않는다. OTL
// 따라서 이 글은 문제가 해결되면 계속 작성할 것이다.



2012년 11월 19일 월요일

Hello Android - Bluetooth 2

작성자: 박영기
작성일: 2012-11-20
이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


연결된 디바이스 목록 보기


새 Bluetooth 디바이스를 검색하기 전에
이미 연결되어있는지 확인하는 것이 좋다.

위 코드의 동작을 확인하려면
Android Setting 메뉴에서
새 블루투스 디바이스를 연결해야한다.

필자는 블루투스 키보드를 사용하였는데 결과값으로 "i-rocks Bluetooth Keyboard"와 "DC:2C:26:00:4A:29"가 출력되었다. 각각 디바이스 이름과 MAC Address이다.


새 Bluetooth 디바이스 발견하기



// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy

이 코드의 실행 결과는 흡사 UDP Multicast Group에 참여해서 자신의 존재를 알리기 위해 메시지를 일정시간동안 보내는 것과 유사하다.

BroadcastReceiver class의 객체의 추상메소드인 onReceive()를 구현한 후
android.content.Context class의 registerReceiver() 메소드에 인자로 전달하면
콜백을 받을 준비가 끝난다.

이후 BluetoothAdapter.startDiscover() 함수를 호출하면
약 12초 동안 onRecive() 콜백이 여러번 호출된다.

이건 흡사 Android 기기 > Setting 메뉴 > Bluetooth 에 나오는
Bluetooth 디바이스 목록 페이지와 유사하다.
단, Setting 메뉴에서는 시간 제한이 없다는 차이점이 있다.

주의: 새 Bluetooth 디바이스를 발견하는 일은 꽤 무거운 작업이고, 리소스를 많이 소비한다. 따라서 연결할 디바이스를 찾았다면 확실히 하기 위해서 cancelDiscovery() 를 호출해서 discovery 작업을 중지시켜야한다. 또한 이미 디바이스가 연결된 상태에서 discovery 작업을 할 경우 사용 가능한 대역폭이 아주 많이 감소하게 되므로 주의해야한다.

Hello Android - Bluetooth 1

작성자: 박영기
작성일: 2012-11-20

이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


Bluetooth 권한

블루투스를 사용하는 앱은 다음 두 권한이 필요하다.


manifast 파일을 열어 다음과 같이 권한을 추가한다.




    
    
    

    
        
            
                
                
            
        
    




이들 권한에 대한 자세한 사항은 이 링크를 참고한다.


BluetoothAdapter 객체 얻기


BluetoothAdapter는 전 안드로이드 기기를 통틀어 하나밖에 없다.
다시 말하면, 싱글톤 객체다.
따라서 new를 사용하지 않고 static 메소드로 객체를 얻는다.



BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    // Device does not support Bluetooth
}

Bluetooth 활성화 시키기


Bluetooth가 존재하지만 비활성화 상태일 때에는 이렇게 활성화시킨다.

단, REQUEST_ENABLE_BT는 지역변수이고 0보다 큰 값을 가진다.

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}


이 코드를 실행시키면 다음 그림을 볼 수 있다.





앞에서 호출한 startActivityForResult()는 비동기 함수이며 즉시 리턴한다.
수행결과는 잠시후 onActivityResult() 콜백으로 전달된다.

void android.app.Activity.startActivityForResult(Intent intent, int requestCode)
void android.app.Activity.onActivityResult(int requestCode, int resultCode, Intent data)

startActivityForResult()에서 두 번째 인자와 onActivityResult()의 첫 번째 인자가 같다는 것을 눈여겨 보길 바란다.

안드로이드와 버튼(android.widget.Button)

작성자: 박영기
작성일: 2012-11-19

업무상 Android를 해야 할 일이 생겼다.
새로운 플랫폼에서 제일 먼저 해야 할 일은
Hello World를 찍는 일.

익명 메소드를 사용한 예제:

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button bbb = (Button) findViewById(R.id.button1);
        bbb.setOnClickListener(new Button.OnClickListener() { 
         public void onClick(View v)
         {
          Button btn = (Button) findViewById(R.id.button1);
          btn.setText("Hello Android");
         }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
}



이번엔 일반적인 예제:

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void initialize() {
        // TODO Auto-generated method stub
        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
    }

    public void onClick(View v)
    {
        switch(v.getId())
        {
            case R.id.button1:
                onButton1_click();
                break;
            }
    }

    private void onButton1_click() {
        // TODO Auto-generated method stub
        Button btn = (Button) findViewById(R.id.button1);
        btn.setText("Hello");
    }
}

신텍스 하이라이터(SyntaxHighlighter) 관련

작성자: 박영기
작성일: 2012-11-19

소프트웨어 관련 블로그에서 가장 일반적으로 사용하는 문법 강조 툴은 SyntaxHighlighter이다.

가끔이지만 아래 링크를 참조할 때가 있어서 남긴다.


참조



설치법: http://alexgorbatchev.com/SyntaxHighlighter/integration.html
브러시: http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/
데모: http://alexgorbatchev.com/SyntaxHighlighter/manual/demo/


2012년 11월 15일 목요일

Android SDK 설치방법 변경

작성자: 박영기
작성일: 2012-11-16


몇 달 전에는 eclipse와 adt-plugin 그리고 SDK를 따로 받아서 설치했어야 했다.
오늘 다시 Android 사이트를 방문해 보니
그 모든 것들이 하나로 통합되어있다.

그냥 압축만 풀고 eclipse를 실행시키면 된다.
That's it!

참조


Android 개발하기 - 목차



Android 블루투스(bluetooth) 개발하기

작성자: 2012-11-16
작성일: 박영기

이 글은 작성중입니다.

참조


저가 ARM 보드 목록

작성자: 박영기
작성일: 2012-11-16

저가 ARM 보드 목록을 보기좋게 정리한 사이트
가운데쯤 ODROID-X 보드가 있다.



Exynos4412 Vs Tegra 3 벤치마크

작성자: 박영기
작성일: 2012-11-16


ODROID-X에 올라온 글을 인용한다.
참조란의 링크를 클릭하면 내용을 볼 수 있다.

Phoronix라는 좀 유명한 리눅스 관련 사이트에 올라온 글입니다.
MIT 대학에서 ODROID-X에 Kernel 3.6과 Ubuntu를 올려서 벤치마킹을 하였습니다.

20여종의 다양한 벤치마킹이 수행되었으며, OMAP4나 TEGRA3에 비해 모든 분야에서 우월한 결과를 보여줍니다.
6페이지 거쳐 자세한 리뷰와 비교가 있으니 참고해 보세요.
Phoronix 사이트가 요즘 많이 느려졌으므로 인내심을 갖고 봐야 합니다.


참조

2012년 11월 13일 화요일

우분투 wubi 디스크 확장하기


wubi 는 우분투(Ubuntu)를 윈도우즈에 쉽게 설치해주는 인스톨러 되시겠다.
그런데 애석하게도 기본 용량이 최대 30GB 이다.

마치며...


참조

https://wiki.ubuntu.com/WubiGuide#How_do_I_create_a_virtual_disk_in_Ubuntu.3F

2012년 11월 11일 일요일

USB 드라이버를 작성하는 방법

작성자: 박영기
작성일: 2012-11-07


나는 리눅스에서 USB 드라이버를 작성하는 방법을 찾고있다.
USB 드라이버를 작성하는 방법은 2가지 정도가 있는 것 같다.

하나는 device driver를 직접 작성하는 것.

다른 하나는 libusb를 사용하는 것.
오피셜 홈페이지는 http://www.libusb.org/ 이다.


참조

파일 디스크립터의 추상적 감시 기능을 제공하는 libevent

작성자: 박영기
작성일: 2012-11-12

select()와 poll()은 이식성이 좋지만 시그널 기반 I/O와 epoll의 성능이 좋으므로 경우에 따라서는 응용 프로그램에서 파일 디스크립터 이벤트를 감시하는 추상 소프트웨어 계층을 만들 필요가 있다.

인용: 리눅스 API의 모든 것. 26장 대체 I/O 모델


참조


2012년 11월 8일 목요일

Makefile 예제

작성자: 박영기
작성일: 2012-11-09

주의: 띄어쓰기 4칸을 TAB으로 바꾸어야 실행 가능함.

응용프로그램용:
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=a.out

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f $(OBJECTS)


정적 라이브러리용:
CC=g++
CFLAGS=-c -Wall
SOURCES=name.cpp
OBJECTS=$(SOURCES:.cpp=.o)
TARGET=libXxx

all: $(SOURCES) $(TARGET)

$(TARGET): $(OBJECTS)
    ar cr $(TARGET).a $(OBJECTS)

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f $(OBJECTS) $(TARGET).a


요건 작업중인거:
#This is prefix for the cross compiler
#Example: arm-linux-
CROSS_COMPILE ?= arm-linux-

CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++

CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=a.out

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CXX) $(CFLAGS) $< -o $@

clean:
    rm -f $(OBJECTS)



코드조각 - getopt

커맨드라인 프로그램 짤 때
가장 많이 쓰는 코드조각이다.

#include 
#include 

void showUsage(char* progname)
{
    printf("Usage: %s [option]\n", progname);
    printf("\t-f option\n");
}


int main(int argc, char**argv)
{

    if(argc < 2)
    {
        showUsage(argv[0]);
        return 0;
    }

    int opt;
    while( (opt=getopt(argc, argv, "hf:")) != -1)
    {
        switch(opt)
        {
        case 'h':
            showUsage(argv[0]);
            break;
        case 'f':
            printf("option is %s\n", optarg);
            break;
        }
    }


    return 0;
}


코드조각 목차

코드 조각들 모음


2012년 11월 6일 화요일

Android 포팅 동영상 강좌 (링크)



작성자: 박영기
작성일: 2012-11-07

총 12개의 동영상으로 구성된 강좌
반드시 보고나면 피가되고 살이되고 뼈가되니
업무 참조 바람



Kernel 옵션 - CPU 전원관리 방법 변경

작성자: 박영기
작성일: 2012-11-07


요즘 핸드폰 같은 임베디드 장비는
전원소비를 줄이기위해서 사용하지 않은 코어를 꺼놓는다.
잠자는 코어는 CPU 사용율이 높아지면 자동으로 깨어난다.

모든 코어가 살아있을 때 성능을 보고싶다면
아래 옵션을 ondemand에서 performance 모드로 바꿔서 커널을 빌드하면 된다.

make menuconfig 
CPU Power Management  --->
    CPU Frequency scaling  --->
        Default CPUFreq governor (performance)  --->

* 'ondemand' 를 'performance' 로 바꿔서 빌드후 적용

이 방법 외에도 방법이 존재한다.
/sys/devices/system/cpu/cpu(N)/online 파일에 1을 쓰면 해당 코어가 살아나게된다.


echo 1 > /sys/devices/system/cpu/cpu1/online


참고로, 하드커널사에서 판매하는 ODROID-X 보드에서는 아래 명령어가 동작하지 않았다.


템플릿


ssh-keygen -t rsa

ssh-keygen 사용법

작성자: 박영기
작성일: 2012-11-07


나는 이 글을 기억하려고 남긴다.

ssh-keygen 명령은 내가 아주 가끔 쓰는 명령이다.

gitosis서버에 public key를 등록 할 때라던지..
github.com에 public key를 등록 할 때라던지..

ssh-keygen -t rsa



2012년 11월 5일 월요일

Nexus 7 커널 빌드하는법

작성자: 박영기
작성일: 2012-11-06
다운로드: config.gz




Nexus 7의 커널을 빌드하는 방법은 다음과 같다:

make tegra3_android_defconfig
make

한가지 흥미로운 점은, Nexus 7의 루트 파일시스템에 config.gz이파일이 존재한다는 점이다. 압축파일 config.gz안에는 config파일이 들어있는데, 위의 1번라인의 명령을 실행한 후에 자동으로 생성되는 .config파일과 내용이 똑같다.

----------------------------------------------------
이글은 An님이 도움주신 내용을 바탕으로 재작성 되었습니다.

Busybox 크로스 컴파일시 주의할 사항

busybox를 크로스컴파일 할 때에도

커널이나

부트로더처럼

$CROSS_COMPILE 환경변수를 사용한다.

make menuconfig에 크로스 컴파일러의
prefix를 설정하는 데가 있는데

$CROSS_COMPILE 변수가 이보다 우선이므로
항상 아래 변수들이 다르게 설정되지 않았는지 확인해야한다

export CROSS_COMPILE=arm-none-eabi-
export PATH=/path/to/toolchain/bin:$PATH
export ARCH=arm
export SUBARCH=arm

망고100 보드로 놀아보자 (링크 모음)

망고카페에서 읽어볼만한 글들을 찾았당~~ 아이 씐나~

이 모든 것을 PDF로 다운로드

2012년 11월 1일 목요일

Nexus 7

목차


repo sync 에러 메시지


에러메시지:
$ repo sync
Fetching projects: 100% (294/294), done.  

error: Exited sync due to gc errors


드래곤볼을 7개 모아

구글신에게 검색
git 버전을 올려야한단다.
참고로 난 지금 git 1.71 쓴다.

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

우분투 10.04 LTS에서는 위 커맨드로 git --version v1.8.0 로 바뀌었다.
우분투 10.10 에서는 위 커맨드로 git --version 1.7.1로 고정되서 바뀌지 않았다. 주의바람.

버전업 하고나니
repo sync 커맨드는 이상무.


2012년 10월 30일 화요일

메모장

진주-커널:
tftp c0008000 ygpark/zImage ; nand erase 0x40000 0x300000 ; nand write.jffs2 0xc0008000 0x40000 0x300000 ; reset

진주-부트:
tftp c0008000 ygpark/u-boot.bin ; nand erase 0x00000000 0x00040000 ; nand write 0xc0008000 0x00000000 0x00040000 ; reset

Nexus7 시스템 정보

mount


$ mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/sdhci-tegra.3/by-name/APP /system ext4 ro,relatime,user_xattr,acl,barrier=1,data=ordered 0 0
/dev/block/platform/sdhci-tegra.3/by-name/CAC /cache ext4 rw,nosuid,nodev,noatime,errors=panic,user_xattr,acl,barrier=1,nomblk_io_submit,data=ordered,discard 0 0
/dev/block/platform/sdhci-tegra.3/by-name/UDA /data ext4 rw,nosuid,nodev,noatime,errors=panic,user_xattr,acl,barrier=1,nomblk_io_submit,data=ordered,discard 0 0
/dev/fuse /storage/sdcard0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/proc/version


$ cat /proc/version
Linux version 3.1.10-g009b6d1 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT Wed Sep 26 12:53:01 PDT 2012


/proc/cpuinfo


$ cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 9 (v7l)
processor       : 0
BogoMIPS        : 1993.93

processor       : 1
BogoMIPS        : 1993.93

processor       : 2
BogoMIPS        : 1993.93

processor       : 3
BogoMIPS        : 1993.93

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x2
CPU part        : 0xc09
CPU revision    : 9

Hardware        : grouper
Revision        : 0000
Serial          : 0f410a0001440200

/proc/partitions


$ cat /proc/partitions
major minor  #blocks  name

 179        0    7467008 mmcblk0
 179        1      12288 mmcblk0p1
 179        2       8192 mmcblk0p2
 179        3     665600 mmcblk0p3
 179        4     453632 mmcblk0p4
 179        5        512 mmcblk0p5
 179        6      10240 mmcblk0p6
 179        7       5120 mmcblk0p7
 179        8        512 mmcblk0p8
 179        9    6302720 mmcblk0p9
 179       32       2048 mmcblk0boot1
 179       16       2048 mmcblk0boot0


Nexus7 공장초기화 이미지 분석

서문


작성자: 박영기
작성일: 2012-10-30


필자는 Nexus7를 분석하고 기록에 남기기 위하여 이 글을 작성하였습니다.
예고없이 변경될 수 있음을 알려드립니다.
삭제 포함.


시작하기전에...


Nexus7을 포함한 안드로이드 기기의 공장 초기화 파일들에는
boot.img
system.img
recovery.img
userdata.img 같은 파일들이 있다.

이것은 안드로이드를 빌드하면 만들어진다.

각각의 파일들은 어떤 기능을 하는지.
그리고 어떻게 뜯어고치는지 알아보겠다.



boot.img


boot.img

참조



2012년 10월 29일 월요일

Nexus7 공장 초기화


서문 


작성자: 박영기
작성일: 2012-10-30


필자는 Nexus7를 분석하고 기록에 남기기 위하여 이 글을 작성하였습니다.
예고없이 변경될 수 있음을 알려드립니다.
삭제 포함.


부트로더 언락


Nexus7은 처음에 부트로더가 잠겨있다.
그래서 부트로더를 푸는 작업이 필요하다.

> fastboot oem unlock

실행하기전에 장비를 fastboot 모드로 부팅을 해야하는데
Nexus7은 전원키 + 볼륨다운키를 누르고 잠시 기다리면 된다.

부트로더 언락시 보증을 받을 수 없다는 메시지가 나온다.
방향키로 Yes/No 선택하고 전원버튼으로 선택한다.

> fastboot oem lock

부트로더를 다시 잠글수도 있다.


공장 초기화

진행하기에 앞서 부트로더 언락이 되어야 진행이 가능하다.
언락을 하고 왔으면 계속 진행바란다.

참조의 Factory Images for Nexus Devices 링크에서 공장 초기화 파일을 받을 수 있다.
용량은 약 260MB정도.

압축파일 속에는
bootloader-grouper-3.41.img 그리고
zip으로 묶인 이미지파일들 (boot.img, recovery.img, system.img, userdata.img)
배치파일들이 들어있다.

공장초기화 방법은
부트로더 언락시 한 것 처럼 장비를 fastboot모드로 부팅시킨 다음
flash-all.bat(윈도우용. 리눅스에서는 flash-all.sh)를 실행한다.

이제 잠시 기다리면 재부팅한다.

사용자 데이터 포함 모든 데이터가 지워지니 주의바람.


참조




2012년 10월 22일 월요일

우분투 10.04, 10.10 에 sun-java6-jdk 설치하기


우분투 메인 저장소에서 sun-java-jdk가 더이상 지원되지 않는다.
Android 개발하려면 sun-java-jdk가 필요한데...
여간 귀찮은 일이 아닐 수 없다.

그래서 우분투 10.04와 10.10 이상에서 sun-java-jdk를 설치하는 방법을 알려주겠다.

android.com에서도 sun-java6-jdk를 설치하는 방법을 설명하고있는데
난 안되더라.

이렇게 하면 성공할꺼다.
add-apt-repository ppa:sun-java-community-team/sun-java6
apt-get update
apt-get install sun-java6-jdk
update-java-alternatives -s java-6-sun

출처


2012년 10월 19일 금요일

안드로이드 오픈소스 프로젝트 (한글번역) - 목차


이 문서는...

이 문서는 source.android.com의 글을 번역한 것입니다.
(원문: http://source.android.com/source/index.html)

작성자: 박영기
작성일: 2012-10-19

시작하기

  • 빌드환경 초기화하기
  • 소스 다운로드하기
  • 빌드하고 실행하기
  • 디바이스를 위한 빌드하기
  • 커널 빌드하기
  • 알려진 문제점


2012년 10월 18일 목요일

안드로이드 오픈소스 프로젝트 (한글번역) - 커널 빌드하기

이 문서는...


이 문서는 source.android.com의 글을 번역한 것입니다.
(원문: http://source.android.com/source/building-kernels.html)

작성자: 박영기
작성일: 2012-10-19

커널 빌드하기

커널에만 관심이 있다면, 커널 소스를 다운로드하고 컴파일하는 가이드로 이 문서가 도움이 될 것이다.

아래의 설명들은 AOSP(Android Open Source Project)의 모든 소스코드를 다운로드하지 않는것을 전제로 한다. 만약 AOSP의 모든 소스코드를 다운로드했다면, 실제 커널 소스를 다운로드하는 것을 제외한 git clone 단계를 건너뛰어야 한다.

여기서는 Pandaboard kernel을 사용한다.

빌드를 위한 커널 빌드 알아내기

당신은 device 프로젝트에서 kernel의 git log를 보고싶을 것이다. device 프로젝트는 device/<vendor>/<name> 형식으로 되어있다.

*주: device/ti/panda 의 정확한 용도는 현재 알 수 없지만, 그 속에 빌드된 kernel 이미지가 존재한다. 여기서 설명하고자하는 바는, kernel 이미지 파일의 커밋로그에서 실제 커널 저장소(kernel/omap.git 등)상의 SHA-1 커밋번호를 알아내자는 것이다.
$ git clone https://android.googlesource.com/device/ti/panda
$ cd panda
$ git log kernel

로그에는 커널 프로젝트를 위하여 SHA1 커밋을 포함해야한다. 다음 단계에서 사용할 수 있도록 이 값을 메모해 두자.

소스 다운로드하기

당신이 원하는 커널은 다음과 의존관계에 있다.
$ git clone https://android.googlesource.com/kernel/common.git
$ git clone https://android.googlesource.com/kernel/exynos.git
$ git clone https://android.googlesource.com/kernel/goldfish.git
$ git clone https://android.googlesource.com/kernel/msm.git
$ git clone https://android.googlesource.com/kernel/omap.git
$ git clone https://android.googlesource.com/kernel/samsung.git
$ git clone https://android.googlesource.com/kernel/tegra.git
  • goldfish 프로젝트는 에뮬레이트된 플랫폼(emulated platforms)을 위한 kernel 소스를 포함하고있다.
  • msn 프로젝트는 ADP1, ADP2, Nexus One 를 위한 것이다. 그리고 퀄컴 MSM 칩셋을 위한 작업의 시작점으로 사용될 수 있다.
  • omap 프로젝트는 PandaBoard, Galaxy Nexus 를 위한 것이다. 그리고 TI OMAP 칩셋을 위한 작업의 시작점으로 사용될 수 있다. 
  • samsung 프로젝트는 Nexus S 를 위한 것이다. 그리고 Samsung Hummingbird 칩셋을 위한 작업의 시작점으로 사용될 수 있다.
  • tegra 프로젝트는 Xoom, Nexus 7을 위한 것이다. 그리고 NVIDIA Tegra 칩셋을 위한 작업의 시작점으로 사용될 수 있다. 
  • exynos 프로젝트는 Samsung Exynos 칩셋을 위한 작업의 시작점으로 사용될 수 있다.

미리 컴파일된 gcc 다운받기

prebuilt toolchain이 경로($PATH)에 있는 것을 확인한다.
$ git clone https://android.googlesource.com/platform/prebuilt
$ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

컴파일

예를들어 우리는 다음 명령을 사용하여 panda 커널을 빌드한다.
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd omap
$ git checkout 
$ make panda_defconfig
$ make
tuna 커널을 빌드하려면, 위의 모든 명령에서 "panda"를 "tuna"로 바꾸어 실행한다.
  • maguro와 toro를 위한 커널은 device/samsung/tuna/kernel 입니다.
  • crespo와 crespo4g를 위한 커널은 device/samsung/crespo/kernel 입니다.
  • stingray와 wingray를 위한 커널은 device/moto/wingray/kernel 입니다.
이미지는 arch/arm/boot/zImage 에 출력됩니다. 이 예제의 경우 zImage를  device/<vendor>/<name>/kernel 혹은 device/ti/panda/kernel 에 복사할 수 있습니다.



2012년 10월 14일 일요일

CodeVisor 설정: Interface


프로그램 재설치를 대비해서
JnD Tech사의 CVD 프로그램의 설정값을 기록한다.
디바이스 이름은 코드바이저다(CodeVisor).


        메뉴 ->
             Config ->
                  Interface 창에서 아래 세 값을 체크한다.

        [v] TRST
        [v] RTCK
        [v] DACR
   

참고

  • SysReset은 필요없다.
  • AP: S3C6410
  • 버전: V2.30 (CodeViser_V2.30_2010_1014.exe)


2012년 10월 11일 목요일

테라텀(Tera Term). 로그에 타임스탬프을 출력하자.

테라텀 홈페이지: http://ttssh2.sourceforge.jp/

터미널에 로그를 찍는건
개발자라면 누구나 한번 해봤겠지
아님 말고 -_-;

로그 메시지에 타임스탬프(시간출력)가
필요한 경우가 가끔 생긴다.
언제 무슨일이 생기는지 알아야 하니깐

타임스탬프를 지원하는 프로그램은
의외로 몇 개 없다.
그 중 테라텀(Tera Term)을 추천하는 바이다.

타임스탬프를 사용하려면
설치하고나서 설정을 하나 바꿔주면 된다.
설치경로를 찾아가서 TERATERM.INI 파일을 열고
변수 LogTimestamp의 값을 on으로 바꿔주면
끝- 아래처럼


; timestamp flag for Log (on/off)
LogTimestamp=on


그리고 이건 덤
로그 저장할 때
파일이름을 시간으로
겹치지 않게 설정한다.

[%h]%Y-%m-%d-%p_%H_%M_%S.log



2012년 10월 9일 화요일

이맥스(emcas)를 배우고 싶은 이유

필자는 윈도우에서는 Visual Studio를 쓰고 리눅스에서는 VI를 쓴다.
가끔 eclipse도 쓰고 업무상 필요하면 Qt Creator도 쓴다.

그외 툴들을 포함해서 단축키를 외우기엔
너무 귀찮다.
아오~ 스트레스~

아니 그보다 주력으로 쓰는
VI에디터의 편집속도가
Visual Studio만큼 나오지 않는다.

VI에디터는
분석용으로는 나름 쓸만한데
작성용으로는 불합격이다.
편집모드를 바꿔야하기 때무네... -_-;

그래서 편집모드가 필요없는
이맥스 (emacs)로 갈아타볼까 싶다.