멀티페어링이 되는 마우스를 찾다보니 선택사항이 많지는 않았다.

마침 세일도 들어가서 로지텍 MX Anywhere 2를 구매하였다.


사용환경이 맥북에 OS X 10.9, 부트캠프로 MS Windows 7, PC에 Ubuntu 12.04 LTS, 갤럭시 S7 엣지이다.



1. 로지텍에서는 블루투스 스마트를 사용하는 Windows 8 이상, OS X 10.10 이상부터 블루투스로 연결할 수 있다고 하였지만


MS Windows 7에 페어링을 시도해보았다. 역시나 장치검색을 하지 못한다.


할 수 없이 MS Windows 7에 유니파잉 모듈을 USB포트에 꼽고, 페어링을 하여 동작을 하였다.


로지텍에서 제공하는 Logitec Options을 설치하지 않아도 동작은 할 수 있으나


DPI 설정(마우스 포인트 속도), 기능 키 설정을 할 수 없으므로 다운로드 사이트에서 받아 설치를 하였다.


배터리 상태까지 보여주어 기능은 만족하였다.


맥북에 USB 포트가 2개 밖에 없는데, 포트 활용엔 제약사항이 있겠다.



2. 두 번째로 OS X 10.9에서 연결은 부팅하자마자 그냥 연결을 성공하였다.


왜냐하면 K811을 사용하기 때문에  Logitec Options을 이미 설치하고 있었기 때문이다.


유용했던 점은 Logitec Option을 실행하자마자 두 개의 장치를 선택해서 이동할 수 있도록 화면이 바뀌어 있었다.


Windows에서 설정가능 했던 옵션들이 그대로 설정가능하였다.



3. Ubuntu 12.04 LTS 64bits에서는 K811을 브로드컴칩셋을 사용한 블루투스 동글로 연결하여 사용하고 있다.


페어링을 시도하였으나 역시 MS Windows 7과 마찬가지로 장치검색을 하지 못한다.


아마도 블루투스 스마트를 지원하지 않는 듯...


Ubuntu 상위버전을 사용하거나 추가로 유니파잉 모듈을 구하게 되면 다시 시도해보겠다.



4. 다음으로 갤럭시 S7 엣지에 연결은 뭐 단번에 페어링을 성공하였다.


K811로 사용할 때에는 인터넷 브라우저에서의 이동, 뒤로가기 등 키보드로 사용하기에는 부족한 점이 많았으나


마우스를 연결하자 마자 앞으로, 뒤로가기 키도 바로 동작하고, 휠로 위아래, 마우스 휠 윗 버튼은 기본으로 Home 버튼으로 동작하니


부족함이 없어 보인다.



마우스는 최대 3개 장치에 연결이 가능하다. 1번에 유니파잉 모듈로 연결하고, 2, 3번에 블루투스 연결 같은 형식이다.


Ubuntu 연결이 안되어 아쉽지만 그런대로 만족한다.


마우스가 조금 작은 편이라 손이 큰 사람에게는 조금 불편할 수 있을 것 같고, 책상위에서의 움직임은 부드러운듯 제어가 잘된다.


그리고 처음 써보는 무한 휠은 누를 때 마다 토글 형식으로 작동하며, 양이 많은 문서 이동에 유용할 것 같다. 이것 때문에 휠버튼 기능은 없다.


PS. 전에 쓰던 Microsoft Sculpt Comfort 마우스가 남게되어 PC에서 사용하려고 블루투스 동글로 연결하였더니 딜레이가 상당하다...

Posted by dcmru
,

개발한 앱 중에 잘동작되던 BroadcastReceiver가 다른사람이 소스를 수정 후 1회만 작동하고 동작이 되지 않는 현상이 나타났다.

사용한 형태는 Service에서 registerReceiver()와 unregisterReceiver()를 사용한 동적 리시버 형태이다.

 

원인을 파악한 결과 다음과 같았다.

 

다른 소스에서 해당 서비스를 적당한 인자를 넣은 intent를 포함시켜 startService()로 호출하여

onStartCommand()에서 전달된 intent의 구분자에 따라 registerReceiver() 및 unregisterReceiver()를 하도록한 형태로

서비스내에서 지속적으로 리시버가 동작하지 않고, onStartCommand를 통해 1회만 동작하고 정지되어 버렸다.

 

또한 dumpsys를 통해 해당 앱의 서비스에 등록된 리시버를 분석한 결과 등록한 리시버가 적당한 때에 해제되지 않아 메모리 누수로 이어지는 것을 확인하였다.

 

연구결과 동적 리시버는 서비스(Service) 또는 액티비티(Activity)의 생명주기(Lifecycle)를 같이 하도록 사용하는 것이 좋다는 결론이다.

즉, onCreate()에서 해당 리시버의 registerReceiver()를 호출하여 등록을 하고,

onDestroy()에서 unregisterReceiver()를 호출하여 리시버를 등록해제 하는 것이다.

 

다만 서비스가 강제 종료되면 동적 리시버가 동작하지 않게 되므로 적당한 서비스 감시 또는 재시작 루틴이 필요할 것이다.

아니면 정적 리시버 사용을 고려해야 한다.

Posted by dcmru
,

안드로이드에서 실행가능한 명령어를 컴파일하여 실행 시 다음과 같은 에러가 발생한다.

error: only position independent executables (PIE) are supported.


다음 옵션을 gcc에 붙여준 후 컴파일 한다.

CFLAGS="-fPIE"
CPPLAGS="$CPPFLAGS -fPIE"
CXXLAGS="$CXXFLAGS -fPIE"
LDFLAGS="-fPIE -pie"

Posted by dcmru
,

다음 명령어로 안드로이드 쉘에 접속한다.

$ adb shell


접속된 안드로이드 쉘에서 다음 명령을 실행하면 /system을 rw로 마운트 할 수 있다.

$ su -

# /system/bin/mount -o remount,rw /system

 

다시 read only로 바꾸려면 다음과 같은 명령어를 실행한다.

# /system/bin/mount -o remount,ro /system

Posted by dcmru
,

Android Studio 1.5에서 안드로이드 프로젝트 오픈 시 아래 에러가 발생하였다.


Unable to load class org.gradle.api.publication.maven.internal.DefaultMavenFactory


Caused by: java.lang.NoClassDefFoundError: org/gradle/api/publication/maven/internal/DefaultMavenFactory


Android Studio 1.5는 Gradle 2.4를 기본으로 사용하고, Gradle 2.4는 android-maven-gradle-plugin를 1.3 버전을 사용해야 한다.


root build.gradle 파일을 열어서  아래 내용으로 classpath 선언해 준다.


buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }
}


참고: https://github.com/dcendents/android-maven-gradle-plugin

Posted by dcmru
,

안드로이드에서 개발을 하는 도중 테스트 버전의 실행파일의 메모리 leak을 체크하고자 valgrind를 사용해보기로 결정하고 방법을 정리해보고자 한다.


valgrind는 우분투 12.04 64bits에서 컴파일을 하였고 안드로이드 NDK가 필요하며 NDK를 안드로이드 developer 사이트에서 다운로드 받아 압축을 풀어 사용한다.


참고로 컴파일에 사용한 NDK 버전은 android-ndk-r9 이고 valgrind를 사용하기 위해서는 rooting이 필요하다.


valgrind의 컴파일은 http://valgrind.org/docs/manual/dist.readme-android.html 를 참고하였다.

위의 사이트에서 실행을 확인한 Android 버전은 다음과 같이 소개하고 있다.


ARM:
  Android 4.0.3 running on a (rooted, AOSP build) Nexus S.
  Android 4.0.3 running on Motorola Xoom.
  Android 4.0.3 running on android arm emulator.
  Android 4.1   running on android emulator.
  Android 2.3.4 on Nexus S worked at some time in the past.

x86:
  Android 4.0.3 running on android x86 emulator.


http://valgrind.org/downloads/ 에서 valgrind 3.9.0 (tar.bz2)를 다운로드 하였다.


순서대로 명령을 실행한다.


$ cd valgrind-3.9.0

$ export NDKROOT=~/android-ndk-r9


하드웨어 종류를 설정하는데 확인된 설정은 다음과 같다.

 

export HWKIND=nexus_s         # Samsung Nexus S; also Xoom (for now)
export HWKIND=generic         # A generic Android device. eg, Pandaboard
export HWKIND=emulator        # Android emulator


$ export HWKIND=emulator

$ export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
$ export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
$ export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc


아래 설정에서 --with-tmpdir=/storage/sdcard는 SD card의 경로로 valgrind 실행 시 임시 파일을 쓰기 위해 필요한 경로이다.

테스트하고자 하는 단말이나 에뮬레이터의 실제 SD card의 경로를 써야 한다. 그렇지 않으면 valgrind 실행 시 에러가 발생한다.


$ CPPFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm -DANDROID_HARDWARE_$HWKIND" \
   CFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm" \
   ./configure --prefix=/data/local/Inst \
   --host=armv7-unknown-linux --target=armv7-unknown-linux \
   --with-tmpdir=/storage/sdcard

 

명령 실행 후 마지막 줄에 아래의 항목이 표시되는지 확인한다.
"Primary -DVGPV string: -DVGPV_arm_linux_android=1"

 

$ make -j2
$ make -j2 install DESTDIR=`pwd`/Inst


adb push로 Inst 디렉터리를 에뮬레이터나 단말의 /data/local/Inst로 업로드 한다.


$ adb push Inst /

$ adb shell

$ /data/local/Inst/bin/valgrind [the usual args etc]


갤럭시 노트3의 안드로이드 4.3 버전에 valgrind를 실행한 결과 아래 에러가 발생하면서 실행이 되지 않았다.


root@hlteskt:/data/local/tmp # /data/local/Inst/bin/valgrind
valgrind: failed to start tool 'memcheck' for platform 'arm-linux': Permission denied

 

/data/local/Inst/lib/valgrind/memcheck-arm-linux 가 연관이 있다고 하는데 해결 방법을 찾을 수는 없었다.

아마도 /data의 마운트 관련된 문제이거나 Knox와 연관이 있지 않을까 하는 추측을 해본다.

그리고 export HWKIND=nexus_s, export HWKIND=generic, export HWKIND=emulator 로 각각 설정을 바꾸어 시도해보았으나 같은 에러가 발생하였다.

할 수 없이 에뮬레이터(Android 4.3)를 구동하여 사용하였다.

 

/data/local/Inst/lib/valgrind/ 내의 라이브러리의 퍼미션을 755로 설정하면 실제 단말에서도 된다.


에뮬레이터(Android 4.3)는 /data/local/Inst/lib/valgrind/ 퍼미션을 설정하지 않아도 구동하여 사용할 수 있었다.

Inst 디렉터리의 사이즈가 대략 150MB이므로 에뮬레이터의 /data 디렉터리의 용량을 충분하게 잡아줘야 한다.

/data 디렉터리의 용량을 늘리는 방법은 http://dcmru.tistory.com/2511037 글을 참고한다.


동적라이브러리까지 체크를 하기 위해서는 아래와 같은 방법으로 한다.

LD_PRELOAD="/path/to/library.so:/path/to/library1.so" valgrind -v --trace-children=yes --leak-check=full prog-and-args


참고

http://valgrind.org/docs/manual/dist.readme-android.html

http://stackoverflow.com/questions/12621418/valgrind-find-memory-leak-in-a-shared-library

http://abipictures.tistory.com/939


Posted by dcmru
,

Android의 emulator에서 /data의 크기를 늘려주는 방법은 다음과 같다.


경로는 Ubuntu를 예로 설명하지만 다른 OS도 설정의 옵션은 같으므로 설정파일의 경로만 바꾸어 적용하면 된다.


"~/.android/avd/<name.avd>/config.ini" 파일을 열어 "disk.dataPartition.size=512"와 같이 크기를 변경해주면 된다.


512는 MiB 단위이고 값을 수정한 후 에뮬레이터를 재시작 해준다.


참고: http://stackoverflow.com/questions/2239330/how-to-increase-storage-for-android-emulator-install-failed-insufficient-stora

Posted by dcmru
,
안드로이드 개발을 위한 이클립스 환경을 새로 구성을 하고,

애플리케이션 배포를 위해 사인을 하니 ProGuard 룰 에러가 발생하면서 사인이 되지 않았다.

에러 내용은 "Proguard returned with error code 1. See console" 이고, 콘솔에 ProGuard 룰 에러가 찍힌다.


해결방법으로는 ProGuard를 업데이트하여 해결하였다.

http://proguard.sourceforge.net/ 에서 V4.7 ProGuard를 다운 받은 후 안드로이드 SDK 내에 tools/proguard/lib 내의

proguard.jar, proguardgui.jar, retrace.jar 파일을 교체해주면 된다.
Posted by dcmru
,

Ubuntu 32bit x86에서 안드로이드 소스 컴파일 시 http://source.android.com/download 에서 확인을 해보면 아래와 같은 패키지가 필요하다.

  • Required Packages:
    • Git 1.5.4 or newer and the GNU Privacy Guard.
    • JDK 5.0, update 12 or higher.  Java 6 is not supported, because of incompatibilities with @Override.
    • flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.  
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
  • You might also want Valgrind, a tool that will help you find memory leaks, stack corruption, array bounds overflows, etc. 
$ sudo apt-get install valgrind
  • Intrepid (8.10) users may need a newer version of libreadline:
$ sudo apt-get install lib32readline5-dev

하지만 기본 설정에서 apt-get install sun-java5-jdk 로는 설치가 되지 않는다. sun-java6-jdk 를 설치하여 make 해보았으나 역시나 Java 6 버전으로는 컴파일이 되지 않는다.

그러므로 apt-get 으로 sun-java5-jdk 설치를 하는 방법은 다음과 같다.

1. vi 로 /etc/apt/sources.list 를 열어 아래 내용을 추가 한다.
deb http://ko.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://ko.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

2. apt-get install sun-java5-jdk

3. update-alternatives --config java 를 실행하여 java-1.5.0-sun 번호를 선택한다.

4. /<HOME>/.bash_profile에서 JAVA_HOME 환경 변수에 /usr/lib/jvm/java-1.5.0-sun 을 설정한다.

5. source /<HOME>/.bash_profile 또는 해당 계정 재로그인 후 make를 하면 에러 없이 컴파일되는 것을 볼 수 있다.
Posted by dcmru
,