Translate

[Android] System Permission App 만들기 - Google Signed App




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 pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
$ 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

  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  4. <uses-permission android:name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" />
  5. <uses-permission android:name="android.permission.WAKE_LOCK" />
  6. <uses-permission android:name="android.permission.INJECT_EVENTS" />
  7. <uses-permission android:name="android.permission.DUMP" />
  8. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  9. <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
  10. <uses-permission android:name="android.permission.STATUS_BAR" />
  11. <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
  12. <uses-permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK" />
  13. <uses-permission android:name="android.permission.MANAGE_USERS" />
  14. <uses-permission android:name="android.permission.READ_PROFILE" />
  15. <uses-permission android:name="android.permission.READ_CONTACTS" />
  16. <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
  17. <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
  18. <uses-permission android:name="android.permission.GET_APP_OPS_STATS" />
  19. <!-- Networking and telephony -->
  20. <uses-permission android:name="android.permission.BLUETOOTH" />
  21. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  22. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  23. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  24. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  25. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  26. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  27. <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
  28. <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
  29. <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
  30. <uses-permission android:name="android.permission.CONTROL_VPN" />
  31. <!-- Physical hardware -->
  32. <uses-permission android:name="android.permission.MANAGE_USB" />
  33. <uses-permission android:name="android.permission.DEVICE_POWER" />
  34. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  35. <uses-permission android:name="android.permission.MASTER_CLEAR" />
  36. <uses-permission android:name="android.permission.VIBRATE" />
  37. <!-- ActivityManager -->
  38. <uses-permission android:name="android.permission.REAL_GET_TASKS" />
  39. <uses-permission android:name="android.permission.GET_DETAILED_TASKS" />
  40. <uses-permission android:name="android.permission.REORDER_TASKS" />
  41. <uses-permission android:name="android.permission.REMOVE_TASKS" />
  42. <uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
  43. <uses-permission android:name="android.permission.SET_SCREEN_COMPATIBILITY" />
  44. <uses-permission android:name="android.permission.START_ANY_ACTIVITY" />
  45. <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
  46. <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
  47. <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
  48. <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
  49. <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />
  50. <!-- WindowManager -->
  51. <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
  52. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  53. <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
  54. <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />
  55. <uses-permission android:name="android.permission.SET_ORIENTATION" />
  56. <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
  57. <!-- DreamManager -->
  58. <uses-permission android:name="android.permission.READ_DREAM_STATE" />
  59. <uses-permission android:name="android.permission.WRITE_DREAM_STATE" />
  60. <!-- Alarm clocks -->
  61. <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
  62. <!-- Keyguard -->
  63. <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
  64. <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
  65. <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  66. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
  67. <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
  68. <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
  69. <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
  70. <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
  71. <uses-permission android:name="android.permission.TRUST_LISTENER" />
  72. <!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked -->
  73. <uses-permission android:name="android.permission.SET_WALLPAPER"/>
  74. <!-- Recents -->
  75. <uses-permission android:name="android.permission.BIND_APPWIDGET" />
  76. <!-- Wifi Display -->
  77. <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
  78. <uses-permission android:name="android.permission.CAMERA" />
  79. <!-- Screen Capturing -->
  80. <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" />



댓글

  1. 안녕하세요. 해당키로 앱빌드시 패스워드는 어떻게 하면 되는지 알수 있을까요?

    답글삭제
    답글
    1. 패스워드를 어떻게 한다는게 질문이 이해가 잘 되지 않네요.
      어떤걸 하려는데 어떤게 문제인지 자세히 이야기 해주시면 이해하기 좋을 것 같습니다.

      삭제

댓글 쓰기