티스토리 뷰

공부

App Thinning. 그리고 Bitcode

Zedd0202 2019. 1. 6. 16:52
반응형


안녕하세요 :) Zedd입니다.

음..ABI글을 쓰다가 또 Bitcode가 궁금해져서..이 Bitcode에 대해서 먼저 공부해보려고 합니다.

ㅠ진짜 너무 어려워요..........

Bitcode라던가 ABI라던가...이런 컴파일러(?)라고 해야하나 암튼 둘다 컴파일러와 관련이 일단 있긴 하다고 볼 수 있는데......

암튼 이쪽은 설명을 봐도봐도 이해가 빡 하고 안되네요.

아예 막 딱 보면 아..이건 내가 몰라도 되는 부분이겠다...그런 거 몇개 있잖아요. 

그런거라면 깔끔히 모르고 보겠는데, ABI랑 Bitcode는 아니거든요??

그래서 일단 알아야 겠음. 

뭔가 이쪽을 잘 알게 된다면 한단계 성장 할 수 있을 것 같네요.



App Thinning과 Bitcode



네..비트..코드...네...비트.....비트...

비트 코드가 머얌? 하고 보면

LLVM...중간 코드.....앱스토어....최적화 어쩌구 저쩌구라는 말을 볼 수 있는데

저는 이 말이 진짜 당최 이해가 안갔어요. 그래서 머 어쩌라고 중간코드인데 머 어쩌라고....


그래서 제 나름대로 설명을 구구절절 해보려고 합니다.


때는 2015년. 역시나 WWDC 15가 열리게 됩니다.

"App Thinning in Xcode"세션. 

여기서 App Thinning이 소개가 됩니다. 


자, 앱안에 뭐가 있을까요? 



실행가능한 코드들과 리소스들로 이루어져 있는 것을 볼 수 있습니다. 



왼쪽처럼 리소스에 비해 코드가 많을 수도 있고 또는 그 반대일 수도 있겠네요.




코드는 64-bit 및 32-bit 버전이 가장 많이 사용됩니다.




실제로 RMV7를 보유하고 있을 수 있습니다. 


 RMV7은 NRV 64슬라이스를 가지고 있기 때문에 Apple이 공유하는 모든 하드웨어에서 잘 실행됩니다. 

(이부분은 이해안감. 32bit, 64bit 아키텍쳐 뭐 이런 이야기 같은데, 이건 일단...제쳐둘게요 머리가 아프다)



asset같은 경우도 1x, 2x, 3x가 각각 있겠죠.







art work도 iPhone idiom / iPad idiom으로 차별화가 가능하죠.






게임이나 다른 3D 그래픽 기반 앱을 사용하는 경우, 1x 2x는 중요하지 않음. 





OpenGL ES나 Metal을 이용하면, 각 asset에 대해 그에 대한 다른 질감(textures)을 가질 수 있고, 

메모리와 그래픽 capability에 따라 낮은/높은 품질을 차별화 할 수 있기 때문에, 

어떤 디바이스에서든 멋지게 보일 수 있죠. 





아마 오디오도 가지고 있을 것이고, bit rate측면에서도 또 차별화가 가능해집니다. 




머 그 외에도 여러가지 데이터들이 있을 수 있겠죠?






앱 하나에 이렇게 많은 것들이 있는데요.


여기서 내 앱에 필요한 것만 담을 수 없을까요? 






네 "App Slicing"이 바로 그것인데요.

App Slicing은 서로 다른 디바이스를 위한 다양한 앱 번들을 만들고 전달하는 과정이라고 생각하시면 됩니다. 



그냥 저렇게 다양한 art work 및 기타 리소스가 있는 범용 앱(universal app) 하나를 업로드 하면, 

앱스토어에서 슬라이스가 발생하게 됩니다.

앱스토어가 디바이스의 특성을 보고, 위 그림처럼 필요한것만 조합해서 별도의 IPA를 만듭니다. 


6+은 저렇게 슬라이스 되겠네요. 



이것이! 모두 내가 손가락 까딱 안해도 앱스토어가 알아서 해준다는 부분이죠.





오..여기까지도 좋은데, 더 나아질 수 있을까요?



자..하나의 예를 생각해봅시다. 

내가 게임을 하나 시작했어. 자, 우리 방금 시작했으니 레벨이 1이겠네요.

근데, 근데 말이죠 내가 레벨 20에 대한 것이 필요할까요? 나 아직 1인데? 

ㅇㅇ필요없음


만약에 뭐 문서를 만드는 앱이라고 생각해보면, 템플릿이 많이 있겠죠?

근데 템플릿이 막 엄청 많으면 많은 저장공간이 필요할거에요.

난 이 템플릿만 필요해! 이럴수도 있는거겠죠?


아마 내가 요청할 때만 로드해주는 그런게 필요하면 좋을 것 같네요.

내가 레벨이 20이 되면 레벨 20에 대한 데이터를 로드하는 것 처럼요.


그런것들을 On Demand Resources (ODR)이라고 하는데요, 

아 진짜ㅣ애플넘들 ODR 무슨 왤케 어렵게 설명하는거지???


아무튼 ODR은 앱스토어에 IPA와 별도로 저장되는데요,

필요할 때 마다 더 많은 컨텐츠를 가져 올 수 있다고 해요.

이것들은 기기의 앱 번들에 저장되지 않으며 iCloud에도 저장되지 않습니다.

시스템에서 관리에는 메모리에 저장되어서 여러 앱에서 ODR을 캐시 할 수 있습니다.


그냥 간단하게 


위에것들은 Xcode가 가지고 있음.






오른쪽 것들은 앱스토어가 가지고 있음.





디바이스에 필요할 때 착착 저장.

레벨 4를 가져오면 시스템에서 자동으로 레벨 1 리소스가 포함된 asset pack을 제거 할 수 있다고도 해요.

또, 다른 앱이 ODR을 다운로드 해야 하는 경우, 

다른 필요 없는 ODR를 삭제하여 공간을 확보 할 수 있다고 합니다. 




ODR설정은 위와같이 할 수 있습니다. 


 

자 이러면 뭐가 좋을까요? 



뭐 이런게 좋다고 합니다.


마지막으로는 Bitcode입니다.

이 Bitcode가 뭐냐??


"아직 기계코드도 아니고 내가 이해 할 수 있는 코드도 아닌 중간단계의 코드입니다. "


Bitcode는 다소 추상적인 면이 없지않아 있는데, 

본질적으로는 애플이 다운로드되기전에 디바이스에 맞게 앱을 최적화 하여 바이너리를 새로 만들어 제공합니다. 

Bitcode를 사용하면, 최신 컴파일러용으로 자동으로 앱을 컴파일하고, 

특정 아키텍쳐(예 : iPhone 6 및 iPad Air 2와 같은 64 비트 프로세서의 경우 arm64)에 맞게 최적화 합니다.


Bitcode는 다른 아키텍쳐에 대한 최적화를 "제거"하여 다운로드는 더 작게 만듬 / 관련 최적화만 다운로드하여 위에 언급한 App Thining 기술과 함께 사용됩니다.

실제로 App Slicing과 함께 쓰여요.


이렇게 앱스토어가 앱을 최적화하려면!!!!!! 

우리는 앱스토어에 앱을 "intermediate representation"으로 archive해야합니다. 즉 Bitcode를 켜면 됨 

Bitcode를 사용하지 않으면 앱스토어에 올릴때 최종 컴파일 결과!!를 딱 올리게 되는것이죠.

현재 iOS에서는 선택사항입니다만, watchOS에서는 이 Bitcode설정이 필수라고 해요.



이 Bitcode가 위에서 말했듯이 다운로드도 더 작게 하고..등등 그런 이점도 있지만, 

가장 중요한 이점은 따로 있습니다. 


LLVM(Low Level Virtual Machine)이라고 들어보셨나요? 

iOS개발자라면..한번쯤은 들어보셨을 법한 단어입니다.


프로그래머는 사람이 "읽을 수 있는" 프로그래밍 언어로 코드를 작성하죠? 

하지만 기계는 이 언어를 이해 하지 못하는데요, 

이때 컴파일러가 기계가 실행 할 수 있는 코드로 변환해줍니다.

많이 들어보셨죠?


LLVM은 intermediate 또는 machine(기계) 코드로 내 코드를 컴파일 하는데 사용되는 라이브러리에요. 

LLVM에는 두 부분이 있는데, 먼저 Objective-C, Swift, Python 또는 Ruby와 같이 앱을 만들기 위해 사용하는 "프론트 엔드"와 해당 앱을 컴퓨터 코드로 컴파일하는 "백 엔드"가 있습니다.


Bitcode와 같은 "중간"언어는 일련의 지침이 주어지면 

다양한 방식으로 다시 컴파일하는데 사용 할 수 있는 앱의 추상 인코딩입니다.

이말이 bitcode의 핵심인데요.

차근차근 읽고 이해하시길 바랍니다.

아직 기계코드도 아니고 내가 이해 할 수 있는 코드도 아닌 중간단계의 코드입니다. 


ㅇㅇ그럼 애플은 그냥 새로운 CPU에 대한 지원을 앱스토어의 "백엔드"에 추가 할 수 있으며 

새로운 아키텍처로 컴파일 하는 방법을 bitcode에 표시하면 되는것이죠.


2013년, iPhone5에서 애플은 64비트 칩셋으로 바꾸고 있다고 발표했었다고...하는데요.

그때는 이 Bitcode가 적용이 되어있지 않을 때였죠.

그래서 앱개발자들은 코드를 수정하고, 앱을 다시 컴파일해서 다시 제출해야 했다고 해요.

만약 이때 bitcode를 사용했었다면, 앱개발자들은 아무것도 안해도 되죠. 

새로운 아키텍처로 컴파일 하도록 알아서 최적화를 해주니까요. 


이 bitcode가 나오기 전까지는, 해당 앱이 실행될 수 있는 모든 환경, 예를들어 32-bit, 64-bit와 arm6/arm7/arm7s/arm64에 대해 바이너리를 생성하여 이를 하나의 파일로 합쳤다고 합니다. 

이를 fat binary라고 하는데요, 뚱뚱한....즉...파일의 크기가 당연히 커졌겠죠?


근데 bitcode가 있다면?

앱스토어 제출시 fat binary를 만들지 않고, bitcode를 업로드 합니다. 

앱스토어는 ㅇㅇbitcode를 받아가지고 각 환경 별 바이너리를 생성합니다.

그러며는 뭐다? 나는 내 환경에 딱 맞는 바이너리를 받는다.


단점이 하나 있다면..개발자는 애플에 제출한 바이너리에 해당하는 디버그 심볼의 복사본을 저장하여, 

앱에서 크래쉬 리포트를 디버깅 할 수 있습니다. 




근데 bitcode를 사용하면 이렇게 unsymbolicated crash어쩌구 저쩌구를 볼 수 있는데요. 

이게 무조건 나는건지?는 확실하진 않는데...ㅎㅎ


암튼 이런데, 이게 bitcode랑 뭔 상관이냐면.. 

위에서 말했듯이, 애플은 이 비트코드를 "다시" 컴파일하여 사용자에게 새로운 바이너리를 제공하는데요,

이 작업을 애플 서버에서 하게 됩니다.

이 때, Xcode에서 로컬로 생성된 dSYMs파일과 실제 사용자가 얻는 바이너리와 일치하지 않기 때문에 제대로 crash를 표시 할 수 없게 됩니다.

암튼 내가 올린거랑 실제 사용자가 받는 바이너리가 다르다는 건 알겠죠?

왜냐? 애플서버가 해당 사용자의 환경에 맞게 다시 컴파일해서 새로운 바이너리를 내서 주니까 ㅇㅇ;;

암튼 그래서 fabric에서 저런 오류가 나게 됩니다. 


해결방법은 


출처 : https://www.bugsee.com/blog/ios-crash-symbolication-bitcode/



저기서 dSYM을 다운받아서

 


앱 설정에 Missing DSYMs에 넣어주면 됩니다. 


ㅠㅠ저 이제 bitcode가 뭔지 이제 좀 뭔가 알겠어요...

계속 몰라서 ㅇ ㅏ.........ㅎ 

이러고 있었는데....

하핳하하하하하하하


헉;;가장 중요한걸 빼먹었네


Bitcode는 여기서 설정이 가능합니다.



출처 : 

https://www.bugsee.com/blog/ios-crash-symbolication-bitcode/

https://www.quora.com/What-is-Apple-Bitcode

https://thenextweb.com/apple/2015/06/17/apples-biggest-developer-news-at-wwdc-that-nobodys-talking-about-bitcode/

https://stackoverflow.com/questions/31088618/impact-of-xcode-build-options-enable-bitcode-yes-no

http://khanrc.tistory.com/entry/iOS-9-대응

반응형

'공부' 카테고리의 다른 글

Premiere Pro 기초 ) 자막넣기  (3) 2019.02.22
ABI stability  (4) 2019.01.07
Swift로 Slackbot 만들기  (1) 2019.01.05
Boot Camp로 Windows 10 설치시 WIFI문제 해결 + Boot Camp삭제 방법  (13) 2018.11.11
Chisel사용해보기  (0) 2018.10.23