오픈소스 커뮤니티 개발자 입장에서 보는 삼성

2015. 5. 28. 17:50한눈에 보는 IT

삼성 기기를 가지고 여러가지 커스텀 롬과 커스텀 커널을 3년 가까히 경험해본 "오픈소스 커뮤니티 개발자" 입장에서 삼성이란 기업은 어떤 기업일까 한번 적어보기로 했습니다.


여기서 "오픈소스 커뮤니티 개발자"는 흔히 말하는 앱 개발자와는 다른,

Linux 커널 개발자나 Android OS 소스코드 건들고 다니는 개발자를 뜻합니다.






1) 잘했다 삼성(쓰담쓰담)

- 커널과 OS의 통합

터치위즈 사용자들을 위해서 커널과의 아주 단단한 연결고리를 만든건 틀림없는 사실입니다.

Knox와의 사용을 위해 별도의 파일시스템까지 사용하고,

일반적으로 CPU 주파수를 조정하는 방식 대신 좀더 직접적으로 CPU 부스트를 힌트하는 cpufreq_limit API를 만들고(카메라 실행이나 흔하게 테스트해보는 런쳐의 부드러움에서 CPU 주파수가 바로 최대치로 올라가고, 초절전모드에서 CPU 최대 주파수를 낮추고 안드로이드 시스템 단에서의 좀더 똑똑한 쓰로틀링을 위해 개입됩니다),

타 스마트폰보다 독특하고 많은 센서를 제대로 활용하기 위해 Sensorhub라는 브릿지를 만들어 커널과 직접 소통합니다.

가끔은 이러한 변경사항들이 AOSP향 커스텀 롬을 포팅할때는 골치아프기도 하지만 터치위즈 사용자들한테는 환영받아야할 사항입니다.


- 보안 개선 (Knox / 커널 / 루팅 / OTA / 다운그레이드)

안드로이드의 고질적인 문제고 앞으로도 갈길이 먼 보안, iOS나 블랙베리에 비해 취약해 엔터프라이즈의 큰 관심을 이끌지 못하는 안드로이드의 문제점을 보완하기 위해 상당히 많은 노력을 쏟아부은게 삼성 커널과 터치위즈롬 틈틈히 많이 보입니다.

 


▲ 버전/세대가 올라갈 때마다 바뀌는 "보안 소프트웨어"




▲ 블로트웨어인듯 블로트웨어아닌 블로트웨어같은 보안 앱들






▲ 제대로 서명되지 않은 커널 모듈이나 기타 애드온 로드를 방지하는 TIMA 기능

이놈 정말 골치아프면서도 경이롭습니다.

저것들이 전부 "Y"로 설정되어있으면 커스텀 커널 사용시 Wi-Fi같은 '서명되지 않은' 모듈을 사용할 수 없는 것은 물론, 순정 커널과 순정 모듈을 사용해도 기기 정보가 일치하지 않을경우 "ㅌㅌ"하면서 뱉어냅니다. 대표적인 예로 해외 Galaxy S4 LTE-A 롤리팝이 떴을 때 국내 기종에 설치할 경우 Wi-Fi가 작동하지 않았었죠.

이미 빌드가 끝난 커널이라도 "모듈"이라는 애드온을 통해 커널 내부 작동 구조를 일시적으로 바꿔 보안적으로 위협될 수 있는데요, TIMA라는 기능을 통해 사실상 걱정거리가 없어진 셈이죠.

(추가적으로 S4이후 Note 3부터 모듈은 거의 사용되지 않고 있죠)



▲ 수퍼유저 권한을 제한하는 SEC_RESTRICT_ROOTING 기능

뭐요? 루팅을 제한한다고요?

(딱히) 아닙니다. 2013년 Galaxy S4때 새롭게 등장한 저놈은 SuperSU같은 수퍼유저 앱들을 아주 잠시 고장내긴 했지만 금방 작동하는 버전으로 업데이트 되었으며 딱히 루팅 유저들한테는 큰 피해는 없다고 알려져있습니다.

그럼 뭐하는 놈이냐고요? 물론 다른 기능도 있지만 큰 특징으로는 /data에 위치한 바이너리가 수퍼유저 권한을 얻어갈 수 없도록 제한하는 것 입니다.

안드로이드의 취약점이 발견될 경우, 시스템 앱이 아닌 유저가 설치한 앱 중에서 수퍼유저 권한을 얻어 기기나 사용자에 해를 끼칠 수 있는 요소를 차단해줍니다. 저게 뚫린건 사실상 Towelroot 밖에 없는거로 기억하는데, 저걸 어떻게 뚫었나 신기할 뿐입니다(갓 Geohot).

여튼 다른 제조사/안드로이드 폰에 비해 좀 더 보안상 이점인건 확실합니다.

(커스텀 롬이나 커널에선 끄는게 더 편하지만요)


이 외에도 커널단에서 보안에 신경쓴 부분은 정말 많습니다.

Towelroot가 떴을 때에도 커널을 제일 발빠르게 패치시켜 배포했던 것도 삼성이고, 기타 취약점을 패치하기 위해 버전명 자체는 구버전이지만 최신 커널에서 보안 취약점 패치 커밋들은 마구마구 적용시킵니다.






▲ 조금이라도 루팅된 흔적이 있으면 OTA조차 거부하는 삼성

아마 모든 안드로이드 기종에 유저의 부트로더 접근 및 수정을 제한하는 제조사는 삼성밖에 없을겁니다(경험상 팬택, LG, Motorola, ASUS, hTC 모두 부트로더 수정을 허용하더군요).

모두들 부트로더를 무시하시던데, 기기에 전원이 들어오고나서 거쳐가는 첫 번째 단계로써 어쩌면 부트로더보다 중요한 단계는 없을겁니다.

iPhone 4처럼 부트로더가 뚫리면 영구적으로 탈옥이 되는 등 말이죠(좀 무관한 얘기지만 A4의 부트로더가 뚫린건 하드웨어적인 부분이라 소프트웨어로 수정이 불가능한 사항입니다).

(부트로더 수정이 가능한 안드로이드 기종들은 그대로 0으로 부트로더 영역을 밀어서 메인보드 무상 교체 받는 법도 한 동안 유행했었죠)

OTA 업그레이드 시 부트로더가 바뀌는 것도 한 과정이니 루팅되어 있거나 루팅에 대한 흔적이 있으면 OTA를 방지해야 그나마 부트로더 write 단계에서의 가로채기(hijack)가 힘들어지니 저것도 보안적인 관점에서는 이점입니다.


- 커널 최적화
다른 제조사들은 모르겠는데, 삼성 기기에 사용되는 커널과 넥서스와 업스트림(순정) 커널과 비교하면 바뀐 부분이 어마어마하게 많습니다.
kmalloc & vmalloc - 메모리 할당하는 방법, 메모리가 부족해질 때 이거나 중요성이 낮은 할당 요청일 경우 우선순위를 매겨 스마트하게 할당시킵니다.
lowmemorykiller - 메모리가 부족해질 때 사용빈도가 적은 앱부터 하나하나 죽여주는 기능, 삼성이 그냥 싹다 다시 작성했다고 봐도 무방할 정도로 많은 수정이 있습니다. drivers/staging/android/lowmemorykiller.c의 주석을 참고하면, 리눅스에서 보고하는 프로세스 리스트와 안드로이드에서 보고하는 프로세스 리스트에는 차이가 있다며 안드로이드를 따라 프로세스를 종료하는게 더 말이 된다네요.
zram - 요즘 기기에서는 잘 사용되지 않지만(vnswap으로 대체), 한창 Android 4.2-4.3 시절 zram이 유행할 때 삼성의 코드가 구글이 제공하는 코드와는 매우 달라 심지어 다른 제조사 기기에까지 포팅되는 재밌는 일이 있었죠.
이 외에도 코드 사이사이에 재밌는 수정들이 매우 많습니다.
0이 1로 바껴있거나, 48이 32로 되어있고, 기기별로 다른 값이 적용되는 등..
근데 이렇게 공들여 바꾼 부분이 과연 정말 실사용에 효과가 있냐고요? 일단은 삼성이 커널단에 최적화해보겠다고 노력을 기울린 부분은 박수쳐줄만 합니다.



2) 노력은 했는데 아쉽지만 망쳤구나

- Android OS 변형 및 최적화

롬 포팅 많이 하다보면 OS 자체에 또한 AOSP와 비교하면 어마어마한 수정이 되어있는것 또한 알 수 있습니다.

당장에 AOSP랑 당연히 호환될 듯한 라이브러리/바이너리 조차 넣으면 부팅이 아예 안되거나..

Xposed가 작동되는 때까지 세 달이 걸렸다거나(ART 구조를 아주 재밌게 여기저기 트윅시켰더군요)..

프레임워크의 ssrm, dvfs에선 커널단 뿐만 아니라 안드로이드 단에서도 CPU관련 값을 조정하여 성능과 배터리 절약에 균형을 맞추려 구현된 코드가 눈에 띕니다.

하지만 이러면 뭐합니까.. 램 2기가에서도 가상메모리를 사용하고 S6에서도 바뀐 터치위즈에서도까지 계속 메모리와 최적화 욕 먹고 있는 삼성 ㅠㅠ

(근데 카메라 실행 속도는 놀랍긴 하더군요)


- 커널 최적화

앞서 다루었듯이 커널 여기저기에 장난질 많이했지만, 아쉽지만 결론은 그닥 좋지 않은거 같습니다.




▲ 좌측 넥서스 7 2세대 7일동안 켜놓은 상태, 우측 Galaxy S4 LTE-A는 16시간 켜놓은 상태.

설치된 앱이 (거의)동일하고 설치된 롬도 동일한데(즉 변수는 커널), 램 점유율이 확연히 차이가 납니다.

(좌 : 0.90GB 사용 가능 / 우 : 495MB 사용 가능)

삼성한테 다시 처음부터 재시작하는 "Back to square one" 방법을 추천드리고 싶네요 ^^;

(커널을 리베이스 해달라!!!)


여러분도 직접 한 번 확인해보세요.

대부분의 삼성 기기들에 /sys/module/lowmemorykiller/parameters/lmkcount 이란 항목이 있습니다.

터미널에서

cat /sys/module/lowmemorykiller/parameters/lmkcount

명령어를 치게되면 부팅된 이후 메모리가 딸려 얼마나 많은 앱들이 죽었는지 셀 수 있습니다.

숫자가 크면 클 수록 안 좋은거죠 ㅎㅎ S6 유저들의 결과가 궁금하네요..



3) 아쉽지만 대기업이니 이해는 간다

- 루팅 유저에 대한 수리 거부 및 루팅카운터&녹스워런티

가끔 가다가 "서비스 센터에서 루팅되어 있다고 수리 거부받았네요"라는 글을 볼 수 있는데요, 심정은 이해합니다만 삼성의 입장에서도 서보면 거부하는게 당연합니다.

iOS의 경우 탈옥하다가 꼬이면 99.99%의 경우 DFU로 쫙 밀면 복구가 가능합니다. (NVRAM 수정으로 하드브릭 만드는 방법이 있긴 하죠)

반대로 안드로이드는 커널까지 완전히 개방시키는 등 루팅이란걸 하면 하드웨어에 훨씬 직접적으로 접근이 가능한터라 안드로이드 제조사의 입장에서는 루팅때문에 발생하는 불량은 수리를 거부해야하는게 맞습니다.


예를 몇 가지 들어보도록 하겠습니다.

A 스마트폰의 경우 동일 세대 B 스마트폰의 일부 파일을 섞어서 부팅시키면 터치패널이 아예 나가버려 디스플레이 무상 교체가 가능해집니다.

(자, 해석해보면 번인으로 사유를 굳이 들지 않아도 공짜로 디스플레이를 교체할 수 있는 셈이죠)

일부 스마트폰의 경우 특정 파티션을 마운트 불능으로 만들어 버리면 다른 파티션 모두 마운트가 안되서 보드 교체를 받을 수 있죠.

(자, 해석해보면 보드 불량이라고 뻥쳐서 무상으로 보드 교체를 받을 수 있죠.)

하드웨어 일부 정보를 변형시킬 수 있으면 고대로 서비스 센터에 가져가서 충돌이 발생한다거나 DRM 기능을 제대로 사용할 수 없다는 등의 사유로 보드 교체를 받을 수 있죠.

(자, 해석해보면 하드웨어 일부 정보를 변경할 수 있는 커스텀 커널을 올려서 무상으로 보드 교체를 받을 수 있죠.)


그런데 이상한 점이 있죠. 저렇게 블랙컨슈머 짓을 분명히 할 수 있음에도 불구하고 S3 이후 기종들에서는 루팅카운터를 없애고 대신 녹스워런티를 집어넣었죠.

저는 이렇게 해석되네요,

"루팅하다가 조금 뻑나도 그런 경우는 소수이니 수리를 해주겠다. 대신 우리 보안 소프트웨어가 취약해지면 안되니, 루팅을 할거면 보안 소프트웨어 사용(S6의 예로는 삼성페이)은 포기해라."

정말 똑똑한거 같습니다.



그러니 루팅했다는 이유로 수리를 거부받았다고 화내지 마세요. 이미 삼성이 하는 수준 자체로는 정말 대인배인건 틀림 없습니다.

(그래도 서비스 센터 방문하기 전에 적어도 꼭 순정으로 돌리시고요. 기사 입장에선 루팅된 이력이 보이면 기록해야 하는 것이 의무입니다.)



4) 고맙긴(잘했긴) 하지만 더 좋았을 수도 있는데 아쉽구나

- 루팅 유저에 대한 자유 보장

삼성은 LG, Motorola나 일부 미통신사(재....채..라이..기..!!)처럼 아예 부트로더에서 타 파티션 접근을 막아버리진 않습니다.

막을 수 있음에도 불구하고 막지 않습니다.

적어도 루팅 유저들에 대한 자유는 보장해주고 있단 소립니다.

해외 T-mobile Galaxy S6 업데이트에 부트로더가 잠금걸렸다는 소리가 있었는데, 설정에 아예 "부트로더 언락" 항목을 추가할 만큼 삼성은 쪼잔하지 않습니다.

하지만 fastboot같이 좀 더 편하게 파티션 접근이 가능하지를 않아 매우 아쉽습니다.

실제로 커널 파티션 계속 스트레스 주다가 커널 파티션이 하드웨어 적으로 손상된걸 본적이 있어.. fastboot를 사용하면 커널을 하드웨어에 설치하지 않아도 바로 컴퓨터를 통해서 부팅을 시킬 수 있는데 fastboot같은 구현이 삼성 기종에서는 볼 수 없다는 부분은 개발자 입장에서 매우 아쉽습니다.

(UART까지 바라진 않지만 그것도 오픈시켜주면 감지덕지죠 ㅎㅎ)



5) 도무지 이해할 수가 없구나

- 로그캣 테러

삼성 롬 가끔 디버깅할 때 보게되는데, 이건 매번 볼 때마다 정말 삼성이 싫어지고 도대체 거기 개발자분들은 디버깅 어떻게 하나 궁금해집니다.

뭔 소리냐고요?

흔히들 안드로이드 디버깅할 때 보는 logcat, 이게 삼성 롬들에서는 정말 말도 안 나올만큼의 양이 쏟아져 나옵니다.

Galaxy S4 LTE-A 순정 펌웨어에서 전원 인가 후 60초 동안 나오는 로그캣 양 : 38577줄, 3.2MB

Galaxy S4 LTE-A CyanogenMod12에서 전원 인가 후 60초 동안 나오는 로그캣 양 : 2366줄, 196KB

16배 정도 차이 나네요.

저 정도면 로그캣에 기록만 하는데에 오버헤드 발생해서 성능 하락과 배터리에 영향이 있지 않을까 우려까지 됩니다.

배포용 빌드에서도까지 이정도인데, 디버깅용 빌드에서는 도대체 어느 정도의 로그캣이 쏟아져 나올까요 ........;;

삼성 개발자님들, 디버깅 안 불편하세요 ㅎㅎ..?

(근데 또 LG 개발자분 말씀 들어보니 LG는 터치 좌표까지 로그캣에 띄운다고 합니다..? <-- 옛날 이야기 )


- 오픈소스 커뮤니티 개발자에 대한 배려심

업스트림/구글 안드로이드 Linux 커널을 보던, AOSP에서 오픈된 다른 안드로이드 구성 요소들을 보던 타 대기업(도시바, LG, Sony, Motorola 등)과 비교하면 삼성에서 작성한 커밋을 찾기가 굉장히 힘듭니다.

삼성이 자체 소프트웨어에 적용한 변경사항들을 오픈시키면 전세계 개발자들끼리 서로 머리 맞대고 더 개선시킬 수도 있었을 텐데 말이죠.

(2013년 중반에 삼성이 만든 f2fs때문에 Linux 커뮤니티 전체가 들썩했던 적이 있지만 진작 삼성 기종들에 사용되지 않고 Motorola에서 선보인 기기에서 먼저 사용되었고, f2fs 총괄을 맡으신 김재극 개발자님께선 삼성에서 Motorola로 건너가셨습니다.)


또한, GPL 라이센스가 적용되는 커널은 opensource.samsung.com 에 배포가 되는데, 여기서 안 아쉬울 수가 없습니다.

먼저, 펌웨어가 배포되고 동일 버전의 커널이 오픈되기까지에 굉장한 시간이 소요됩니다.

거의 하루에 한 번씩 메일을 보냈는 데에도 한 달 뒤에야 공개를 한다거나,

I9506 소스코드 달라고 했는데 I9505 소스코드를 주거나(뭬요?),

커널 말고 다른 소스코드 달라고 했는데 매우 냉정한 메크로 답변인 "우리는 오픈소스 라이센스가 적용되는 소스코드만 배포하며, 다른 소스코드는 삼성 자체의 기술력이 포함되어있을 수 있어 공개하지 않습니다"라는 답변이 온다거나..


그리고 각각 소스코드에 포함되어있는 "빌드 및 적용 방법"이 정말 부정확합니다.

빌드해서 나온 zImage를 그대로 tar로 묶어서 오딘으로 올리라뇨, 기기 ......되란 말입니까, 삼성.

심지어 스냅드래곤 800에서 Android 4.3에 커스텀 커널 적용할 때 필요한 도구조차 제공되지 않고, 한 중국인 개발자의 mkboot툴을 이용해야만 부팅이 가능했던 때도 있었습니다.


또, 이건 삼성이 의도한건진 모르겠는데 요즘 공개되는 커널 소스들, 대부분 빌드조차 제대로 되지 않고 빌드 되고 적용하면 기저대역이 나가고.. 패닉나고 난리도 아닙니다.

오디오쪽 소스코드에선 헤더 인클루드를 <>로 해야하는데 ""로 하거나,

디스플레이쪽 소스코드에선 헤더 인클루드가 되야할 영역을 벗어나 빌드 오류를 뿜꺼나..

또 Galaxy Note쪽 보아하니 커널을 직접 빌드하면 기저대역도 제대로 안 잡히고, Galaxy Alpha는 모뎀 소스가 제대로 공개되어 있지도 않다고 하더군요.

그리고 직접 빌드한 커널을 실사하려면 빌드프롭에서 Knox 관련 항목을 바꿔주어야 하는데 이러한 정보 조차 제대로 공지하고 있지 않습니다.

이건 실망할 수 밖에 없네요.

더 잘할 수 있습니다, 삼성.


자료 출처: http://www.matcl.com/?m=bbs&uid=257671&%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4%EC%BB%A4%EB%AE%A4%EB%8B%88%ED%8B%B0%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9E%85%EC%9E%A5%EC%97%90%EC%84%9C%EB%B3%B4%EB%8A%94%EC%82%BC%EC%84%B1