What’s new in Android development tools – Google I/O 2016

-다들 좋은아침 -안녕하세요 오늘 토크에 와주셔서 감사합니다 Android 개발 툴의 바뀐 모습을 알아보는 자리인데요

전 세계의 개발자 분들이 와주셔서 정말 즐겁습니다 게다가 이런 큰 자리에서요 정말 기대조차 못한 멋진 일이라고 말씀드리고 싶습니다 Steph Cuthbertson입니다 오늘은 Tor Norbye하고 Jamal Eason와 함께인데요

Android Studio 내부를 구경해 보기로 하죠 이미 내부 관계자나 마찬가지이신 분들 올해는 Zav가 스테이지에 안나왔죠? 전 그냥 대타입니다, 대타 하와이 해변에 늘어졌대요 좋냐, Zav 처음 Android Studio 개발을 시작할 때 우리가 쓰는 언어에 중점을 둔 IDE가 목표였다는 건 아시죠 그래서 Android 플랫폼 네이티브인 IntelliJ를 선택했습니다

이번 Android Studio는 단기간에 엄청난 노력이 들어갔는데요 어제 발표한 내용 중 하나는 이제 탑 125 앱의 92%가 Android Studio를 쓴답니다 3년 전 여기 I/O에서 발표했었는데 데모 시연을 한 게 Tor였는데 기억하시나요 프리뷰 베타하고 안정판 합쳐서 릴리즈가 131개나 됩니다 이젠 그게 저희의 성공 요소이기도 합니다 아주 활발하고 열정적인 개발자 커뮤니티요 초기 빌드를 직접 써보시고 피드백을 항상 잘 해주시니까요

그래서 팀도 집중할 수 있고 진척도 빠릅니다 작년엔 뭘 다르게 해야 생산성도 올라가고 삶이 편해질까 곰곰이 생각해봤는데요 아직 Android Studio를 잘 모르시는 분들을 위해 2016하고 그 전까지의 개발 상황을 60초만에 안내해드리죠 그럼 다들 아시는 게 비슷해질 거고 그 다음에 22하고 그 이후의 미래에 대해 얘기해봅시다

그러니까 올해 이미 20을 발표했지요 Instant Run하고 에뮬레이터로 속도에 포커스를 맞춘 버전이었습니다 새로운 에뮬레이터 UI도 나왔고요 GPU 디버거 프리뷰요

검색에서 딥 링크 생성 테스팅 등등등 그리고 그 조금 후에는 21 N하고 동시에 개발했습니다 그런고로 N의 기능과 API가 다 지원되지요 에뮬레이터로 N을 경험해 보실 수 있어요

Jack 컴파일러로 Java 8 지원을 확인하실 수 있고 21에서는 Instant Run의 속도를 높였습니다 dex 스텝을 프로세스 중에 실행되도록 옮긴 결과인데요 속도가 엄청 올랐죠? 이걸 기반으로 나온 게 22입니다 속도, 스마트 기기, 그리고 Android 플랫폼 지원에 중점을 맞추었죠 여기 I/O가 좋은 점이 청중이 다 개발자분들이시라는 겁니다 그래서 오늘 토크의 처음 25분은 2

2 프리뷰의 거의 모든 기능을 라이브로 시연해볼겁니다 나중에 직접 써보시고요 여기서 기억하실 건 이건 프리뷰 빌드니까 기대치도 프리뷰 퀄리티로 맞춰주세요 그다음엔 저희가 항상 하는 일을 할겁니다 다음 몇 주 동안에 안정화 작업을 하는거죠

항상 그러듯이, 베타하고 안정판을 내면서요 그다음엔 저하고 Jamal이 다시 가지고 돌아와서 디자인, 개발, 제작, 테스팅까지 스크린샷까지 찍어서 단계적으로 보여드리겠습니다 그다음엔 개발 비화 각 기능이 왜, 어떻게 개발되었나 보여드리지요 그렇게 22를 소개해드릴 Tor Norbye를 박수로 맞이해주시기 바랍니다

감사합니다 알겠습니다 다들 화면 보이세요 데모 좋습니다 데모 기기는요? 고마워요

그럼 좀 작고 간단한 것부터 시작하죠 마음에 꼭 드실 거라 생각합니다 어제 SDK 콤포넌트를 많이 발표했는데 Android Studio 22를 이렇게 인스톨하시면 이젠 배경에 버튼이 생겼습니다 최신 기능을 인스톨하시면서도 코딩을 계속 하실 수 있습니다 작년 한 해 동안은 속도 향상에 중점을 두었습니다

다들 그게 가장 중요하실 것 같아서요 현재의 Instant Run을 보여드리겠습니다 이 오른쪽이 I/O 앱입니다 여기 코드를 주석 처리하고 실행하면 그렇게 변경하니까 대충 1초도 안걸려서 디바이스에 변경된 버전이 실행됩니다 Instant Run없이는 15초쯤 걸리겠군요 서로 안 맞는 쪽으로 변화를 줘도 예를 들어 이걸 메소드로 만들면 그래도 1, 2초밖에 안 걸립니다

데모 이후에 Steph가 Instant Run in 22하고 23에 대해서 이야기할겁니다 Instant Run 작업중에 해야했던 것이 APK 내부 구조를 파악하는 것이었습니다 그래서 그 용도로 만든게 APK Analyzer

이젠 제 프로젝트의 APK나 다른 APK도 열 수 있습니다 파일 내부 상황을 파악할 수 있지요 그래서 예를 들자면 assets 나 res 폴더를 볼수있고 이 경우에는 Instant Run이군요 이렇게 앱을 부분별로 리패키징하는 겁니다 실제 앱을 써보기로 하겠습니다

Chrome APK입니다 이 툴의 기능은 두어 가지 있는데 첫째는 다운로드 사이즈를 보는 겁니다 이게 아주 중요한 마켓도 있지요 다운로드 사이즈도 인스톨 사이즈도 최소로 이건 앱에 뭐가 들어 있는지를 보여주고 삭제해도 되는지 정할 수 있게 해줍니다 Assets 폴더 내부 파일을 볼까요

레이아웃 폴더도 보이고 바이너리 XML을 소스 코드로 디컴파일도 할 수 있습니다 리소스 레퍼런스는 아직 손볼 게 많군요 이걸 다시 리소스 이름하고 매칭시켜줄겁니다 각 값 테이블도 보실 수 있습니다 이전엔 보기 좀 힘든 파일이었죠 이젠 뷰어가 있으므로 그냥 들어가서 뭐가 있나 보시면 됩니다

그리고 또 하나 중요한게아 하나 더, 이걸로 dex 파일을 열 수 있습니다 64k 메소드 한계는 아마 다 아실겁니다

사실 메소드 한계가 아니라 메소드+레퍼런스 한계입니다만 이젠 뭘 선언해줬나 보실 수 있습니다 그리고 뭘 참조하고있는지 64k가 안되게 하거나 multidex를 켤 수 있습니다 빌드 아웃풋의 manifest 파일을 보신 적이 있으시다면 분명히 쓴 적 없는 게 많이 보이지요? 그렇죠? 어디서 나왔을까요 22에는 manifest 에디터가 새로 생겼습니다

XML 탭인데요, 여기 아래쪽에 Merged Manifest 탭이 생겼습니다 이걸 누르면 보시다시피 전체 manifest가 나오죠 코드가 변경될 때마다 업데이트 됩니다 여기 오른쪽에는 설명문 각자 어디서 생겨나나 보여주죠 예를 들어 인터넷 허가 Play 서비스에서 오는군요 여기 들어가서 병합하는 줄을 찾아봅니다 Gradle의 manifest 합병 프로세스의 미스테리를 푸셨으면 좋겠군요

미스테리라고 하면 프로젝트를 설정하시기 위해 빌드 파일을 편집하시는 건 이상하지요 그래서 프로젝트 구조 대화상자를 아예 다시 쓰는 중입니다 -중이라고 하는 건 아직 의존성 부분밖에 못해서요 뭐 따져보자면 그게 가장 힘든 부분이지만 새 PSD에서 가장 좋아하는 부분은 메시지 패널입니다 IDE가 추천하는 걸 보여주는 건데요

여기 보시는 대로 제 프로젝트는 jCenter에 의존하는데 이거 새거 나왔는데 하고 알려주는거죠 그럼 제가 여기 업데이트 링크를 누르면 이제 최신 버전을 사용중입니다 Update All 눌러서 다 할수도 있고요 이건 Lint가 하던 것처럼 로컬 저장소만 보는 게 아니라 원격 저장소도 찾아봅니다 의존성 뷰로 바꾸면 의존성 소프트웨어를 볼 수 있지요 모듈별로도 아니면 프로젝트 전체로도요 볼 수 있는 것의 예를 들어보죠 그때 그때 사용되는 의존성 소프트, 프로젝트에서 어떤 의존성 소프트를 어떻게 쓰나

의존성 소프트를 추가해줄 수도 있습니다 이제 검색도 할 수 있는 멋진 UI가 생겼습니다 업데이트 추천처럼 얘도 원격 저장소를 봅니다 로컬 저장소도 보고요 가능한 버전을 다 보여주고 의존성 리스트의 범위 스트링도 조정하게 해 줍니다

여기 experimental 설정에 있습니다 갖고 노시려면요 다음 두세 번 릴리즈 중에 구현 완료할 생각입니다 다음 볼 부분은 C++입니다 작년에 편집 지원이 얼마나 잘 되나 보여드렸었는데요 이번에 통합한 JetBrains의 Sea-lion C++ 기능입니다

아직 실험중인 Gradle 플러그인이 필요합니다만 22에서 획기적인 뉴스는 외부 빌드 시스템 지원을 추가했습니다 네이티브 코드를 짜는데 CMake를 쓸 수 있습니다 안정판 플러그인을 쓰면 이렇게 선언해줍니다 그럼 C++를 쓰실 수 있습니다

C++ 관련해서, 곧 마법사 하나 추가할 예정입니다 프로젝트에 C++ 지원을 추가하기 아주 쉬워지는거죠 그러면 샘플 프로젝트가 하나 생깁니다 이거하고 똑같이 생겼어요 그럼 메인에서 네이티브 라이브러리를 로드하고 샘플 라이브러리로 "hello world"가 있습니다 이걸 써보죠 먼저 여기 C++ 코드에 브레이크 포인트를 설정해주고 여기 메인은 그냥 디폴트 레이아웃을 보여줍니다 중간에 한 줄 있군요

이 문자열을 바꿔서 C++의 값을 보여주게 할까요 그럼 TextView textView = findViewById 그리고 아까 그 ID를 씁니다 그렇게 해주고 setText 메소드 호출 C++ 쪽에서의 호출이죠 여기에도 브레이크 포인트 이젠 디버거를 쓸겁니다 이게 Gradle을 실행하면 CMake도 실행되고 빌드 되고 패키지 만들어지고 한 1초만에 앱이 에뮬레이터에서 실행되고 있을겁니다 됐군요 브레이크포인트 Java 부분입니다

이제 마음놓고 manifest를 보시면 실수, activity 현황이요 여기서 디버거를 다시 보면 우리가 이제 C++ 영역에 있군요 여기저기 쑤셔봅시다 하이브리드 디버거와 CMake 지원 클래스였습니다 마지막으로 보여드릴 건 빌드 시스템 영역 커맨드 라인에서 갑니다 직장 동료한테서 프로젝트가 왔다고 치죠 아니면 Git poll했더니 새 빌드 툴 버전이 나왔던가 아니면 컴파일된 프로젝트의 SDK버전이라던가 빌드하시면 이런 메시지가 뜹니다 2201 빌드 툴이 없답니다 그럼? SDK Manager로 가서 인스톨하셨죠? 2

2 알파는 experimental 플래그를 포함합니다 그리고 빌드를 실행하면 아 라이센스는 동의했고 보시다시피 Gradle이 알아서 다운로드해줘요 그래서 이제는 프로젝트에 서버를 끼워넣는 게 훨씬 더 쉬워졌죠 커맨드 라인은 좀 극단적이고 비쥬얼 에디터로 가봅시다 Layout Editor가 새로 바뀌었죠 아 Layout Editor라고 하면 안되지 레이아웃만 하는 게 아니거든요 일단 메뉴 파일을 열고 여기 있군요 디자인 메뉴를 드래그&드롭 해주고 설정 파일도 드래그&드롭

그리고 보시는 대로 Component Inspector 이거 정말 멋지게 잘되었어요 물론 레이아웃이 큰 비중을 차지하니까 오른쪽에는 새 Component Inspector, 지금 선택된 컴포넌트의 주요 속성을 보여드립니다 지금은 TextView군요 TextView 예를 들자면 텍스트 모습을 보여드리죠 Component Inspector에 회색 글자가 있지요? 아직 텍스트 모습을 안 정했는데? 이게 런타임 실제 모습인겁니다 그럼 예로 들어 폰트 크기는 14 SP 다른 걸로 변경하면 그 사이즈를 계산해 줍니다 여기에는 속성이 일부밖에 나와있지 않아요 찾기 쉽게요

다른, 전체 속성을 찾으시려면 여기 위에 클릭 한 번만 더하시면 됩니다 디자인에는 청사진 모드가 있고요 청사진 모드는 기본적인 뼈대만 보여드리는 겁니다 앱의 x-레이 사진 같은거죠 청사진 모드하고 디자인 모드를 옆에 나란히 둘 수도 있습니다 이거는 주문하신대로 스크롤 뷰입니다 이젠 디자인을 바로 스크롤하실 수 있지요

청사진 모드는 constraint 레이아웃 쓰실 때 좋습니다 constraint 레이아웃을 보기로 할까요 일단 auto connect 모드를 끄고 컴포넌트를 좀 끌어올까요 여기에 텍스트 뷰를 놓고 텍스트 에디터에 텍스트 뷰도 하나 더 암호도 하나 더 오른쪽 아래에 버튼도 좀 추가하고 작업하는 꼴이 좀 엉망이지만 뭐 선택해서 제대로 할 수 있거든요 우클릭하고 이 아래에 있는 거 정렬하기 얘네 다 왼쪽에 정렬할래요 수직으로도 맞춰버릴까 그러면 디자인은 완성이고 이걸 랜드스케이프 모드로 눕히면? 안되겠네요 버튼이 화면 밖으로 나가니까 이거 고쳐보죠 여기 작은 전구 아이콘이 있는데 constraint를 파악하는 겁니다 이거 클릭하면 어떻게 되는지 잘 보세요 constraint가 이렇게 되있군요 우리가 원하는 게 뭔지 예상해 본 겁니다

이제 이걸 리사이즈하면 이젠 버튼도 잘 움직이는군요 보통은 Auto connect 모드니까 여기에 버튼을 드래그하면 이걸 드롭하는 순간 바로 constraint가 자동으로 추가됩니다 물론 마음에 안들면 클릭해서 지울수도 있고요 새로 끌어올 수도 있습니다 이건 프리뷰 비스무리한 겁니다 이걸 쓰시면 어떤 게 된다 하고요

그리고 constraint에도 장점이 있는데요 드래그 중에, 보이시죠? 자동으로 1/4나 설정한 %로 가서 붙습니다 어제 어느 분이 이거 XML 에디팅에서도 되냐고 물어보셨는데, 물론 됩니다 보시면 지금 XML입니다 이쪽의 constraint를 건드리고 놀 수도 있고 XML 에디팅도 잘 되는군요 그러니까 이건 아주- 감사합니다 그러니까 아주 편한 constraint 툴인데요

이걸로 레이아웃 hierarchy를 줄일 수도 있고 아시다시피 최적화에 아주 중요하죠 그래서 그걸 도와드릴 기능도 있습니다 이 레이아웃을 볼까요 보시기 편하게 청사진 모드로 바꿔서 이 레이아웃은 실제로는 nested 리니어 레이아웃의 집합인데 이 리니어 레이아웃을 constrint 레이아웃으로 바꾸게 명령한다면 구조를 단순화하면 어떻겠냐고 하네요 그럼 보시는대로 화면은 똑같지만 constraint입니다 왼쪽 리스트는 많이 단순화됐고요

네 그럼 에디팅을 볼까요 에디팅 부분에도 기능을 좀 추가했습니다 첫째, Firebase가 통합되었습니다 이제 Firebase로 작업하시려면 크래쉬 리포팅을 추가한다던가 해서 그럼 여기 도우미 창을 더 열고 원하시는 걸 선택하고 크래쉬 리포팅은 이거요 그럼 여기 소스 에디터 옆에 지시문이 나와서 그것만 따라하시면 됩니다 그리고 예를 들어 이 라인들을 실행하고 싶다 그러면 소스 코드로 불러오시면 에디팅이 됩니다 어떤 API의 사용법을 알고 싶으시다거나 하시면요 Job Scheduler를 포함해야된다 하면 네 Job Scheduler는 포함하셔야합니다 우클릭하면 자동으로 샘플 코드가 찾아지는 겁니다 보시는대로 얘가 서버에 가서 추천된 코드를 가져오는 거죠 서보시라고

우클릭해서 브라우저 새 창에 열고 더 자세히 보실 수도 있습니다 22는 IntelliJ 161 기반입니다 당연히 그 쪽 관련해서 새 기능도 많은데요 그 중 하나는 양방향 문자열의 에디팅 지원입니다

저희 국제 수요층 분들이 요청하시던 기능인데요 아랍어 텍스트입니다 보시는대로 소스 에디터가 이제는 이걸 정확하게 다룹니다 요게 그동안 골칫거리였는데 이젠 잘 됩니다 IntelliJ 고마워요 IntelliJ 16에서는 에디터의 검사기능이 많이 추가되었는데요

덤으로 저희 쪽에서도 추가한 게 있습니다 Android 전용으로요 좀 볼까요 뭐 데이터를 넘겨줄 때 필드를 정적으로 하는 건 아주, 매우, 정말로 안 좋은 거라는 거 다들 아실겁니다 절대 안돼요

이제는 Lint가 잡아내 줍니다 그게 누수 요인이기도 하지만 그래야 Instant Run이 좋아하거든요 지금 예로 든 것만큼 간단하지는 않은 건데 여기 필드를 정적으로 하고 app data 1은 문제가 없지만 app data 2 이후로는 context로 인스턴스가 있는데 그걸 포인팅하는 정적 참조문이 있습니다 그럼 안돼죠 그럼 여기 지원 주석을 봅시다 어제 발표한 지원 라이브러리인데 새 기능이 몇 있죠

먼저 이 메소드, 이젠 드디어 야 이 메소드 워커 스레드 클래스 안에 있는데도 스레드-세이프인데? 라고 하실 수 있습니다 아무 스레드에서나 부르실 수 있습니다 전에 있던 API 체크는 Lint가 플랫폼 API를 메인 SDK에 비교하는 형식이었는데요 이것도 픽스가 있는데 뭐, 체크 넣어줘 하는거죠 하지만 이제는- 아 죄송 이제는 제 메소드가 이 API를 요구할 거라 얘상하고 API에서 부르는 책임을 넘겨주는겁니다

라이브러리 API 체크를 클라이언트로 보내고 그럼 이 호출들이 제 API를 부르고 있지만 API체크가 적용됩니다 이 다음은 dimension 리소스- dimension annotation입니다 그러니까 이 정수가 하나의 dimension인데요 적용하실 수 있는 유닛이 많지요 여기서, 픽셀이 아주 중요합니다 SDK의 대다수의 API는 픽셀 space에서 작동합니다

그래서 픽셀 annotation을 따로 만들었는데요 @Px입니다 이걸 하면 잘못 사용된 부분에 다 플래그가 뜨죠 dimension이어야할 리소스를 넘겨주는 부분이요 도움이 되면 좋겠네요 마지막 또 중요한 annotation이 keep annotation입니다 메소드하고 클래스에 @Keep을 쓰실 수 있는데요 그리고- Gradle 플러그인 2

2 ㅣ점에서는 ProGuard나 새 Incremental Shrinker를 쓰시면 릴리즈하실 때 자동으로 제거되지 않습니다 support annotation이 마음에 드신다면 더 유용하게 만들 수 있을 기능이 있습니다 새 추론기능입니다 한동안 IntelliJ에 분석 기능이 있었는데요 null인지 추론하는 것이었습니다 아직 flag 기능이지만 써보시려면 support annotation 추론기능입니다

그래서 이걸 현재 파일에 쓰면 분석을 몇 돌려서 프로젝트에 사용중인 annotations를 알아내실 수 있습니다 그래서 파일을 다시 보면 이런 div 마커가 다 이렇게 알아낸 adaptation입니다 예를 들어 여기 퍼미션이 요구되는데 annotations를 시작하고 Lint가 코드의 버그를 찾게 해줄겁니다, 아마도요 오레곤 주립대의 연구팀과 협업해서 퍼미션 관련 작업중입니다 그래서 이건 아직 WIP인데요 이게 다 되면 앱이 Android 쪽 퍼미션으로 옮겨갑니다

여기서 이 액션을 invoke하면 리퀘스트가 들어가서 Android 쪽 퍼미션의 callback을 처리하는 겁니다 사용되지 않은 리소스는 없애도록 리팩토링도 했습니다 그러니까 실제로는 사용되지 않을 리소스를 추가하면 Refactoring에 가서 Remove unused resources하면 IDE가 그런 리소스를 찾아서 없애 줍니다 앱이 좀 더 가벼워지죠 네 마지막으로 소개할 건 Espresso Test Recorder인데요 객석에서 벌써 탄성이 들려오네요, 네에 그럼 프로젝트 창에서 Run 메뉴에서 Record Espresso test

Espresso입니다 Ex-presso아닙니다 그래서 그걸 하면 보시는 대로 앱 빌드를 시작하고 왼쪽에 이벤트 레코더를 시작합니다 오른쪽에는 앱이 실행중이지요 그래서, 예를 들어, 여기 카테고리를 클릭하면 보시는 바와 같이 이벤트가 기록됩니다 Back 버튼을 눌러서 돌아가고 좀 아래로 가서 음악 타일을 눌러봅시다

제가 누르는 대로 여기에 기록되고있지요 그게 뭔지 이해하려고 노력하는겁니다 예를 들어 여기 빨간 버튼을 누르면 제가 FAB quiz 버튼을 눌렀다고 기록이 됩니다 그래서 레코딩하면서 또 할 수 있는게 assertion 추가입니다 여기 Add Assertion 버튼을 누릅니다 그러면 스크린샷하고 뷰 hierarchy를 받아서 앱 내부 구조를 알 수 있습니다

보시다시피 앱의 내부 논리 구조에서 옮겨다닐 수 있지요 그리고 예를 들어 이 질문 Who was the youngest Beatle? 이걸 클릭하면 그걸 받아서 assertion을 제안합니다 그러니까, 어, 이 시점에서 테스트가 실행중이면, 이 문자열이 Who was the youngest Beatle? 이어야 한다는 거지요 그럼 Save Assertion을 누르고 계속합니다 그래서 혹시 누구- 여기서 정답 전까지 오답 좀 누를 겁니다 아셨죠? 틀렸네요

틀렸대요 정답은 조지였습니다 ok, 그럼 이젠 Submit 버튼을 눌러보죠 저게 정답이었다고 보이시죠? 테스트 레코딩은 이걸로 충분한거같고 Complete Recording 시작합니다 이걸 누르면 테스트 결과를 어떤 클래스로 저장할지 묻는데 디폴트값으로 하겠습니다

여기 Espresso Test인데요 처음에 오답 클릭한 거 보이시죠? 테스트 편집도 가능합니다 그러니까 예를 들어 오답 타일 클릭한거 없애고 다시 가서 테스트를 다시 하고 해볼까요 여기 Run 버튼을 누르기만 하면 됩니다 클라우드 테스트도 가능하지요 지금 보여드릴 시간은 없지만 등록해보세요 서로 다른 폼 팩터 여럿을 가지고 UI 테스트를 실행합니다 꽤 유용하죠

그럼 이걸 에뮬레이터에 다시 돌려서 테스트를 빌드하고 실행하고 여기 오른쪽 앱 실행창을 봐주세요 저보다 클릭이 빠릅니다 APK 인스톨, 완료, 클릭, 클릭, 클릭 그리고 녹색 패스 감사합니다 그럼 여기까지 하고 다시 Jamal한테 넘기겠습니다 비쥬얼 에디터에 대해 이야기 해줄 겁니다 Thanks Tor, 좋은 데모였습니다 Tor이 저희가 하는 일을 보여드렸고 저는 저희가 왜 그걸 하는지 그리고 왜 개발자분들이 개발 workflow에 통합하셔야할지 설명해보겠습니다 디자인 측면에서 메인 토픽이 두가진데 XML 하고 레이아웃입니다

XML은, 여러분중에 전체 UI를 XML로 디자인하시는 분도 계시다는거 압니다, 좋은 일입니다 하지만 저한테는, 다른 많은 분들한테도 비쥬얼라이징 툴이 있어서 앱이 어떻게 보일지 알 수 있는 편이 좋습니다 그래서 저희 팀 스스로 목표를 세웠죠 XML 에디팅이 필요없는 툴을 만들 수 있을까 하고요 물론 이후에 코드를 리뷰하실 수 있지만 기본 문제가 되어서는 안됩니다 그게 새로 나온 레이아웃 에디터의 기본 이념입니다 Tor가 보여드렸듯이 새 기능이 많은데 위젯을 컴포넌트 트리로 드래그한다던가 디자인 위로요 또 청사진 모드 앱 뒷면에서 위젯이 상호작용하는걸 보실 수 있지요 그리고 새 속성 패널 전에는 뷰에 사용 가능한 모든 속성을 보여드렸는데 이제는 저희가 엄선해서 현재 뷰 레이아웃에 보아서 가장 어울리는 속성만을 골라 보여드립니다

저희가 또 자문해본게 레이아웃 관련인데요 Android 레이아웃 옵션이 몇 가지있는데 linear 레이아웃이 있고 horizontal and linear가 있지요 하지만, 경우에 따라서는 프레임이나 테이블 레이아웃이 필요한데 그건 안되네요? grid 또는 relative 레이아웃은요 그래서 그 둘중 어느걸 써야하죠? 저희가 풀려는 문제가 그겁니다 레이아웃에 어떤 컨테이너를 쓸지 자주 고민하시게 될 테니까요 이 경우 해답은 constraint 레이아웃입니다

컨테이너 고민은 하실 필요 없이 컨텐츠하고 레이아웃 상의 위젯 배열에 집중하실 수 있습니다 그래서 constraint 레이아웃의 장점을 알아보죠 첫째 UI 개발이 빠릅니다 데모에서 보셨듯이 위젯을 가볍게 추가하고 여러 contraint도 연결 가능합니다 또 중요한 것은 이걸로 더 반응성 좋은 디자인이 가능하다는 것입니다

그러니까, 내 앱 스크린이 Nexus 4나 타블렛이나 다른 Nexus 기기에 어떻게 보이냐를 생각하기보다 이제는 constraint를 추가해서 컨텐츠가 화면 사이즈에 자동으로 반응하게 합니다 셋째 최적화가 중요합니다 데모에서 보셨듯이 hierarchy를 대신 해드릴 수 있습니다 이미 아실 것 같지만 linear하고 relative 밑에 relative를 또 하시면 Android OS의 처리 속도가 실제로는 더 느려집니다 그러니까 nesting의 경우 constraint 레이아웃으로 간소화시켜줄수 있습니다

그리고 마지막으로 하위호환이 됩니다 그러니까 새 프로젝트에 쓰실 수 있고 지원 라이브러리라 기존 프로젝트에도 사용하실 수 있습니다 이자인 관련 보여드린 세번째 툴이 Layout Inspector입니다 가끔 앱 로딩하실때 생각하신적 있죠 왜 내 뷰가 오버랩하나 아니면, 속성 중 하나가 예상과는 다른 값인데? 그런거요 그래서 저희 툴을 쓰시면 우클릭으로 현재 레이아웃의 스샷을 찍으셔서 모든 속성을 직접 살펴보실 수 있고 전체 뷰 hierarchy도 보실 수 있습니다

디버깅에 큰 도움이 되겠지요 이제 개발에 관해 또 개발 편의를 위해 저희가 어떤 툴을 만들었나 잠시 토크 타임을 가지겠습니다 데모에서 보여드렸듯이 새로 Firebase 플러그인이 나왔는데요 어제 Google I/O에서 출시한 Firebase 서비스를 지원합니다 Google Analytics, Ads, 클라우드 메시징, 전부 Android Studio 20 내에서 원클릭으로 사용 가능합니다

Samples 브라우저도 좋은데요 보여드렸다시피 API 사용례를 찾으신다면 이제 Google Samples를 버튼 원클릭으로 보실 수 있습니다 이제 앱 개발의 스타팅 포인트를 찾기가 좀 더 쉬워지실겁니다 그러면 이젠 빌드 툴에 대해 이야기할 차례고 그건 Steph가 해 주겠습니다 수고하셨습니다, Jamal 빌드에 관해서는 Instant Run으로 시작하죠

개발자로서 가장 좋을 대는 다음 단계로 계속 나아가는, 플로우를 타는 거고 저희의 목표 중 하나는 Android 개발을 웹 개발만큼이나 가볍게 만드는 것입니다 그래서 코드를 변경하시고 그걸 리프레시해서 보시고 코딩의 플로우를 잃지 않지요 그래서 Instant Run을 만든 겁니다 그래서 그 작동법을 좀 이야기하자면 하나를 변경하시면 IDE는 그걸 이렇게 스왑합니다 점증적인 변경이라면 가장 빠른 스왑이 가능한데 hot-swap이라고 부릅니다

여기서 하는것은 처음 빌드 시에 바이트코드를 다 만들고 그 후에 변경을 하시면 변경된 코드를 반영하기 위해 코드 패스를 리다이렉트합니다 두번째는 warm swap인데 액티비티 재시작이 요구되죠 그래서 필요하실때마다 그렇게 합니다 예를 들면, 리소스 체인지요 Cold swap은 앱 자체의 재시작이 요구됩니다 구조적인 변경이 있을 시에 필요합니다 상속에 변경이 있던가 메소드의 signature를 바꾸시는 경우 등이 그렇지요

여기서 이야기를 조금 뒤로 돌려 어제 키노트에서 이야기했던 벤치마크에 대해서 말씀드리겠습니다 벤치마크 테스트는 다양한 앱과 툴로 이루어집니다 여기서 다 얘기할 생각은 없고 예 하나만 들지요 위키피디아 앱으로도 테스트를 합니다 오픈 소스 앱이라 GitHub에 있습니다

그리고 그냥 재미로 보시라고 저희 규준도 써놨습니다 보시다시피 Instant Run 비활용 상태에서 20하고 비교했는데 cold swap을 쓰면 21이 47배 빠르고 hot-swap을 쓸 경우 10

7배 빠릅니다 그 의미는, 잘 생각해보시면 빌드가 10배 넘게 빠르다는 것입니다 20과 비교하는건데 20은 1

5보다 빠르지요 dex 구조를 변경해서요 ADB push 속도도 10배 빨라졌습니다 그래서 따지고보면 좀 저평가된건데 뭐 저희 제일 목표는 개발자분들이 한층 빠른 빌드를 가능하게 하는 거니까요 그래서 거기 집중해서 저희 벤치마크에서 apples to apples 비교가 가능합니다 저희가 하는 다른 벤치마크 테스트가 참여하시는 유저분들의 통계를 봅니다

그리고 서로 다른 방식을 구현합니다 참여하시는 분들 감사합니다 저희가 보는 통계 샘플인데요 hot swap을 쓰는 Instant Run의 평균 빌드 타임입니다 전 유저층을 나타내므로 전세계, 모든 OS 각국, 모든 하드웨어 등을 포함합니다 아주 오래되고 느린 프로세서를 가진 하드웨어나 그 비슷한 것도요

지금 보시는 것은 대부분의 유저들의 hot-swap은 4,5초나 그 미만입니다 항상 저희 목표는 그래프 시프트입니다 최대한 많은 게 1초 내에 이루어지도록 하고 있습니다 그러니까 저희가 원하는 것은 풀 빌드 시간을 낮추기 hot-swaps의 속도 향상 최대한 많은 스왑을 hot swap으로 그런 게 목표입니다 hot swap, warm swap cold swap의 분포도와 풀 빌드 타임, 그리고 cold swap이 요구되는 요인을 봤습니다

이걸 보면 결국 개발자분들의 데이터이죠 22에서 가장 큰 변경점이 이 덕택에 이루어졌습니다 22는 AAPT로의 체인지를 포함합니다 아시다시피 리소스를 변경할 때 AAPT가 엔드 ID를 manifest에 집어넣습니다

아마도 모르셨겠고 일단 저희는 몰랐던 점은 리소스를 변경하거나 새로 추가하면 AAPT가 이 ID의 숫자를 다시 매깁니다 그래서 결과가 뭐냐면 코드 변경을 하셔도 cold swap을 하게 됩니다 이게 cold swap의 16~19%를 차지하는 요인이었습니다 그래서 22에서는 AAPT에 변경이 이루어져 리소스 ID가 항상 동일합니다

그냥 22 Instant Run이 빨라졌다 수준이 아닌 더 자세한 인사이더 뷰를 보여드렸습니다 hot swap 빈도가 늘어난 걸 보실 테니까요 그리고 또다른 변경점이 Split APK의 이점을 사용한 것인데요 지금은 빌드 시에 앱이 11~12개의 dex파일로 나누어집니다 풀 빌드를 하시면 실제로는 변경된 코드만 빌드하는겁니다

빌드 타임을 계속 낮출 예정입니다 22만이 아니라 다른 릴리즈에서도요 그러니까 여전히 빌드가 느리다 하면 저희를 찾아오시면 엔지니어링 팀이 감사해할겁니다 그럼 이번에는 프로젝트 구조

Tor가 데모를 잘 해줬는데요 그래서 저는 인사이더 뷰만 드릴겁니다 프로젝트 구조 대화창 밑으로 빌드 모델에 상당히 흥미로운 체인지가 있었는데요 Gradle은 참 유용했죠 아주 융통성 있는 언어고 Android에 좋았습니다 하지만, 생각해보면 IDE는 구조 input을 기대하고 Gradle은 프로그래밍 언어지요 그러니까 꽤 복잡합니다

22의 변경점 중 하나는 Gradle parser를 밑바닥부터 완전히 새로 썼습니다 그러니까 Gradle 파일을 읽어들일 때 훨씬 정확하고 IDE에서 써서 다시 내보낼때도 훨씬 더 정확합니다 그러니까 앞으로 보실 것은 예를 들자면 Gradle 파일에 변수를 쓰실 때 IDE에서도 맞게 읽어들입니다 앞으로 프로젝트 구조 대화창에서도 UI 요소 변경이 가능합니다

22의 Gradle 모델의 변경은 이미 완료되었습니다 Tor가 말했듯이 프로젝트 구조 대화창은 22에서 일부 완료이며 experimental flag에서 실험해보실 수 있습니다 2

3에서 전부 완료할 예정이며 그 시점에서는 디폴트가 되겠지요 Tor가 보여드린 Merged Manifest Viewer의 스크린샷입니다 잠시 이야기를 앞당기죠 Jack이요 Jack컴파일러는 2

1에서 Gradle에 통합되었고 22에서는 annotation 처리기능도 포함합니다 그러니까 이제 클래스 패스에 annotation processor 사용 가능합니다 여기 포함되는게 컴파일의 의존성 소프트웨어 등 그리고 다 자동으로 적용됩니다 자세한 사용법은 저희 문서 사이트에있고 여기 I/O에서 알려드리고 싶은 건 툴을 작성하시고 클래스 파일을 프리- 혹은 포스트-프로세싱하는 분은 Jack의 가장 큰 장점 중 하나가 구조적인 API로 조작이 쉽다는 것입니다

이후 릴리즈에서 차츰 Jack의 비중을 늘려나갈 것입니다 그러니까 실제로 한 번 써보시고 미흡한 점이 있으면 꼭 알려주세요 마지막 토픽은 C++ 지원입니다 이부분은 그냥 저희가 뭘 하는지 전체를 알려드리겠습니다 C++를 처음부터 끝까지 이해할 좋은 방법이라고 생각합니다

저희가 그렇게 많은 투자를 하는 이유는 그래픽이 아주 중요한 앱과 게임을 개발하시는 분이 많아서입니다 그리고 C++은 정말로 중요하다고 저희한테 강조하고 또 강조하셨죠 이미 C++에디팅과 디버깅을 지원합니다 전부 IntelliJ를 통한 것이지요 2016

1의 새로운 점 하나는 IntelliJ의 향상된 C++지원입닏다 22의 가장 큰 변경점은 CMake와 Gradle일겁니다 CMake 예시를 설명드리죠 Gradle파일에서 CMake 프로젝트를 참조할 수 있습니다

이걸로 SO 파일이 빌드되고 APK에 패키징되었습니다 이게 가능한 것은, Gradle이 이제 CMake에도 나갑니다 저희는 CMake가 프로젝트 메타데이터를 더 내보내게 하려고 합니다 어떻게 빌드하는지 프로젝트에 있는 파일 목록 등 Tor가 보여드렸듯이 프로젝트 hierarchy에

cpp 파일이 보이게되고 같은 폴더에 있는 경우 h 파일도 추가됩니다 파일 자체는 프로젝트 hierarchy의 노드로 추가됩니다 외부 빌드 파일 밑에요, 그래서 거기서나 IDE에서 파일을 편집하실 수 있습니다 Tor가 보여드린 것처럼 이제 앱을 실행하시거나 브레이크포인트도 설정하시거나 다 예상하는대로 작동합니다 NDKBuild 셋업도 같습니다

Android mk 파일을 참조하실 수 있지요 C++ 디버거의 개선점도 잠시 소개하고 싶습니다 우선 22에서는 말씀드렸다시피 굳이 C++, Java, 혹은 하이브리드 디버거를 명시해주지 않아도 auto를 쓰면 IDE가 자동으로 맞는 디버거를 선택해드립니다

N에서 디버깅 중이시라면 Java하고C++ 디버거는 일체입니다 그리고 마지막으로 추가한게 watchpoint인데요 변수를 추가하시고 그게 빨간색이거나 변경되었으면 프로세스를 프리즈할 수 있습니다 Watchpoint는 x86과 Nexus 9에서 사용하실 수 있으며 다른 온라인 기기에도 확대할 예정입니다 지금 당장은 체험해보고싶으시다면 에뮬레이터에서 하시면 됩니다

Samsung S5, S6 기기와의 호환성 이슈도 여럿 고쳤습니다 그게 22의 C++에 관한 거 다고 앞으로 나올 릴리즈에서도 계속 개선점을 기대해주세요 마지막으로 이야기할 분야는 테스트입니다 Jamal에게 다시 마이크를 넘깁니다

모두들 감사합니다 그래서 테스트를 할 때 핵심은 로컬 테스트 환경입니다 올해 초 Android 에뮬레이터를 출시하게돼서 정말 흥분됐는데요 아직 안써보신 분이 있다면 정말 좋은 툴입니다 장점은 CPU, GPU, I/O 속도가 다 향상된거라 실제 기기보다도 빠릅니다 ADB 속도도 향상되었습니다 사실 asset을 push하는 와중에 앱하고 생기는 병목 현상의 원인은 ADB입니다

새 Android 에뮬레이터로는 10배 빨라졌습니다 그리고 Tor가 보여드린대로 UI도 바뀌었고요 회전, 스크린샷 찍기 등이 가능합니다 그리고 확장 UI도 있어서 센서를 컨트롤할 수도 있습니다 위치 정보 확인, SMS 메시징, 통화하기 앱 테스트에 필요한 모든 툴이요

로컬 테스트에 더해서 Android Studio 내에서 Firebase Test Lab을 출시하였습니다 Tor 데모에 나온 것처럼 Clouds 탭에서 클라우드에 있는 기기 선택이 가능합니다 그러면 보유하고계시지 않은 기기로도 테스트되고 APK하고 테스트를 보내서 앱 테스트를 합니다 그리고 아까 보여드렸죠, Espresso Test Recorder 좋은 데모인데 이게 왜 중요하냐면요 테스트를 만드는 건 지루할 수도 있는 작업이고 그다지 많은 사람들이 선호하진 않지요

그래서 이제는 기기를 누르시면 테스트 캡쳐가 됩니다 결과물은 Test Lab에 업로드하셔도되고 아니면 로컬 머신에서 실행하셔도 됩니다 마기막으로 APK Analyzer 이거는 왜 중요하냐면 완료라고 생각하시고 빌드해보시면 APK가 너무 큽니다 왜냐하면 결국 나중에가서 유저가 Google Play에서 앱을 다운받을 때는 최소로 작은APK를 원하거든요 이 툴은 APK를 해부합니다 dex와 asset 파일을 보고 뭐가 문제라서 APK가 이렇게 큰가 보는거죠

모든 기능을 이야기할 시간은 없습니다 그래도 새 Lint 분석기능하고 IntelliJ 2016는 말씀드렸고 접근성에 큰 투자를 했고 Android Studio 22에 새로 추가한 기능들입니다 간단하게 다시 말씀드리자면 새 기능이 추가된 부분은 디자인, constraint 레이아웃 매니저와 디자이너 코딩에 도움이 될 Firebase의 통합 향상된 C++지원과 빌드 지원 그리고 테스트를 도와드릴 레코더입니다 어디서 시작하냐고요? Android Studio 2

2을 쓰시려면 업데이트를 체크하시면 canary채널의 Android Studio 22를 받아보시라고 뜰겁니다 그리고 혹시라도 Android Studio가 없으시다면 이 링크로 가셔서 새 걸로 다운받으세요 물론 채널은 canary채널로 변경하셔야 Android Studio 22가 다운받아집니다

끝입니다 대단히 감사합니다 감사합니다