August 5th, 2010
APK에 들어있는 AndroidManifest.xml 보는 법

이건 뭐 팁도 아니고 그냥 메뉴얼에 나와있는 내용(그럼에도 자꾸 물으시는 분들이 있으셔서)
APK에 들어이쓴 xml file들은 binary encoding되어있어 그냥은 보기 어려운데
SDK에 들어있는 aapt로 볼 수 있다.

$/usr/local/android-sdk/platforms/android-8/tools/aapt dump xmltree com.amazon.kindle.apk AndroidManifest.xml

하면 요렇게 나온다.

N: android=http://schemas.android.com/apk/res/android
E: manifest (line=2)
A: android:sharedUserId(0×0101000b)=”com.amazon” (Raw: “com.amazon”)
A: android:versionCode(0×0101021b)=(type 0×10)0×64
A: android:versionName(0×0101021c)=”1.0.0.76480048″ (Raw: “1.0.0.76480048″)
A: package=”com.amazon.kindle” (Raw: “com.amazon.kindle”)
E: application (line=8)
A: android:label(0×01010001)=@0×7f0a0000
A: android:icon(0×01010002)=@0×7f02003f
A: android:name(0×01010003)=”com.amazon.kcp.application.ReddingApplication” (Raw: “com.amazon.kcp.application.ReddingApplication”)
A: android:enabled(0×0101000e)=(type 0×12)0xffffffff
A: android:debuggable(0×0101000f)=(type 0×12)0×0
E: activity (line=14)
A: android:theme(0×01010000)=@0×7f0b0000
A: android:name(0×01010003)=”com.amazon.kcp.library.HomeActivity” (Raw: “com.amazon.kcp.library.HomeActivity”)
E: meta-data (line=17)
A: android:name(0×01010003)=”android.app.default_searchable” (Raw: “android.app.default_searchable”)
A: android:value(0×01010024)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
E: activity (line=22)
A: android:theme(0×01010000)=@0×7f0b0000
A: android:label(0×01010001)=@0×7f0a0087
A: android:name(0×01010003)=”com.amazon.kcp.library.ArchivedItemsActivity” (Raw: “com.amazon.kcp.library.ArchivedItemsActivity”)
E: meta-data (line=26)
A: android:name(0×01010003)=”android.app.default_searchable” (Raw: “android.app.default_searchable”)
A: android:value(0×01010024)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
E: activity (line=31)
A: android:theme(0×01010000)=@0×7f0b0003
A: android:name(0×01010003)=”com.amazon.kcp.library.TransientActivity” (Raw: “com.amazon.kcp.library.TransientActivity”)
E: meta-data (line=34)
A: android:name(0×01010003)=”android.app.default_searchable” (Raw: “android.app.default_searchable”)
A: android:value(0×01010024)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
E: activity (line=42)
A: android:theme(0×01010000)=@0×7f0b0003
A: android:name(0×01010003)=”com.amazon.kcp.reader.ReaderActivity” (Raw: “com.amazon.kcp.reader.ReaderActivity”)
A: android:launchMode(0×0101001d)=(type 0×10)0×2
A: android:configChanges(0×0101001f)=(type 0×11)0xa0
E: activity (line=48)
A: android:label(0×01010001)=@0×7f0a0066
A: android:name(0×01010003)=”com.amazon.kcp.reader.NotesActivity” (Raw: “com.amazon.kcp.reader.NotesActivity”)
E: activity (line=51)
A: android:label(0×01010001)=@0×7f0a003f
A: android:name(0×01010003)=”com.amazon.kcp.info.InfoActivity” (Raw: “com.amazon.kcp.info.InfoActivity”)
E: meta-data (line=54)
A: android:name(0×01010003)=”android.app.default_searchable” (Raw: “android.app.default_searchable”)
A: android:value(0×01010024)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
E: activity (line=59)
A: android:label(0×01010001)=@0×7f0a004e
A: android:name(0×01010003)=”com.amazon.kcp.info.AboutActivity” (Raw: “com.amazon.kcp.info.AboutActivity”)
E: meta-data (line=62)
A: android:name(0×01010003)=”android.app.default_searchable” (Raw: “android.app.default_searchable”)
A: android:value(0×01010024)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
E: activity (line=67)
A: android:theme(0×01010000)=@0×7f0b000b
A: android:name(0×01010003)=”com.amazon.kcp.web.WebActivity” (Raw: “com.amazon.kcp.web.WebActivity”)
A: android:configChanges(0×0101001f)=(type 0×11)0xa0
E: activity (line=73)
A: android:theme(0×01010000)=@0×7f0b0002
A: android:name(0×01010003)=”com.amazon.kcp.redding.AlertActivity” (Raw: “com.amazon.kcp.redding.AlertActivity”)
E: activity (line=77)
A: android:theme(0×01010000)=@0×7f0b0000
A: android:name(0×01010003)=”com.amazon.kcp.welcome.WelcomeActivity” (Raw: “com.amazon.kcp.welcome.WelcomeActivity”)
E: activity (line=81)
A: android:theme(0×01010000)=@0×7f0b0001
A: android:label(0×01010001)=@0×7f0a0000
A: android:name(0×01010003)=”com.amazon.kcp.search.SearchActivity” (Raw: “com.amazon.kcp.search.SearchActivity”)
A: android:launchMode(0×0101001d)=(type 0×10)0×1
E: intent-filter (line=86)
E: action (line=87)
A: android:name(0×01010003)=”android.intent.action.SEARCH” (Raw: “android.intent.action.SEARCH”)
E: category (line=88)
A: android:name(0×01010003)=”android.intent.category.DEFAULT” (Raw: “android.intent.category.DEFAULT”)
E: meta-data (line=90)
A: android:name(0×01010003)=”android.app.searchable” (Raw: “android.app.searchable”)
A: android:resource(0×01010025)=@0×7f050000
E: provider (line=94)
A: android:name(0×01010003)=”com.amazon.kcp.search.SearchProvider” (Raw: “com.amazon.kcp.search.SearchProvider”)
A: android:authorities(0×01010018)=”kindle” (Raw: “kindle”)
A: android:syncable(0×01010019)=(type 0×12)0×0
E: activity (line=99)
A: android:theme(0×01010000)=@0×7f0b0004
A: android:name(0×01010003)=”.UpgradePage” (Raw: “.UpgradePage”)
A: android:screenOrientation(0×0101001e)=(type 0×10)0×1
E: intent-filter (line=104)
E: action (line=105)
A: android:name(0×01010003)=”android.intent.action.MAIN” (Raw: “android.intent.action.MAIN”)
E: category (line=106)
A: android:name(0×01010003)=”android.intent.category.LAUNCHER” (Raw: “android.intent.category.LAUNCHER”)
E: intent-filter (line=109)
E: action (line=110)
A: android:name(0×01010003)=”android.intent.action.VIEW” (Raw: “android.intent.action.VIEW”)
E: category (line=111)
A: android:name(0×01010003)=”android.intent.category.DEFAULT” (Raw: “android.intent.category.DEFAULT”)
E: category (line=112)
A: android:name(0×01010003)=”android.intent.category.BROWSABLE” (Raw: “android.intent.category.BROWSABLE”)
E: data (line=113)
A: android:scheme(0×01010027)=”kindle” (Raw: “kindle”)
E: uses-sdk (line=119)
A: android:minSdkVersion(0×0101020c)=(type 0×10)0×4
E: uses-permission (line=121)
A: android:name(0×01010003)=”android.permission.INTERNET” (Raw: “android.permission.INTERNET”)
E: uses-permission (line=122)
A: android:name(0×01010003)=”android.permission.READ_PHONE_STATE” (Raw: “android.permission.READ_PHONE_STATE”)
E: uses-permission (line=123)
A: android:name(0×01010003)=”android.permission.WRITE_EXTERNAL_STORAGE” (Raw: “android.permission.WRITE_EXTERNAL_STORAGE”)
E: uses-permission (line=124)
A: android:name(0×01010003)=”android.permission.ACCESS_WIFI_STATE” (Raw: “android.permission.ACCESS_WIFI_STATE”)

July 14th, 2010
안드로이드의 사생활 침해 위험성(데모)

안드로이드로 먹고 살고 있고 그 자유스러움을 사랑하지만
사랑스러우면 위험한 법.

아래의 동영상은 투명한 Activity(잘 모르면 애플리케이션의 윈도우라고 봐도 무리 없다)로 사진 찍는 앱을 제작한 것이다.


영상을 보면 벅스음악을 듣고 있는듯 하지만(실제로도 틀면 나온다. 벅스 최고!!) 실제로는 그 위에 투명한 앱이 떠있는 것이고 화면을 터치하면 preview없이 사진을 찍어 파일로 저장한다.
여기서는 ‘태연’님이 찍혔지만 지하철에서는 내 못생긴 엉덩이가 찍힐 수도 있다.

찰칵음이 나는데 이거 없애는 것도 별 문제 아니다(그런 앱이 있는걸 보니). 그리고 난다고 들리겠는가?