라벨이 android인 게시물 표시

오늘 아침 배달된 악성코드

이미지
제목: "오늘 아침 서울역에서 포착된 안타까운 사진이랍니다." 배포주소: 60.156.117.115/xz/c.apk 악성코드는 xz/c.apk를 입력해주면 획득할수 있다. 디컴파일해서 메니페스트만 봐도 최근 유행하는 코드처럼 sms 를 탈취하기 위해 리시버를 등록합니다. 그리고, 국민은행, 농협, 우리은행 등으로 위장한 앱을 다운로드 받습니다. 저장된 전화번호 목록으로 위 메시지를 전송합니다.

android setuid()

NDK를 이용해 setuid를 실행해보면 당연히 그냥은 안된다. 권한을 변경해주어야한다. http://en.wikipedia.org/wiki/Setuid 아래는 테스트 코드 int main(int argc,char *argv[]){ int id = 999; printf("hello world\n"); id = getuid(); printf("getuid(): %d , euid: %d \n",id, geteuid()); setuid(0); setgid(0); id=getuid(); printf("getuid() after setuid(): %d , euid: %d \n",id, geteuid()); return 0; } 위 코드를 NDK로 컴파일하고 디바이스에 넣고 실행해보자. 실행파일을 넣고 adb push hello /data/local/tmp 접속한다. adb shell 권한을 변경하고, 실행해보자 # cd /data/local/tmp # su # chmod 6755 hello # exit # ./hello hello world getuid(): 2000 , euid: 2000 getuid() after setuid(): 2000 , euid: 2000 # 안된다. 구글링 확인해보니 실행위치에도 관계가 있다. root권한으로 /system을 remount한다음 cat /data/local/tmp/hello > /system/xbin/hello 해서 복사한 다음 권한과 소유권을 변경하면 정상적으로 동작한다.

Android NDK

Android Native Development Kit Java에서 C나 C++로 만든 Native 코드를 호출하기 위한 방법 중 JNI ( Java Native Interface )라고 있다. 안드로이드에서는 Native 코드를 사용하기 위해 NDK를 제공한다. 일반적인 순서는 1. Java로 Android 코드 작성(호출하고자 하는 native 함수의 signature 작성) 2. 위 자바코드를 컴파일 3. 결과물로 나온 *.class 파일을 javah 를 이용해 header 파일 생성 4. 생성된 *.h 를 이용해 *.c 나 *.cpp 로 native 코드 작성. 5. Android.mk 작성 6. ndk 에 있는 ndk-build 를 실행 7. *.so 를 포함해서 패키징(*.apk) 8. 디바이스에 설치 및 실행 그럼, 이제 환경을 구성하자. 자바를 설치한다. 구글에서 Android SDK를 검색하면 첫번째 검색되는 링크를 클릭하여 SDK를 다운로드 한다. 다운로드한 파일을 적당한 곳에 푼다.(c: 드라이브 d: 드라이브 linux라면 /home 아래든) 여기선 c:아래 압축을 풀어놓는다. 구글에서 ndk를 검색하면 제일 처음 검색되는 구글 개발자 사이트에서 ndk를 받을수 있다. 여기서 자신의 플랫폼에 맞는 kit을 다운받아야 한다. 적당한 곳에 압축을 푼다.(마찬가지로 c:에 압축을 해제) 이제 컴파일러가 필요하다. 대부분 linux를 사용하는 user는 gcc를 설치했으리라 생각한다. 윈도우에서는 cygwin 설치를 추천한다. cygwin을 다운로드하고 develop 부분을 그냥 다 설치한다.(귀차니즘) 환경변수에서 NDK홈을 지정해준다. 보통 윈도우에서는 시스템-고급 시스템 설정(시스템 속성)-환경변수 에서 설정한다. NDK=c:\android-ndk-r8e cygwin 을 실행하여 프롬프트에서 echo $NDK 또는 $NDK/ndk-build  해서 잘 설정 되었...

Android Debug 시 cursor.moveToNext()

디버깅을 하는데 데이터를 몇개 넣어봤는데, 이상하게 정확하게 나오질 않는다. 그래서 , eclipse에서 cursor의 moveToNext() 식을 watchlist에 넣었다. 혹시나 이런 바보같은 일을 되풀이 할까 두렵다. ㅋ watchlist는 메소드를 실행한 결과를 가져오기 때문에 커서의 포인터가 다음으로 이동해버린다. 그래서, 실제로 코드가 실행하면서 커서가 이동하고, watchlist 값을 평가할때 커서가 이동하기때문에 값이 정확하게 나오지 않던것이다. 정확히 커서값을 보며 확인한 결과는 아니지만, 거의 확실하다.(귀찮아서 테스트 안함) 보통 adapter로 해결되지만 가끔 curosr를 사용하고 디버깅할때는 주의해야겠다.

Android Activity 의 lifecycle

이미지
Activity 의 상태에 대한 이해하기 쉬운 그림이다. (구글 이미지 검색으로 퍼왔음) Activity의 상태는 Foreground, Background, 그리고 일부분만보이는 Foreground 상태 3가지가 있다. Foregorund 상태 는 onStart() 이후부터 onStop() 사이이다. 이중 onResume()과 onPause() 사의 상태가 실제로 사용자의 입력을 받을수 있는 Foreground상태이고, onStart()이후와 onStop()이전은 일부분만보이는Foreground상태 (실제로 일부분이 보이거나, 보이지 않을수 있음. 非foreground 상태라고 함)이다. 경고를 표시할때 등, 다이얼로그 박스가 화면에 뿌려지면 非Foreground상태이다. Background상태 는 화면에 보이지 않는다. 보통 onCreate()에서 보통 자원 획득과 초기화를 수행하고, onDestroy()에서 자원을 정리/반납한다. 그래서, 앱을 실행할때 화면에 바로 뜨지 않거나, 종료후에도 실행되는 경우를 볼 수 있다. Activity의 state가 바뀔때마다 해당 메소드를 override 함으로써, 상태변화때 적절한 행동을 할수 있다. 보통 onResume()을 override할때 화면을 다시 그려주고 , pause상태에서는 메모리가 모자랄경우 해당 앱을 죽어버리므로 onPause() 메소드에 상태를 저장하는 코드를 작성한다.

Intent

안드로이드 개발시 Intent는 영어 뜻으로는 "목적","계획" 이다. 아니 "~을 할려고 하는" 이라고 생각하는게 더 쉬울것 같다. 단순 호출은 startActivity(new Intent(this, EditContent.class)); 하면 EditContent activity 를 호출할 수 있다. (현재 activity 스택의 위에 쌓인다) EditContent에서는 finish(); 를 호출함으로써 activity를 끝내고 이전 스택의 내용(이전 activity)이 foreground로 올라온다.

Android Date format

TextView txt = (TextView)findViewById(R.id.txtCal); Date date = new Date(); txt.setText( android.text.format.DateFormat. getDateFormat (ctx).format (date) ); 이렇게 사용하면, 현재 context를 기준으로 locale에 맞게 변환하여 준다.(Context ctx;) DateFormat class는 SimpleDateFormat과 비슷하다. http://developer.android.com/reference/java/text/DateFormat.html

Android Spinner

3일차. 윈도우즈에서는 보통 콤보박스(ComboBox)라 불린다. 리스트(List)라고 불릴때도 있다. Android에서는 Spinner 위젯이다. Graphical layout에서 Spinner 를 가져다 놓은다음 목록을 채우기 위해 해당 activity 생성자에 String[] items = {"쇼핑","여친","약","사랑","우정"}; ArrayAdapter aa = new ArrayAdapter (this, android.R.layout.simple_spinner_item, items); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(aa); 하면 내용이 채워진다. android.R.layout.simple_spinner_item 등 해당 static final 값들은 왜 저런방식으로 사용하지는 모르겠다. 그냥 R.id._spinner1 처럼 접근 해도 되지 않을까? class명으로 봤을때 Adapter 이면 spinner 위젯이라는 타입만 알면 되는것 아닌가?

Intent Exception

2일째. startActivity(new Intent(this, EditContent.class)); 계속 exception이 난다. 먼저 default.properties 파일을 열어봤다. target 이 android-8 로 되어있다. 2.2 는 api level 이 8 이므로 정상으로 보인다. 혹시나 해서 android-7로 고치고 layout의 xml을 다 지우고 다시 만들었다. 실행해보니 emulator가 서버린다. 다시 8로 고치고 결국 구글링... reference를 찾아보니 startActivity 메소드는 ActivityNotFoundException 을 발생시켜서 일단 catch해주고, Exception 도 catch 해주었다. 아무생각없이 e.printStackTrace(); 했더니 아무것도 안나온다. ㅋ 대신에 Log.d("myTag", e.getMessage() ); 를 넣어주고 android.util.Log 패키지를 import 해주었다. elipse에서 perspective 를 DDMS로 바꾸고, log창을 보니 explict activity class를 찾을수 없다고 나온다. Unable to find explicit activity class {org.alwaysn00b.finance/org.alwaysn00b.finance.EditContent}; have you declared this activity in your AndroidManifest.xml? 이런.. AndroidManifest.xml에서 Activity를 추가해주어야한다. 해보니.. 잘된다. ㅡㅡ; 책하나 제대로 된거 한번 봐야겠다.

Emulator가 구동이 안될때

emulator: ERROR: bad config: virtual device directory lacks config.ini AVD Manager 에서 이런 에러 메시지가 나오면서 구동이 안될때 AVD의 path가 한글이 포함되어서이다. android move avd -n avd_name -p move_to_path 하면 avd를 옮길 수 있는데 계속 옮길수 없다고 나오길레 (윈도우 7사용중, 관리자모드로 안됨) 그냥 지우고 명령줄에서 android create avd -n avd_name -p create_path 해서 만들어 줬다. create_path 역시 한글이 있으면 안된다. [출처] Emulator가 구동이 안될때 | 작성자 동훈