1/25/2021

Android Partition

1. Android Partition 구조 자료수집

Android에서 구성되는 Partition의 구조가 어떻게 변화가 되고 있는지 궁금해서 관련자료들을 수집하고 간단하게 정리한다. 

우선 Android의 Booting 부터 이해를 해야 될 것이며,  OTA와 관련된 부분을 별도로 다시 보도록 하자. 


1.1 Android Verified Boot(VBoot) 2.0  

AVB(Android Verified Boot) or Verified Boot(VBoot)라고 하며, 일종의 Linux라고 하면 Security Boot라고 보면 될 것 같다. 

  • AVB 의 vbmeta 기본구조 
boot/system/vendor를 같이 관리 목적이며, 상위에서 설명했듯이 Security Boot와 유사하다.
다만 3개의 Partition을 한번에 관리하는 것이 큰 목적이다. 
더불어 system/vendor는 hashtree로 구성하여 좀 더 많은 보안정보를 넣고 마지막에 vbmeta에 대한 sign하는 Key 정보를 넣어 구성 



  • AVB의 VBMeta의 확장구조 
boot/system/vendor를 같이 2개 이상으로 구성하고 싶다면 아래와 같이 Chained 연결하여 구성하여, OTA를 쉽게 구성할 수 있을 것이다. 
구조를 보면  xyz Partition을 Public Key로 연결하는 구조


  • Rollback Protection 
VBmeta의 Rollback Index 와 RIL 값이 존재하며, 이는 OTA에서 Upgrade를 했을 경우 중요한 정보이다. 


  • Stored Rollback Index
  1. RIL #0: 상위 head 의 vbmeta의 Rollback Index 42
  2. RIL #1: 상위 tail 의 xyz Rollback index 101


  • OTA A/B Slot 부분 
  1. Slot A:  RIL 정보 [42,101]
  2. Slot B:  RIL 정보 [43, 103]
상위와 같이 두개의 Rollback Index를 관리하며, 증가는 하며 이를 관리한다. 


관련 tool은 avbtool 이 존재하며 세부내용은 아래링크참조


  • Recommended Boot Flow
Stored Rollback Index가 Update되는 순간은 아래와 같이 Device Lock 이며, Key  값이 다르면, 이를 Update하는 것으로 보인다. 
Boot Flow이지 OTA Flow가 아니므로 주의 



vbmeta 와 a/b slot 

VBoot 2.0 초기 Mount 


1.2  OTA(On The Air) Update 

OTA를 보면 System Partition 과 Non System Partition으로 볼 수 있으며, Update하는 방법은 서로 다르다. 

  • 1. OTA System Update (A/B Slot)
우선 상위 AVB를 보면 vbmet 부분을 참조하면 될 것 같으며, boot/system/vendor 와 같이 Update되어진다. 



출처 

  • 2. OTA Other Update
A/B Slot이 아니라 Block 기반의 OTA라고 하는데, 관련내용은 아래 참조 


  • OTA 기타 관련정보 및 관련소스 


동적파티션 (Android 10 이후부터 지원가능)
기존까지는 정적파티션기반으로 되어왔는데, Android 10이후로 Partition 의 Size도 변경가능


2. Android의 Partition Tool 기능 

Android에서 GPT 관련설정 Tool 과 관련정보수집 

  • bpt 의 GPT Table 
bpt 의 tool에  json 설정하여 GPT Table을 만드는 방법 

  • GPT Table 정보 
GPT Table의 기본이해 

Android 아키텍처 구조 

1/10/2021

SELinux (Security-Enhanced Linux) 자료조사 및 정리

1. SELinux (Security-Enhanced Linux) 이해 

SELinux는 보안강화로 문제가 있는 Application들로 부터 이를 보호하기 위해서 생겨났다고 한다. 
아래와 같이 Linux Kernel의 Security Module은 Mandatory Access Control (MAC)를 지원하며, 
한마디로 필수적인 접근권한접근을 Kernel 단에서 부터 이를 실행한다. 

https://www.ni.com/ko-kr/support/documentation/supplemental/15/selinux---addressing-access-control-security-in-labview-rio-devi.html

상위과 같이 User Process  매번 Linux Kernel에게 접근권한을 허락(Yes or No)을 받아 접근하는 방식이다. 
이는 Android에서도 쉽게 볼수 있는 구조이며, 특정 Resource or File에 접근권한 외부로부터 보호할수가 있다.  


물론 SELinux 를 사용하더라도 이기능을 ON/OFF 처럼 할수있다.
  1. Enforcing : SELinux Policy에 적용하여 접근권한제어 행사  
  2. Permissive: SELinux는 접근권한제어는 하지는 않지만, warnning/debug 표시됨 
이외 disabled 비활성화가 존재 (아예사용안함)

Enforcing의 경우 SELinux Policy를 반드시 확인 

SElinux-Addressing Access Control Security in Labview
NI(National Instrument)의 Labview에서 RIO Devices 의 SELInux 관련내용 


  • SELinux의 Policy이해 
Linux User는 SELinux ID or SELinux User로 Mapping되어 동작되어진다. 






  1. Linux User 
  2. SELinux ID or SELinux User 
  3. SELinux Role
  4. SELinux Domain or SELinux Type 

  https://en.wikipedia.org/wiki/Security-Enhanced_Linux


1.1 SELinux 기본동작방식 

DAC(Discretionary Access Control) : 일반적인 Linux의 권한 접근방식
MAC(Mandatory Access Control): SELinux 기반으로 Policy에 의한 접근방식

DAC vs MAC

  • 일반 Linux DAC 동작방식 
Process ( User: swift / Group: users(media,video)가 File (User:root / Group:root) 에 접근은 아래와 같이 한다.  



DAC(Discretionary Access Control)

  • SELinux MAC 동작방식 
SELinux를 사용할 경우 Linux Kernel에서 Policy Rules에 맞게 허락을 받고 SELinux context 가 Process에 추가되어 사용할 Target context 에 접근한다. 
하지만, Policy Rules를 보면 현재 Process는 File에 접근할 권한이 없다. 



MAC(Mandatory Access Control)



  • SELinux의 Context 분석 
  1. Target 의 Context  구조 
  2. Process 의 Security Context  구조



중요한것을 설정시 서로 양쪽의 SELinux Type 기준으로 설정하며, SELinux의 Sensitivity 도 설정가능 


  • SELinux의 Sensitivity 의 Multi-Category Security (MCS) 
Sensitivity 설정방법 
user_r:user_r:user_t:s0 
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#
#                          s0           부터     s0:c0.c5 까지 범위설정 (c는 category 약어)
#
#system_u:system_r:httpd_t:s0           -        s0:c0.c5
#                          ▼                     ▼
#                  Low security level,    High security level, also
#                  associated with no     associated with compartments
#                  compartments.          c0, c1, c2, c3, c4 and c5.

Sensitivity 확인방법 
$ semanage user -l  //SELinux User 와 Roles 확인 
SELinux User    SELinux Roles
  
root            staff_r sysadm_r
staff_u         staff_r sysadm_r
sysadm_u        sysadm_r
system_u        system_r
unconfined_u    unconfined_r
user_u          user_r

$ semanage user -l  //Sensitivity인 MCS의 Level 과 Range  c0.c1023 는 c0 부터 c1023까지   
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range                      SELinux Roles
  
root            sysadm     s0         s0-s0:c0.c1023                 staff_r sysadm_r
staff_u         staff      s0         s0-s0:c0.c1023                 staff_r sysadm_r
sysadm_u        sysadm     s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r
unconfined_u    unconfined s0         s0-s0:c0.c1023                 unconfined_r
user_u          user       s0         s0                             user_r  



  • Type enforcement 
Process의 Context가 Target Context를 실행하기 위해서는 아래와 같은 Type enforcement 로 양쪽의 Type를 추가 하고 Class를 File하고 실행권한  추가한다.
그러면, 상위 SELinux는 실행이 가능해진다.  

      allow  type(process)  type(target) : class { }

allow user_t lib_t : file { execute };

1.2  SELinux 의 class 와 permission확인 

class는 일반 file 부터 다양한 종류의 device file 비롯하여 socket 부터 다양하게 class를 분리를 해놓았으며, 이 권한을 주는 것이므로
아래와 같이 접근할 경우 class 와 permission을 반드시 확인하자. 

  • General SELinux 
$ ls /sys/fs/selinux/class   //상위에서 정의한 class file 확인 (Linux)
appletalk_socket  db_procedure  file            netlink_audit_socket           node           socket              x_cursor     x_screen
association       db_schema     filesystem      netlink_dnrt_socket            nscd           sock_file           x_device     x_selection
blk_file          db_sequence   ipc             netlink_firewall_socket        packet         system              x_drawable   x_server
capability        db_table      kernel_service  netlink_ip6fw_socket           packet_socket  tcp_socket          x_event      x_synthetic_event
capability2       db_tuple      key             netlink_kobject_uevent_socket  passwd         tun_socket          x_extension
chr_file          dbus          key_socket      netlink_nflog_socket           peer           udp_socket          x_font
context           db_view       lnk_file        netlink_route_socket           process        unix_dgram_socket   x_gc
db_blob           dccp_socket   memprotect      netlink_selinux_socket         rawip_socket   unix_stream_socket  x_keyboard
db_column         dir           msg             netlink_socket                 security       x_application_data  x_pointer
db_database       fd            msgq            netlink_tcpdiag_socket         sem            x_client            x_property
db_language       fifo_file     netif           netlink_xfrm_socket            shm            x_colormap          x_resource

$ ls /sys/fs/selinux/class/file/perms/    //class file permission 기능 확인 
append      execmod           getattr  lock     quotaon      relabelto  swapon
create      execute           ioctl    mounton  read         rename     unlink
entrypoint  execute_no_trans  link     open     relabelfrom  setattr    write

  • Android SELinux
$ ls /sys/fs/selinux/class  //상위에서 정의한 class file 확인 (Android)
alg_socket         isdn_socket                   packet
appletalk_socket   iucv_socket                   packet_socket
association        kcm_socket                    peer
atmpvc_socket      kernel_service                phonet_socket
atmsvc_socket      key                           pppox_socket
ax25_socket        key_socket                    process
binder             keystore_key                  process2
blk_file           llc_socket                    property_service
bluetooth_socket   lnk_file                      qipcrtr_socket
bpf                memprotect                    rawip_socket
caif_socket        msg                           rds_socket
can_socket         msgq                          rose_socket
cap2_userns        netif                         rxrpc_socket
cap_userns         netlink_audit_socket          sctp_socket
capability         netlink_connector_socket      security
capability2        netlink_crypto_socket         sem
chr_file           netlink_dnrt_socket           service_manager
dccp_socket        netlink_fib_lookup_socket     shm
decnet_socket      netlink_generic_socket        smc_socket
dir                netlink_iscsi_socket          sock_file
drmservice         netlink_kobject_uevent_socket socket
fd                 netlink_netfilter_socket      system
fifo_file          netlink_nflog_socket          tcp_socket
file               netlink_rdma_socket           tipc_socket
filesystem         netlink_route_socket          tun_socket
hwservice_manager  netlink_scsitransport_socket  udp_socket
icmp_socket        netlink_selinux_socket        unix_dgram_socket
ieee802154_socket  netlink_socket                unix_stream_socket
infiniband_endport netlink_tcpdiag_socket        vsock_socket
infiniband_pkey    netlink_xfrm_socket           x25_socket
ipc                netrom_socket                 xdp_socket
ipx_socket         nfc_socket
irda_socket        node
db_language       fifo_file     netif           netlink_xfrm_socket            shm            x_colormap          x_resource

$ ls /sys/fs/selinux/class/file/perms/       //class file permission 기능 확인 
append       execute_no_trans mounton     rename      watch_sb
audit_access getattr          open        setattr     watch_with_perm
create       ioctl            quotaon     unlink      write
entrypoint   link             read        watch
execmod      lock             relabelfrom watch_mount
execute      map              relabelto   watch_reads


2. SELinux 의 Access Control 방법 

위에서 SELinux MAC 동작 방식을 봤지만 SELinux에서 Acess Control 하는 방법 아래로 구분되는 것 같다. 

  1. Type Enforcement (TE) : 가장 처음적용되는 기능 
  2. Role-Based Access Control (RBAC): 기본으로 사용하지 않는다고 함
  3. Multi-Level Security (MLS) : 상위에서 Sensitivity 에서 설정
  4. Multi-Category Security(MCS): MLS의 확장으로 



2.1 SELinux 에러 Message 분석 


avc:  denied  { read write } for  pid=1876 comm="syslogd" name="xconsole" dev=tmpfs ino=5510 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:device_t:s0 tclass=fifo_file permissive=1 
상위 에러는 SELinux Policy에 따라 read , write 접근이 되지 않았아 발생한 에러 
  1. scontext: process의 context
  2. tcontext: target의 context
  3. tclass: target class
  4. permissive: 1은 permissive 상태이므로 접근은 가능하지만 warning/debug 발생 




SElinux 부분 별도정리 필요 
Android App에서 권한문제로 인하여 이 관련부분을 알아보게됨 







Android SELinux 관련부분 수정방법 
*.te 생성방법 
  1. system/sepolicy/public
  2. system/sepolicy/private
  3. system/sepolicy/vendor
  4. device/manufacturer/device-name/sepolicy

  1. genfs_contexts
  2. file_contexts
  3. *.te


  • SELinux 빌드 
system/sepolicy/Android.mk

 //sepolicy 문제 , 
https://kodejava.org/how-do-i-use-datainputstream-and-dataoutputstream/
https://jung-max.github.io/2019/09/02/Android-NDK%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-kernel%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

[  368.428751] type=1400 audit(1610446043.380:38): avc: denied { write } for comm="sh" name="duty_cycle" dev="sysfs" ino=37608 scontext=u:r:untrusted_app:s0:c101,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=com.example.testjeonghun
[  368.452747] type=1400 audit(1610446056.140:39): avc: denied { write } for comm="sh" name="duty_cycle" dev="sysfs" ino=37592 scontext=u:r:untrusted_app:s0:c101,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=com.example.testjeonghun
[  368.476177] type=1400 audit(1610446056.140:39): avc: denied { write } for comm="sh" name="duty_cycle" dev="sysfs" ino=37592 scontext=u:r:untrusted_app:s0:c101,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=com.example.testjeonghun
[  368.500078] type=1400 audit(1610446056.140:40): avc: denied { write } for comm="sh" name="duty_cycle" dev="sysfs" ino=37608 scontext=u:r:untrusted_app:s0:c101,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=com.example.testjeonghun


I/om.example.beep: type=1400 audit(0.0:56): avc: denied { write } for name="duty_cycle" dev="sysfs" ino=37592 scontext=u:r:untrusted_app:s0:c99,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 app=com.example.beep
I/om.example.beep: type=1400 audit(0.0:57): avc: denied { open } for path="/sys/devices/platform/bus@5d000000/5d010000.pwm/pwm/pwmchip0/pwm0/duty_cycle" dev="sysfs" ino=37592 scontext=u:r:untrusted_app:s0:c99,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 app=com.example.beep


//분석 
https://source.android.com/security/selinux/validate

//JNI
https://www.programmersought.com/article/5477408309/
https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.1


https://android.googlesource.com/platform/external/sepolicy/+/57531cacb40682be4b1189c721fd1e7f25bf3786/untrusted_app.te

//sys filesystem 권한 
$ vi ./system/sepolicy/public/file.te
$ vi ./device/fsl/imx8q/mek_8q/sepolicy/file_contexts

$ find . -name untrusted_app*.te
./device/fsl/imx6sl/sepolicy/untrusted_app_25.te
./device/fsl/imx7d/sepolicy/untrusted_app_25.te
./device/fsl/imx6sx/sepolicy/untrusted_app_25.te
./device/fsl/imx6dq/sepolicy/untrusted_app_25.te
./device/fsl/imx7ulp/sepolicy/untrusted_app_25.te
./device/fsl/imx8m/sepolicy/untrusted_app_25.te
./device/fsl/imx8q/sepolicy/untrusted_app_25.te
./device/google/wahoo/sepolicy/private/untrusted_app_all.te
./device/linaro/poplar/sepolicy/untrusted_app_25.te
./device/linaro/poplar/sepolicy/untrusted_app.te
./device/linaro/poplar/sepolicy/untrusted_app_27.te
./system/sepolicy/private/untrusted_app_25.te
./system/sepolicy/private/untrusted_app.te
./system/sepolicy/private/untrusted_app_27.te
./system/sepolicy/private/untrusted_app_all.te
./system/sepolicy/public/untrusted_app.te
./system/sepolicy/prebuilts/api/28.0/private/untrusted_app_25.te
./system/sepolicy/prebuilts/api/28.0/private/untrusted_app.te
./system/sepolicy/prebuilts/api/28.0/private/untrusted_app_27.te
./system/sepolicy/prebuilts/api/28.0/private/untrusted_app_all.te
./system/sepolicy/prebuilts/api/28.0/public/untrusted_app.te
./system/sepolicy/prebuilts/api/26.0/private/untrusted_app_25.te
./system/sepolicy/prebuilts/api/26.0/private/untrusted_app.te
./system/sepolicy/prebuilts/api/26.0/private/untrusted_app_all.te
./system/sepolicy/prebuilts/api/26.0/public/untrusted_app_25.te
./system/sepolicy/prebuilts/api/26.0/public/untrusted_app.te
./system/sepolicy/prebuilts/api/27.0/private/untrusted_app_25.te
./system/sepolicy/prebuilts/api/27.0/private/untrusted_app.te
./system/sepolicy/prebuilts/api/27.0/private/untrusted_app_all.te
./system/sepolicy/prebuilts/api/27.0/public/untrusted_app_25.te
./system/sepolicy/prebuilts/api/27.0/public/untrusted_app.te
./system/sepolicy/prebuilts/api/29.0/private/untrusted_app_25.te
./system/sepolicy/prebuilts/api/29.0/private/untrusted_app.te
./system/sepolicy/prebuilts/api/29.0/private/untrusted_app_27.te
./system/sepolicy/prebuilts/api/29.0/private/untrusted_app_all.te
./system/sepolicy/prebuilts/api/29.0/public/untrusted_app.te

//일반적인 Android 앱 
https://source.android.com/security/selinux/concepts
http://shincdevnote.blogspot.com/2017/04/se-for-android.html

//이것을 고치면 문제 발생 (app_neverallows.te 같이 수정해야함)
$ vi system/sepolicy/prebuilts/api/29.0/public/untrusted_app.te
$ vi ./system/sepolicy/public/untrusted_app.te
type untrusted_app, domain;
type untrusted_app_27, domain;
type untrusted_app_25, domain;

# 상위 untrusted_app domain이 선언되었음 
# sysfs 허용 sysfs domain 허용 이 부분은 file_contexts 에 각 도메인 선언 
allow untrusted_app sysfs:file rw_file_perms;


$ cat ./system/sepolicy/private/untrusted_app.te
typeattribute untrusted_app coredomain;

app_domain(untrusted_app)
untrusted_app_domain(untrusted_app)
net_domain(untrusted_app)
bluetooth_domain(untrusted_app)


$ cat ./device/fsl/imx8q/mek_8q/sepolicy/genfs_contexts
genfscon nfs / u:object_r:rootfs:s0
genfscon fuseblk / u:object_r:vfat:s0
genfscon sysfs /class/typec                                             u:object_r:sysfs_usb_c:s0
genfscon sysfs /devices/virtual/power_supply/usb                  u:object_r:sysfs_batteryinfo:s0
genfscon sysfs /devices/virtual/power_supply/battery              u:object_r:sysfs_batteryinfo:s0
genfscon sysfs /devices/platform/rtc/rtc/rtc0/hctosys             u:object_r:sysfs_rtc:s0
genfscon sysfs /devices/platform/scu/scu:rtc/rtc/rtc0/hctosys     u:object_r:sysfs_rtc:s0
genfscon sysfs /devices/platform/sound/extcon                     u:object_r:sysfs_extcon:s0
genfscon sysfs /devices/platform/sound-wm8960/extcon              u:object_r:sysfs_extcon:s0
genfscon sysfs /devices/platform/bus@56260000/56268000.hdmi/extcon      u:object_r:sysfs_extcon:s0
genfscon debugfs /dma_buf u:object_r:debugfs_dma:s0
genfscon debugfs /sync/sw_sync u:object_r:debugfs_sw_sync:s0
genfscon sysfs /devices/soc0   u:object_r:sysfs_soc:s0

#mek_8q ethernet
genfscon sysfs /devices/platform/bus@5b000000/5b040000.ethernet/net  u:object_r:sysfs_net:s0
#mek_8qm wifi
genfscon sysfs /devices/platform/bus@5f000000/5f000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/net u:object_r:sysfs_net:s0
#mek_8qxp wifi
genfscon sysfs /devices/platform/bus@5f000000/5f010000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/net u:object_r:sysfs_net:s0
genfscon binder /binder u:object_r:binder_device:s0
genfscon binder /hwbinder u:object_r:hwbinder_device:s0
genfscon binder /vndbinder u:object_r:vndbinder_device:s0
genfscon binder /binder_logs u:object_r:binderfs_logs:s0
genfscon binder /binder_logs/proc u:object_r:binderfs_logs_proc:s0
genfscon binder / u:object_r:binderfs:s0

$ ls ./device/fsl/imx8q/sepolicy/
adbd.te                           hal_composer.te                   init-insmod-sh.te                 recovery.te
audioserver.te                    hal_drm_clearkey.te               init.te                           sensors.te
bluetooth.te                      hal_drm_default.te                installd.te                       shell.te
bootanim.te                       hal_drm_widevine.te               install_recovery.te               surfaceflinger.te
bootstat.te                       hal_dumpstate_impl.te             kernel.te                         system_app.te
cameraserver.te                   hal_graphics_composer_default.te  logd.te                           system_server.te
device.te                         hal_health_default.te             mediacodec.te                     tee.te
dnsmasq.te                        hal_light_default.te              mediaextractor.te                 toolbox.te
domain.te                         hal_neuralnetworks_imx.te         mediaprovider.te                  untrusted_app_25.te
dumpstate.te                      hal_oemlock.te                    mediaserver.te                    update_engine_common.te
ephemeral_app.te                  hal_power_default.te              mediaswcodec.te                   update_engine.te
fastbootd.te                      hal_sensors_default.te            modprobe.te                       vendor_init.te
file_contexts                     hal_thermal_default.te            netd.te                           vndservicemanager.te
file.te                           hal_usb_default.te                platform_app.te                   vold_prepare_subdirs.te
genfs_contexts                    hal_usb_impl.te                   priv_app.te                       vold.te
hal_bluetooth_default.te          hal_wifi_default.te               proc_net.te                       webview_zygote.te
hal_bootctl_default.te            hal_wifi_supplicant_default.te    profman.te                        wificond.te
hal_camera_default.te             healthd.te                        property_contexts                 zygote.te
hal_cas_default.te                hwservice_contexts                property.te

$ ls ./device/fsl/imx8q/mek_8q/sepolicy
file_contexts  genfs_contexts

https://source.android.com/security/selinux/device-policy
https://android.googlesource.com/device/lge/hammerhead/+/marshmallow-dev/sepolicy/file_contexts#139

$ cat ./device/fsl/imx8q/mek_8q/sepolicy/file_contexts
/dev/mxc_asrc                   u:object_r:audio_device:s0
/dev/mxc_hdmi                   u:object_r:video_device:s0
/dev/mxc_hantro                 u:object_r:video_device:s0
/dev/mxc_hantro_h1              u:object_r:video_device:s0
/dev/mxc_vpu_malone             u:object_r:video_device:s0
/dev/mxc_hifi4                  u:object_r:audio_device:s0
/dev/galcore                    u:object_r:gpu_device:s0
/dev/imxdpu                     u:object_r:gpu_device:s0
/dev/caam_kb                    u:object_r:caam_device:s0
/dev/dri                        u:object_r:gpu_device:s0
/dev/dri/card0                  u:object_r:graphics_device:s0
/dev/dri/card1                  u:object_r:graphics_device:s0
/dev/dri/card2                  u:object_r:graphics_device:s0
/dev/dri/controlD64             u:object_r:graphics_device:s0
/dev/dri/controlD65             u:object_r:graphics_device:s0
/dev/dri/renderD128             u:object_r:gpu_device:s0
/dev/dri/renderD129             u:object_r:gpu_device:s0
/vendor/bin/hw/android\.hardware\.usb@1\.1-service.imx             u:object_r:hal_usb_impl_exec:s0
/dev/diag                       u:object_r:diag_device:s0
/vendor/app(/.*)?               u:object_r:same_process_hal_file:s0
/data/vendor/ss(/.*)?           u:object_r:tee_data_file:s0
/data/vendor/.opencl-cache(/.*)?       u:object_r:opencl_cache_file:s0

###############################################
# same-process HAL files and their dependencies
#
/vendor/lib(64)?/hw/gralloc\.imx\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libfsldisplay\.so          u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/nxp.hardware.display@1.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libedid\.so                u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libdrm_android\.so         u:object_r:same_process_hal_file:s0

/vendor/lib(64)?/libGLSLC\.so               u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libVSC\.so                 u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libGAL\.so                 u:object_r:same_process_hal_file:s0

/vendor/lib(64)?/hw/vulkan\.imx\.so        u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/hw/gralloc_viv\.imx\.so   u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libdrm_vivante\.so         u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libvulkan_VIVANTE\.so      u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libSPIRV_viv\.so           u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libCLC\.so                 u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libLLVM_viv\.so            u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libOpenCL\.so              u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libopencl-2d\.so           u:object_r:same_process_hal_file:s0

#early_init_sh service
/vendor/bin/init\.insmod\.sh                u:object_r:init-insmod-sh_exec:s0
/vendor/etc/early\.init\.cfg                u:object_r:init-insmod-sh_exec:s0
/vendor/etc/setup\.core\.cfg                u:object_r:init-insmod-sh_exec:s0
/vendor/etc/setup\.main\.cfg                u:object_r:init-insmod-sh_exec:s0

/vendor/lib(64)?/lib_aac_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_amr_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_asf_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_avi_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_dsf_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_flac_parser_arm11_elinux\.3\.0\.so      u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_flv_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_mkv_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_mp3_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_mp3_parser_v2_arm11_elinux\.so          u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_mp4_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_mpg2_parser_arm11_elinux\.3\.0\.so      u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_ogg_parser_arm11_elinux\.3\.0\.so       u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/lib_rm_parser_arm11_elinux\.3\.0\.so        u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/extractors/libimxextractor\.so              u:object_r:same_process_hal_file:s0
/(vendor|system/vendor)/bin/hw/android\.hardware\.keymaster@3\.0-service.trusty      u:object_r:hal_keymaster_default_exec:s0

# trusty ipc target
/dev/trusty-ipc-dev0        u:object_r:tee_device:s0

/vendor/bin/hw/android\.hardware\.health@2\.0-service.imx          u:object_r:hal_health_default_exec:s0

/vendor/bin/hw/android\.hardware\.power@1\.3-service\.imx  u:object_r:hal_power_default_exec:s0
# mmc rpmb
/dev/mmcblk0rpmb      u:object_r:mmc_rpmb_char_device:s0

# secure os storage
/vendor/bin/storageproxyd   u:object_r:tee_exec:s0

/vendor/bin/hw/android\.hardware\.drm@1\.2-service\.widevine u:object_r:hal_drm_widevine_exec:s0
/vendor/bin/hw/android\.hardware\.drm@1\.1-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/vendor/bin/hw/android\.hardware\.drm@1\.2-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
/vendor/bin/hw/android\.hardware\.dumpstate@1\.0-service\.imx      u:object_r:hal_dumpstate_impl_exec:s0
/dev/cpu_dma_latency u:object_r:latency_device:s0
/vendor/bin/hw/android\.hardware\.oemlock@1\.0-service\.imx      u:object_r:hal_oemlock_impl_exec:s0
/vendor/bin/hw/android\.hardware\.boot@1\.0-service\.imx      u:object_r:hal_bootctl_default_exec:s0


 http://shincdevnote.blogspot.com/2017/04/se-for-android.html
https://android.googlesource.com/platform/system/sepolicy/+/nougat-dr1-release/file_contexts
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/sec-sel-building-policy-module
https://community.nxp.com/t5/i-MX-Processors/How-to-access-serial-port-from-Android-MM-application/m-p/600424
https://wenchiching.wordpress.com/2016/12/05/how-to-change-process-domain-from-untrusted_app-to-system_app/
https://jung-max.github.io/2019/09/16/Android-SEAndroid%EC%A0%81%EC%9A%A9/

$ vi ./device/fsl/imx8q/sepolicy/system_app.te
...
allow system_app sysfs:file { open read write };


$ vi ./device/fsl/imx8q/mek_8q/sepolicy/file_contexts  // /dev 이면 이곳에 추가 
....
# pwm0
/sys/devices/platform/bus@5d000000/5d010000.pwm/pwm/pwmchip0/pwm0/duty_cycle            u:object_r:pwm0_device:s0

$ vi ./device/fsl/imx8q/mek_8q/sepolicy/genfs_contexts //
...
# pwm0
genfscon sysfs /devices/platform/bus@5d000000/5d010000.pwm/pwm/pwmchip0/pwm0/duty_cycle u:object_r:sysfs_pwm0_device:s0

새 정책파일 
https://source.android.com/security/selinux/implement


$ vi ./device/fsl/imx8q/sepolicy/device.te
type sysfs_pwm0_device, sysfs_type, fs_type;

$ vi ./device/fsl/imx8q/sepolicy/pwm.te
type sysfs_pwm0_device, sysfs_type, fs_type;

allow untrusted_app sysfs_pwm0_device:dir r_dir_perms;
allow untrusted_app sysfs_pwm0_device:file rw_file_perms;
allow untrusted_app sysfs_pwm0_device:file { read write open };



****************** app.te 와 주의 
$ vi system/sepolicy/private/app_neverallows.te  //상위를 고쳐도 app이 지켜야할 부분이므로 여기서 에러 발생 
$ vi system/sepolicy/prebuilts/api/29.0/private/app_neverallows.te
주석처리 
# Do not allow any write access to files in /sys
#neverallow all_untrusted_apps sysfs_type:file { no_w_file_perms no_x_file_perms };

# Apps may never access the default sysfs label.
#neverallow all_untrusted_apps sysfs:file no_rw_file_perms;

$ vi ./device/fsl/imx8q/sepolicy/file_contexts
$ vi ./device/fsl/imx8q/mek_8q/sepolicy/file_contexts
# pwm0
/sys/devices/platform/bus@5d000000/5d010000.pwm/pwm/pwmchip0/pwm0/duty_cycle            u:object_r:sysfs_pwm0_device:s0
/sys/devices/platform/bus@5d000000/5d020000.pwm/pwm/pwmchip1/pwm0/duty_cycle            u:object_r:sysfs_pwm1_device:s0

$ vi ./device/fsl/imx8q/sepolicy/pwm.te
type sysfs_pwm0_device, sysfs_type, fs_type;

allow untrusted_app sysfs_pwm0_device:dir r_dir_perms;
allow untrusted_app sysfs_pwm0_device:file rw_file_perms;
allow untrusted_app sysfs_pwm0_device:file { read write open };


BOARD_SEPOLICY_DIRS  확인

system_app 



이 설정 때문인지 shell에서 su 명령어가 되어 root 권한으로 실행가능하지만, vi가 없음
그래서 현재 adb shell로 연결할 방법모색
cat 으로 수정하려고 함 


보안  (dm-verity)

remount 후 소스 수정후 recovery 모드로 동작 

1/09/2021

Android USB 설정 및 USB Type C

 1. USB Device Tree 설정분석 


USB OTG Device Tree 관련내용 


Chapter 14 Connectivity Subsystem



  • USB 분석이유 
USB Device Tree를 다시 분석하는 이유는 USB Type-C가 지원이 되면서, HW 구조가 변경이 되어 개인적으로 이 부분을 정확히 이해하려고 한다. 
i.MX8QXP의 EVM의 경우 아래와 같이 사용하고 있지만, 현재 OTG1/2만 사용하고자 하면 이 구조를 변경을 해야한다. 
  1. OTG1: OTG 사용   
  2. OTG2/OTG3: USB Type-C  (USB 2.0 과 USB 3.0 동시 필요)

USB 3.0 TypeC 의 경우 Cadence 것을 가져다 쓰며, 아래와 같이 AMBA에서 APB/AXI4로 연결하여 사용되어지고 있다. 
중간에 MUX에 의해 Host or Device 선택되어지면, 이는 OTG에 의해서 결정될 것이다. 
(참고로 USB 2.0 OTG의 경우, 대체적으로 dwc or hdrc )

14.12.2 Functional Description





변경하고자 하는 HW
OTG1 과 OTG2만 USB 2.0 사용할 경우 재미있는 것은 상위 OTG1/2만 사용할 경우 OTG가 잘동작하지 않아 이를 HW로 ID 핀으로 Device or Host 설정을 한 후 사용예정 


$ vi ./vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi

/*
    USB OTG일 경우  i.MX series는 /sys file에 ci_hdrc.0 만 생성되며, ci_hdrc.1 은 찾아볼수 없음 
    i.MX8은 i.MX6 다르게, OTG Hardware는 두개지만 내부적 OTG2는 USB3를 위해서으로 분할되어 있음
    
    Device Tree 주소와 같이 보자 
    
  2.2.2 Connectivity Memory Maps
     5B28_0000 : LPCG USB3           (현재 미사용 추측) 
     5B27_0000 : LPCG USB2           (현재 미사용 추측)
     5B16_0000 : USB3_PHY3P0  (OTG3/2) 
     5B12_0000 : USB3         (OTG3/2) 
     5B11_0000 : USB3_CTRL    (OTG3/2) 
     5B10_0000 : USBOH_PHY    (OTG1)
     5B0F_0000 : USBOH_PL301         (현재 미사용 추측)
     5B0D_0000 : USBOH_OTG    (OTG1) 
*/

  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt
  
	usbotg1: usb@5b0d0000 {
		compatible = "fsl,imx8qm-usb", "fsl,imx7ulp-usb",
			"fsl,imx27-usb";
		reg = <0x5b0d0000 0x200>;
		interrupt-parent = <&gic>;
		interrupts = <GIC_SPI 267 IRQ_TYPE_LEVEL_HIGH>;
		fsl,usbphy = <&usbphy1>;
		fsl,usbmisc = <&usbmisc1 0>;
		clocks = <&usb2_lpcg 0>;
		ahb-burst-config = <0x0>;
		tx-burst-size-dword = <0x10>;
		rx-burst-size-dword = <0x10>;
		power-domains = <&pd IMX_SC_R_USB_0>;
		status = "disabled";
	};

/*
    Datasheet를 보면, OTG Hardware는 2개가 다른 곳에 있으며, 이 것을 OTG1/2 분할 해서 사용해야 할 것같다.  
    구성은 좀 재미있으며, Datasheet를 비교해봐도 i.MX6와 완전다르다 
    
OTG1의 구성을 세부적으로 Datasheet와 같이 분석 
    
  14.10.3.1.1 Configuration, Control and Status Register Set 구성 (5B0D_0000 : USBOH_OTG )  
       - UOG1 (OTG1) : 3개다 동일 offset 이며, 공통 OTG 기능 목적으로 사용되는 것으로 추측 
       - UOG2 (OTG2)
       - UH   (USB Host)
      USB Core RegisterUSB Non Core Register가 구분               
      
  14.10.4 USB Non-Core Memory Map/Register Definition        (5B0D_0000 : USBOH_OTG )
      Non Core Register들로 추가적으로 의존적인 부분이라고 하는데, 공유목적으로 분리사용하는것으로 추측
        - 5b0d0200 : USBNC_OTG1_CTRL1  Non-Core Control
        - 5b0d1200 : USBNC_OTG2_CTRL1         
        - 5b0d2200 : USBNC_UH_CTRL1        
        ** usbmisc 사용    
        
  14.10.5 USB Core Memory Map/Register Definition      (5B0D_0000 : USBOH_OTG )
       USB Core Register들은 USB Core Function Control과 독립적인 기능역할을 해서 분리 
        상위 14.10.3.1.1 Configuration, Control and Status Register Set 과 동일         
*/
  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/usb/usbmisc-imx.txt

	usbmisc1: usbmisc@5b0d0200 {
		#index-cells = <1>;
		compatible = "fsl,imx7ulp-usbmisc", "fsl,imx6q-usbmisc";
		reg = <0x5b0d0200 0x200>;
	};

  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/phy/mxs-usb-phy.txt
  
	usbphy1: usbphy@5b100000 {
		compatible = "fsl,imx8qm-usbphy", "fsl,imx7ulp-usbphy",
			"fsl,imx6ul-usbphy", "fsl,imx23-usbphy";
		reg = <0x5b100000 0x1000>;
		clocks = <&usb2_lpcg 1>;
		power-domains = <&pd IMX_SC_R_USB_0_PHY>;
		status = "disabled";
	};
        
/* 
OTG3/2의 구성분석 
   
    USB OTG2는 내부적으로 보면 USB3.0 OTG Controller 위해 존재하며, 상위 OTG1 과 OTG3 Device Driver 완전 다르다. 
    EVM은 사용 상위 OTG2의 Controller가 14.12.6.33 USB2 Port Status and Control (PORTSC1USB2)  존재하는데, 
    EVM을 보면, USB-C Type에 위해서 사용되며, USB 2.0 Phy(OTG) 와 USB 3.0 Phy 때문에 사용한 것으로 파악  
    
    관련내용 14.12.1.1 Features Reference Manual
    - 전압도 12V 와 5V로 구조로 분리되어 동작 (추후 시간이되면, USB3.0 회로구성을 다시 한번 세부 분석해야겠음)
    - 현재 아래는 USB Type-C 사용할때 3.0 와 2.0을 같이 사용하기 위한 전용 Controller로 생각되며, 
      처음 OTG1/2만 사용할 경우 필요 없을 것이라고 생각했지만, 분석 후 아래의 otg3도 같이 사용할 필요할 것으로 파악. 
*/

	usb3phynop1: usb3-phy {
		compatible = "usb-nop-xceiv";
		clocks = <&usb3_lpcg 4>;
		clock-names = "main_clk";
		power-domains = <&pd IMX_SC_R_USB_2_PHY>;
		status = "disabled";
	};

/*     
OTG3/2의 구성을 세부적으로 Datasheet와 Driver 같이 분석 
   
  14.12.6.1 Core Registers Memory map   (5B12_0000 : USB3       0x5B130000,  0x5B140000)
      USB Core Register들은 USB Core Function Control과 독립적인 기능역할을 해서 분리
        - 5B120058 :  OTGCTRL1     Core Control
        - 5B12005C :  OTGCTRL2
        
        - 5B130480 :  PORTSC1USB2  xhci_regs
        - 5B130490 :  PORTSC1USB3  xhci_regs 
   
  14.12.7.1 Non-Core Registers Memory map (5B11_0000 : USB3_CTRL )     
      Non Core Register들로 추가적으로 의존적인 부분이라고 하는데, 공유목적으로 분리사용하는것으로 추측
  
  https://mjmwired.net/kernel/Documentation/devicetree/bindings/usb/cdns-usb3.txt
  
     ./drivers/usb/cdns3/core.c (현재 상위 USB3 PHY 주소는 아래 정의됨)
        /*
         * Request memory region
         * region-0: nxp wrap registers  : 0x5B110000  none_core_regs           USB3_CTRL 
         * region-1: xHCI                : 0x5B130000  xhci_regs  (core_regs)   USB3 
         * region-2: Peripheral          : 0x5B140000  dev_regs   (core_regs)   USB3 
         * region-3: PHY registers       : 0x5B160000  phy_regs                 USB3_PHY3P0 
         * region-4: OTG registers       : 0x5B120000  otg_regs   (core_regs)   USB3 
         */
         
*/

	usbotg3: usb3@5b110000 {
		compatible = "Cadence,usb3";
		reg = <0x5B110000 0x10000>,
			<0x5B130000 0x10000>,
			<0x5B140000 0x10000>,
			<0x5B160000 0x40000>,
			<0x5B120000 0x10000>;
		interrupt-parent = <&gic>;
		interrupts = <GIC_SPI 271 IRQ_TYPE_LEVEL_HIGH>;
		clocks = <&usb3_lpcg 1>,
			 <&usb3_lpcg 0>,
			 <&usb3_lpcg 5>,
			 <&usb3_lpcg 2>,
			 <&usb3_lpcg 3>;
		clock-names = "usb3_lpm_clk", "usb3_bus_clk", "usb3_aclk",
			"usb3_ipg_clk", "usb3_core_pclk";
		assigned-clocks = <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_PER>,
				  <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_MISC>,
				  <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_MST_BUS>;
		assigned-clock-rates = <125000000>, <12000000>, <250000000>;
		power-domains = <&pd IMX_SC_R_USB_2>;
		cdns3,usbphy = <&usb3phynop1>;
		status = "disabled";
	};


  • USB Type C 연결구조 및 USB PD 구조 
USB Type C의 경우 아래와 같이 USB2.0 (Unshielded) 과 USB3.0 (Shielded,CBTU02043) 으로 나뉘어진다. 
USB PD(Power Delivery)는 아래의 PTN5150A에 의해서 CC(Configuration Channel) 설정되며, 내부에 Current도 설정가능하므로 추후 다시 한번 살펴보자. 




OTG1/2관련내용 
Device Tree 요약하면 OTG1 설정 과 OTG3 설정(OTG2가 포함) 두개를 다 사용시 자동적으로 OTG1/2를 Switch된다고하며, OTG3를 써야 OTG2도 동작가능


OTG3 관련내용 CDNS-USB3 사용 

$ vi ./vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/imx8x-mek.dtsi
//상위 설정에서 disable 된 것을 okay 재정의하고, USB OTG1,3 관련 세부설정 

&usbphy1 {
	status = "okay";
};

&usbotg1 {
	vbus-supply = <&reg_usb_otg1_vbus>;
	srp-disable;
	hnp-disable;
	adp-disable;
	power-active-high;
	disable-over-current;
	status = "okay";
};

&usb3phynop1 {
	status = "okay";
};

/*
  ptn5110으로 12V/5V 로 USB PD가 지원되는 것으로 보이며, USB Type C (USB3.0) 일 경우 필요 
*/

&usbotg3 {
	dr_mode = "otg";
	extcon = <&ptn5110>;
	status = "okay";
};


  • USB PD(Power Delivery) 구조 
20V 와 5V Switch로 인하여 CC1/CC2 결정과 내부 Current 결정 


PTN5110/PTN5150A (상위 그림참조) 
CC(Configuration Channel) Logic 이라고하며, 두개의 CC1/CC2를 제공 
USB PD를 위해서 12V 와 5V 선택가능한것으로 보이며, 각 Current도 조절가능 각각의 12V/5V Switch는 별도필요

반드시 참조 

기타용어 
  • OCP (Over Current Protection)
  • OPP (Over Power Protection)
  • OVP (Over Voltage Protection)
  • SCP (Short Circuit Protection)
  • OTP (Over Temperature Protection)
  • BOP (Brown Out Protection)


1.1 Kernel Config 분석방법 

Android에서 제공하는 Kernel Config 옵션이 많이 부족한것 같아 관련부분을 점검해보기로 하고, 아래와 같이 Android Config를 설정한 후 
ARM용으로 menuconfig를 실행하여 설정을 비교하기로 하였으며, menuconfig에서 빠진 내용들을 확인했다. 

$ export ARCH=arm64
//$ export CROSS_COMPILE=aarch64-linux-gnu-
//$ export AARCH64_GCC_CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
//$ export AARCH32_GCC_CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-eabi/bin/arm-eabi-
$ make imx_v8_android_defconfig      //이 설정 값 기반으로 .config을 새로 생성 
$ make menuconfig

$ cp .config org_cofig
$ make menuconfig
$ diff .config org_cofig // 비교 후 수정사항을 상위 defconfig에 추가 

$ vi out/target/product/mek_8q/obj/KERNEL_OBJ/.config
$ diff .config out/target/product/mek_8q/obj/KERNEL_OBJ/.config

$ make mrproper  // 내가 설정한 부분 전체 삭제



1.2 Kernel Config 설정 및 확인 


USB OTG 이해 및 USB Gadget의 KERNEL CONFIG 관련내용 



#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USBIP_CORE is not set
CONFIG_USB_CDNS3=y
CONFIG_USB_CDNS3_GADGET=y
CONFIG_USB_CDNS3_HOST=y
CONFIG_USB_MUSB_HDRC=y
# CONFIG_USB_MUSB_HOST is not set
# CONFIG_USB_MUSB_GADGET is not set
CONFIG_USB_MUSB_DUAL_ROLE=y
......
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_ACM=y
CONFIG_USB_F_SS_LB=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_U_ETHER=y
CONFIG_USB_U_AUDIO=y
CONFIG_USB_F_SERIAL=y
CONFIG_USB_F_OBEX=y
CONFIG_USB_F_NCM=y
CONFIG_USB_F_ECM=y
CONFIG_USB_F_EEM=y
CONFIG_USB_F_SUBSET=y
CONFIG_USB_F_RNDIS=y
CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_F_FS=y
CONFIG_USB_F_UAC1=y
CONFIG_USB_F_UAC1_LEGACY=y
CONFIG_USB_F_UAC2=y
CONFIG_USB_F_UVC=y
CONFIG_USB_F_MIDI=y
CONFIG_USB_F_HID=y
CONFIG_USB_F_ACC=y
CONFIG_USB_F_AUDIO_SRC=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_UEVENT=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_ACC=y
CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_UVC=y
# CONFIG_USB_CONFIGFS_F_PRINTER is not set
CONFIG_USB_ZERO=m
# CONFIG_USB_ZERO_HNPTEST is not set
CONFIG_USB_AUDIO=m
# CONFIG_GADGET_UAC1 is not set
CONFIG_USB_ETH=m
CONFIG_USB_ETH_RNDIS=y
# CONFIG_USB_ETH_EEM is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not set            //필요할 것이라고 생각했는데, 판단미스 
# CONFIG_USB_FUNCTIONFS is not set          //필요할 것이라고 생각했는데, 판단미스
CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
# CONFIG_USB_RAW_GADGET is not set
# CONFIG_TYPEC is not set
CONFIG_USB_ROLE_SWITCH=y


2. Android init.usb.rc (USB Gadget 수정)  


Android init.rc 문법 

Android에서는 init.rc 문법기반으로 Gadget ConfigFS 기반로 쉽게 USB Gadget들의 상태를 변경가능

  • USB Gadget(Device) 모드 설정 
Chip Vendor init.usb.rc 설정으로 실제 저장되는 곳은 /vendor/etc/init/hw/init.freescale.usb.rc 
$ vi ./device/fsl/imx8q/mek_8q/init.usb.rc
on early-boot
# USG Config FS을 이용하여 직접 init.rc에서 Gadget을 설정가능 
    mount configfs none /config
    mkdir /config/usb_gadget/g1 0770
    mkdir /config/usb_gadget/g1/strings/0x409 0770
    write /config/usb_gadget/g1/bcdUSB 0x0200
    write /config/usb_gadget/g1/idVendor 0x18d1
    write /config/usb_gadget/g1/bcdDevice 0x0440
    write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
    write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
    write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
    mkdir /config/usb_gadget/g1/functions/mass_storage.0
    mkdir /config/usb_gadget/g1/functions/accessory.gs2
    mkdir /config/usb_gadget/g1/functions/audio_source.gs3
    mkdir /config/usb_gadget/g1/functions/rndis.gs4
    mkdir /config/usb_gadget/g1/functions/midi.gs5
    mkdir /config/usb_gadget/g1/functions/ffs.adb
    mkdir /config/usb_gadget/g1/functions/ffs.mtp
    mkdir /config/usb_gadget/g1/functions/ffs.ptp
    mkdir /config/usb_gadget/g1/configs/b.1 0770
    mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770
    write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
    write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
# USB adb  설정 
    mkdir /dev/usb-ffs 0775 shell shell
    mkdir /dev/usb-ffs/adb 0770 shell shell
    mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000
# USB mtp/ptp device 설정         
    mkdir /dev/usb-ffs/mtp 0770 mtp mtp
    mkdir /dev/usb-ffs/ptp 0770 mtp mtp
    mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
    mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
#
# USB Android property 설정 
#   
   setprop sys.usb.mtp.device_type 3  
  
  # vendor.usb.config 설정하며, USB OTG의 주소 ( Device Tree에서 반드시 확인)   
  # ls /sys/class/udc/ 로 확인가능  
  # otg3 는 현재 Device Tree에서 별도의 Driver로 사용하며, USB3 용  (*hdrc* 가 아님)
  # gadget-cdns3 or 5b110000.usb3 (otg3)
    #setprop vendor.usb.config "5b110000.usb3"  
  #   
  # vendor.usb.config 설정하며, USB OTG의 주소 ( Device Tree에서 반드시 확인)   
  # ls /sys/class/udc/ 로 확인가능  
  # ci_hdrc.0 or 5b0d0000.usb (otg1 ,OTG1/2로 동시사용가능)
  #          
    setprop vendor.usb.config "5b0d0000.usb"
     or
    setprop vendor.usb.config "ci_hdrc.0"      
# Kernel의 libcomposite 관련부분 미사용     
    write /sys/module/libcomposite/parameters/disable_l1_for_hs "y"
# 최종 adb    
    symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1

on boot
    setprop sys.usb.configfs 2
    #jhlee (추가후 RNDIS Window 10 존재하나, Window 10에서 미인식 )
    #setprop sys.usb.controller "ci_hdrc.0"
    #setprop sys.usb.config rndis,adb
    #setprop sys.usb.configfs 1    
    #setprop sys.usb.configfs 2

  • Android system/core의 init*.rc 내용 
Android에서제공하는 property 상태에 따라 USB Gadget 설정이 변경되며, 이를 확인 
$ vi system/core/rootdir/init.usb.configfs.rc
  https://android.googlesource.com/platform/system/core/+/master/rootdir/init.usb.configfs.rc
  
//sys.usb.config=adb && property:sys.usb.configfs=0 값에 따라 변경   
$ vi system/core/rootdir/init.usb.rc 
  https://android.googlesource.com/platform/system/core/+/master/rootdir/init.usb.rc

현재 /sys/class/android_usb/android0/enable를 이용하여 방법은 이용을 해보지 못했는데, 
/sys/class/android_usb/android0은 존재하지만, 내부에 enable이 현재 생성되지 않음 



  • USB Gadget TEST 방법 
  https://www.kernel.org/doc/html/latest/usb/gadget-testing.html


  • USB Gadget RNDIS 설정시 ip route 와 iptable 설정 


2.1 Android USB Gadget 설정확인 


  • USB Gadget ConfigFS 관련부분 확인 
Android Board에서 Gadget ConfigFS와 설정된 기능 
$ ls -l /config/usb_gadget/g1/
total 0
-rw-r--r--  1 root root 4096 2021-01-05 07:12 UDC
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceClass
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceProtocol
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceSubClass
-rw-r--r--  1 root root 4096 2021-01-01 07:26 bMaxPacketSize0
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bcdDevice
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bcdUSB
drwxr-xr-x  3 root root    0 1970-01-01 00:00 configs
-rw-r--r--  1 root root 4096 2021-01-01 07:26 driver_match_existing_only
drwxr-xr-x 10 root root    0 2021-01-01 05:16 functions
-rw-r--r--  1 root root 4096 1970-01-01 00:00 idProduct
-rw-r--r--  1 root root 4096 1970-01-01 00:00 idVendor
drwxr-xr-x  2 root root    0 1970-01-01 00:00 os_desc
drwxr-xr-x  3 root root    0 1970-01-01 00:00 strings

//상위 RNDIS 설정된 부분이 나오지 않아 Kernel Config 수정  
$ ls /config/usb_gadget/g1/functions/  
accessory.gs2    ffs.adb ffs.ptp        midi.gs5
audio_source.gs3 ffs.mtp mass_storage.0

//KERNEL CONFIG 추가설정
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_ETH_RNDIS=y

//Kernel Config 수정 후 USB Gadget RNDIS 확인 
$ ls /config/usb_gadget/g1/functions/ 
accessory.gs2    ffs.adb ffs.ptp        midi.gs5
audio_source.gs3 ffs.mtp mass_storage.0 rndis.gs4 

$ ls /sys/module/libcomposite  //현재 미존재하지만, RNDIS 동작확인 


Window 10 RNDIS 미인식문제 (Window 7은 문제없음)

  • Android Property 관련사항 확인 
getprop를 이용하여 현재 설정된 값들을 확인하고 강제로 변경하여 테스트 
$ getprop | grep usb
[init.svc.usb-hal-1-1]: [running]
[init.svc.usbd]: [stopped]
[persist.sys.usb.config]: [adb]
[ro.audio.usb.period_us]: [20000]
[ro.boottime.usb-hal-1-1]: [13786733000]
[ro.boottime.usbd]: [14657327000]
[sys.usb.config]: [adb]
[sys.usb.configfs]: [2]
[sys.usb.controller]: [ci_hdrc.0]
[sys.usb.ffs.ready]: [1]
[sys.usb.mtp.device_type]: [3]
[vendor.usb.config]: [ci_hdrc.0]

//상위의 init.usb.configfs.rc 중 adbd stop  
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config none
$ setprop sys.usb.configfs 2

//상위의 init.usb.rc 중 rndis,adb 이용을 위해서 강제 기능 테스트 
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config rndis,adb
$ setprop sys.usb.configfs 2

//상위의 init.usb.rc 중 midi,adb 이용을 위해서 강제 기능 테스트 
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config midi,adb
$ setprop sys.usb.configfs 2

//상위와 같이 직접 변경하면 아래와 같이 Error 발생하여, init.usb.rc 반영하기로 결정   
init: processing action (sys.usb.config=rndis,adb && sys.usb.configfs=1) from (/init.usb.configfs.rc:131)
init: processing action (sys.usb.config=rndis,adb && sys.usb.configfs=1 && sys.usb.ffs.ready=1) from (/init.usb.configfs.rc:134)
init: Command 'write /config/usb_gadget/g1/UDC ${sys.usb.controller}' action=sys.usb.config=rndis,adb && sys.usb.configfs=1 && sys.usb.ffs.ready=1 (/init.usb.configfs.rc:139) took 0ms and failed: Unable to write to file '/config/usb_gadget/g1/UDC': Unable to write file contents: Device or resource busy

  • Android i.MX USB 관련사항 점검
i.MX8QXP 와 i.MX6를 비교를 하면 차이나며, 관련부분을 좀 더 분석해야할 것으로 생각됨
// OTG1 관련부분의 hdrc가 1개 확인
$ su
# find /sys -name  *hdrc*     
/sys/class/udc/ci_hdrc.0
/sys/devices/platform/bus@5b000000/5b0d0000.usb/ci_hdrc.0
/sys/devices/platform/bus@5b000000/5b0d0000.usb/ci_hdrc.0/udc/ci_hdrc.0
/sys/bus/platform/devices/ci_hdrc.0
/sys/bus/platform/drivers/musb-hdrc
/sys/bus/platform/drivers/ci_hdrc
/sys/bus/platform/drivers/ci_hdrc/ci_hdrc.0
/sys/bus/pci/drivers/ci_hdrc_pci
/sys/module/musb_hdrc

// OTG3,2 cdns 관련부분확인 
# find /sys -name  *cdn*
/sys/devices/platform/bus@5b000000/5b110000.usb3/xhci-cdns3
/sys/bus/platform/drivers/cdns-mhdp-imx
/sys/bus/platform/drivers/sdhci-cdns
/sys/bus/platform/drivers/cdns-usb3
/sys/bus/platform/drivers/imx-cdnhdmi
/sys/firmware/devicetree/base/bus@5b000000/usb3@5b110000/cdns3,usbphy
/sys/module/cdns3

# lsusb -t
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 003: ID 0525:a4a1
Bus 002 Device 001: ID 1d6b:0003

// USB Host에 연결된 Device 확인 (lsusb의 옵션이 제대로 안됨) 
# ls /sys/bus/usb/devices/  
1-0:1.0 1-1 1-1:1.0 1-1:1.1 2-0:1.0 usb1 usb2

# cat /sys/bus/usb/devices/1-1/idProduct
a4a1

# cat /sys/bus/usb/devices/usb1/uevent //usb1이 OTG1 일것이라고 생각했는데, OTG3 이 Host 역할 
MAJOR=189
MINOR=0
DEVNAME=bus/usb/001/001
DEVTYPE=usb_device
DRIVER=usb
OF_NAME=usb3
OF_FULLNAME=/bus@5b000000/usb3@5b110000
OF_COMPATIBLE_0=Cadence,usb3
OF_COMPATIBLE_N=1
PRODUCT=1d6b/2/504
TYPE=9/0/1
BUSNUM=001
DEVNUM=001

# exit
$


1/03/2021

Android System App 권한

1. Android App Signature

Android App에 Signature 기능이 있는 것을 알아본게 된 이유가 System 권한을 가지고 실행하기 위해서 이를 알아보게되었다. 
왜냐하면, 일반적으로 만든 App들은 untrusted_app domain으로 SELinux에서 제한이 있어 매번 제대로 실행이 되지 않는 것을 해결해볼까 하고 생각이였다.
물론 SELinux를 허용모드로 하면 이문제는 이 부분이 다 필요가 없지만, 개발환경이 아닌 실제에서는 다르기때문에 이를 다시 생각하게되었다. 

물론 이 문제이외에도 permission에 관련된 문제가 있었으나, 그부분은 init.xxx.rc에서 강제로 했다. 

이부분은 OpenSSL의 인증서 Certificate(X.509)부분을 보면 쉽게이해가 가며, 간단히 보면, private key 와 public key의 사용으로 동작되는 것을 알 수 있다. 

암호화 기본개념 과 Cipher Suite

Android에서는 아래의 4종류의 Key가 있다고 하며 역할은 아래와 같다. 
  1. platform: a key for packages that are part of the core platform.
  2. shared: a key for things that are shared in the home/contacts process.
  3. media: a key for packages that are part of the media/download system.
  4. testkey: the default key to sign with if not otherwise specified.

https://boundarydevices.com/android-security-part-1-application-signatures-permissions/

상위과 같이 동작원리는 간단하다. 
Signing/Verfify 로 이를 쉽고 빠르게 검증하는 것이다. 


AOSP Source 기준으로 살펴보면 각 Key 위치와 Certificate 위치확인 

  • Default build system signs package 들과 testkey 아래 위치에 존재
$ ls build/target/product/security/
Android.mk  media.x509.pem    networkstack.x509.pem  platform.x509.pem  shared.pk8       testkey.pk8       verity_key  verity.x509.pem
media.pk8   networkstack.pk8  platform.pk8           README             shared.x509.pem  testkey.x509.pem  verity.pk8

  • Vendor NXP(Freescale)용 signs package 
$ ls device/fsl/common/security/
media.pk8       networkstack.pk8       platform.pk8       README             shared.pk8       testkey.pk8                 testkey_rsa4096.pem
media.x509.pem  networkstack.x509.pem  platform.x509.pem  rpmb_key_test.bin  shared.x509.pem  testkey_public_rsa4096.bin  testkey.x509.pem

$ grep -r  PRODUCT_DEFAULT_DEV_CERTIFICATE. .
./device/fsl/imx6sl/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx7d/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx6sx/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx6dq/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx7ulp/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx8m/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \
./device/fsl/imx8q/ProductConfigCommon.mk:PRODUCT_DEFAULT_DEV_CERTIFICATE := \

$ cat ./device/fsl/imx8q/ProductConfigCommon.mk  // OVERWRITE 
...
PRODUCT_DEFAULT_DEV_CERTIFICATE := \
	device/fsl/common/security/testkey
...

$ cat ./device/fsl/imx8q/BoardConfig.mk  // AVB를 위한 RSA 비대칭키사용
.....
BOARD_AVB_ENABLE := true

BOARD_AVB_ALGORITHM := SHA256_RSA4096
# The testkey_rsa4096.pem is copied from external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_KEY_PATH := device/fsl/common/security/testkey_rsa4096.pem
.......

$ cat ./device/fsl/imx8q/mek_8q.mk  
.....
# Copy rpmb test key and AVB test public key
ifeq ($(PRODUCT_IMX_TRUSTY),true)
PRODUCT_COPY_FILES += \
    device/fsl/common/security/rpmb_key_test.bin:rpmb_key_test.bin \
    device/fsl/common/security/testkey_public_rsa4096.bin:testkey_public_rsa4096.bin
endif
.....

PRODUCT_DEFAULT_DEV_CERTIFICATE 에 의해 overwrite가 가능하다고 하니, 상위와 같이 검색  

platform/shared/media/testkey 생성부터 인증관련내용

1.1 ASOP Source에서 platform Key 추출 

  • ASOP Default Platform Key 추출 
두개의 password는 android로 설정 했으며, key alias는 androiddebugkey로 설정 
$ mkdir mytest1
$ cp build/target/product/security/platform.pk8 mytest1/
$ cp build/target/product/security/platform.x509.pem mytest1/

$ cd mytest1

//PKCS#08:  Private-Key Information Syntax Standard 로 아래와 같이 변경 (DER) platform.pem로 생성 
//PKCS#12:  Personal Information Exchange Syntax Standard 로 platform.x509.pem을 platform.p12로 변경  Private KEY는 platform.pem이용하고 설정값  

$ 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 -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass android  

$ ls 
platform.jks  platform.p12  platform.pem  platform.pk8  platform.x509.pem

PKCSx(Public Key Cryptography Standards)
  1. PKCS_12:공개키 인증서 교환문법 표준
  2. PKCS_08:개인키 정보 문법 표준 


  • NXP용 Platform Key 추출 
두개의 password는 android로 설정 했으며, key alias는 androiddebugkey로 설정 
$ mkdir mytest2
$ cp device/fsl/common/security/platform.pk8 mytest2/
$ cp device/fsl/common/security/platform.x509.pem mytest2/

$ cd mytest2

$ 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 -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass android 

$ ls 
platform.jks  platform.p12  platform.pem  platform.pk8  platform.x509.pem

Platform Key 추출


Platform Key 관련링크들  

2. App 에 System App 권한부여  

상위에서도 설명했지만, 기본 App은 untruested_app으로 실행되기 때문에 SELinux와 Permission 문제가 발생해서 이부분을 system 권한으로 변경하도록 실행 

  • Androidmanifest.XML 에서 system 권한 부여
Java에서 현재 root는 안된다고 하는데, 과거에는 된 것 같음 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.beep"
    android:sharedUserId="android.uid.system" >

  • ASOP에서 NXP platform.jks 추출 후 Android Studio 에서 Sign 방법 
Android Studio -> File -> Project Structure -> Signing Config


or 

Android Studio -> Build -> Generate Signed Bundle/APK -> APK

상위처럼 하면, 구지 build.gradle를 직접 수정하지 하지 않해도 되지만, debug 와 release를 구분해서 넣어주자.  


기본 SELinux Domain untrusted_app
[12387.628007] type=1400 audit(1611554077.764:163): avc: denied { read } for comm="om.example.beep" name="duty_cycle" dev="sysfs" ino=37724 scontext=u:r:untrusted_app:s0:c101,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 app=com.example.beep
바뀔 SELInux Domain system_app
[14697.359731] type=1400 audit(1611556387.500:167): avc: denied { read } for comm="om.example.beep" name="duty_cycle" dev="sysfs" ino=37724 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1

현재 permission 과 권한도 system으로 변경했지만 SELinux에서 거부되는 것은 현재 sysfs 때문이라고 생각이 된다. 

매번 Build Clean 후 다시 실행했으며, 만약 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 에러가 계속나면, 나의 경우, 상위 system 설정 후 Sign이 맞지않아 생겼다.
NXP용 platform key를 사용해야 문제가 없었음  

  • adb shell or serial 에서 package 설치확인 
Terminal에서  package 설치확인 
$ su
#
# pm list packages | grep <package>

# pm uninstall <package>


2.1 signapk.jar를 이용한 Sign 방법 

아직 해보지 못했으며, 관련부분만 현재 검색했음 

  • Android App Sign 
apk 생성후 이를 ASOP에서 직접 signapk.jar를 이용하여 sign하는 방법 
$ find . -name signapk.jar
./out/host/linux-x86/framework/signapk.jar
./out/soong/host/linux-x86/framework/signapk.jar
./out/soong/.intermediates/build/make/tools/signapk/signapk/linux_glibc_common/combined/signapk.jar
./out/soong/.intermediates/build/make/tools/signapk/signapk/linux_glibc_common/javac/signapk.jar
./prebuilts/sdk/tools/lib/signapk.jar

$ mkdir mytest
$ cp my_nosign.apk   mytest/              // my app 
$ cp build/target/product/security/platform.x509.pem  mytest/
$ cp build/target/product/security/platform.pk8   mytest/
$ cp out/host/linux-x86/framework/signapk.jar  mytest/
$ cd mytest

$ java -jar signapk.jar platform.x509.pem platform.pk8 my_nosign.apk my_sign.apk        // signing apk 
$ ls my_sign.apk