Android 의 특정 기능들은 일반 개발자가 해당 기능을 이용해서 앱을 제작할 수가 없다.
바로 제조사의 keystore 파일을 이용해서 signing 을 해야 하기 때문이다.
안드로이드 개발자 사이트의 manifest 의 permission 부분을 보면 특정 권한들은 아래와 같이 'Not for use by third-party applications.' 라고 보여진다.
http://developer.android.com/reference/android/Manifest.permission.html
public static final String DELETE_PACKAGES
Added in API level 1
Allows an application to delete packages.
Not for use by third-party applications.
Constant Value: "android.permission.DELETE_PACKAGES"
제조사의 keystore 파일을 이용해 signed APK 를 만들게되면 시스템 권한의 사용이 가능해 지는데 LG, 삼성과 같은 제조사의 keystore 파일은 해당 제조사에서 관리를 하며 오픈하지 않는다.
실질적으로는 단말기 출시할 때 기본 탑재되는 앱을 만드는 일이 아니라면 일반 Android App 개발자는 해당 기능을 사용할 수 없는 환경이다.
(LG/삼성에서 단말 출시 할 때 KT/SKT 전용 앱이 기본적으로 설치되어 있으며 그중에 일부의 앱만 제조사 signing을 받아 단말에 탑재되어 출시된다.)
아는사람들은 다 아는 방법같은데..
난 Google signed APK 를 만들어서 제조사 signing 없이 개발 및 테스트 할 수 있는 방법을 최근에야 알게 되었다.
시스템권한의 App을 개발 및 테스트 할 수 있는 환경은 다음과 같다.
1. Android Emulator 에서 구동 및 테스트
2. Firmware 가 userdebug mode 로 탑재되어있는 단말기
(userdebug mode Firmware 탑재 단말은 일반 Android App 개발자의 경우 단말제조사나 SKT/KT/LG U+ 관련 직종에서 일을 해야만 손에 넣을 수 있다.)
System Permission 을 사용하는 App을 만들기 위해 Google keystore 파일을 만들어 보겠다.
1. https://github.com/android/platform_build/tree/master/target/product/security 사이트에서 platform.pk8, platform.x509.pem 파일을 가져온다.
2. 다음의 명령으로 platform.jks 파일을 생성한다.
(OS 환경설정에 해당 명령어의 path가 잡혀있지 않으면 openssl, keytool 명령어 전체경로를 적어줘야 할 수 있다.)
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -password pass:android -name androiddebugkey
$ keytool -importkeystore -deststorepass android -destkeystore platform.jks -srcstoretype PKCS12 -srcstorepass android -srckeystore platform.p12
3. 생성된 platform.jks (keystore) 파일을 이용해서 App 을 다시 빌드하면 Google Platform Android 에뮬레이터에서 시스템 권한을 사용 할 수 있다.
생성된 keystore 파일을 다운받을 수 있게 올려 놓았다.
platform_google.jks 다운받기
참고: http://blog.naver.com/PostView.nhn?blogId=kimyow&logNo=50117944249&parentCategoryNo=6&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
Android 에서 사용 가능한 권한은 아래와 같다.
https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/AndroidManifest.xml
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.INJECT_EVENTS" />
- <uses-permission android:name="android.permission.DUMP" />
- <uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
- <uses-permission android:name="android.permission.STATUS_BAR" />
- <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
- <uses-permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK" />
- <uses-permission android:name="android.permission.MANAGE_USERS" />
- <uses-permission android:name="android.permission.READ_PROFILE" />
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
- <uses-permission android:name="android.permission.GET_APP_OPS_STATS" />
- <!-- Networking and telephony -->
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
- <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
- <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
- <uses-permission android:name="android.permission.CONTROL_VPN" />
- <!-- Physical hardware -->
- <uses-permission android:name="android.permission.MANAGE_USB" />
- <uses-permission android:name="android.permission.DEVICE_POWER" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.MASTER_CLEAR" />
- <uses-permission android:name="android.permission.VIBRATE" />
- <!-- ActivityManager -->
- <uses-permission android:name="android.permission.REAL_GET_TASKS" />
- <uses-permission android:name="android.permission.GET_DETAILED_TASKS" />
- <uses-permission android:name="android.permission.REORDER_TASKS" />
- <uses-permission android:name="android.permission.REMOVE_TASKS" />
- <uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
- <uses-permission android:name="android.permission.SET_SCREEN_COMPATIBILITY" />
- <uses-permission android:name="android.permission.START_ANY_ACTIVITY" />
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
- <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
- <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
- <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />
- <!-- WindowManager -->
- <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
- <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />
- <uses-permission android:name="android.permission.SET_ORIENTATION" />
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <!-- DreamManager -->
- <uses-permission android:name="android.permission.READ_DREAM_STATE" />
- <uses-permission android:name="android.permission.WRITE_DREAM_STATE" />
- <!-- Alarm clocks -->
- <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
- <!-- Keyguard -->
- <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
- <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
- <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
- <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
- <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
- <uses-permission android:name="android.permission.TRUST_LISTENER" />
- <!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked -->
- <uses-permission android:name="android.permission.SET_WALLPAPER"/>
- <!-- Recents -->
- <uses-permission android:name="android.permission.BIND_APPWIDGET" />
- <!-- Wifi Display -->
- <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
- <uses-permission android:name="android.permission.CAMERA" />
- <!-- Screen Capturing -->
- <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" />
안녕하세요. 해당키로 앱빌드시 패스워드는 어떻게 하면 되는지 알수 있을까요?
답글삭제패스워드를 어떻게 한다는게 질문이 이해가 잘 되지 않네요.
삭제어떤걸 하려는데 어떤게 문제인지 자세히 이야기 해주시면 이해하기 좋을 것 같습니다.