Learn how to Build Android Apps with Android Jetpack and Kotlin

발표자 : 건축가와 건축가를 배우십시오 Kotlin 프로그래밍 언어로 된 Android 앱 업계에서 입증 된 도구와 라이브러리를 사용합니다

Kotlin에서 Android 앱을 만드는 중입니다 Udacity와 함께 Google에서 개발 한 코스입니다 업계에서 실제 Android 앱을 제작하여 학습하게됩니다 현대적인 응용 프로그램 아키텍처의 모범 사례 Android Jetpack 구성 요소를 사용하는 이유와 방법을 이해하고, 데이터베이스 룸, WorkManager 백그라운드 처리를위한 새로운 탐색 구성 요소 등

핵심 Kotlin 기능을 사용하여 앱 코드 작성 보다 빠르고 간결하게 Android로 개발하는 법은 API와 바로 가기를 배우는 것 이상 그것은 당신의 두뇌를 모바일 개발자처럼 생각하도록 훈련시키는 것입니다 우리와 함께 배우십시오 이 무료 과정에 대한 자세한 정보와 모든 정보를 보려면 Udacity, udacitycom/google으로 이동하십시오

Build great Material Design products across platforms (Google I/O '18)

[음악 재생] JOHNATHAN CHUNG : 안녕하세요 우리 이야기에 오신 것을 환영합니다

제 이름은 Jonathan Chung입니다 그리고 저는 Material Design 팀의 UX 리드입니다 NIC BUTCHER :여보세요 내 이름은 닉 부처 야 그리고 저는 Design Relations 팀의 디자이너이자 엔지니어입니다

LARCHE : 나는 윌이야 저는 Material Design의 엔지니어입니다 JOHNATHAN CHUNG : 자리에 앉으세요 오늘 우리는 정말 어떻게 이야기하는지에 대해 기쁘게 생각합니다

플랫폼 전반에 걸친 훌륭한 소재 디자인 제품을 제작할 수 있습니다 그래서, Material Design이란 무엇입니까? 우리가 막 만든 모든 새로운 발표? 이전에 우리가 알고 있던 것에서 어떻게 진화 했습니까? 머티리얼 디자인은 이제 적응 형 디자인 시스템입니다 오픈 소스 코드로 뒷받침되는 팀은 고품질의 디지털 경험을 제공합니다 즉, Material은 당신을 돕습니다 정말 빠르고 아름답고 유익한 제품을 만들 수 있습니다

우리가 처음 출시 한 2014 년에는 제로 고객이 생겼습니다 이제 Material Design을 사용하는 150 만 개 이상의 앱이 있습니다 믿을 수 없어 그리고이 거대한 고객 수를 기반으로, 우리는 정말로 듣고 계속했습니다 우리의 시스템을 개선합니다

오늘 우리는 End-to-end 제품인 Material Theming을 출시했습니다 재료 디자인을 쉽게 만들 수있는 기능 자, 여러분 중 일부는 더 많이 배우기를 간절히 원합니다 하지만 아마도 당신 중 일부는 여전히 궁금해하고 있습니다 머티리얼 디자인이 당신에게 적합한 지 여부 귀하의 회사를 위해

그래서 나는 새롭게 걷는 것으로 시작할 것입니다 디자인 된 Materialio 사이트 그런 다음 Nick은 재료 도구 제품군을 시연합니다 공동 작업 및 맞춤 설정을 위해 제작 한 정말 쉽고 편리합니다

그러면 Will은 Material Components에 대해 이야기 할 것입니다 오픈 소스 코드 라이브러리 모든 플랫폼에서 사용할 수 있습니다 그래서 내가 왜해야하는지 세 가지 이유를 설명해 드리겠습니다 Material Design 사용을 고려하십시오 첫째, Materials Design은 개발자를위한 것입니다

우리에게 많은 피드백을 주셨습니다 앱을 적용하고 구축하는 것이 쉽지 않은 점 머티리얼 디자인을 사용합니다 이제 Material Theming 및 모든 도구를 사용하여 우리는이 새로운 기능을 지원하기 위해 구축했습니다 우리는 이제 창조하고자하는 열망을 갖게됩니다 개발할 코드에 눈을 돌려야합니다

머티리얼 디자인은 진정한 크로스 플랫폼 프레임 워크입니다 일관된 사용자를 만드는 것이 얼마나 중요한지 이해합니다 플랫폼 전반에서 작동하는 경험 따라서 머티리얼 디자인을 사용하면 사용자에게 도움이됩니다 여러 장치를 사용합니다

우리는 또한 고품질의 제품을 만드는 것이 오랜 시간이 걸린다 따라서 우리는 플랫폼 간 일관성을 장려하고 있으며, 또한 코드를 제공하고 있습니다 Android, iOS, 웹 및 Flutter에서 개발을 시작하십시오 이제, 우리는 그것을 시험에 적용 할 것입니다 이렇게 스크린을 만들 것을 상상해보십시오

그리고 아마도 여러분 모두는 전문가이자 전문가 일 것입니다 하지만 내 경험에 의하면, 화면을 구축 이것을 좋아하고 올바르게하려면 시간이 걸릴 것입니다 재료 디자인의 힘으로, 우리는 이제 그 어느 때보다도 쉽게 만들고 있습니다 여러 플랫폼에서 이와 같은 화면을 설계하고 구축 할 수 있습니다 그리고이 모든 마법은이 재 설계 된 사이트에서 바로 시작됩니다

새로운 사이트는 이제 디자인, 개발 및 도구로 나뉩니다 각 섹션에서 모든 위대한 자원을 찾을 수 있습니다 우리 팀이 당신을 위해 창조 한 디자인 지침, 도구, 리서치 통찰력, 오픈 소스 코드, 당신이 이름을 짓는다 우리는 시간을 좀 보냅니다 이 사이트는 현재 더 자세하게 설명되어 있습니다

디자인 섹션에는 여전히 모든 것이 있습니다 Material Design에 대해 좋아했습니다 모든 것이 있습니다 아무것도 사라지지 않았다 또한 가장 많이 읽은 기사 몇 가지를 소개합니다

페이지 상단의 콘텐츠를 빨리 찾을 수 있습니다 우리는 여전히 당신을 돕는 데 집중하고 있습니다 아름다운 디자인 제품, 배경없이 디자인 여기에서 기사를 볼 수 있습니다 우리가 당신을 위해 제공 한 것, 그리고 시스템 아이콘, 자신 만의 맞춤 색상 팔레트 생성, 당신의 브랜드에 맞는 서체를 고르십시오

UI에서 모양의 힘을 실제로 활용할 수 있습니다 마지막 섹션에서는 재료 연구에 대해 이야기합니다 우리는 Material Design의 모든 유연성을 보여 주며, 당신이 소매 용 건물이라면, 의사 소통을 위해, 또는 무엇인가 여행 앱만큼이나 복잡합니다 모든 것이 있습니다 그리고 우리는 그것을 테스트했습니다

그리고 체크 아웃 할 수있는 모든 것이 있습니다 머티리얼 디자인 가이드도 확장 및 향상되었습니다 재료 시스템, 재료 기초 및 재료로 변환 지침 머티리얼 시스템 섹션부터 시작하여, 우리는 Material Metaphors에 대한 일반적인 개요를 제공합니다 그런 다음 재단 섹션 다이빙 기본 관행으로 그래서 구조적인 것들을 언급 할 것이고, 타이포 그라피, 도해 법, 모양, 레이아웃 등

이제 지침 섹션에서는 전술 지침을 제공합니다 재료 제품을 만드는 방법에 대해 알아보십시오 이것에 관한 가장 좋은 점은 이러한 위대한 디자인 지침은 엔지니어링과 밀접하게 관련되어 있습니다 이제 다른 기능 중 일부를 살펴 보겠습니다 너를 위해 도움이 될 사이트에 제품을 만들 때

우리는 어떻게 상세한 사양을 가지고 있는지 압니다 엔지니어링 프로세스를 10 배 더 빠르게 만듭니다 그래서 우리는이 뷰를 제공하고 있습니다 Spec 뷰어 이 스펙 뷰어에서 우리는 이제 이 이미지에 대한 유용한 정보

오른쪽의 메뉴를 클릭하면, 다양한 유형의 모든 레이어에 액세스 할 수 있습니다 이 이미지에 대해, 당신은 단지 이미지 만 볼 수 있습니다, 측정, 텍스트, 색상, 모양 및 표고를보고, 이 UI에서 사용되는 여러 구성 요소를 확인하십시오 또는 우리가 추가했을지도 모르는 추가 노트 이 텍스트 주석을 살펴 보겠습니다 따라서이 주석에서, 여러분은 글꼴 이름, 크기 및 색상을보고, Google 팀이 구축 한 Google 글꼴 사이트로 연결됩니다

우리는 이러한 유용한 자원을 표면화하기를 정말로 원했습니다 워크 플로우의 맥락에서 당신에게, 그래서 당신이 필요로하는 모든 것이 바로 거기에 있습니다 이제 Google 글꼴 사이트로 이동하면 너는 다운로드하고 사용할 수있을 것이다 우리의 mock에서 사용되는 글꼴 우리는 또한 가장 효과적인 방법에 대한 연구를 수행했습니다

지침을 전달합니다 그리고 우리는 인터랙티브 한 콘텐츠 독자들에 대한 이해의 수준을 높였습니다 그래서 우리는 콘텐츠를 소개하기 시작했습니다 우리 기사에서 상호 작용한다 다음은 재료 팔레트 생성기의 예입니다

그것은 컬러 기사에 줄 지어 배치됩니다 이 도구와 상호 작용함으로써, 개선 된 색상 시스템에 대해 배울 수 있습니다 그래서 그것들은 우리가 가지고있는 새로운 특징 중 일부입니다 디자인 섹션에 추가 그러나 어떻게이 모든 것을 구축합니까? 그게 니가 여기있는 이유야

맞지? Develop 섹션은 이제 기능과 액세스 권한이 있습니다 Android, iOS, 웹 및 Flutter 용 오픈 소스에 모두 제공됩니다 플랫폼 협약을 존중하면서, 구성 요소가 제대로 작동하는지 확인하려고했습니다 Android뿐 아니라 다양한 플랫폼에서 사용할 수 있습니다 그리고 이들 구성 요소로 게임을 즐길 수 있습니다

우리 카탈로그에 아래로 스크롤하면 섹션이 표시됩니다 개발자 리소스 디자인 섹션과 비슷하게, 우리는 당신에게 필요한 자원을 제공하기를 원했습니다 귀하의 제품을 구축하는 데 사용할 수 있습니다

그리고 이것에 익숙하지 않다고 가정 해 봅시다 아래쪽으로 더 스크롤하면 이 작업을 시작하려면 자습서를 찾으십시오 기어를 도구 섹션으로 전환합니다 도구 섹션에는 모든 훌륭한 리소스에 대한 링크가 있습니다 갤러리를 시작으로 우리가 당신을 위해 만들었습니다

내가 사랑하고 디자인을 공유하기 위해 사용해온 부분이다 내 팀과 나는이 제품을 좋아한다 갱도 갤러리는 공동 작업을 매우 쉽고 매끄럽게 만듭니다

Nick이 갤러리에 대한 자세한 내용을 1 분 안에 알려줍니다 오른쪽에는 액세스 권한이 있습니다 양식화 된 아이콘의 다섯 가지 전체 세트 형식, 크기 및 밀도 범위에서 사용할 수 있습니다 하단에는 Material Theme가 표시됩니다 스케치 편집자

Theme Editor 란 무엇입니까? 이미 다른 회담 소식을 듣지 않았다면, Theme Editor는 플러그인입니다 브랜드를 체계적으로 표현할 수 있습니다 색상, 도해 법, 인쇄술, 그리고 모양 그리고 Theme Editor를 통해, 당신은 우리가 당신을 위해 제공 한 주제를 취할 수있을 것입니다 그것을 사용자 정의하여 사용자 정의하십시오

이러한 구성 요소 집합은 디자인에 사용할 수 있습니다 곧 또한 Theme Editor에 대한 유용한 정보 가이드 라인에 언급 된 모든 가이드 라인입니다 도구에 직접 통합됩니다 나중에 뭔가를 바꾸고 싶다면 어떨까요? 문제 없어

다음은 내부 색상에서 색상을 선택하는 예입니다 팔레트를 구성 요소의 전체 라이브러리에 적용합니다 나는 이것이 매우 유용하다고 생각한다 그리고 이것은 내 일을 그렇게 쉽게 만듭니다 이제, 나는 그것을 동료에게 넘겨 주겠다

닉, Theme Editor 사용법에 대해 더 자세히 이야기 해주십시오 고맙습니다 고마워, 조니 고마워, 조니 그래서 우리는 Material System, Foundation, 가이드 라인을 통해 고유 브랜드를보다 쉽게 ​​가져올 수 있습니다

귀하의 앱에 나는 당신에게 어떻게하면 좋을지의 예를 들려 줄거야 당신은 정말로 얼마나 쉬운 지 보여주기 위해 이것을합니다 해야 할 일이며, 특히 새로운 자료가 어떻게 나타나는지 보여줍니다 툴링은 설계 과정에서이 프로세스를 만듭니다 훨씬 더 빨리 개발할 수 있습니다

그래서 저는 올해 멋진 팀의 일원이었습니다 Google I / O 앱을 디자인하고 제작 한 사람 어쩌면 당신 중 일부는 그것을 사용했을 수도 있습니다 우리는 새로운 컴포넌트 리를 배치했음을 눈치 챘을 것입니다 여기에 하단 앱 바를 사용하는 것처럼 인셋 팹과

그러나 우리는 새로운 Material Theming을 모두 사용하고 싶지 않았습니다 우리가 원하지 않았기 때문에 오늘 큰 출시를위한 쇼를 망쳐 놓을 수 있습니다 오늘 우리가하는 일은 너를 걷는거야 Material Theming이 어떻게 할 수 있었는지 몇 가지 가능성을 통해 Google I / O의 상표를 훨씬 더 깊게 가져 오기 위해 적용됩니다 이 응용 프로그램에

그래서 Google I / O, 개발자 회의입니다 우리는 그것을 개발자 페스티벌로 거의 생각하고 싶어합니다 이 브랜드에는 장난기가 가득합니다 나는 특히 장난을 좋아한다 모션 스타일의 종류

또한 색상 표를 통해 표현됩니다 당신 주위에있는 모든 곳에서 볼 수 있습니다 또한 소프트웨어의 은유를 사용합니다 엔지니어링 세계, 레이어 및 스택과 같은 것들 그리고 우리는 일러스트 스타일에 영감을주기 위해 그것을 사용합니다

브랜드의 일종으로 그렇다면 이러한 요소를 앱 디자인에 어떻게 적용 할 수 있을까요? 그래서 나는 스케치에있다 이 파일은 테마 편집기에서 생성 한 디자인 파일입니다 조니가 방금 당신을 보여 줬어 Theme Editor가 많은 것들을 생성했다는 것을 알 수 있습니다 우리를 위해

그것은 구성 요소의 무리, 인쇄술, 스케일, 컬러 팔레트, 입면도 설정 및 아이콘, 등등 여기에서 Components View로 전환하면, 기본적으로 볼 수 있습니다 자료의 모든 구성 요소에서 일대일로 이 스티커 시트에서 나를 위해 생성 된 지침 여기, 내 디자인에서 사용할 준비가되었습니다 앱 바에서 모든 것이 있습니다 팹에서 카드로의 백 드롭

이름은 여기에 있습니다 이 구성 요소들에 대한 더 좋은 점은 그들이 Material Theming 시스템을 알고 있다는 것입니다 내가 의미하는 바를 보여 드리죠 테마로 다시 전환하여 여는 경우 스케치 플러그인 메뉴의 테마 편집기, 우리는이 테마가 현재 I / O, 일종의 인디고 프라이 머리, 그리고 청록색 악센트 색깔의 종류 색상 설정으로 들어가서 여기에서 Primary Color 섹션을 클릭하면, 그리고 나는이 원색을 바꾸어야했다

16 진수 코드를 직접 드래그하거나 16 진수 코드를 입력함으로써, 그것은 많은 효과를 가질 것입니다 내가 너를 그들을 따라 가게 해줘 우선, 이런 종류의 색조 팔레트를 보게됩니다 이 10 가지 색상의 색상이 생성되었습니다 내가 선택한 그 한 색깔에서

이것은 꽤 멋지다 나는이 작은 것에 괴짜 할 것이다 여기에 순진하지 않고 있습니다 선택한 색조 만 사용하는 것이 아닙니다 밝기를 변경하고 그런 식으로 팔레트의 종류,이 알고리즘 뒤에 디자이너가 색상을 선택하는 방법을 모방하려고 노력하고 있습니다

그리고 그것을 사용하여 멋진 색상 표를 고를 수 있습니다 잘하면 응용 프로그램 전체에서 훌륭하게 작동합니다 그래서 그것을 선택하면 테마의 전체 색상 팔레트 업데이트 중입니다 그리고 제가 다시 구성 요소로 전환하면,이 스티커 시트, 당신은이 모든 요소들이 테마 색의 변화를 알고 있습니다 그리고 그 변화는 모든 요소들로 흘러 넘칩니다

따라서 앱 바가 기본 색상을 선택하고 더 어두운 색상을 선택할 수 있습니다 상태 표시 줄의 음색 등, 그것은 꽤 강력합니다 그렇다면 우리가 생성 한이 라이브러리를 어떻게 사용합니까? 따라서 내 앱 디자인 파일로 전환하면, 이것은 I / O 앱의 일부 화면입니다 라이브러리의 구성 요소를 사용하여 디자인했습니다 저를 위해 Theme Editor가 생성되었습니다

Sketch의 라이브러리 기능을 사용하지 않은 경우, 꽤 멋지다 기본적으로 구성 요소를 공유하는 방법입니다 서로 다른 디자인 파일간에 또는 팀간에 공유 할 수 있습니다 그것은 매우 강력합니다 따라서 표준 스케치 삽입물을 사용하여 라이브러리에 액세스합니다

메뉴 그리고 제가 생성 한이 라이브러리로 스크롤합니다 그리고 바로 여기서 볼 수 있습니다 스티커 시트에서 우리가 방금 보았던 이러한 종류의 나무 구조로 배열됩니다 그래서 우리는 우리가 구성 요소의 다양한 변형, 구성 요소가있을 수있는 다른 상태로 내려갑니다

따라서 설계에 팹을 추가하려면, 메뉴에서 하나 잡을 수있어 내 디자인에 떨어 뜨려 라 그리고 오른쪽 경위 창에서, 재정의를 제공하는 것을 볼 수 있습니다 당신은 아이콘과 같은 것들을 바꿀 것입니다 따라서 Theme Editor를 통해 생성하면, 사용할 수있는 많은 구성 요소가 있습니다

그래서 우리는 그것이 생성 된 라이브러리를 이해합니다 그리고 그것을 당신의 디자인에 사용하는 방법 이러한 매개 변수 중 일부를 사용자 정의하기 시작하십시오 그래서 나는 나의 도서관으로 돌아가 Theme Editor를 열었다 그리고 내가 생각하는 첫 번째 매개 변수 중 하나 I / O 브랜드가 재미있을 수도 있습니다

I / O 로고에서 영감을 얻고 싶습니다 그 사이에 이런 종류의 탁월한 슬래시가 있습니다 나는 우리가 흥미로운 종류의 표면을 할 수 있다고 생각한다 모양 치료 그래서 기본적으로, 기준선에서, 우리는 이런 종류의 둥근 모서리 표면 모양

각도 설정으로 전환하겠습니다 대신에이 세 모서리의 선택을 취소하십시오 왼쪽 상단 모퉁이 반지름을 크랭크 업하십시오 여기 I / O 로고에서 영감을 얻으 려합니다 내 제품의 구성 요소에 깊이 삽입 할 수 있습니다

라이브러리에서 저장을 누르고 전환하면 내 디자인 파일에 스케치가이 작은 보라색 막대를 띄웁니다 모퉁이에서 기본 라이브러리에 업데이트되었습니다 이것을 클릭하면 diff가 거의 나옵니다 이것들은 모두 이러한 변화의 영향을받을 것입니다 그래서 그것들을 선택할지 말지를 선택할 수 있습니다

나는이 모든 변화를 가져갈 것입니다 이제는 형상 시스템을 알고있는 모든 구성 요소 업데이트 될 예정입니다 예를 들어이 하단 시트를 확대하면 당신은 그것이 커트 코너에서 픽업되는 것을 볼 수 있습니다 그리고 마찬가지로, 여기에있는이 제기 버튼에, 그것은 모양을 인식합니다 시스템의 일부 구성 요소는 다른 기능을 제공합니다

매개 변수를 선택할 수 있거나 가질 수없는 변형 체계 예를 들어, 여기에 표준 원형 프리젠 테이션을 사용하고 있습니다 그러나 Symbol 설정으로 들어가면 내가 선택한 곳으로 갈 수있어 다른 대안을 선택하십시오 만약 내가 매개 변수를 알고 싶거나 원하지 않는다면

예를 들어, 다이아몬드 또는 스퀘어 타입으로 픽업 할 수 있습니다 모양, 다른 모양 매개 변수에 데리러 것입니다 또는 원하면 원형으로 유지하도록 선택할 수 있습니다 그래서 그것들은 그들의 매개 변수를 고르지 않을 것입니다 유사 콘텐츠에 대해 말하면서 새로운 분산을 도입했습니다

텍스트 필드 중 우리는 곧 다시 돌아올 것입니다 내 디자인에서 바로 들어가서 선택할 수 있습니다 기본 텍스트 필드의 표준 종류는 무엇입니까? 다른 변형으로 전환 할 수 있습니다 내 스티커 시트에서 사용할 수있는 것들 그래서 거기에 우리가 간다

텍스트 필드의 다른 변형이 있습니다 바로이 윤곽선을 사용하면 더욱 분명합니다 살펴보고 싶은 다음 매개 변수는 활판 인쇄입니다 현재 I / O 앱은 Google Sans를 사용하고 있습니다 Google 브랜드의 서체 인 페어링 된 Roboto와 함께 나는 우리가 어떤 영감을 얻을 수 있다고 생각한다

그것은 개발자 이벤트입니다 그래서 저는 개발에서 영감을 얻으려고합니다 환경을 보호하고 모노 스페이스 글꼴을 사용해보십시오 이것이 Google 브랜드와 어떻게 작동하는지 확인하십시오 Theme Editor의 타이포 그라피 설정으로 들어가면, 테마 편집기에있는 여기에이 스케일이 있음을 알 수 있습니다 나를 위해 생성, 이런 종류의 의미 스타일을 제공 내 디자인 전반에 걸쳐 적용 할 수 있습니다

여기에있는 Google Sans를 선택하고 검색하면 모노 스페이스 (monospace)의 경우, 여기서 Roboto Mono를 사용할 것입니다 내 즐겨 찾기 중 하나, 그것은 어디서나 교환 할 것입니다 그 다른 폰트가 사용되었다는 것 내가 사는 곳마다 다른 곳이야 Google Sans의 다른 변형을 사용하면 수동으로 변경할 수 있습니다

그리고 그것은 흥미로운 것을 할 것입니다 여기를 보시면 Google Sans로 설정되어있는 동안 볼 수 있습니다 특정 글꼴 크기와 추적 및 무게를 가졌습니다 그리고 다른 글꼴, Roboto Mono로 전환했을 때, 해당 스타일에 대해 변경된 글꼴 크기, 추적 및 체중 그래서 여기에있는 것은 Theme Editor입니다

글꼴에 대해 꽤 영리합니다 글꼴의 특성을 살펴 봅니다 순서대로 광학적으로 수정하십시오 조화로운 스케일을 만들 수 있습니다 그래서 당신이 선택한 글꼴이 무엇인지 알 수 있습니다

x 높이 또는 획 두께가 다릅니다 또는 이와 비슷한 것을 보면, 사용하는 크기를 조정합니다 규모의 다양한 유형에 대한 이 조화로운 유형을 생산하기 위해서 모두 단지 글꼴을 선택함으로써, 그것은 저를위한 스케일을 생성합니다 그것은 꽤 훌륭하다

그래서 그것을 저장하고 내 앱 디자인으로 다시 전환합니다 다시 말하면, 도서관이 업데이트되었음을 ​​알려줍니다 나는 모든 변화를 가져갈 수있다 디자인 전반에 걸쳐 나는 다른 폰트를 마침내 사용하고 있었다 당신은 내 새로운 서체로 업데이트 된 것을 볼 수 있습니다

[박수 갈채] 테마 편집기로 이동하십시오 그래서 이러한 변화는 나에게 꽤 좋아 보인다 나머지 팀원들과 공유하고 싶습니다 머티리얼 플러그인을 사용하면 Theme Editor와의 긴밀한 통합을 얻으십시오 하지만 갤러리와도 정말 잘 통합됩니다

공동 작업을위한 도구 플러그인에서 바로 갤러리에 업로드하도록 선택할 수 있습니다 프로젝트 또는 하위 수집을 설정할 수 있습니다 그것을 넣고 곧바로 업로드 할 수 있습니다 한 번 업로드하면 준비가 완료됩니다

팀과 공유했습니다 그래서 나는 우리 팀과 공유 할 수있는 고유 한 URL을 얻습니다 그래서 갤러리에서 디자인 작품에 대한 개요를 얻을 수 있습니다 새로운 반복을 업데이트 할 수 있으므로 내 디자인이 어떻게 발전했는지 나는 논평 할 수있다

그래서 이것을 사람들과 공유 할 수 있습니다 다양한 디자인 기능에 대한 토론이 있습니다 그러나 나는 당신에게 내가 절대적으로 좋아하는 기능 중 하나를 보여 주겠다 이는 검사 모드입니다 이제 Inspect Mode를 사용하면 디자이너가 쉽게 작업 할 수 있습니다

개발자와 개발자를위한 핸드 오프 디자인에서 필요한 모든 정보를 얻을 수 있습니다 따라서 Inspect Mode를 활성화하면이 Inspector를 얻습니다 오른쪽으로 그리고 나서, 내가 가리 키거나 디자인의 항목을 선택할 때, 그것은 나에게 spec 일을 줄 것이다 근본적으로 나에게 자동으로 빨간 선을 그어 줄거야

그래서 그것은 나에게 크기, 위치 정보를 준다 그것은 선택과 모든 것의 몸과 사본을 나에게 준다 서체 정보 그것도 당신이 그들에서 사용하는 모든 아이콘을 데리러거야 소재 테마 그래서 어떤 Material Icons가 당신을 연결시킬 것입니다 Material Icon 사이트로 이동합니다

필요한 자산을 확보 할 수 있습니다 그리고 바로 거기에서 무엇보다도 갤러리는 구성 요소를 이해합니다 테마 편집기가 생성합니다 따라서이 팹을 여기에서 선택하면, 단지 말하지 않을 것입니다

이봐, 이건 파란색 동그라미 야 그것은 말할 것입니다, 이봐 요, 나는 그것이 팹이라는 것을 알고 있습니다 따라서 그것이 팹이라는 것을 알 수 있습니다 무엇보다도 플랫폼 링크 당 제공됩니다 문서를 참조하기 때문에 개발자 구현해야하는 구성 요소로 직접 이동할 수 있습니다

그리고 그들은 어떤 매개 변수도 주어질 것입니다 변경 사항은 구성 요소에서도 변경되었습니다 나는 이것을 충분히 강조 할 수 없다 더 이상 그림이 그림을 넘겨주는 것이 아니라, 이봐, 이걸 구현할 수 있기를 정말로 바란다 구성 요소 간의 밀 결합 Theme Editor와 Material Design 구성 요소간에 제공됩니다

그들은 동일한 구성 요소라는 것을 의미합니다 이 구성 요소를 사용한다는 의미입니다 이 매개 변수가 변경되었습니다 그래서 더 이상 추측하는 게임이 아닙니다 그래서 이러한 변화는 나에게 좋을 것 같습니다

@Will에 대한 Comment 기능을 열어 두겠습니다 이러한 변화가 갤러리에 업로드되었습니다 구현 준비 너에게 끝이야, 윌 LARCHE : 고마워, 닉

그는 위대하지 않습니까? [박수 갈채] 그래서 저는 엔지니어입니다 그리고 닉은이 갤러리 프로젝트를 나에게 공유했습니다 나는 링크를 얻었다 그리고 나는 그것을 클릭한다 그리고 나는 여기 들어올거야

그리고 나에게 Material Components 선적 서류 비치 자, Material Components 또는 MDC는 무엇입니까? Material Components는 오픈 소스 프레임 워크입니다 머티리얼 디자인을 구현합니다 Android 용 MDC, iOS, 웹 및 Flutter 용 MDC가 있습니다 Google에서 앱과 동일한 코드입니다

각각에는 수십 가지 구성 요소가 있으며 모두 닉이 더 일찍 이야기했던 시원한 것들을해라 오픈 소스이기 때문에 수수께끼가 없습니다 그들은 마법 상자가 아닙니다 보거나 사용자 정의 할 수있는 모든 것을 사용할 수 있습니다 그리고 우리는 코드를 기증 해 주시기 바랍니다

이제 Material Components의 새로운 텍스트 필드를 살펴 보겠습니다 어떻게해야합니까? MDC를 코드 기반에 추가하는 것은 매우 쉽습니다 Android 사용자는 디자인 지원에 액세스합니다 표준 지원 라이브러리 설정을 사용하여 Maven을 통해 라이브러리 웹에서는 노드 모듈 만 설치하면됩니다

Flutter에서 끝났습니다 Flutter에는 재질 구성 요소가 내장되어 있습니다 iOS에서는 CocoaPod를 사용할 수 있습니다 Pod 파일에 추가합니다 iOS에서 조금 더 자세히 살펴 보겠습니다

새 텍스트 필드를 구현하는 방법에 대해 설명합니다 따라서 MDC iOS의 모든 텍스트 입력란에는 입력 및 제어기를 포함한다 우리는 MDC 텍스트 필드와 아웃 라인 컨트롤러를 추가 할 것입니다 우리의 앱에 본질적인 콘텐츠 크기를 사용하여 레이아웃 할 수 있습니다

UI 텍스트 필드 대리자를 설정할 수도 있습니다 그리고 자리 표시자는 국경을 넘어서 뜰 것이다 MDC를 이미 사용하고 있다면 업그레이드가 매우 쉽습니다 이러한 새로운 디자인을 얻으십시오 CocoaPod를 사용하고 있다면, 포드 업데이트 MaterialComponents를 실행하십시오

그런 다음 컨트롤러 클래스를 변경합니다 예전의 수업에서 새로운 멋진 수업 중 하나에 이르기까지 그리고 너 끝났어 그런데이 텍스트 필드는 훨씬 더 우수합니다 이전 디자인보다 성능이 좋습니다 우리는 엄청난 양의 연구를 순서대로 수행했습니다

이러한 최적화 된 디자인, 많은 연구가 필요합니다 그리고 그것은 긴 형태로, 사용자가보고 상호 작용할 확률이 훨씬 높습니다 이 텍스트 필드는 이전 디자인보다 새로운 텍스트 필드 또는 자료에 대해 더 자세히 알고 싶다면 연구, 목요일 "Measuring Material"목요일을 볼 수 있습니다 12시 30 분에 iOS에서 이렇게하는 것은 쉬운 일입니다 하지만 안드로이드는 어떨까요? 글자 입력 레이아웃에 윤곽선 상자 스타일을 설정했습니다

요소입니다 웹에서는 요소를 바꿉니다 클래스 MDC 라인 리플, MDC 클래스의 요소 클래스 경로가있는 SVG가있는 노치 아웃 라인 MDC 노치 외곽선 경로 및 MDC 요소 노치가있는 윤곽 유휴 수정 자 클래스 MDC 텍스트 필드 개요를 잊지 마십시오 더 간단 할 수는 없습니다

그리고 Flutter에서 테두리를 윤곽선으로 바꿉니다 MDC Flutter에서 일하기 때문에 조금 편견이 있습니다 하지만 펄터가 완벽한 방법이라고 생각합니다 여러 플랫폼에서 재료 설계를 구현할 수 있습니다 한 번 해보면 iOS와 Android를 모두 얻을 수 있습니다

그리고 MDC가 바로 구워집니다 Flutter 용 기본 UI 프레임 워크입니다 새 프로젝트를 만들 때마다 이미 링크되어 있습니다 나는 그것을 좋아한다 이제 재료 텍스트 입력란 코드에 추가 할 수 있습니다

그러나 더 많은 것이 있습니다 거의 모든 재료 가이드 라인 구성 요소를 찾을 수 있습니다 자재 구성 요소 앱 바, 버튼, 카드, 칩, 대화 상자, 탐색, 탭, 잉크 잔물결 지금 수십 가지가 있습니다

그리고 오늘 Materialio/develop에서이 모든 것들을 이용할 수 있습니다 그리고 설계가 완료되지 않았기 때문에 항상 더 많은 것들이 추가됩니다 오늘은 디자인 리소스를 보여 줬습니다 오늘 Material

io에서 사용할 수 있습니다 Theme Editor, Gallery 및 Material Tools Suite의 사용법 브랜드를위한 디자인을 사용자 정의 할 수 있도록 도와줍니다 머티리얼 구성 요소가 만드는 방법 4 개의 플랫폼에서 이러한 디자인을 쉽게 구현할 수 있습니다 정확성과 용이성 그래서 당신이 I / O에 있다면, 그 밖의 무엇을 할 수 있습니까? 우리의 디자인 돔으로 갈 수 있습니다

디자인 리뷰 및 데모를 얻을 수 있습니다 박스 회담에 귀를 기울이십시오 그리고 당신은 또한 이야기를 보러 갈 수 있습니다 "Flutter가있는 코드 Beautiful UI 그리고 재료 디자인 " 우리는 Material Components를위한 30 개의 코드 랩을 가지고 있습니다

코드 랩에서 그리고 수요일 2시 30 분에 세션, "펄럭과 물질을 묻는다" 우리에게 와서 질문 할 수있는 곳 Flutter 앱에서 소재 디자인을 구현하는 방법에 대해 알아보십시오 고맙습니다

[음악 재생]

Leveraging the Power of Arrow to Build Android(Kotlin) Apps using Functional Programming

[음악 재생] 좋아, 얘들 아 다시 오신 것을 환영합니다

그래서 얼마나 많은 기능적인 프로그래머가 여기에 있습니까? 승인 그럼 지금 놀라운 세션이 있습니다 화살표를 사용하여 안드로이드를 구축하는 힘 모니카 (Monika)의 함수 프로그래밍을 사용한 Kotlin 그녀는 4 년 동안 안드로이드 개발자로 일해 왔습니다 이제부터 그녀를 무대에 오르게해서 시작할 수 있습니다

[음악 재생] MONIKA KUMAR : 개발자 John을 만날 수 있습니다 Kotlin을 처음 사용하고 싶어합니다 그의 프로젝트에서 Kotlin의 함수 프로그래밍 기능 그러면 어떻게 그렇게 할 수 있을까요? 화살표를 입력하십시오 안녕, 모두들

저는 Monika Kumar Jethani입니다 나는 당신을 환영합니다 이 세션의 모든 부분을 활용하면 Arrow 기능적 프로그래밍을 사용하여 Android 애플리케이션을 구축하는 방법 그래서 저는 4 명으로 구성된 다국어 프로그래머입니다 소프트웨어 개발 분야에서 수년간의 경력을 쌓았습니다 관심 분야는 이동성과 인공 지능입니다

코드를 읽고, 코드를 작성하고, 코드에 대해 이야기합니다 그리고 나는 자바가 시작된 같은 날에 태어났습니다 얼마나 많은 사람들이 함수형 프로그래밍을 사용하기 시작 했습니까? 당신의 프로젝트에서? 좋아, 좋아이 세션에서 우리는 함수형 프로그래밍이 무엇인지 조사하고, Kotlin의 기능적 구성물 Arrow 소개, Arrow의 데이터 유형에 대해 자세히 설명합니다 유형 클래스,보다 기능적인 프로그래밍 개념 Arrow가 그 자체로 가져 오는, 그리고 샘플 Arrow 애플 리케이션

그래서 함수형 프로그래밍은 선언적 스타일을 도입합니다 당신이 무엇을해야할지 집중하는 프로그래밍의 하는 방법보다는 계산으로 평가를 처리합니다 수학 함수의 그래서 객체 지향 프로그래밍과는 달리, 프로그램에 국가가있는 곳 객체는 메소드를 통해 상태를 변경합니다

함수형 프로그래밍은 유지 보수 및 변경을 엄격하게 피할 수 있습니다 의 상태 따라서 함수형 프로그래밍의 핵심 개념은 순수한 함수입니다 따라서 순수한 함수 (normal function)처럼, 당신은 입력을 받아, 당신은 출력을 제공합니다 그러나 보편적 인 판매 포인트가 있습니다

순수 함수가 있음을 의미합니다 동일한 입력에 대해 항상 동일한 출력을 제공합니다 b = 1, b = 2, b = 10, 동일한 입력에 대해 동일한 출력을 얻을 수 있습니다 두 번째 요점은 중요한 점입니다 주문 함수는 적용된 매개 변수에만 초점을 맞 춥니 다

그것에 함수 밖에서는 작동하지 않습니다 여기 오른쪽에서 볼 수 있습니다 합계 함수는이 두 가지 이유로 순수한 함수입니다 그래서 언제든지, 내가 1을 동등하게한다면, b = 2이면 항상 출력을 얻습니다

일부 기능은 조작 요소에 초점을 맞추기 때문에 그것은 그것에 제공됩니다 그것은 인스턴스 변수 나 어떤 것이 작동하지 않습니다 함수 밖입니다 따라서 함수형 프로그래밍의 많은 장점이 있습니다 객체 지향 프로그래밍 그래서 우리는 응용 프로그램을 함수로 만듭니다

따라서 코드는보다 간결하고 모듈화됩니다 테스트가 더 쉬워집니다 그것은 예측 가능합니다 당신은 T가 1 인 것을 압니다 또한 a1, b2를 주면 3이됩니다

똑같습니다 – T에서 10을 얻습니다 안전 프로그래밍을 장려합니다 불변성과 순수성과 같은 구조를 도입함으로써 기능 그래서 함수형 프로그래밍은 언어 독립적입니다 그리고 함수를 다루는 언어 일류 시민으로서의 기능적 프로그래밍으로서의 소리 언어

예는 Scala, Haskell 및 Kotlin입니다 이러한 언어에서 함수는 다른 함수로 전달 될 수 있습니다 함수에서 반환 될 수 있습니다 변수에 할당 할 수 있습니다 그럼 Kotlin의 함수 구조를 살펴 보겠습니다

그것들은 변경 불가능한 객체를 의미하는 변경 불가능 성이며, 객체의 상태를 변경할 수 없습니다 그리고 Kotlin에서 val 키워드를 사용하여 불변성을 부여합니다 고차 함수 – 고차 함수 함수를 취하는 함수에 주어진 이름이다 매개 변수 또는 반환 함수로 람다 (Lambdas) – 또 다른 기능을 제공합니다

기능 그러나이 경우에 공급되는 기능은 이름이 없습니다 게으른 평가 – 객체 생성 처음 사용될 때까지 연기됩니다 테일 호출 재귀 – 그래서 모두들 여기서 재귀에 익숙해야합니까? 따라서 꼬리 호출은 메소드의 마지막 호출 동일한 서브 루틴에 호출됩니다 꼬리 호출 재귀, Kotlin의 꼬리 호출 최적화 재귀 호출로 마지막 호출이있는 경우입니다

확장 기능 – 어디에서 할 수 있습니까? 더 많은 메소드를 추가하여 클래스의 기능을 확장하십시오 Null 안전성 – nullable 유형을 나타낼 수있는 곳 유형 뒤에 물음표가 나타납니다 패턴 일치 – 호출 할 변형을 알아 내고, 패턴 또는 유형에 따라 다릅니다 그래서 코 틀린은 우리 모두가 알듯이, 바닥을 걸을 것입니다 자바에 있었다

그리고 그것들을 개선하려고합니다 그래서 우리 모두가 알 수 있습니다 객체 지향 프로그래밍 언어에서 자체는 객체 지향 프로그래밍 언어입니다 따라서 Kotlin은 기본적으로 객체 지향 프로그래밍의 융합입니다 기능 프로그래밍

순수한 함수형 프로그래밍 언어는 아닙니다 기능적 프로그래밍을 시행하지는 않지만, 형식화 된 함수형 프로그래밍을 지원하지 않습니다 그래서이 모든 것을 고치려면 Arrow가 들어갑니다 Arrow는 Kotlin의 표준 라이브러리에 기능적인 동반자입니다 그것은 2017 년에 소개되었습니다

최신 릴리스는 073입니다 가장 인기있는 두 가지 Kotlin 라이브러리의 융합입니다 Kategory 및 funcKTionale을 사용하면 자세한 정보를 얻을 수 있습니다

arrow-ktio에서의 Arrow에 대해 따라서 Arrow에는 세 가지 데이터 유형이 있습니다 더 많은 데이터 유형이 있습니다 하지만이 프레젠테이션에서는 세 가지 중요한 것에 초점을 맞춘다

Option, Either 및 Try입니다 그래서 그들 모두는 봉인 된 수업입니다 그리고 Option은 이름에서 알 수 있듯이, 선택적 값을 나타내는 데 사용됩니다 그래서 Option에 A 타입의 값이 있다면, 그것은 [INAUDIBLE] Some의 가치를 가질 것입니다 그래서 약간의 가치가 있다면 A가 될 것입니다

모든 값은 None이됩니다 그래서 Option은 Some 또는 None을 가질 수 있습니다 예에서 볼 수 있듯이, 우리가 someValue, Some과 문자열을 할당하려한다면, 그것을 인쇄합니다 그래서 우리는 산출물로서 어떤 가치를 얻습니다 따라서이 경우 someValue, 변수, Some 유형의 Option 값을 포함합니다

두 번째 예 – emptyValue 변수 없음 유형의 옵션 값을 포함합니다 그런 다음 옵션을위한 중요한 도구가 있습니다 어떤 유형의 경우, 어떤 작업을 수행하면, 당신은 결과를 얻을 것이다 없음 유형에서, 당신은 작업을 수행하려고 시도하지만, 당신은 결과적으로 항상 None을 얻을 것입니다 따라서이 예에서는 숫자를 볼 수 있습니다

Some 유형의 Option 유형입니다 숫자 없음은 유형 없음의 Option 유형입니다 따라서 옵션에 대한 작업을 수행하려고 할 때 type 일부는 결과를 얻는다 언제 Option 유형 None에서 작업을 수행하려고 시도하면, 당신은 결과를 None으로 얻습니다 두 번째는 출력을 없음으로 얻는 경우입니다

기본 설정을 지정하려는 경우가있을 수 있습니다 null 타입의 경우의 값 – 없음 유형 거기에서 getOrElse를 사용할 수 있습니다 그래서 당신에게 제공하는 옵션을 제공합니다 유연성을 기본 제공 None 유형의 경우 값

그래서 값은 None이고, getOrElse를 사용하면, 이를 기본값으로 지정합니다 그래서 당신이 그것을 출력 할 때, 당신은 디폴트 값을 얻습니다 None 값이기 때문입니다 그런 다음 Option의 사용 사례는 다음과 같을 수 있습니다 우리는 신청서에 양식이 있습니다

따라서 필수 항목은 주로 이메일, ID, 비밀번호, 사용자입니다 이름 이름은 Option이 될 수 있습니다 따라서 Option 데이터 유형을 사용하여 당신의 코드에서 그 이름 그런 다음, 우리 모두는 Kotlin의 when 절 스위치와 같습니다

그래서 절에는 기본값이 있습니다 따라서 기본적으로, 없음을 사용할 수 있습니다 그리고 나머지 경우에는 Some을 사용할 수 있습니다 이제 두 번째 데이터 유형 인 Isither로 넘어갑니다 그 이름에서 알 수 있듯이, 모두 이중 값 중 하나입니다

따라서 왼쪽은 예외 상황을 나타내는 데 사용됩니다 오른쪽은 [INAUDIBLE]을 나타내는 데 사용됩니다 따라서이 예제에서는 right라는 변수를 볼 수 있습니다 그리고 그것은 어느 쪽인가의 유형입니다

그래서 왼편에는 문자열이 있어야합니다 맞습니다 정수를 포함해야합니다 당신은 어느 쪽을 지정합니다 맞아요

그리고 당신이 그것을 인쇄하면, 당신은 권리를 얻습니다 그럼 두 번째 경우에 그래서 왼쪽, 예외를 나타 내기 때문에, 일부 유효성 검증 메시지를 넣을 수 있습니다 따라서 인쇄 할 때 왼쪽 부분이 인쇄됩니다 그래서 당신은 또한 어떤 디폴트 값을 넣으려고 시도 할 수 있습니다 마찬가지로, 권리가 있다면, 당신은 그냥 결과물을 낼 수 있습니다

왼쪽에 기본값을 넣을 수 있습니다 당신은 예외적 인 경우입니다 그냥 0을 출력 할 수 있습니다 따라서 이것이 가능한 예입니다 어느 쪽에서 값을 추출 할 때 사용합니다

Option과 마찬가지로, getOrElse를 Either와 함께 사용할 수 있습니다 게다가 그리고 여기에서도 왼쪽에 기본값을 제공 할 수 있습니다 그래서 여기서 다시 볼 수 있습니다, 우리는 getOrElse를 사용하여 기본값 0을 할당 알려진 부분이있는 왼쪽 부분으로 그래서 당신은 어느 쪽이 될 수 있는지 추측 할 것입니다 그 검증 자료를 표시합니다

우리 양식에는 이메일 양식이 있습니다 그래서 우리는 특정 형식이있을 것으로 기대합니다 그래서 포맷이 바르게 따른다면, 우리는 그것을 입력으로 받아 들일 수 있습니다 그렇지 않으면 유효성 검사 메시지를 표시 할 수 있습니다 어느 쪽이든의 도움으로 이제 시도해 보겠습니다

Try는 Try와 유사합니다 Java 나 C #에서 볼 수 있습니다 그래서 값이 존재하는지 확인해보십시오 존재하는 경우 성공 부분으로 이동합니다 실패하면 실패 부분으로 넘어갑니다

따라서 예제에서 볼 수있는 getQuizQuestions 실패 할 가능성이 있으며 예외가 발생합니다 그래서 그것은 Try 안에 포함되어 있습니다 그래서 Try 내부에 동봉되어 있기 때문에, 그것은 예외를 던질 수 있습니다 예외가 발생하면 출력을 실패로 볼 수 있습니다 그리고 예외 행 번호와 이름을 얻습니다

예외도 마찬가지입니다 Option 및 Either와 유사하므로 다음과 같이 할 수도 있습니다 Try 값을 추출하십시오 성공하면 b 부분을 찾습니다 그래서 우리는 실패한 b로서 성공합니다

따라서 실패한 경우 기본값을 출력 할 수 있습니다 이 경우 0입니다 그리고 성공 – b를 찾을 수 있습니다이 경우는 a입니다 승인

따라서 알려진 함수가 있습니다 Recover로 예외를 처리하는 데 사용됩니다 실패입니다 그래서 복구 – 다시, 예외가 걸립니다, 화면에 표시 할 값을 제공합니다 그 예외가 발생할 때 여기에서는 런타임 예외가 발생합니다

이렇게되면 값 0이 출력됩니다 그리고 이것은 Recover를 사용하여 수행 할 수 있습니다 그래서 try를위한 유스 케이스는 예외를 잡을 수있다 우리가 나누는 것처럼 그래서 우리는 항상 제수가 0이 아닙니다

따라서 Try 블록에서 나누기 코드를 묶을 수 있습니다 기기가 0이 아닌 경우 분할 결과를 출력합니다 값이 0이면 Try를 사용할 수 있습니다 오류 부분으로 리디렉션 할 수 있습니다 그래서 타입 클래스 – 타입 클래스는 Arrow의 중요한 특징입니다

그들은 행동을 나타냅니다 3 가지 타입 클래스가 있습니다 이 세션에서 초점을 맞추십시오 그것은 Functor, Monad 및 Applicative입니다 따라서 Functor는 래핑 된 값에 함수를 적용하는 데 사용됩니다

맵 기능 사용 그래서 여기에서 그들은 A에서 B까지의 기능을 가지고 있다는 것을 알 수 있습니다 우리는 감싸 진 값, F of A를가집니다 그리고 나서 우리는 감싸 진 값, B의 F를 얻습니다 그래서 F 포장 된 값을 변환하는 함수입니다

map은 동일한 컨텍스트 내에서 변환 된 값을 반환합니다 Functor는 어떻게 작동합니까? 펑 터는 함수와 펑터를 취하고, 새로운 펑터를 반환합니다 그래서 여기서 플러스 3이 함수라는 것을 알 수 있습니다 그러면 Functor가 생깁니다이 경우 Option

Some (2)입니다 그리고 새로운 펑터를 반환합니다 그래서 OptionSome (2)에서 연산을 수행하면 3, 그것은 우리에게 Some (5)를 줄 것이다 그래서 Some (5)는 새로운 functor입니다

맵 기능에 의해 제공됩니다 따라서 Functor에서 먼저 값은 컨텍스트에서 풀립니다 그런 다음 3을 더한 함수가 적용됩니다 결과 값은 같은 맥락에서 배치됩니다 그래서 이것은 일부 부분에서는 잘 작동합니다

이제 Option에 포함 된 None 부분이 있습니다 지금까지 함수 자체는 전혀 적용되지 않습니다 오른쪽에서 코드를 볼 수 있습니다 옵션 없음을 사용합니다 함수에 3을 더하고 싶습니다

그래서 함수는 적용되지 않습니다 결과 출력은 None입니다 그런 다음 Functor를 배열에 적용합니다 따라서 각 추가 된 값에 대해 함수가 적용되고, 우리는 새로운 가치 배열을 얻습니다 그런 다음 함수에 적용된 펑터 – 그래서 여기에서 우리는 functor 자체가 함수라는 것을 알 수 있습니다

먼저 주어진 값에서 우리는 함수를 적용합니다 즉 주어진 값은 10이므로 우리는 더하기 2를합니다 그것은 우리에게 12를줍니다 그런 다음 함수에 3을 더한 함수를 적용하여 15를 얻습니다 그런 다음 Functor는 Option, Either, Try 또는 모든 데이터 유형으로 작업하고, Functor의 인스턴스를 제공합니다

여기서 addOne을 볼 수 있습니다 Type 종류의 매개 변수를 취합니다 그래서 모든 클래스는 Option, Try, 여기에서 사용할 수있는 Functor 인스턴스를 제공하십시오 여기 구체적인 구현을 할 때 볼 수 있습니다 이걸 Option과 Try로 – 그래서 옵션 (1)의 경우, 플러스 1 기능을 수행합니다

그런 다음 Some (2)로 출력합니다 그런 다음 Try를 사용하여 동일한 작업을 수행 할 때 Try (1)을 사용하면 1 Success (2)를 제공합니다 마찬가지로, 사람들은 커스텀 펑터를 만들 수 있습니다 그러나 그들은 일정한 규칙을 따라야합니다 규칙은 구성 및 신원과 같습니다

그래서 당신은 명심해야합니다 당신의 펑터를 만드는 동안 그래서 Applicative– Applicative가 사용되었습니다 Apply를 사용하여 랩핑 된 값에 랩핑 된 함수를 적용합니다 여기에서 함수 a가 더하기 3과 같은 것을 볼 수 있습니다

또한 값에 싸여 있습니다 그리고 우리는 감싸 진 값 Some (2)를가집니다 따라서 래핑 된 함수를 값에 적용합니다 일부는 (2) Apply를 사용하고 결과는 Some (5)입니다 애플리케이터가 어떻게 작동하는지 – 우리는 문맥 안에 포장 된 함수를 가지고있다

우리는 맥락에서 가치가 있습니다 우리는 둘 다 unwrap하고 값에 함수를 적용합니다 그리고 우리는 맥락에서 새로운 가치를 부여합니다 그래서 응용 프로그램을 값 배열에 적용합니다 그래서 함수에 2와 3을 곱하면, 우리는 펑터처럼 적용 할 것입니다

각 배열 요소에 적용 해 보겠습니다 새로운 배열 요소 목록을 얻습니다 따라서 Applicative Builder로 알려진 개념이 있습니다 당신은 다른 Option 타입을 통해 그것을 묶어서 계산할 것이고, 일부 계산을 수행합니다 여기 예제에서 볼 수 있습니다

Employee라는 클래스가 있습니다이 클래스에는 세 가지 속성이 있습니다 ID, 이름 및 doj 그리고 우리는 Option 타입의 변수를 가지고 있습니다 다른 옵션 유형 – 하나는 UUID, 하나는 String, 하나는 Integer입니다

따라서 이러한 속성 값을 유지하는 데 사용됩니다 그래서 우리는지도에 Applicative와 Map을 사용합니다 모든 변수 값 [INAUDIBLE] Employee의 속성으로 Applicative Builder에 대한 USP는 다음과 같습니다 유형, 컴퓨팅 할 때의 정보를 보존한다는 것 다른 Option 유형을 넘어서 그리고 모든 값이 완료되면 콜백이 호출됩니다

값이 Some 일 때 발생합니다 값 중 하나가 없음이면 출력이 없음으로 표시됩니다 없음에서 작동하지 않습니다 따라서 모나드 – 모나드는 싸인 된 값을 적용합니다 flatMap을 사용하여 랩핑 된 값을 리턴하는 함수

여기서는 half라는 함수가 있습니다 따라서 반은 의견을 제시합니다 그리고 그 수가 짝수라면 그것의 절반을 돌려 줄 것입니다 그것이 4이면, Some (2)를 줄 것입니다 짝수가 아니면 None을 반환합니다

그래서 절반은 모나드를 반환하는 함수입니다 그리고 우리는 감싸 진 값인 Some (3)을가집니다 flatMap을 사용하여 반으로 적용합니다 따라서 3이 짝수가 아니기 때문에 반은 None을 반환합니다 4는 짝수이므로 절반은 랩된 값을 반환합니다

그 일부입니다 (2) 우리가 None 연산을 위해 똑같은 것을하려고 할 때, 그것은 아무 것도주지 못할 것이다 이미 말했듯이, 모든 작업은 일부와 작동합니다 없음으로는 작동하지 않습니다 Monad는 어떻게 작동합니까? Monad는 모나드와 모나드를 반환하는 함수를 취하고, 그리고 나서 모나드를 반환합니다

그래서 Some (3)은 모나드라는 것을 알 수 있습니다 함수 half는 함수이고, 모나드를 반환합니다 그리고 마지막 결과는 None입니다 그 자체는 모나드입니다 Monad Chaining도 가능합니다

여기서 볼 수 있습니다 절반은 3 번 호출됩니다 값은 Some (20)입니다 그래서 처음으로 반은 참여하게되고, 그것은 어떤 것을 줄 것이다 (10); 두 번째 시간, 일부 (5); 세번째, 없음 모나드 바인딩은 다음과 같은 프로세스입니다

다른 Option 유형을 결합하는 데 사용됩니다 따라서 Option 유형은 flatMap을 사용하여 결합 할 수도 있습니다 그러나 계산이 증가하고 복잡성이 커집니다 따라서이를 방지하기 위해 Monad 바인딩을 사용합니다 따라서 Monad 바인딩에서 bind 메소드는 내부적으로 flatMap을 호출합니다

그러나 성능 집약적 인 방식으로 수행합니다 그래서 우리는 세 가지 옵션을 결합한 것을 볼 수 있습니다 정수 값을 갖는 타입 그리고 결과로, 모나드 바인딩 후에, 또한 Option 유형입니다 그래서 Functor, Applicative, 및 Monad

Functor의 모든 참여자는 Applicative에서 가능합니다 그리고 Applicative의 모든 기여자들 Monad에서도 가능합니다 따라서 더 많은 기능 프로그래밍 개념이 있습니다 첫 번째는 기능 구성입니다 그 이름에서 알 수 있듯이 작곡 기존 함수에서 함수를 작성합니다

그래서 고정 기능으로 작성하십시오 고정 된 의미로, 함수 이름 두 이름 사이 그리고 그것은 그들이 왼쪽과 오른쪽 매개 변수라고 가정합니다 해당 함수에 적용됩니다 이렇게 구성된 함수는 오른쪽에서 가치를 얻습니다

왼쪽에 적용하고 계속합니다 그것이 최종 결과를 얻을 때까지 그래서 여기에서 당신은 볼 수 있습니다, 두 가지 기능이 있습니다 심지어 더 커졌습니다 그리고 그들에 대한 작품을 작곡합니다

따라서 Compose는 우선 짝수 기반 목록을 필터링합니다 둘째로, 그 결과를 더 큰 수조로 전달할 것입니다 그런 다음 greaterThanThousand를 기준으로 목록을 필터링합니다 배관 – 배관은 Compose의 반대입니다 왼쪽에서 시작하여 계속 적용합니다

오른쪽의 모든 것 그래서이 경우에는 이것이 동일한 예입니다 거기에 Compose가있었습니다 이 경우 먼저 목록을 평가합니다 더 많은 것을 위해

그리고 그 결과가 무엇이든간에 그 결과를 짝수에게 제공 할 것입니다 논리적 구성 요소 – 함수에서 작동합니다 부울 형식을 반환하고이를 부인합니다 그래서 여기에 모든 정수의 함수가 있음을 알 수 있습니다 0보다 큽니다

다시 말하면, 임대인 기능은 보완법을 기반으로합니다 이전 기능의 즉, 그것은 0보다 작은 모든 사람들을 찾을 것입니다 컴포넌트 함수는 보완 물을 찾는 데 사용됩니다 특정 기능의 그럼 우리는 목록을 가지고 있습니다 목록을 출력하면 1에서 5까지 모든 숫자를 더 많이 얻는다

남은 숫자는 그보다 훨씬 적습니다 암기는 순수 함수의 예비를 캐시하는 데 사용됩니다 우리 모두 알다시피 순수 함수 항상 동일한 입력에 대해 동일한 출력을 반환합니다 그래서 우리가 [INAUDIBLE] 함수를 캐시한다면 – 캐시 순수 함수 결과, 그것은 우리에게 도움이 될 것입니다 우리는 같은 계산을 여러 번 수행 할 필요가 없습니다

함수를 외우고 계산 결과를 저장합니다 그것에 적용된 매개 변수에 그렇다면 Arrow를 기존 Android와 어떻게 통합 할 수 있습니까? 스튜디오 프로젝트? 종속성을 추가해야합니다 이것은 의존성 목록입니다 GitHub 사이트에 나열됩니다

필요한 모든 클래스와 함수를 기반으로, 적절한 종속성을 가져와야합니다 이것은 간단한 계산기 앱입니다 두 개의 operants를 취하고, 더하기, 빼기, 곱하기, 나누기 그래서 데이터를 통합 할 수있는 유스 케이스였습니다 유형 개념

그래서 여기에 Add, Add operation, you 또한 모나드 바인딩을 결합 할 수 있습니다 유사한 유형의 옵션 여기서는 나누기 위해 Try 데이터 형식을 사용했습니다 왜냐하면 제수가 0 일 가능성이 있기 때문입니다 따라서 제수가 0이면 실패가 발생합니다

예외 이름 제수가 0이 아니면 Try는 Success 봇을 실행합니다 나는 값을 얻는다 비슷하게, 곱셈은 모두 1에서 2가 2라는 것을 압니다 3에서 1은 3입니다

따라서 Some (1)에 들어가는 것은 숫자 자체가됩니다 그래서 곱셈 – 나는 그 사건을 고려했습니다 더 많은 경우가 있습니다 마찬가지로, 값이 0이면 결과는 0이됩니다 따라서 모든 Arrow 개념을 통합 할 수 있습니다

우리가 보통하는 일에 그렇다면이 앱은 이메일을 입력하는 간단한 앱입니다 구독 버튼을 누르십시오 그래서 여기에 Option 유형을 사용했습니다 따라서 입력 된 이메일이 유효한 입력 인 경우, 변수에 저장합니다 유효한 입력이 아닌 경우 None 만 저장합니다

따라서이 경우, 추가 처리, 메일 링 목록에 이메일을 추가하는 것처럼 완료되지 않습니다 따라서 입력이없는 곳에서 볼 수 있습니다 이메일 입력은 None으로 저장합니다 입력이 제공되면 값은 Some 및 값으로 저장됩니다 그런 다음 Android 용 화살표를 사용할 때의 우수 사례 – 그래서 Arrow는 새로운 도서관이자 Kotlin입니다

우리 대부분에게 새로운 것입니다 그래서 우리는 Kotlin과 Arrow를 통합 할 수 있습니다 가능한 한 우리 프로젝트에서 부작용을 단일 지점으로 푸시하려고합니다 또한, 우리는 다른 데이터에 대해 매우 확신 할 필요가 있습니다 다른 개념, 즉 데이터 유형과 유형 수업

차이점이 있습니다 우리가 어떻게 할 수 있는지 확인해야합니다 Arrow의 주어진 개념을 사용하여 프로젝트를 모델링합니다 그래서 이미 진행중인 다양한 프로젝트가 있습니다 화살표를 사용하여 완료됩니다

Helios처럼 – Helios는 Kotlin의 Arrow 용 JSON 파서입니다 그것은 화살표를 사용합니다 그런 다음 기능 유효성 검사가 있습니다 Either 및 Try 데이터를 사용하여 양식 유효성 검사 수행 유형 따라서이 링크에서 다른 프로젝트를 확인할 수 있습니다

그래서 화살을 말릴 준비가 되셨습니까? 좋아, 잘됐다 이것이 바로 프레젠테이션의 끝입니다 모두 감사합니다 모든 검색어에 대해 내 Gmail ID에 연결할 수 있습니다 고맙습니다

Build the new, modular Android App Bundle (Google I/O ’18)

피에르 레 세네 : 안녕하세요 저는 Pierre이고 Google Play의 소프트웨어 엔지니어입니다

안토니 모리스 : 안녕하세요 저는 Google Play의 소프트웨어 엔지니어 인 Anthony입니다 IBRAHIM KARAHAN : 저는 Google의 파트너 개발자 옹호자 인 Ibo입니다 피에르 레 세네 : 음, 여러분 중 일부는 이전 세션에서 온 것일 수도 있습니다 Google Play에 대한 개요를 제공 한 원형 극장에서 동적 게재 및 새로운 게시 형식 안드로이드 앱 번들 (Android App Bundle)과 어떻게 이것은 애플 리케이션을 작게 만들 것입니다

이 세션에서는 기술 심층적 인 다이빙을 할 것입니다 이 새로운 출판 형식 우리는 그것이 무엇을 포함하는지, 그것을 어떻게 만드는지, 그것을 게시하는 방법뿐만 아니라 그것을 테스트 할 수있는 다른 방법을 제공합니다 Google Play의 생성 및 게재 방법에 대해서도 설명합니다 APK를 최종 사용자에게 제공합니다

이제 Android App 번들의 형식부터 시작해 보겠습니다 Android App Bundle은 zip 아카이브입니다 이미 익숙한 파일이 들어 있습니다 APK에서는 텍스트 파일, 리소스, 자산, 네이티브 라이브러리 앱 번들과 APK가 두 가지 목적을 지닌 두 가지 고유 한 형식입니다

앱 번들은 순전히 출판 형식입니다 그래서 그것은 장치에 직접 설치 될 수 없습니다 또한 일부 메타 데이터 파일 최종 APK에서 끝나지 않는 도구가 올바른 방식으로 APK를 구축하는 데 도움이됩니다 마지막으로 앱 번들의 형식이 APK보다 엄격합니다 우리는 도구가 완전히 묶음에있는 파일 이해하기 유효한 APK를 생성 할 수 있습니다

이제 하나의 앱 번들을 열고 내부 내용을 살펴 보겠습니다 그래서 그 묶음을 열면, 이것은 당신이 기대해야하는 것입니다 그래서 이것은 많은 사람들에게 익숙해 져야합니다 바퀴를 다시 발명하는 대신에, 우리는 APK의 일부 구조를 재사용하기로 결정했습니다 우리가 파일을 더 잘 설명하는 데 필요한 것을 수정해야합니다

그래서 우리는 그들을 자유롭게 통과 할 것입니다 시작하려면 앱 번들에 다중 모듈 지원, 전에 들었을 수도 있습니다 그리고 곧 모듈에 대해 더 자세히 알려 드리겠습니다 지금 당장은 최상위 디렉토리 앱 번들에는 모듈의 이름이 있습니다 모듈에는 항상 base라는 모듈이 있습니다

번들에 이것이 우리가 여기서 바라 보는 것입니다 Android 매니페스트가 계속 표시됩니다 새 프로젝트는 실제 XML 파일입니다 APK에서는 바이너리 형식을 볼 수 있습니다

앱 번들에서 프로토콜 버퍼로 컴파일됩니다 형식을 사용하면보다 쉽게 ​​변환 할 수 있습니다 APK와 달리 dex 파일은 dex라는 디렉토리 아래에 있습니다 Android 리소스, 애셋, 반면에 부정적인 도서관은, APK와 동일한 디렉토리 구조를 따르십시오 유일한 차이점은 XML 리소스입니다

이들은 또한 프로토콜 버퍼 포맷으로 컴파일되며, 바이너리 형식 대신 resourcespb 파일은 리소스 테이블입니다 이것은 파일 resourcesarac과 같습니다

APK에서 보았을 수도 있습니다 앱에있는 리소스를 설명합니다 및 타겟팅pb 확장자는 프로토콜 버퍼 형식입니다

다시 말하면, 이전에 도구를 변형하기가 더 쉬워졌습니다 APK에서 이진 형식으로 변환됩니다 assetspb 및 nativepb 파일 자산에 대한 자원 테이블과 동일합니다

및 네이티브 라이브러리 그래서 자산이나 네이티브 라이브러리가있는 경우에만 존재합니다 또한 파일의 대상 지정을 설명합니다 각각의 디렉토리에 있습니다 앞에서 언급 한 것처럼 리소스 테이블, 자산 테이블 및 기본 라이브러리 테이블 앱 파일 타겟팅에 대해 설명합니다

그래서 나는 그것이 의미하는 바를 설명하겠습니다 파일 타겟팅은 설명입니다 주어진 파일을 대상으로하는 장치 또는 사용자 유형 Google Play 동적 게재의 핵심 개념입니다 파일 타겟팅을 이해 한 이후 은 주어진 사용자에게 필요한 파일 만 제공 할 수 있음을 의미합니다 그리고 이것이 우리가 앱을 더 작게 만들 수있게 해줍니다

앱 번들은 APK에 존재하는 타겟팅을 다시 사용합니다 당신은 이미 이것에 익숙합니다 그래서 나는 빨리 가서 빨리 달릴 것입니다 리소스의 경우, 예를 들어, 리소스의 디렉토리 이름에 HDPI HDPI 장치를 대상으로 지정하거나 프랑스 사용자를 대상으로 fr을 추가하십시오 네이티브 라이브러리의 경우 동일합니다

디렉토리에 아키텍처를 추가합니다 여기서도 새로운 것은 없습니다 앱 번들도 같은 방식으로 작동합니다 이제 우리는 당신 중 일부를 위해, 애셋은 앱의 큰 부분을 차지합니다 따라서 앱 번들은 자산 타겟팅을 지원합니다

언어 타겟팅부터 시작합니다 곧 텍스처 압축 형식을 추가 할 예정입니다 및 그래픽 API 버전 따라서 우리는 관련 자산 만 사용자에게 제공 할 수 있습니다 앱과 게임의 크기를 줄이십시오

이것이 대상 자산 디렉토리를 만드는 방법입니다 해시 기호를 사용하는 동안 타겟팅하는 저작물 디렉토리를 식별하려면 다음에 정의하는 키가옵니다 우리가 목표로 삼고있는 차원들 – 예를 들어, lang은 언어를, tcf는 텍스처 압축 포맷을, 등등 그런 다음 키와 관련된 값이옵니다 음, 몇 가지 예를 살펴 보겠습니다

애셋이 포함 된 디렉토리의 예는 다음과 같습니다 프랑스어 사용자 이것은 자산 디렉토리의 또 다른 예이며, 여기서 텍스쳐 압축 포맷에 기초하여 타겟 화되고, etc1 형식을 지원하는 장치를 타겟팅합니다 이제 앱 번들 형식에 대해 더 많이 알고 있으므로 나는 Anthony에게 그것을 넘겨 줄 것이다 사용자에게 소규모 앱을 제공하는 데이 방법을 사용하는 방법을 알려줍니다 ANTHONY MORRIS : 고마워, 피에르

안녕, 모두들 피에르가 너에게 설명하고 있었어 우리가 어떻게 형식을 바꾸는 지 Play 스토어에 게시합니다 그리고 지금 나는 너에게 설명 할거야 사용자에게 제공하는 서비스의 형식을 어떻게 변경하는지, 어떻게 우리가 이것을 제공하는 데에만 사용하는지 각 사용자에게 필요한 것

이제 분할 된 APK부터 시작하겠습니다 그래서 Android Lollipop에서 Android에 기능을 추가했습니다 플랫폼으로 분할 APK라고합니다 Split APK를 사용하면 여러 APK를 장치에 설치할 수 있습니다 마치 하나의 앱에 속한 것처럼 행동합니다

이 분할 APK를 설치할 수 있습니다 다른 장치에서 다른 조합으로, 한 번에 하나씩 설치하거나 한 장씩 설치할 수 있습니다 이제 분할 된 APK는 일반 APK와 동일한 형식을 갖습니다 여기에는 Java 코드 색인 파일, 원시 코드, 자원, 및 자산 디렉토리 일단 APK가 분리되면, 단일 APK에있는 것처럼 액세스 할 수 있습니다

또한, 각 애플리케이션 패키지 이름과 버전이 같다 다른 모든 것들과 코드 장치에 설치되어 있어야합니다 동일한 키로 서명해야합니다 자 이제 Android App을 어떻게 사용할 수 있는지 살펴 보겠습니다 우리가 장치에 제공하는 분할 APK를 묶어서 생성하십시오

먼저 앱 번들을 살펴 보겠습니다 모든 장치에 공통되는 모든 것을 찾아야합니다 기본 APK에 넣습니다 그래서 여기에는 Android 매니페스트 파일이 포함됩니다 예를 들어, dex 파일 등이 있습니다

그런 다음 다른 APK를 생성합니다 각 화면 밀도에 대해 각 분할에는 모든 내구재가 포함됩니다 Android 프레임 워크에 의해 선택되었을 것입니다 그 밀도를 가진 장치에서 다른 APK를 생성 할 수도 있습니다

네이티브 라이브러리를 포함하는 각 네이티브 아키텍처 용 그 아키텍처의 그리고 우리는 다른 분할을 생성 할 수 있습니다 앱에서 지원하는 각 언어에 대해 각 언어의 문자열을 다른 APK에 저장합니다 자, 함께, 우리는 이러한 분할 구성을 호출합니다 분할 또는 구성 분할

이제 기기에 앱을 제공하려고 할 때, 우리는이 분할의 서브 세트를 제공하기 만하면됩니다 모든 기기에 모든 것을 제공하는 대신 그래서 삼성 갤럭시 J5가 있다고 해봅시다 기본 APK와 xhdpi 밀도를 설치합니다 split, ARM 아키텍처 분할 및 영어 왜냐하면 나는 영어 만 할 뿐이니까 하지만 그보다 조금 더 까다 롭습니다

Pierre는 프랑스어와 영어를 모두 구사하며, 그는 자신의 장치에서 두 가지 언어를 모두 지정합니다 설정 그래서 그의 장치에서 Pixel 2 XL과 올바른 밀도와 아키텍처 우리는 영어와 불어를 모두 제공합니다 자기 장치로 나눠 피에르가 브라질로 이주하여 포르투갈 인

그런 다음 포르투갈어를 장치에 추가 할 수 있습니다 이제 그가이 작업을 수행 할 때 Play 스토어 이를 인식하고 포르투갈어를 다운로드하려고 시도합니다 기기에서 스플릿을 사용하는 모든 앱에 대한 언어 분할 그리고 그 당시 장치가 온라인 상태가 아닌 경우, 그러면 우리는 그 언어를 다운로드 할 것입니다 다음 기회에 나눕니다

그리하여 이것이 config split이 작동하는 방법입니다 그러나 내가 처음에 언급했듯이, Lollipop 이상에서만 지원됩니다 이는 현재 사용자의 약 85 %를 차지하지만 대부분의 사용자는 여전히 L 장치를 대상으로합니다 이러한 기기의 경우 앱 번들 여전히 크기 절약을 달성 할 수 있습니다 특정 밀도를 포함하는 독립 실행 형 APK 생성 및 아키텍처

그래서 우리가 L 플러스에서 할 것처럼 분할을 생성하는 대신, 우리는 독립형 APK 매트릭스를 생성 할 것입니다 우리는 이것을 언어로 확장하는 것을 간략히 고려했다 쪼개지도 그러나 우리는 합계의 약간을했다 손에 조금 닿았습니다

하지만 지금은 Pre L 기기의 경우 각 독립 실행 형 APK에 모든 언어를 포함합니다 이제 앱을 제공하려고 할 때 장치에 가장 적합한 단일 APK를 선택하십시오 Galaxy Nexus라는 첫 번째 Android 기기가 있다면 우리는 hdpi 팔 독립형 APK를 제공 할 것입니다 이것을 인식 할 수 있습니다 당신이 한 일과 비슷하다

과거에는 멀티 APK로 하지만이 모든 것을 하나로합시다 이 그림은 이렇게 보입니다 실제로는 방법에 대한 세부 사항을 실제로 걱정하지 않아도됩니다 이 모든 분할 APK가 생성됩니다 또는 독립 실행 형 APK가 생성됩니다

하나의 앱 번들 만 업로드하면됩니다 Play는 오른쪽 분할을 생성하고 각 장치에 적합한 역할을합니다 그리고 우리가 지금까지 토론 한 차원들 시작일뿐입니다 Pierre는 앱 번들을 사용하여 애셋을 타겟팅하는 방법에 대해 설명했습니다 그래픽 API를 사용하면 곧 설정 분할을 생성합니다 그걸 바탕으로 우리는 또한 설정 생성을 시작합니다

새로운 플랫폼 기능을 활용하기 위해 분할합니다 그리고 우리는 압축되지 않은 네이티브 라이브러리 m-class 장치에서 이제 이보에게 가져 가라고 부탁합니다 이 앱을 사용하여 앱 크기를 얼마나 줄일 수 있는지 살펴 봅니다 묶음

이브라힘 카라간 : 고마워요, 안소니 이제 Play에서 APK를 기기로 분할하는 방법을 알았습니다 우리는 앱 번들로 크기 절약에 대해 이야기 할 것입니다 평균적으로 앱 번들로 게시 된 앱 20 % 더 작아지고 매회 20 % 절약됩니다 응용 프로그램이 다운로드되거나 업그레이드됩니다

이제 우리가이 숫자에 어떻게 도달했는지 살펴 보겠습니다 Play 스토어의 모든 애플리케이션을 분석했습니다 다운로드 횟수는 1 백만 회를 넘습니다 그리고 우리는 문자열에 대해 언어 분리를 사용하여 크기의 95 % 이상을 절약 할 수 있습니다 이미지의 경우 45 %입니다

또한 네이티브 라이브러리의 경우 크기의 20 %를 절약 할 수 있습니다 즉, 모든 앱이 앱 번들로 이동하는 경우, 우리는 하루에 약 10 페타 바이트의 데이터를 저장합니다 앱 다운로드 및 업데이트에서 가져옵니다 그것은 1000 만 기가 바이트, 또는 3 억 뮤직 비디오입니다 YouTube에서

그리고 그 위에 사용자는 추가 300 메가 바이트를 볼 수있었습니다 더 많은 사진, 더 많은 앱 또는 더 많은 음악을위한 디스크 공간 확보 자신의 장치에 이제 실제 크기 절약을 살펴 보겠습니다 이는 초기 액세스 프로그램 및 파트너 중 일부입니다 그래서 우리는 Twitter로 시작할 것입니다

Twitter – 이미 다중 APK로 게시 중입니다 전에 아키텍처가 분할되었습니다 그러나, 그들의 응용 프로그램은 번역되었습니다 많은 언어로, 그리고 그것은 여러 화면을 지원합니다 밀도 그들은 여전히 ​​출판비로 많은 비용을 절감합니다

앱 번들과 함께 크기가 20 % 증가합니다 또한 더 이상 다중 APK를 제공 할 필요가 없습니다 다음은 이전에 멀티 APK를 사용하지 않는 TextPlus입니다 앱 번들을 사용하면 앱 번들을 사용하여 모든 크기에서 26 %의 크기 절감 Jaumo의 앱은 원래 크기의 절반이며, 이것은 그들이 [무관심] 한 대형 도서관을 가지고 있기 때문입니다 또한 단일 APK에서 여러 아키텍처를 지원했습니다

이제 앱 번들을 만드는 방법을 살펴 보겠습니다 지금 저장을 시작할 수 있습니다 최신 안드로이드 스튜디오 32 카나리아 Android 앱 번들을 완벽하게 지원합니다 이제 우리는 빌드 할 새로운 옵션을 보게 될 것입니다

빌드 메뉴의 번들 [부적절한] 모든 앱 번들 할당은 쉽습니다 우리는 앱 모듈, 제품 맛을 선택하기 만합니다 빌드 유형 및 Android Studio 당신을위한 앱 번들을 만들고, 서명하고, 게시 할 준비가되었습니다 커맨드 라인을 선호하는 사람들을 위해 또는 자동화 된 빌드 시스템과 통합하려는 경우, 새로운 Gradle Android 플러그인은 새로운 작업 세트를 제공합니다

Android 앱 번들을 만들 수 있습니다 기억하십시오, 이것은 당신이 사용하는 것입니다 – 조립 작업 명령 줄에서 APK를 만듭니다 이제 앱 번들의 경우 번들 명령으로 전환하십시오 어셈블 링 태스크와 마찬가지로, 번들 태스크 또한 특정 향미료를 만들 수 있습니다 귀하의 응용 프로그램의

일단 번들 작업이 끝나면 출력 폴더에 앱 번들을 만들려고하는데, 맛과 빌드 유형이 선택되었습니다 빌드 된 아키텍트는 bundleiad입니다 번들 작업은 서명 구성과 호환됩니다 귀하의 build

gradle 파일 그리고 하나의 gradle 작업으로, 당신은 서명 된 앱 번들을 생성 할 수 있습니다 출판 준비 또한 앱 번들을 사용하면 Play가 자동으로 애플리케이션을 아키텍처, 화면 밀도, 및 언어 스플릿을 기본적으로 사용합니다 당신 구성을 할 필요가 없습니다

그러나 우리는 또한 개발자 스플릿을 완전히 제어 할 수 있습니다 어떤 이유로 든 분할을 사용하지 않으려는 경우 모든 차원에서 새로 도입 된 기능을 사용하여 번들 블록은 여기에 이제 Pierre는 앱을 게시하는 방법에 대해 이야기 할 것입니다 번들을 재생 콘솔에 추가합니다 PIERRE LECESNE : 감사합니다

좋아요, 그래서 당신은 앱 번들을 만들었습니다 이제 어떻게 게시 할 수 있는지 살펴 보겠습니다 Google Play Console에 있습니다 먼저 Google Play에서 앱 서명에 등록해야합니다 기억하는 사람들을 위해이 프로그램을 시작했습니다

작년에 Google I / O에서 등록 할 때 공개 키를 안전하게 전송합니다 Google Play에 그런 다음이 릴리스 키를 사용하여 Play에 서명합니다 사용자를 대신하여 생성 된 APK 사용자에게 보내기 전에 그러나 APK를 계속 업로드하는 경우 제작 탭 트랙에서 테스트 트랙에서 앱 번들을 테스트하고, Play는 업로드 된 APK를 사임하지 않습니다 그리고 우리는 당신이 자신감을 가질 수 있도록 이것을했습니다 먼저 작은 청중에게 앱 번들을 시험해보고, 현재 프로덕션 사용자에게 영향을주지 않습니다

등록한 후에는 릴리스를 관리하고, APK에서했던 것처럼 새 릴리스 만들기 – 앱 번들을 현재 같은 위치에 드롭합니다 APK를 삭제하고 업로드를 기다립니다 업로드되면 출시를 검토하고 출시를 해제 할 수 있습니다 그게 전부 야 그리고 나는 충분히 강조 할 수 없다

더 이상 멀티 APK를 처리 할 필요가 없습니다 Play Console이 백그라운드에서 생성했습니다 지원되는 모든 APK를 제공합니다 이제 앱 번들을 업로드했습니다 그리고 플레이는 너를 위해 모든 힘든 일을 해냈다

큰 그러나 개요를 가질 수 있으면 좋지 않을까요? Play에서 무엇을 생성 했습니까? 이제 Play Console에서 새로운 도구를 만들었습니다 번들 탐색기라고합니다 번들 탐색기를 사용하면 업로드 된 번들을 탐색 할 수 있습니다 보세요

첫 번째 화면에서 오른쪽 상단 모서리에 번들 게시로 얻을 수있는 크기 절감 효과 이제 앱의 1/4 이상을 저장했습니다 물론 이것은 장치마다 다릅니다 그래서 우리는 널리 사용되는 장치 구성을 사용하여 이것을 계산했습니다 또한 장치 구성 목록 아래에 있습니다

및 해당 장치에 대한 APK 서비스의 전체 크기입니다 몇 가지 기기를 클릭하고 어느 기기를 볼 수 있습니까? 기기는 각 버켓에 있습니다 지원되는 모든 장치를 이름으로 검색 할 수도 있습니다 생성 된 APK 집합을 다운로드하려면 특정 장치에 게재되었습니다 이것은 매우 도움이 될 것입니다

그 특정 장치에 대한 버그 보고서를 얻고, 그리고 사용자가 얻은 것을 정확히 얻고 싶습니다 APK가 제공되는 서비스 따라서 이름을 검색하고 다운로드를 클릭 한 다음, Play에서 제공 한 APK 세트를 받게됩니다 물론, 우리는 여러분 모두를 잊지 않았습니다 누가 우리의 출판 API를 사용하는지 앱 번들 업로드는 오늘 API를 사용하여 가능합니다

모든 문서를 찾을 수 있습니다 developersgooglecom/android 게시자 그리고 이제 앤서니에게 넘기십시오 ANTHONY MORRIS : 고마워, 피에르

이제 우리는 빌드하고 게시하는 방법을 배웠습니다 Android 앱 번들 그러나 우리가 배포판을 완성하기 전에, 우리는 여전히 테스트의 라운드를하고 싶습니다 그러나 앱 번들 자체는 설치할 수 없습니다 그럼 어떻게 테스트합니까? 첫째, 개발 과정에서 앱에서 빌드 된 APK를 설치할 수 있습니다

Android Studio에서 직접 다운로드 할 수 있습니다 따라서 여기서 아무 것도 할 필요가 없습니다 그러나 품질 관리 팀의 경우 항상 그렇지는 않습니다 Android Studio에서 소스 코드에 액세스 할 수 있습니다 따라서 세 개발자의 이야기를 통해 이야기하겠습니다

앨리스, 밥, 클레어 QA로 앱 번들을 테스트하는 방법 항목 앨리스부터 시작합시다 Alice는 새로 출시 된 내부 테스트를 사용합니다 재생 콘솔에서 내부 트랙은 알파 베타 트랙과 유사하지만, 이미 익숙 할 수도 있습니다 그러나 지연이 거의 없다는 점이 다릅니다

번들 업로드와 업데이트 사이 테스터 장치에서 사용할 수 있습니다 품질 보증 테스트를위한 신속한 처리 Play Console (앨리스)을 거치며 품질 보증팀이 받게 될 신뢰감이 있습니다 자신의 장치에서 byte와 byte는 무엇과 같은가? 최종 사용자는 릴리스를 프로덕션으로 푸시하면 얻을 수 있습니다 앨리스가 어떻게 이것을 설정하는지 보도록하겠습니다

정말 간단합니다 그래서 Alice는 최대 100 명의 QA 테스터의 이메일리스트를 생성합니다 내부 테스트 트랙에 적합합니다 그녀의 QA 테스터가 업데이트 링크를 따릅니다 업로드 된 번들을 받게됩니다

내부 테스트 트랙으로 그게 전부 야 그러나 모든 사용자가 Play Console에 액세스 할 수있는 것은 아닙니다 귀하의 품질 보증주기 동안 피에르가 밥의 이야기를 들어 봅시다 피에르 레 세네 : 사실, 밥은 접근 할 수 없습니다

Play Console에 연결합니다 그는 자신의 컴퓨터에서 로컬로 테스트하는 것을 선호합니다 아무것도 업로드하기 전에,하지만 그는 여전히 사용자가 얻을 수있는 것을 테스트하려고합니다 어떻게 그 일을합니까? 음, 번들에서 APK를 생성하려면, Play는 Bundletool이라는 새로운 도구를 사용합니다 따라서 Bob이 로컬에서 빌드를 재생하려면, 그는 단순히 Bundletool을 다운로드하고 몇 가지 간단한 명령

Bundletool에는 Build APKs라는 명령이 있습니다 Android 앱 번들을 사용하여 우리가 APK 세트 아카이브라고 부르는 것 APK 세트에는 APK 모음이 들어 있습니다 장치에 설치할 준비가되었습니다 APK 설치라는 또 다른 명령 해당 APK 세트 아카이브를 가져 와서 APK를 추출하고, 해당 장치에 설치하십시오

실제 커맨드 라인 작업을 보도록하겠습니다 그래서 여기에 명령 [? 최근?] Bob에 의해 build-apks 호출, 앱 번들 전달, APK가 만들어지기를 원하는 위치를 말합니다 그리고 깃발 연결 장치를 통과시킴으로써, Bundletool은 현재 기기 전용 APK를 구축합니다 자신의 컴퓨터에 연결되어 있습니다 그리고 Bob이 APK를 생성하려고한다면, 말하자면 팀원이 아닌 다른 사람 손에 물리적 장치, 그것은 여전히 ​​수 있습니다

사양이 포함 된 파일을 제공하십시오 장치를 JSON 형식으로 그리고 당신은 여기서 그 파일의 압축을 볼 수 있습니다 이 장치가 지원하는 API에 대한 정보를 제공하며, 지원되는 언어, 화면 밀도 및 APK 버전 Bundletool도 이러한 장치 사양 파일을 생성합니다 따라서 온라인에서 장치 사양을 찾을 필요는 없습니다

또는 직접 작성하지 않아도됩니다 이 명령을 실행하면됩니다 이 파일을 생성하십시오 또한 Bob은이 APK를 설치하려고하기 때문에 장치에서 APK는 개인 키로 서명해야합니다 그래서 그는 경로를 키 스토어에 전달합니다

APK 세트에 포함 된 모든 APK 그러면 서명되어 Bob의 장치에 직접 설치할 수 있습니다 다음은 APK 설치 명령의 호출입니다 APK 세트에서 APK를 추출합니다 연결된 장치에 직접 설치합니다 쉬운

그래서 Bob과 그의 지역 테스트였습니다 이제 Ibo가 클레어의 이야기를 들려 줄 것입니다 이브라힘 카라한 : 클레어가 일하고있다 중간 규모 회사의 경우 그들의 응용 프로그램을 채우기 위해 지속적인 통합 도구를 설정하십시오 매일 QA 팀은 야간에 응용 프로그램 빌드, 여러 장치에 설치, 응용 프로그램이 올바르게 작동하는지 테스트합니다

클레어는 QA 팀을 돕고 싶어합니다 그녀는 Bundletool을 다시 사용합니다 CI에 APK 세트를 생성합니다 그녀는 다음과 같은 명령을 사용합니다 Bob은 이전에 사용했습니다

그러나 이번에는 장치 사양 플래그를 생략하고, APK 세트를 생성합니다 APK 세트에는 가능한 모든 기기의 APK입니다 이제 QA 팀이 CI에서 설정 한 APK 만 가져옵니다 그들은 장치를 연결하려고합니다 install-apks 명령을 실행하십시오

Bundletool이 장치 구성을 읽습니다 첨부 된 기기에서 APK 세트의이 구성과 일치하는 APK, 장치에 설치하십시오 Play와 동일한 선택입니다 특정 기기에 대해 APK를 게재 할 때 발생합니다 Bundletool이 할 수있는 한 가지 더 범용 플래그를 전달하여 범용 APK를 생성하는 것입니다

범용 APK는 파일을 포함하는 단일 APK입니다 모든 장치의 모든 파일 따라서 모든 장치에 설치할 수 있습니다 글쎄, 그건 정말 대변하지 않아 사용자가 언제 받게 될지 Play 스토어에서 애플리케이션을 설치합니다 그러나 이는 APK를 사용자에게 전달하는 편리한 방법입니다

사용자가 어떤 장치를 실행 중인지 모를 때 Bundletool은 Android App Bundle을 만드는 데 사용되는 도구이기도합니다 Gradle은 장면 뒤에서 그것을 사용합니다 우리는 다른 사람들과 함께 일할 것입니다 체인, 툴체인 제작, 빌드 툴 통합 Android 앱 번들을 만들 수 있습니다 귀하가 사용하고있는 툴체인의 그리고 마지막으로, 우리는 어떻게 Google이 제공 한 APK를 생성합니다

귀하의 사용자에게 Bundletool을 오픈 소싱하는 이유는 무엇입니까? 오늘 가서 githubcom/google/bundletool을 이용하십시오 실행 파일 또는 [? 빌드?]에서 그것 출처 이제 Pierre는 다른 방법에 대해 이야기 할 것입니다 응용 프로그램을 더 작게 만들 수 있습니다

PIERRE LECESNE : 감사합니다 Google Play 동적 전송을 사용하면 우리는 헤어지는 새로운 방법을 도입하고 있습니다 앱을 별도의 기능으로 통합하여 각 사용자마다 필요합니다 레시피 앱이 있다고 가정하고 초기 다운로드를 작게 유지하려고합니다 모든 사용자가 좋아하는 동안 레시피 검색, 작은 분량 만 선택 실제로 새로운 레시피를 추가 할 수 있습니다

그리고이 기능이 앱의 중요한 공간 당신이 할 수있는 일은 그 기능을 자체 모듈로 분해하는 것입니다 필요한 때에 만 봉사하십시오 여기서 사용자를 찾는 방법을 볼 수 있습니다 앱을 엽니 다

그래서 사용자가 레서피를 추가하기를 원할 때, 그는 바닥에 작은 플러스를 클릭한다 그리고 백그라운드에서 볼 수 있습니다 모듈이 다운로드되어 설치됩니다 몇 초 후에 모듈을 사용할 수 있습니다 앱의 어느 부분에서 별도의 기능으로 탈출 하시겠습니까? 사용자 중 일부만이 기능을 사용하는 경우, 좋은 후보가 될 수 있습니다

특히 해당 기능이 앱에서 상당한 공간을 차지하는 경우 마지막으로, 사용자가 몇 초 동안 기다릴 수 있는지 고려하십시오 기능을 사용하기 전에 생성 할 기능을 결정한 후에는 이것이 앱 번들에서와 같이 보일 것입니다 기본 디렉토리 이외에도, 이제 별도의 디렉토리가 있습니다 앱의 각 모듈에 대해 이 디렉토리의 형식은 정확하게 앞에서 다룬 기본 형식과 동일합니다 Play에서 재생할 APK입니다

각 모듈에 대해 분할 세트를 생성합니다 기능 분리 및 구성으로 구성 해당 모듈을 분할합니다 Anthony는 앞에서 언급했듯이 APKS가 분리되어 소개되었습니다 Android Lollipop을 사용하여 3L 기기를 지원하고, 거절 할 모듈을 표시 할 수 있습니다 Bundletool은 지정된 APK를 생성합니다

모듈이 함께 병합되었습니다 이제 동적 기능의 작동 방식에 대해 살펴 보았습니다 내가 너를 이보에게 넘겨 주자 너는 너를 보여 줄 것이다 그것들을 만드는 법

IBRAHIM KARAHAN : 고마워, 피에르 동적 모듈을 만들려면 필요한 작업 만 수행하면됩니다 안드로이드 스튜디오 32 카나리아 다운로드 동적 기능 마법사를 사용하십시오 파일 메뉴의 새 모듈을 클릭하고, 동적 모듈을 선택하십시오

모듈 이름을 입력하면 Android Studio가 실행됩니다 새로운 동적 모듈을 만들 것입니다 수동으로 동일한 작업을 수행 할 수도 있습니다 manifest 및 buildgradle 파일을 편집하십시오

새 모듈의 매니페스트부터 시작할 것입니다 첫 번째 단계는이 모듈을 선언하는 것입니다 앱의 새로운 APK로 설정합니다 이렇게하려면 split 속성을 추가합니다 매니페스트 태그에 이름을 지정합니다

이 예제에서는 vrviewer입니다 다음 단계는 모듈 태그를 추가하는 것입니다 모듈을 선언하려고하면 모듈에 제목을 붙이십시오 이 태그는 Play 스토어에서 모듈을 식별하는 데 사용됩니다 귀하의 응용 프로그램의

그런 다음이 모듈을 주문형 모듈로 선언합니다 onDemand 특성을 추가합니다 즉,이 모듈은 사용자의 기기로 전달됩니다 앱이 Play 스토어에 앱을 요청하면 설치시 전달하는 대신 물론, 주문형 모듈은 L plus 장치에서 지원됩니다 따라서 3L 장치에서이 모듈을 제공하기로 결정한 경우, 융합 태그를 추가 할 것입니다

포함하도록 Play 스토어에 지시 이 모듈은 설치시 기본 모듈 옆에 있으며, 3L 기기 또는 범용 APK로 전송할 때 이제 buildgradle 파일을 살펴보십시오 동적 모듈부터 시작하겠습니다 첫 번째로 지금은 새로운 플러그인을 사용하고 있습니다 com

androiddynamic-feature 두 번째로 기본 모듈을 추가합니다 이 모듈에 대한 종속성으로 기본 모듈에 포함 된 기능에 액세스 할 수 있습니다 베이스의 build

gradle 파일에 필요한 유일한 변경 사항 모듈은 동적 피처 목록을 추가하는 것입니다 모든 동적 모듈 이름을이 목록에 넣으십시오 이것은 gradle이 리소스를 저장하도록 지시하는 것입니다 동적 모듈에서 사용할 수있는 기본 모듈 이제 Anthony는 어떻게 이러한 모듈을 사용할 수 있는지 보여줄 것입니다 새로운 Play Core 라이브러리로 ANTHONY MORRIS : 고마워, 아이보

그럼 어떻게 가는지 살펴 보겠습니다 온 디맨드 모듈의 설치 요청시기 당신은 그들이 설치되기를 원한다 따라서 Play 스토어와 상호 작용하려면 분할 설치 API를 도입했습니다 Play Core Library라는 새로운 라이브러리의 일부로 이제 Play Core 라이브러리는 Java 클라이언트 라이브러리입니다 장치에서 IPC를 사용하기 위해 Play와 통신합니다

그런 다음 Play 스토어에서 통신합니다 이 주문형 모듈을 Play의 서버에서 다운로드하여 당신은 그들을 요청합니다 약간의 코드를 살펴 보겠습니다 API는 동일한 작업 프레임 워크를 사용하여 구성됩니다 Google Play에서 익숙 할 것입니다

서비스 API 및 FireBase API 분할의 설치는 호출 된 클래스에 의해 조정됩니다 splitInstallManager 모든 모델로 요청을 구성합니다 다운로드하고 싶은 파일 재생을 시작하기 위해 startInstall을 호출합니다

요청한 모듈에 필요한 분할을 다운로드하십시오 API를 사용하면 수신 할 수도 있습니다 다운로드 및 설치 프로세스 전반에 걸쳐 업데이트합니다 진행 상황을 표시하고 다운로드 할 때 사용할 수 있습니다 설치 진행 상황을 사용자에게 알려주고, 온 디맨드 기능을 다운로드하기를 기다리고 있습니다

피에르 비디오에서 이걸 봤어 모듈의 주소를 다운로드 할 때 나타났습니다 대규모 모듈의 경우 사용자 확인을 받아야합니다 분할 설치 API로 다운로드하기 전에 앱이 요청할 때마다이 작업을 수행해야합니다 10 메가 바이트 이상의 온 디맨드 모듈 다운로드받을 수 있습니다

그러나 대체 옵션이 있습니다 이러한 모듈을 설치하는 데 필요하지 않은 경우 즉각적인 사용을 위해 즉각적으로 사용할 수 있으며 이것을 지연이라고합니다 설치 API 이 간단한 한 줄을 사용하여 지연된 설치를 요청하는 경우 모듈의 사용자가 편리한 시간에 다운로드 할 수 있습니다 일반적으로 사용자가 장치를 사용하고 Wi-Fi에서 충전하는 방법에 대해 설명합니다

이 때문에 우리는 더 큰 모듈을 설치할 수 있습니다 API에 의해, 사용자 확인을 요구하지 않고, 최대 100 메가 바이트 따라서 이것은 매우 사용자 친화적 인 방법입니다 앱의 대형 주문형 모듈을 다운로드 할 수 있습니다 분할 설치 API를 사용하여 귀하의 주문형 모듈

따라서 현재 어떤 모듈이 설치되어 있는지 확인할 수 있습니다 그리고 사용자가 더 이상 해당 모듈을 필요로하지 않는 경우, 모듈 제거를 요청할 수 있습니다 사용자에게 귀중한 디스크 공간 확보 기기에서 앱의 공간을 줄일 수 있습니다 이제 주문형 모듈을 설치하고 설치할 때 N Plus 기기에서는 앱을 다시 시작할 필요가 없습니다 따라서 코드는 즉시 사용할 수 있습니다

설치 완료 후 새로운 자원 및 자산 컨텍스트 개체를 새로 고치면 사용할 수 있습니다 그러나 Android L / M에서는 스플릿을 설치합니다 앱을 다시 시작해야합니다 올바르게 설치하려고합니다 하지만이를 피하기 위해 분할 컴팩트 라이브러리, 에뮬레이트하는 L / M에 스플릿 설치 앱이 백그라운드에 들어갈 때까지 우리는 올바르게 설치할 수 있습니다

그래서이 분할 컴팩트 라이브러리 앱을 다시 시작하지 않아도된다는 의미입니다 이 모듈 안에있는 거의 모든 것들 앱에서 즉시 사용할 수 있습니다 이 분할 컴팩트 라이브러리를 설정할 수 있습니다 어떻게하면 될지와 매우 유사한 방식으로 앱에서 Multidex 라이브러리를 설정하는 것에 익숙해야합니다 마지막으로 앱 업데이트를 릴리스하면 Play는 기본 모듈과 이미 설치된 모든 주문형 모듈을 포함합니다

따라서 장치에있는 모듈의 버전 항상 동기화됩니다 항상 같은 버전입니다 파트너는 이것이 실제로는 이 모델에 대해서 좋아, 그럼이 모든 걸 감싸 줘 오늘부터 모든 개발자가 Android App Bundles를 만들 수 있습니다

안드로이드 스튜디오 32 카나리아 그리고 모든 사용자에게 Play에서이를 게시 할 수 있습니다 그래서 나는 여러분 모두가 이것을 시도하고 보도록 권합니다 전환하여 앱이 얼마나 작아 질 수 있는지 안드로이드 애플 리케이션 번들로

이제 모듈화를 시작할 예정입니다 개발자들에게 앞으로 몇 개월 동안 오늘부터 모듈화 된 앱을 만들 수 있습니다 Studio Canary에 게시하고 게시 할 수 있습니다 Play 콘솔의 내부 트랙과 알파 트랙으로 이동합니다 하지만 우리는 출판과 제작을 시작할 것입니다

앞으로 몇 개월 동안 베타 버전으로 추적합니다 관심이 있으시면 관심사를 등록 할 수 있습니다 제공되는 링크에서 모듈화합니다 그리고 그걸로와 주셔서 감사합니다 질문이 있으시면 나중에 잡으실 수 있습니다

나는 우리가 지금 시간이 있다고 생각하지 않는다 또는 Sandbox에서 며칠 동안 우리를 붙잡을 수 있습니다 C, 무대 뒤 그리고 고마워 훌륭한 입출력을 가져라

[음악 재생]

How I: Use WordPress APIs and Android Volley to build native apps

VEYSEL GUREN : 오늘 저는 당신에게 말할 것입니다 WordPress를 사용하여 기본 응용 프로그램을 만든 방법 REST API 및 Android Volley

Nefisyemektariflericom이 검색되었습니다 전문 모바일 기술 회사의 그들은 우리의 전문적이고 혁신적인 공장 여기서 도전은 그들이 고도로 사용자 정의 된 WordPress 패키지를 사용하여, 네이티브 앱을 만들려면 웹 서비스가 필요합니다 및 네트워킹 시스템 여기 도전은 Nefis Yemek Tarifleri 웹 사이트는 WordPress, 그것은 고도로 맞춤화되었습니다

따라서 WordPress에는 기본 웹 서비스가 없습니다 Android 앱용 시스템 그래서 우리는 WordPress REST API와 Android Volley를 사용했습니다 Android 앱을 만들기위한 사실, WordPress에는 기본 웹 서비스가 없습니다 REST API를위한 시스템 그래서 우리는 REST 서비스를 가능하게하기 위해 WordPress API를 활성화했습니다

실제로 REST API는 JSON으로 데이터를 제공하기 만하고, 우리는이 데이터를 얻고 객체로 해석합니다 이 플러그인은 사용하기 쉬운 REST API를 제공합니다 HTTP를 통해 사용할 수 있습니다 간단한 JSON 형식으로 사이트의 데이터를 수정하십시오 사용자, 게시물, 택 소노 미 등이 포함됩니다

데이터를 검색하거나 업데이트하는 것은 HTTP를 보내는 것처럼 간단합니다 의뢰 우리는 WP API를 웹 서비스 기술로 사용했습니다 웹 사이트에 요청을 보내고 JSON 형식의 응답 Android Volley는 HTTP 라이브러리입니다 이로 인해 네트워킹이 더 쉽고 빠릅니다

발리는 오픈 AOSP 저장소를 통해 사용할 수 있습니다 Volley는 자동 스케줄링 등의 이점을 제공합니다 네트워크 요청, 여러 개의 동시 네트워크 연결, 투명 디스크 및 메모리 응답 캐싱 및 지원 요청 우월성 우리는 네트워킹을 가능하게하기 위해 Volley를 사용했습니다 JSON으로 오는 웹 서비스 응답은 JSON을 사용하여 구문 분석됩니다

코딩 내에서 객체로 사용될 준비가됩니다 발리를 쉽게 삽입 할 수 있으며 고성능을 제공합니다 결론적으로, 우리는 백만 명이 사용합니다 매일 매일 많은 사람들이 무엇을 어떻게 점검하고 있는지 이 안드로이드 애플 리케이션에서 요리 [음악 재생]

How to build “Hello App inventor” : 앱 인벤터2 강좌 첫 애플리케이션 만들기 1

프로젝트를 만들어 보겠습니다 상단 메뉴에 있는 [Start new project]를 클릭합니다

프로젝트 이름을 넣어 주시고 OK 버튼눌러 주세요 프로젝트 목록이 보여줬다가 쉭~하고 사라집니다 Label과 Button 버튼 선택하여 옮겨 줍니다 Button 안에 들어 있는 글씨를 변경하도록 하겠습니다 버튼을 클릭하고 오른쪽 하단에 있는 Text 박스에 내용을 지우고 확인 버튼이라고 입력해줍니다 그러면 버튼의 글씨가 변경[확인버튼]이라고 변경됩니다 Label에는 텍스트를 모두 지워줍니다

오른쪽 상단에 있는 Blocks를 클릭해주세요 버튼을 클릭해 주세요 첫 번째 블럭을 이동시켜줍니다 Label1을 큻릭하여 해당 블록을 옮겨주세요 Built-in 에서 Text를 클릭하여 블록을 옮겨 줍니다 그리고 내용을 입력합니다 상단에 있는 Build를 클릭하여 App(provide QR code for apk)를 선택해 줍니다

빌드가 되면 QR 코드가 만들어 집니다 휴대폰으로 찍어서 스마트폰에 설치를 하면됩니다 QR코드를 읽는 어플을 이용하여 찍어 주세요

Google I/O 2013 – The New Android SDK Build System

XAVIER DUCROHET : 안녕하세요 내 이름은 Xavier Ducrohet입니다

저는 Android SDK 개발자 도구의 선두 주자입니다 그리고 저는 새 빌드의 주된 기여자입니다 SDK에 대한 시스템입니다 왜 새로운 빌드 시스템인가? 음, 현재 상황을 보면 우리는 다소 최종 스크립트를 가지고 있습니다 맞춤 설정할 수 있지만 공개 API는 없지만 SDK를 업데이트 할 때마다 중단 될 가능성이 있습니다

반면에 ADT 커스터머 빌더는 매우 엄격합니다 적어도 IDE에서는 작동합니다 그리고 나서 우리는 [부적절한] 그 자신의 건축자가 있습니다 조금 더 유연하지만 많은 시간을 단축하지는 않습니다 병합, 일부 문제

그래서 우리는 그것을 고치고 싶습니다 우리는 하나의 빌드 시스템을 만들고 싶었습니다 유연한 방식으로 모든 이유가있다 그리고 우리는 여러분이 지속적인 통합 서버에서 구축 또는 IDE 내에서 IDE에서 사용자 정의가 작동하지 않는다면, 작동하지 않습니다

그것은 당신의 워크 플로우를 해치워 의존성과 같은 몇 가지 기능을 추가하고 싶었습니다 관리, 테스트 배포 및 실행 기능뿐만 아니라 개발자가 요청한 Android 관련 기능 우리는 처음부터 시작하고 싶지 않았습니다 그래서 우리는 주변을 둘러 보았다

많은 빌드 시스템이 있습니다 그들은 플러그인 생태계, Jenkins, TeamCity, 우리는 그 모든 것을 활용하고 싶었습니다 그래서 둘러 보았고 우리는 Gradle에 정착했습니다 왜 Gradle 이죠? 음, 사용자로서, 그것은 매우 강력합니다 위대한 선언적 구문

그러나 당신은 당신의 필요에 맞게 사용자 정의 할 수 있으며, IDE 통합을위한 툴링 API 우리의 관점에서, 우리가 플러그인을 개발할 때, 우리는 새로운 도메인 관련 언어를 만들어서 빌드 시스템의 구성 Android와 매우 관련이 있습니다 Google은 귀하에게 훌륭한 API를 제공 할 수 있습니다 빌드 시스템을 확장하십시오 또한 IDE 통합을 사용자 정의하여 IDE 정말로 알지 못합니다

헤이, 일종의 빌드입니다 시스템이지만 실제로는 Android 빌드 시스템입니다 또한 Gradleware라는 회사에서 개발했습니다 디자인 된 오픈 소스 아파치이기 때문에 우리에게 좋습니다

그리고 우리는 함께 협력하여 시스템 Gradle 자체는 기능을 추가합니다 최상의 경험을 줄 수 있어야합니다 당신에게 개발자 그래서 저는 많은 사람들이 Gradle을 알지 못한다고 생각합니다 어쩌면 조금만 시도해 보셨을 것입니다

그래서 몇 가지 기본 사항부터 시작하여 간단한 프로젝트 따라서 매우 간단한 Java 프로젝트를 살펴보면 먼저 구성은 buildgradle이라는 파일에 있습니다 프로젝트 루트에서 찾을 수있는 buildxml 또는 pom

xml을 빌드하면 그것은 Ant 또는 Maven과 함께합니다 간단한 선을 사용하면 할 수있는 일은 기본을 구축하는 것입니다 코드를 생성하고 JAR 파일을 생성하고, 테스트 코드를 작성하고, 테스트를 실행하고 XML 파일을 출력하십시오 Jenkins 서버에 피드를 보내 일부 추세를 얻을 수 있습니다 대시 보드 및 로컬 HTML 보고서를 사용하여 동일한 결과 얻기 워크 스테이션에서 테스트를 실행할 때

동일한 Android 프로젝트는 좀 더 복잡합니다 하지만 그렇게 나쁘지는 않습니다 정말로 따라서 빌드 스크립트의 첫 번째 섹션은 플러그인이있는 곳의 Gradle 우리가 여기서 말하고있는 중이 야

여기에 유물이 있습니다 그냥 수업 경로에 올려 놓으십시오 Gradle 개발자가 미래, 그래서 조금 덜 장황하다 그래서 우리는 우리가했던 것처럼 플러그인을 적용합니다 Java 플러그인 용

그리고 세 번째 블록은 실제로 안드로이드 플러그인의 구성 여기에는 두 가지 속성이 있습니다 첫 번째로, compileSdkVersion은 무엇입니까? 당신은 projectproperties에서 target으로 사용할 것입니다 타겟, 타겟 SDK 버전이 있기 때문에 이름을 변경했습니다

거기에 약간의 혼란 그리고 나서 나중에 이야기 할 두 번째 속성입니다 그럼 그걸로 뭘 할 수 있니? APK를 만들 수 있습니다 테스트 APK를 구축 할 수 있습니다 이전에는 별도의 테스트 프로젝트를 사용 했었습니다

그것은 단지 유연하지 않습니다 우리는 그것을 찾아야한다 관계를 찾기가 너무 어렵습니다 두 프로젝트 사이 그래서 메인 프로젝트로 돌아 왔습니다

이 두 APK를 배포하고 모든 번호에서 테스트를 실행할 수 있습니다 연결된 장치의 그것들을 병행하여 실행할 것이고, 당신은 똑같은 두 가지를 얻을 것입니다 출력 – XML과 HTML 이미 Ant 스크립트보다 더 많은 작업을 수행합니다 당신이 알아 차렸 듯이, 나는 아무것도 구성하지 않았습니다

구성에 대한 규칙입니다 원본 폴더의 경우 규칙적인 규칙입니다 메인 코드를 가지고 있기 때문에 Java 프로젝트 및 테스트 코드 소스 및 소스 테스트에 있습니다 Android에서는 동일한 규칙을 다시 사용합니다

우리는 그것을 조금 확장합니다 더 많은 파일이 있습니다 그래서 소스 메인, 우리는 안드로이드 매니페스트, XML을 추가합니다 자원과 자산을 추가합니다 AID를 이동하고 스크립트 파일을 실행합니다

자신의 폴더 아래에 그런 다음 테스트 측에서 해당 계측기 테스트를 호출합니다 우리는 실제 실제 지역에 대한 테스트를 계속하고 싶었습니다 [? JUnit?] 테스트 우리는 거기에 명단이 없습니다 자동으로 생성됩니다

나중에 얘기하겠습니다 좋아, 너의 구조 야 자, 어떻게 그걸 달리는거야? 오, 기다려 그래서 낡은 프로젝트가 있다면 아마도 그 모든 것들로 돌아가서 당신의 것을 바꾸고 싶지는 않습니다 그냥 Gradle을 시험해보기위한 프로젝트입니다

그래서 이것은 현재 프로젝트를 구성하는 방법입니다 Gradle에게 내 구조라고 말해야 해 여기 아주 간단합니다 다시 말하지만 Android 블록에는 sourceSet이 있습니다 그리고 그것은 sourceSet의 컨테이너입니다

그리고 내부에서는 메인과 장비 테스트 따라서 우리 악기 테스트에서 우리가하는 일은 setRoot입니다 우리는 모든 것을 테스트 할 소스 / 악기 테스트 그래서 / Java, 테스트 / res 등등 주요 소스 세트에 대해 res

srcDirs 그리고 그것은 사실 대괄호로 [비 숙련 된] 것입니다 실제로 우리가 현재 지원할 수 있기 때문입니다 여러 res 폴더 그래서 원한다면 원천을 정리할 수 있습니다

그리고 나서 우리는 그것들을 병합하고, 중복을 탐지하고, 그리고 옳은 일을하십시오 좋아요, 그래서 Gradle을 실행하십시오 일단 Gradle을 설치하면 프로젝트로 이동합니다 루트, 그리고 당신은 단지 Gradle과 일부 작업 이름을 수행합니다 작업을 얻으려면 작업이라는 태스크가 있습니다

작업 목록 대시 대시를하면 모든 것을 얻을 수 있습니다 당신이 아마 신경 쓰지 않는 중간 작업 그리고 정말로 복잡한 프로젝트에서, 그것은 50이 될 것입니다 작업, 또는 그와 비슷한 것

당신은 그 모든 것을 신경 쓰지 않습니다 당신은 그들 중 4 명을 돌 봅니다 assemble은 프로젝트 결과물을 만듭니다 수표가 귀하의 모든 수표 및 테스트를 실행합니다 Build는 조립 및 테스트를 모두 수행합니다

이것은 제품을 만드는 것이입니다 그것은 그것을 구축하고 테스트하는 것입니다 그런 다음 깨끗하게 청소합니다 여기서 재미있는 점은 작업은 실제로 아무 것도하지 않습니다 저는 그것들을 앵커 작업이라고 부릅니다

플러그인은 갈 것이고 그 밑에 플러그를 꽂는 것과 같은 종류 일 것입니다 사용자가 조립한다고 말하면 다음과 같은 작업이 있습니다 너는 실제로 전화해야한다 예를 들어 자바 프로젝트는 다른 작업을하고 있습니다 JAR을 빌드하고 테스트를 실행하려면 테스트하십시오

즉, 다른 플러그인을 적용 할 때 [INAUDIBLE], FindBug 플러그인이 있습니다 그것의 일이 무엇인지 신경 써야합니다 방금 check를 호출하면 test, FindBugs main이 호출됩니다 및 FindBugs 테스트 따라서 매우 강력하고 확장 성이 뛰어납니다

무슨 일이 일어나고 있는지 알고 싶다 그래서 안드로이드에 대해서도 똑같은 일을합니다 우리는 모여서 수표를 가지고있다 connectedCheck 및 deviceCheck 그리고 이것이없는 이유는 장치, 장치로 테스트

나중에 얘기하겠습니다 차이점 중 하나는 실제로 조립할 것입니다 두 가지 버전 [INAUDIBLE] 릴리스의 디버그가 있습니다 앤트 릴리스와 디버그

여기를 제외하고 실제로 두 가지를 모두 빌드 할 수 있습니다 Ant가 실행되는 동안 병렬로 만들어야합니다 서로 무시하십시오 좋아, 그럼 사용자 정의에 대해 조금 이야기 해보자 그래서 우리는이 새로운 빌드 시스템을 구축하고 있습니다

가장 기본적인 맞춤 설정은 일부 속성을 재정의하려고합니다 예를 들어 여기에는 defaultConfig 객체가 있습니다 헤이라고하는 안드로이드 개체, 나는 버전을 할거야 코드 및 minSdkVersion 등이 있습니다 따라서 빌드 할 때 해당 값이 당신의 매니 페스트와 그 위대한입니다

당신은 아마도 궁금해 할 것입니다, 음, 왜 제가 그 일을하고 싶습니까? 실제로 그 값들을 내 매니페스트에 넣을 수 있습니까? 자, 당신이 야간에 건축을하고 싶다고 상상해보십시오 점진적으로 버전 코드를 늘리고 싶습니다 그래서 들어가는 스크립트를 만들 수 있습니다 어떻게 든 해킹 할 수 있습니다 주위에 당신의 매니 페스트, 그리고 뭔가, 그리고 아마 아주 좋은하지

여기 Gradle을 사용하면 우리가 뭔가를 할 수 있습니다 그 버전 코드를 얻을 수있는 새로운 함수를 만든다 Jenkins에서 예를 들어, 시스템 속성 또는 [알아들을 수 없는] 그런 다음 버전 코드에 삽입하면됩니다 그리고 그것은 항상 작용할 것입니다

함수가 실제로 -1을 반환하면 기본값은 바탕 화면에서 실행 중일 때입니다 값은 삽입되지 않습니다 따라서 사용자 정의 로직을 수행 할 수 있지만 여전히 매우 유용합니다 선언적 나는 단지 1 분 전에 언급했다

빌드 된 디버그 및 릴리스 그리고 많은 개발자들이 우리에게 다음과 같은 것을 요청했습니다 ProGaurd를 디버그로 실행하고 싶습니다 제발 할 수 있을까요? 그리고 그것이 같았 기 전에, 우리는 그것을 다시 할 수 없습니다 그래서 우리는 그것을 보았고 우리는 우리가 할 것이라고 말했습니다 정말 유연한 무언가

그래서 우리는 빌드 유형의 개념을 도입했습니다 빌드 유형은 애플리케이션을 패키지하는 방법과 어떤 옵션은 디버그 가능하고, 어떻게 서명되며, ProGaurd를 실행합니까? 그리고 내장 디버그 및 내장 릴리스부터 시작합니다 하나,하지만 새로운 것을 만들 수 있습니다 여기에 DSL이 있습니다 Android 객체 내부에는 매우 유형 객체를 빌드하십시오

그것은 또한 컨테이너입니다 우린 그걸 봤어 우리는 세트를 보았다 우리는 그것을 다시 사용할 것입니다 우리가 가지고있는 전형적인 패턴입니다

그리고 그 안에 우리는 디버그 속성을 구성합니다 그리고 우리는 디버그 빌드 유형의 일부 속성을 설정합니다 그리고 우리는 몇 가지 속성을 설정했습니다 그리고 그 중 하나는 패키지 이름 접미사입니다 따라서 디버그로 빌드 할 때마다 패키지가 무엇이든간에 귀하의 응용 프로그램의 이름입니다,에서 디버그를 추가합니다 패키지의 끝 부분을 사용하여 나란히 공부할 수 있습니다

귀하의 릴리스 응용 프로그램 그리고 접미사 이름은 접미사 확장을 위해서만 사용됩니다 그것은 많은 개발자들이 우리에게 요청한 것입니다 그런 다음 Play Console에서이 새로운 기능을 사용할 수 있습니다 베타 버전을 가질 수 있습니다

그리고 실제로 특정 베타 버전을 구축하려고합니다 그 테스터들에게 따라서 새로운 베타 테스트를 만들 수 있습니다 여기에서는 몇 가지 속성을 추가하고 있습니다 그리고 그것은 훌륭합니다

그러나 그것은 충분하지 않습니다 베타 버전을 맞춤 설정해야합니다 따라서 각 빌드 유형에 대해 사용자 지정 원본 폴더 예를 들어 베타 버전에서는 베타 테스트이므로 사용자의 통계에 대한 통계를 수집하려고합니다 귀하의 신청서를 사용하고 있습니다

그러면 어떻게해야합니까? 음, 소스 / 베타 / 자바에서, 당신은 단지 몇 가지 코드를 넣어 이 코드는 베타 버전과 함께 제공됩니다 베타 버전 만 빌드 할 때마다 릴리스 및 디버그 버전이 아닙니다 보낼 수 있으려면 인터넷 권한이 필요합니다 그 데이터

어쩌면 일반 응용 프로그램에 인터넷 허가 따라서 매니페스트에서 수동으로 가져 오는 대신 시간과 그것을 제거하는 것을 잊어 버리는 것은 위대하지 않다 베타, 안드로이드 매니페스트에 넣으십시오 빌드 할 때 메인 매니페스트에 병합됩니다 베타 버전

그리고 당신이 가진 것들과 같은 것들에 대해서도 그것을 사용할 수 있습니다 MapView API 키 및 출시시 다른 API 키가 필요함 디버깅은 구성에 서명하는 것과 관련되어 있기 때문에, 글쎄, 당신은 단지 그 폴더의 res 폴더에 넣을 수 있습니다 다른 빌드 유형 그리고 물론, 당신은 할 수 있어야합니다 베타 버전을 빌드하십시오

그래서 어셈블 및 디버그 어셈블 링은 다음과 같습니다 에서 오는 추가 할 때마다 자동으로 생성됩니다 새로운 빌드 유형 따라서 실제로 세 가지 버전을 모두 동일하게 사용할 수 있습니다

시간을 갖고 그들을 구축하십시오 괜찮아 그래서 서명은 빌드 유형의 일부라고 말했어 구성 그래서 우리는 여기서 일을 매우 유연하게 만들고 싶었습니다

서명 구성 컨테이너가 있습니다 서명 설정은 KeyStore의 위치에 있으며, 암호, 알다시피, 열쇠의 이름 디버그라는 기본 버전이 있습니다 여기 간단한 예제에서 우리가하는 일은 우리가하는 것입니다 Gradle에게 디버그 서명 구성하기 구성 및 루트에있는 KeyStore 사용 그렇게해서 내 프로젝트, 팀원 모두 또는 빌드 서버는 항상 다음과 같이 빌드됩니다

같은 디버그 KeyStore 그리고 귀하의 품질 관리가 시도 할 때 문제가되지 않습니다 다른 빌드에서 오는 것을 설치하십시오 그게 당신이해야 할 전부입니다 디버그 빌드 유형은 다음으로 자동 구성됩니다 특정 서명 구성을 사용하십시오

조금 더 복잡한 예제를 보도록하겠습니다 애플리케이션의 출시 버전이 있다고 가정 해 보겠습니다 어쩌면 당신이 가지고 있기 때문에 당신의 디버그와 다릅니다 그것을 말해주는 일부 속성, 이봐, 내 일부 테스트 서버 대신 프로덕션 서버 ProGuard를 사용하고 있습니다

나는 모호하고 많은 일을하고 있습니다 그리고 그 버전을 테스트하고 싶습니다 디버깅하고 싶습니다 어떻게해야합니까? 글쎄, 당신이 할 것이고, 당신은 새로운 빌드 타입을 만들 것이고, 예를 들어, 디버그 릴리스라고 부릅니다 InitWith는 릴리스 빌드 유형으로 초기화합니다

따라서 릴리스 빌드를 변경하고 갈 때마다 유형의 경우 디버그 릴리스로 복사됩니다 그리고 우리는 뭔가를 사용자 정의합니다 그래서 우리는 디버깅이 가능하다고 말합니다 패키지 이름에 접미어를 추가하여 설정할 수 있는지 확인합니다 그것은 귀하의 릴리스 버전과 병렬로

그런 다음 디버그 서명 구성을 지정하여 그것을 구축 할 수 있습니다 그런 다음 sourceSet을 변경하여 source / release, 당신이 거기에 넣는 것과 마찬가지로, 디버그 릴리스를 빌드하십시오 그리고이 몇 줄을 사용하면 갑자기 새로운 정확하고 항상 응용 프로그램의 버전 정확히 귀하의 릴리즈와 동일하지만, 그것을 디버깅 할 수 있습니다 ProGuard 사용자 정의가 필요하다면, 또한 해당 버전의 경우 일부 규칙을 사용하지 않거나 사용 설정하거나, 너 그렇게 할 수있어 하지만 기본적으로 모든 규칙을 선택합니다

버전이 사용합니다 나는 그 예에 대해서 정말로 좋아한다 선언적이라고 보여주지 않습니다 하지만 init은 여기에 원시 타입을받지 못한다 실제로 buildtypes

release를받습니다 실제로는 유형 빌드 유형의 객체입니다 따라서 빌드 유형 내부에서 매번 컨테이너, 릴리스 사용 또는 디버그 또는 베타, if 그 특정 객체가 존재하지 않으면, 우리는 빌드 유형 인스턴스 그리고 우리는 그것을 용기에 담았습니다 그래서 여기서 정말로하고있는 것은 단지 나중에 읽을 속성 모음과 그 파일을 파싱하고 무언가를 만드는 무언가

모든 라인은 실제로 실제 모델을 조작합니다 그리고 그것은 매우 중요하고 매우 강력합니다 즉, 릴리스, 베타, 디버그, 디버그 릴리스 그것은 그들 중 많은 것입니다 그리고 아마도 패키지의 접미사를 넣고 싶지 않을 것입니다

그들 모두에 수동으로 이름을 붙이십시오 프로그래밍 방식으로 할 수 있다면 어떨까요? 글쎄, 그냥 그렇게해라 모든 빌드를 구성한 Android 블록 이후 유형을 만들고, 그냥 빌드 유형을 반복하고 자동으로 패키지 이름 정말 흥미로운 점은 기본적으로 그 모델을 구축하십시오 그리고 구성 된 모델은 다음 중 IDE로 전송됩니다

프로젝트를보고 할 때 IDE 통합 따라서 패키지 이름 접미사를 설정하는지 여부 수동으로 또는 일부 논리, 루프 또는 어쩌면 당신은 말합니다, 이봐 요, 우리는 단지 월요일에 그것들을 추가하고 싶습니다, 당신이하고있는 일이 무엇이든간에 그것은 단지 일할 것입니다 IDE는 현재 진행중인 작업을 인식합니다 최종 구성된 모델을 얻습니다 그리고 그것은 매우 강력합니다

그렇게하면 IDE에서 모든 것을 알 수있게됩니다 해당 모델을 기반으로하는 프로젝트 그러나, 당신이 사용하는 논리가 무엇이든간에 실제로 구성하십시오 좋아, 의존성을 살펴 보자 그것은 많은 개발자들이 요구 한 것입니다

그래서 Gradle은 기본적으로이를 지원하므로 그로부터 이익을 얻으십시오 따라서 의존성에 대한 네 가지 범위가 있습니다 컴파일, 런타임, 그것은 당신의 주요 소스 코드를위한 것입니다 그리고 런타임은 항상 컴파일을 확장합니다 컴파일 할 때 의존성이 있다면 런타임 자동으로 가져옵니다

그리고 테스트에도 똑같습니다 지금까지 안드로이드는 약간 다릅니다 런타임이 패키지로 바뀌 었습니다 정말로 우리가하는 일 APK에 모든 의존성을 패키징합니다

그런 다음 기기 테스트를 테스트하여 항상 계측 테스트 그럼 베타 버전으로 돌아가 죠? 우리는 통계를 사용자에게 보내려고합니다 몇 가지 라이브러리를 사용하여 도움을 원한다고 가정 해 봅시다 음, 컴파일시에 추가하면, 릴리스에는 해당 라이브러리도 있습니다 그리고 당신은 그렇게하고 싶지 않습니다

그래서 우리는 당신의 빌드 타입을위한 스코프를 가지고 있습니다 그래서 여기에서는 빌드 유형 컴파일 범위에서만 말하자면, 저는 [INAUDIBLE]을 사용합니다 또는 그런 것 그리고 그 빌드 유형에만 해당됩니다 그래서 당신이 Gradle에 의존하는 방법입니다

종속성 개체가 있습니다 컴파일은 범위입니다 그런 다음 당신이 가지고있는 의존성이 무엇이든간에 그것을 제공하십시오 여기서 우리는 오래된 프로젝트를 가지고 있고 내 libs 프로젝트에서 JAR 파일링, 그건 당신이하는 일입니다 [알아들을 수 없는] lib에있는 모든 JAR 파일 현재 프로젝트를 마이그레이션하는 데 매우 유용합니다

따라서 원격 종속성을 사용하려는 경우, 이것이 당신이하는 일입니다 먼저, 사용할 저장소를 지정하십시오 그래서 여기에 우리는 mavenCentral을 말합니다 그러나 만약 당신이 말할 수 있습니다 사용자 정의 내부 이슈 저장소, 거기에 URL을 넣을 수 있습니다

메이븐 (Maven)이든 아이비 (Ivy)이든 관계없이 지원합니다 문제가 아니다 그런 다음 의존성 블록에서 계측기 테스트 컴파일하면 이슈 주소를 알 수 있습니다 그리고 여기 우리는 광장에서 페스트 안드로이드를 사용합니다 좋은 주장과 테스트 결과를 얻을 수 있습니다

그런 다음 베타 컴파일이 로컬 JAR을 사용하는 방법에 주목하십시오 따라서 종속성 관리를 사용하고 싶지 않습니다 Maven 또는 로컬 JAR 파일을 사용하면 네가 가진 것에 따라 Gradle은 매우 유연합니다 네가 원하는대로 쓸거야

그래서 다른 사람의 코드를 사용하는 것입니다 자신 만의 코드를 사용하려면 약간 다릅니다 첫째, 다중 프로젝트 설정이 필요합니다 우리가 전에는 갖지 못한 것이 었습니다 Eclipse는 실제로이를 지원하지 않으며 [INAUDIBLE] 당연하지

그래서 여기에, 우리가 가진 것은, 우리는 세 가지가 있습니다 다른 패키지 모듈 app, lib1, lib2가 있습니다 그들은 모두 자신 만의 buildgradle을 가진 자신의 프로젝트입니다

그리고 settingsgradle이 있습니다, 여기에 모든 것이 있습니다 다른 모듈 그리고 의존성에 대해서, 당신은 단지, 이봐, 나는 프로젝트와 프로젝트 경로를 포함하십시오 그래서 매우 유사하고 매우 쉽습니다

따라서 도서관 1은 도서관 프로젝트가 될 수 있습니다 그리고 나서 lib2는 JAR 파일과 같을 수 있습니다 그리고 lib1이 lib2에 의존한다면 물론, 앱은 transitively 당신의 의존성 그래서 lib1이 라이브러리 프로젝트라면, 이것은 여러분이 도서관 프로젝트를 선포하십시오 일반 프로젝트와 정확히 동일합니다

그것은 같은 플러그인입니다 하나의 플러그인 만 있으면됩니다 그것은 오직 하나의 메이븐 인공물을 가지고 있습니다 내부에는 두 개의 플러그인이 있습니다 그리고 플러그인 이름은 다르지만 정확하게는 일반 프로젝트와 동일합니다

DSL은 약간 다릅니다 제한 그러나 나는 그것에 대해 자세하게 설명하지 않을 것입니다 그렇다면 도서관 프로젝트는 무엇을합니까? 현재 그들이하는 것과 매우 유사합니다 우리에게는 새로운 것들이 있습니다

첫 번째로, 마침내 우리는 바이너리를가집니다 그들 포장 그래서 우리는 모든 것을 AAR 형식으로 포장합니다 단지 Zip 파일 일뿐입니다 번들입니다

그리고 그것을 저장소에 업로드 할 수 있습니다 [박수 갈채] XAVIER DUCROHET : 오랜 시간이 다가왔다 우리가 지원하는 다른 것, 우리는 자산에 대한 지원을했습니다 라이브러리에 자산 만 넣으면됩니다 응용 프로그램에 병합됩니다

ProGuard 규칙이 있습니다 예를 들어, 라이브러리에 특정 난독 화해서는 안되는 클래스 ProGuard 특정 파일을 유지하라는 파일 그리고 해당 라이브러리를 사용하는 응용 프로그램이 실행될 때마다 ProGuard는 또한 ProGuard 규칙을 활성화하여 예를 들어 클래스가 난독 화되지 않습니다 우리는 아직 린트 (Lint) 통합이 없지만 추가하자 마자 우리는 사용자 정의 린트 (Lint) 규칙과 같은 일을하고 싶다면 if 당신은 당신이 확신하고 싶어하는 맞춤형 API를 가지고있다

사람들이 제대로 사용하면 몇 가지 규칙을 가질 수 있습니다 다른 메타 데이터를 추가하여 라이브러리를 사용하면 툴에서 더 나은 경험을 할 수 있습니다 체인에서 IDE를 사용하는 것이 좋습니다 좋아요, 그래서 도서관 프로젝트는 무료 대 지불과 같은 일을하고 싶습니다 그리고 훌륭합니다

이제 Google Play에서 여러 APK 지원을 통해 예를 들어 다른 APK를 타겟팅하는 경우 이전 버전의 Android 또는 최신 버전의 Android ARM을 MIPS 대 x86을 타겟으로한다면 그러나 세 가지 또는 모든 조합을 사용하려면 도서관 프로젝트를 처리 할 수 ​​없게된다 그래서 우리는 변종을 만들었습니다 따라서 제품 향미의 개념은 귀하의 신청? 그래서 다른 응용 프로그램을 지원할 것입니다 패키지 이름이 같은지 아닌지에 따라 다릅니다

무료 대 지불 여부 그리고 그것은 맞춤식 것들을 할 것입니다 그래서 그것은 정말 다른 것과 같습니다 빌드 유형에서 차원 빌드 유형과 결합됩니다

그래서 여기에 그것들을 만드는 방법이 있습니다 우리는 풍미 컨테이너 제품을 가지고 있습니다 그리고 새로 만들 수 있습니다 그래서 여기에 두 가지 flavor, flavor1, flavor2를 만듭니다 일부 패키지를 지정합니다

그들 중 하나는 말합니다, 이봐, 나는 다른 minSDK 버전을 원한다 다른 하나는 minSDK 버전을 자동으로 나타납니다 그리고 물론 당신은 다른 것을 가지고 싶습니다 그 안에있는 코드, 맞죠? 무료 버전에는 특정 코드가 있습니다 무료 및 유료 버전을 지불해야합니다

따라서 각각의 경우에 새로운 소스 폴더도 생깁니다 별도로 테스트하기 때문에 별도의 테스트 폴더 광고에 의해 지원되는 무료 버전이있는 경우 AdMob SDK에 대한 의존성을 추가하고 싶습니다 예를 들어, 유료화에 넣고 싶지는 않습니다 버전도 있으므로 범위가 다릅니다

여기에서 우리는 모든 범위에 대해 많은 범위를 가질 것입니다 응용 프로그램 기본적으로 빌드를 기반으로 그들과 함께 모든 당신의 의존성을 넣어 중요한 부분은, 만약 당신이 맛, 그리고 당신이 디버그 및 릴리스 빌드 유형을 가지고, 당신은 디버그 및 릴리스 응용 프로그램 맛이 있다면, 그것은 실제로 행렬이며, 우리는 모든 것의 조합

그래서 flavor1과 flavor2가 있다면, 당신은 가질 수 없습니다 그냥 디버그 빌드 더 이상 아무 의미가 없습니다 flavor1 debug 또는 flavor2 debug 중 하나입니다 그래서 당신은 맛이 있다면 그것은 매우 유용합니다 [? 보내

?] 이제 x86과 MIPS를 결합하려는 경우 ARM과 비교해 볼 때 실제로 작동하지 않는 것은 맞습니까? 그래서 우리는 풍미 차원을 ​​가지고 있습니다 그러나 DSL에서 그룹을 호출했습니다 우리는 이름을 변경해야 할 수도 있습니다 그래서 이것은 정말로 다른 차원입니다 – 그래서 한 차원은 ABI, x86 대 ARM입니다 그리고 다른 하나는 버전입니다

유료 또는 무료입니다 그리고 여기에서는 두 개의 ARM을 생성하고이를 두 개의 ARM에 할당합니다 특정 차원 따라서 ARM1이 패키지 이름을 사용자 정의하지 않는 방법에 유의하십시오 그것은 당신과 같은 버전이기 때문입니다

응용 프로그램, 유료 버전은 자체 패키지 이름 그래서 모든 것을 조합 할 것입니다 첫째, 결국 패키지가 많이 생깁니다 그리고 당신은 그것들을 자동으로 얻습니다 새로운 차원을 추가하거나 무언가를 추가하면 그 모든 것을 당신을 위해 생성하십시오

복잡한 작업이기 때문에 우리가 모든 것을 결합한 모든 다른 방법을 이해하십시오 치수– 빌드 유형 및 제품 풍미의 다른 차원 따라서 최대 4 개의 다른 소스 폴더를 만들 수 있습니다 예를 들어, 특정 예제에서 그래서 그들은 모두 마치 마치 존재하는 것처럼 간주 될 것입니다

하나의 원본 폴더 그리고 모든 것을 하나의 SDK에 결합합니다 리소스가 있다면 오버라이드 메커니즘 만 사용합니다 그래서 우리는 귀하의 기본 자원으로 시작합니다 우리는 그 위에 맛을 덮어 씁니다

그런 다음 빌드 유형을 덮어 씁니다 그리고 그것은 입술과 자산을위한 것입니다 그리고 도서관이 있다면, 그들은 주요 도서관 아래에있을 것입니다 하나, 그리고 그것들은 모든 것에 의해 무시 될 것입니다 구성에 서명하면 여기에 약간의 유연성이 있습니다

우선 순위입니다 따라서 가장 우선 순위가 높은 순서는 빌드 유형이며, 그리고 당신의 주요 구성 여기서 흥미로운 점은 디버그 빌드 유형에는 기본 디버그 구성 따라서 모든 디버그 빌드 유형이 서명됩니다 같은 열쇠로 릴리스의 경우 서명 구성을 릴리스 빌드 유형, 모든 릴리스가 함께 서명됩니다

같은 열쇠 하지만 그렇게하고 싶지 않으면 아마 유료 및 무료 서명 키가 필요합니다

그런 다음하지 마세요 빌드 유형에 서명 구성을 지정하고 그것은 대신에 맛 그리고 나서 그것은 선택 될 것입니다 그리고 여러분은 두 가지 다른 서명이 다를 수 있습니다 버전의 앱

패키지 이름 때문에 많은 방법이 있다는 것을 알았습니다 패키지 이름 사용자 정의 그래서 우리는 기본 Android로 시작합니다 매니페스트의 패키지 이름 재정의가 다른 구성이있는 경우 그것, 우리는 대신 이것을 사용합니다 맛이 있다면 이걸 가져 가세요

그리고 나서 우리가 가지고있는 패키지를 알아낼 때, 빌드 유형에 하나가 있으면 접미사를 추가합니다 그러나 R 클래스를 생성 할 때는 항상 src / main / AndroidManifestxml의 패키지 이름 그래서 당신이 어디든 당신의 모든 수입을 항상 같은 것 전환 할 필요가 없습니다 다른 응용 프로그램을 생성 할 수 있습니다

패키지 이름 그러나 모든 수입은 항상 동일합니다 이제 테스트에 대해 이야기 해 봅시다 나는 여기저기서 시험을 언급했다 그래서 빠른 요약을 해봅시다

테스트 용 소스 폴더와 flavor 별 소스 폴더가 있습니다 당신은 풍미를 사용합니다 종속성 범위가 있습니다 종속성 범위는 테스트 및 한 가지 맛 매니페스트를 생성합니다

그리고 지금 우리는 왜 우리가 생성하는지 이해할 것입니다 그 매니페스트는 6 가지 다른 여섯 가지 패키지가있는 응용 프로그램은 테스트를 위해 여섯 가지 매니페스트를 유지하고 싶습니다 신청 테스트 애플리케이션의 매니페스트는 실제로 참조됩니다 테스트중인 패키지

그래서 그것은 유지하는 것이 많을 것입니다 테스트 응용 프로그램의 패키지 이름은 패키지 이름을 기반으로 자동 생성 테스트 된 애플리케이션 테스트 당 하나의 테스트 앱을 갖게 될 것입니다 신청 그래서 지금은 하나의 빌드 유형으로 만 테스트합니다 따라서 기본적으로 디버그를 구성 할 수 있습니다

우리는 아마도 그것을 미래에 바꿀 것입니다 하지만 지금은 단지 하나입니다 그리고 마침내 도서관 프로젝트는 APK가 아닌 AAR 만 출력하면 테스트 할 수 있습니다 도서관 프로젝트 내부에서 outputs은 테스트 APK입니다 그러면 라이브러리가 라이브러리에 포함되므로 라이브러리를 테스트 할 수 있습니다

라이브러리를 별도로 제공하고 원하는 경우 APK 내부에서도 사용할 수 있습니다 알았어 건물에 관한거야 시험을 치는 것은 어떨까요? 그래서 약간 복잡합니다 그리고 우리는 그것을 들여다 보았다

그리고 우리는 실제로 세 가지 시나리오 첫 번째 시나리오는 장치가 없다는 것입니다 나는 단지 뭔가 시험하고 싶다 그리고 우리는 그것을 일반 Gradle에서 작업을 확인하십시오 따라서 당신은 당신이 거기에서 달릴 수있는 것에 국한 될 것입니다

다른 것과 같이 정적 분석을 실행할 수 있습니다 FindBugs와 모든 링크 Robolectric을 사용한다면, 다음과 같이 할 수 있습니다 그들도 거기에 가라 두 번째 시나리오는 제 책상에 앉아있는 개발자입니다

내 전화가 내 워크 스테이션에 연결되어 있습니다 어쩌면 태블릿 일 수도 있습니다 나는 뭔가를하고 싶다 그래서 이것이 연결된 수표입니다 연결된 장치를 찾고 실행합니다

모든 것을 병렬로 처리하여 결과를 얻으십시오 OK, 세 번째 시나리오는 빌드 서버입니다 여기에 실제로 연결된 장치가 없어야합니다 빌드 서버에 직접 연결하십시오 몇 가지 문제

첫째, 잘, 당신은 하나 이상의 빌드 서버를 가질 수 있습니다 그래서 그것은 문제입니다 더 많은 장치를 사용할 수있게 될 것입니다 병렬로 빌드하면 계측을 실행할 수 없습니다 UI를 평행하게 테스트하는 테스트입니다

일하지 않을거야 우린 어떤 종류의 대기열이 필요합니다 맞습니까? 그래서 우리는 주변을 둘러 보았고 실제로는 두 가지가 있습니다 시나리오, 하위 시나리오 첫 번째 것은 장치 랩을 가지고있는 것입니다

그리고 대기열 시스템이 있습니다 그리고 빌드 시스템은 무언가를 만든 다음 대기열에 넣습니다 그리고 당신은 장치를 가지고 있고 그것을 테스트합니다 그리고, 원격 대시 보드를 갖게 될 것입니다 젠킨스 시스템이 될 수는 없어

테스트를 실행합니다 그래서 당신은 다른 대시 보드를 얻을 것입니다 하지만 그렇게 할 수 있습니다 우리가 여기에서 중요하다고 생각하는 한 가지는 당신이 젠킨스가 빌드 한 후에 헤이, 뭐라고 말하고 싶지 않아 출력? 젠킨스 (Jenkins) 때문에 출력물을 가져다가 어딘가에 업로드합니다

내가 만든 빌드 변종에 대해 알지 못한다 얘기 했어 그래서 당신은 그것을 인식하고있는 빌드 시스템을 갖고 싶습니다 실제로 밀어 붙이십시오 따라서 새 빌드 변형을 추가하거나 제거 할 때마다, 돌아가서 구성 할 필요가 없습니다

젠킨스의 인스턴스 그래서 우리는 API를 만들었습니다 그리고 테스트 서버 API라고 부릅니다 그리고 APK를 어딘가에 업로드 할 수 있습니다 구현하기가 매우 쉽습니다

그래서 자신 만의 테스트 랩을 가지고 있다면 그것을 구현할 수 있습니다 테스트 랩을 갖고 있지 않다면 밖에있는 서비스들 Testdroid는 하나입니다 AppThwack은 하나입니다 둘 다 샌드 박스에 있습니다

그래서 가서 그들과 이야기해야합니다 그리고 우리는 그 사람들과 협력하여 그들은 플러그인을 만들고, 우리는 플러그인과 통합합니다 두 번째 시나리오는 글쎄, 만약 당신이 [INAUDIBLE] 장치 또는 에뮬레이터는 일반적으로 에뮬레이터가 될 것입니다 직접적으로 그리고 필요시 실행됩니다 그래서 여기에 또 다른 API가 있습니다

매우 간단합니다 우리는 장치 목록을 얻습니다 그리고 각 장치에 대해 우리는 그들과 연결합니다 에뮬레이터는 실제로 시작하는 것입니다 그런 다음 설치하고 테스트를하고 드롭합니다

실제로 우리는 지역 결과를 가지고 있습니다 그리고 다른 회사들이 그렇게하고 있습니다 그 중 하나가 Manimal입니다 샌드 박스에 있습니다 그래서 당신은 그들에게 가서 이야기 할 수 있습니다

아니면 실제로 보여줄 수 있습니다 우리는 그 사람들과 함께 일했고, 우리는 플러그인을 만들었습니다 그럼 어떻게 생겼는지 보자 여기 샘플 프로젝트가 있습니다 그것은 매우 기본입니다

여기에 buildgradle이 있습니다 그래서 우리는 안드로이드 플러그인을 바로 여기에 적용했습니다 그들의 플러그인 그래서 그것이하는 일은, 기본적으로, 그들의 플러그인입니다

설치되고 자동으로 우리의 플러그인을 찾아 내고, 이 확장 기능을 구현 중입니다 포인트, 그냥가 그리고 더 큰 플러그인이기 때문에, 그것의 자신의 DSL이 있으십시오 그래서 여기에 사용자 정의 DSL이 있습니다 이봐, 나는 테스트하고 싶다

그 두 장치에 하지만 그들은 50 가지 이상의 에뮬레이터를 가지고 있습니다 구성 기기를 제공하지 않으면 말하자면, 나는 그들 모두를 시험하고 싶다 따라서 서버에서 목록을 가져 와서 에 따라 응용 프로그램과 호환되는 것들 귀하의 minSDK 버전 및 그런 것들

음, 지금은 minSDK 버전 만 지원하지만 이후에는 ABI 및 그런 것들 그리고 모든 테스트를 병렬로 실행합니다 여기서는 더 쉽게 테스트하기 위해 테스트 할 것입니다 다른 두 가지 그래서 내가 보여주고 싶은 첫 번째 것은 당신이 우리가 알고있는 일의 목록 이 확장 지점 – 그래서 우리는 여기에 자동으로 더 많은 것을 갖습니다

기기 테스트 방법 따라서 새로운 서비스 제공 업체가 생길 때마다 그것을위한 새로운 과제 그러나 우리는 그것을 부르지 않을 것입니다 빌드 서버에서 직접 Gradle을 수행합니다 장치 검사

나는 여기서 정보를 얻을거야 그래서 응용 프로그램을 빌드 할 것입니다 실제로 지어 질 필요가 없습니다 그래서 그것은 최신이라고, 최신이라고 말하기 위하여려고하고있다, 최신 정보 그리고 여기서 우리는 건물을 짓기 시작합니다

말하자면, 그 에뮬레이터에 연결하십시오 그래서 내 장치가 여기에 에뮬레이터를 시작하지 않습니다 실제로 클라우드에서 연결됩니다 [INAUDIBLE]을 시작합니다 그런 다음 배포 할 예정입니다

이봐, 난 성공한 시험이있어 그리고 지금 그걸 끝내고있어 그리고 나서 나는 또 다른 시험을 통과했습니다 그리고 끝났어 그리고 그게 다야

방금 두 개의 서로 다른 에뮬레이터에서 테스트했습니다 그것은 20, 50 대 병렬 일 수있었습니다 슈퍼 할 쉽게 그리고 나서 그냥 가서 빌드 / 보고서 / 열기를 엽니 다 도구 테스트 / 장치 – 공급자 당 보고서가 있습니다

indexhtml 그리고 시험을 치렀습니다 이 두 장치에서 테스트되었습니다 기기별로 볼 수 있습니다

그리고 거기에 있습니다 슈퍼 할 쉽게 우리는 정말 개선하고 싶었습니다 [박수 갈채] XAVIER DUCROHET : 우리는 정말 경험을 향상시키고 자합니다 Android 용 테스트 그리고 거기에는 많은 것들이 있습니다

테스트를 작성하는 데 도움이됩니다 그리고 우리는 그것에 대해 연구해야합니다 그러나 그들을 실행하는 것은 그것의 큰 부분입니다 Manimal과 같은 회사와 협력하고 있습니다 다시 쇼룸에서, 그들은 실제로 I / O 참석자를위한 특별 제안

따라서 반드시 가서 확인해야합니다 타사 서비스와의 통합 또는 손쉬운 사용 자신의 시스템과 통합 할 수 있도록 내부적으로 매우 중요합니다 그리고 우리는 당신이 사용하기에 아주 쉽도록하고 싶습니다 좋아, 내가 얘기하고 싶은 마지막 일은 건축 환경 따라서 과거에는 정기적으로 업데이트 된 도구와 어떻게 든 귀하의 빌드 파산

새 버전의 ADT를 얻었으므로 더 이상 컴파일 할 필요가 없습니다 그리고 그것은 큰 문제입니다 그리고 우리는 그것을 고치고 싶습니다 우리는 이것이 다시는 일어나지 않도록하고 싶습니다 그리고 Gradle은 우리가 그렇게하도록 도울 것입니다

네 가지 핵심 포인트가 있습니다 첫째, 음, 당신은 Gradle 버전을 담당합니다 그리고 당신은 Ant 버전을 이미 담당했습니다 하지만 실제로 Gradle은 – 그들은 증가했다, 그들은 새로운 특징을 그렇게 빨리 비교했다 개미에게 네가 책임 지는게 좋단다 그리고 그들은 Wrapper 라 불리는이 기능을 가지고 있습니다

당신이 정말로 그 사실을 정말로 통제하기 쉽습니다 모든 개발자, 모두가 서버를 만들고, 같은 것을 가지고있다 Gradle 버전 정말 세련된 도구입니다 정말로 그것을 확인하십시오

두 번째 요점은 당신이 플러그인의 버전 그래서 처음에 DSL에서 보았습니다 제가 어떻게 말합니까, 헤이, Maven Central에서 플러그인을 가져 오면 여기에 있습니다 글쎄, 이슈 주소의 일부는 버전 번호입니다 새 버전을 업데이트 할 때 해당 버전을 제거하지 않을 것입니다

구 버전 따라서 항상 이전 버전을 유지할 수 있습니다 전환 할 준비가되면 전환해야합니다 두 번째 요점은 아마도 내가 말하지 않았을 것입니다 또한 처음에는

그래서 플러그인은 APT와 같은 도구를 사용하여 Dalvik으로 바이트 코드를 컴파일하는 DX 그리고 그것은 SDK라는 컴포넌트 아래에있었습니다 플랫폼 도구 그리고 그것의 단지 하나의 버전이있었습니다 때로는 도구를 업데이트하면 플랫폼 도구를 업데이트하십시오

갑자기, 이봐, 아래 업데이트되며, 선택의 여지가 없습니다 여기서는 SDK 플랫폼 도구에서 구성 요소를 만들고 새 구성 요소를 만들었습니다 빌드 툴 (Build Tools) 그리고 Build Tools에 대한 중요한 점은 SDK의 대부분은 네가 가진 사건을 상상해 보라 [박수 갈채] XAVIER DUCROHET : SDK가있는 경우를 상상해보십시오

이전하지 않으려는 오래된 프로젝트가 있고, 그것이 잘하는 방법이기 때문에 이전 플러그인과 빌드 도구 버전을 사용하고 있습니다 그것은 문제가되지 않습니다 새로운 프로젝트를 시작하고 싶습니다 신선한 시작하고 싶다

새 버전의 플러그인을 사용합니다 새 버전의 빌드 도구를 사용하고 두 가지 서로 다른 두 개의 툴 체인을 사용하는 다른 프로젝트 단일 SDK 마지막으로 4 번째 요점은 IDE I입니다 우리가 수요일 Studio에 관해 이야기했을 때 언급했다 IDE는 더 이상 빌드를 수행하지 않습니다

더 큰 프로젝트를 가져옵니다 빌드 할 때마다 더 큰 프로젝트에 위임합니다 ADT를 업데이트하기 전에 이전에 두 가지를 모두 얻었습니다 동일한 플러그인, 빌더 및 편집자 내부 여기 Studio는 편집에 관한 모든 것입니다

디버깅 및 프로파일 링 더 이상 건물을 짓는 것이 아닙니다 언제든지 새로운 버전을 출시 할 때마다 무료입니다 Studio 또는 ADT의 경우 ADT에 Gradle을 통합 할 때, 새로운 버전을 받으러 오십시오 Gradle 덕분에 그 값을 변경할 때만 빌드 스크립트를 강제로 전환해야합니다

빌드의 새 버전으로 좋아요, 그래서 이것은 매우 짧은 소개입니다 시스템 구축 toolsandroidcom에는 많은 온라인 정보가 있습니다

많은 문서화 및 빌드 구성 앞서 언급 한 것처럼 라이브러리의 DSL은 매우 다릅니다 그래서 당신은 그것을 조사해야합니다 우리는 여러분의 의견이 필요합니다 우리는 그것이 필요로하는만큼 융통성을 지니고 싶습니다

너 모두를 위해서 나는 우리가 이미 많은 사용자 정의를 가지고 있다고 생각한다 그러나 우리가 놓치고있는 것들이있을 것이라고 확신합니다 의견을 보내주세요 특히 Studio에서는 어쨌든 시도해야합니다

그래서 우리는 매우 행복합니다 그리고 우리에게 피드백, FindBug를주고, 우리는 무엇이든 할 것입니다 우리는 사물을 향상시킬 수 있습니다 그래서 사실, 질문을 할 시간이있는 것처럼 보입니다 [박수 갈채] XAVIER DUCROHET : 감사합니다

어쨌든 위층에있는 샌드 박스에서 대답 할거야 어떤 질문이든 하지만 시간이 있기 때문에 우리는 몇 가지 질문을 할 수 있습니다 관객 : 그래서 나는 네가 컴파일했다고 믿는다는 말을했다 의존성 또는 런타임 종속성을 해제합니다

남자들은 그 이름이 다릅니다 androidjar는 어떻게 처리됩니까? XAVIER DUCROHET : 죄송합니다, androidjar? 관객 : 예, 빌드 전용 종속성 때문입니다 XAVIER DUCROHET : 자동으로 완료됩니다

당신은 그것을 할 필요가 없습니다 귀하의 DSL에서 처음에는 SDK를 컴파일 할 때 버전 17에서는 17에서 SDK 버전 만 선택합니다 관객 : 그럼 그걸 갈구 할 수 있니? 너희들이 그걸 갈고리로 넣을 수 있니? XAVIER DUCROHET : 죄송 해요, 뭐라 구요? 관객 : 음, 우리 중 일부는 androidjar XAVIER DUCROHET : 음

글쎄, 아마 그렇게해서는 안된다 [웃음] 관객 : 우리 중 일부는 있습니다 XAVIER DUCROHET : 네

그리고 우리는 뭔가를 알아 내야 할 것입니다 관객 : 고마워 관객 : 첫째, 고마워요 그것은 많은 것들입니다 두 가지 질문이 있습니다

하나는 도서관 프로젝트가 AAR에 관한 것입니다 그들은 각각 자신의 Rjava를 가지고 있습니까, 아니면 전체 실험실을합니까? 자체 Rjava가 있습니까? XAVIER DUCROHET : AAR은 – 죄송 해요 반복 할 수 있니? 관객 : 도서관 프로젝트도 가능합니다

그들 자신의 자원을 가지고 있는가? XAVIER DUCROHET : 예, 자원, 자산 따라서 AAR은 zip 파일입니다 그 안에는 classesjar가 있습니다 그것은 당신의 컴파일 클래스입니다

당신의 활동이있는 경우에 대비하여, 사용 권한 및 그런 것들 리소스 폴더, 자산 폴더가 있으며 ProGuard가 있습니다 파일을 가지고 있습니다 궁극적으로 JNI 라이브러리를 보유하고 있다면 JNI 라이브러리를 갖게 될 것이며, [INAUDIBLE], 뭐든간에 관객 : 네, 고마워요

두 번째 질문은 NDK 통합에 관한 것입니다 XAVIER DUCROHET : 네 관객 : 거기에 몇 가지 일이 있었어 x86 및 JNI에 대해 XAVIER DUCROHET : 전체 x86 및 ARM을 언급하지만, 그리고 그것은 그것의 디자인입니다 그러나 우리는 현재 NDK를지지하지 않습니다

그럼 곧 그렇게 될 것입니다 따라서 직접 구축 할 수 있습니다 Gradle이 NDK에 전화 할 것입니다 빌드 유형으로 구성하는 방법이 있습니다 어떤 ABI를 사용하고 싶은지, 원하는 경우 세 가지 뚱뚱한 패키지 또는 단지 하나만 할 수 있습니다

그리고 나서 그것은 NDK에 전화 할 것입니다, 이봐, 제발 ARM 버전을 빌드하고 빌드 결과를 여기에 입력하십시오 다른 ABI 용으로 제작하고 거기에 넣으십시오 다른 빌드 유형 따라서 이것이 우리가 필터링을 수행하는 방법입니다

관객 : Android Studio에 통합 될 예정입니다 또한, NDK 건물? XAVIER DUCROHET : 예, Gradle의 일부가 될 것입니다 그래서 당신이 Gradle로 건축 할 때마다, 당신이 말한다면, 이봐, 나 원시 재료를 만들고 싶다면, 그것을 만들 것입니다 그리고 Studio는 기술적으로 신경 쓰지 않을 것입니다 어떤 시점에서는 편집 기능을 추가해야합니다

그것은 오래 걸릴 것입니다 하지만 최소한 파일을 편집 할 수는 있습니다 작동하게 만들다 관객 : 어디서 볼 수 있습니까? NDK를 위해 오는 것은 무엇입니까? XAVIER DUCROHET : 로드맵이 없습니다 이번에 계획했다

관객 : OK XAVIER DUCROHET : 우리에게는 몇 가지 계획이 있지만 우리는하지 않습니다 적어 놓은 것이 있으십시오 관객 : 안녕하세요, 제 이름은 마크입니다 나는 그것을 알기를 원한다

좋아, 이제 우리는 많은 폴더를 가지고있다 SRC, JAVA, JNI, RRS, 자산 등이 있습니다 그리고 이들의 합병 과정 폴더, 그들은 다른가요? 또는 내가 정말로 알고 싶은 것은, 우리는 의존성을 가질 수 있는가? 자산이 포함 된 라이브러리 프로세스가있는 경우 이제는 최종 APK에 내장되어 있지 않습니다 새로운 것, Gradle 빌드에 해당되는가요? XAVIER DUCROHET : 예 자산이있는 경우 귀하의 패키지에 포장 될 도서관

당신은 풍미에 따라 자산을 가질 수 있습니다 모든 맛, 모든 빌드 유형에는 고유 한 JAVA 코드가 있으며, 자체 매니페스트, 자체 리소스, 자체 자산 그리고 당신이 만들고있는 향기에 따라, 그것은 단지 선택합니다 모든 것을 자동으로 병합하십시오 라이브러리가 자동으로 선택되어 병합됩니다 그리고 그것은 – 관객 : 고마워, 나는 그 동안 오랜 시간을 기다렸다

XAVIER DUCROHET : 좋습니다 관객 : NDK를 지원하지 않으므로 앤트는 어때요? 여전히 당분간 지원 될 것입니까? XAVIER DUCROHET : 개미가 될 것 같습니다 곧 Gradle로 옮길 것을 권합니다 당신이 할 수있는대로 기능이 누락 된 경우 – 관객 : NDK를 지원하지 않습니다

XAVIER DUCROHET : NDK에 대한 오 지원? 관객 : 방금 NDK를 지원하지 않는다고하셨습니다 이 순간 그래서 그것을 구축하는 유일한 방법은 음, 유일한 방법은 아니지만, XAVIER DUCROHET : 음, 지금은 NDK가 구축되지 않았습니다 개미와도 그냥 파일을 만듭니다 관객 : 네, 그렇지만 통합이 쉽습니다 XAVIER DUCROHET : 그렇습니다

하지만 미래가 아닙니다 [웃음] XAVIER DUCROHET : 그것은 우리가 NDK 안에 파일을 만들 수 있습니다 원하는 경우 수동으로 호출 할 수 있습니다 그것은 Ant와 관련된 문제는 그것이 XML의 일부 스크립팅을 가지고 있습니다 사용자 정의 코드, 왜냐하면 우리가 정말 복잡해지기 때문입니다

논리, 그 모든 sourceSet, 자산, 입술, 이 모든 것을 XML로 할 수 있습니다 그래서 우리는 사용자 정의 작업을합니다 커스텀 태스크에서 빠른 if / else 문을 다시 구현했습니다 내 XML에서 그것을 사용할 수 있습니다 그러나 그것은 마치 믹스입니다

그리고 커스텀 작업에 많은 것을 전달한 다음 다시 XML에, 그리고 다른 커스텀 태스크로 되돌아 가면, 그것은 단지 빌어 먹을 혼란 그것은 단지 유지할 ​​수 없습니다 그리고 그게 무엇이든지간에 그것이 가능할 때 나는 행복하다 Gradle로 전환했으나 개선하지는 않습니다 그것은 IDE에서 작동하지 않을거야

더 이상 사용되지 않습니다 사용되지 않습니다 하지만 오픈 소스입니다 가져 가라 좋은 버전이 있는지 확인하라

정말로 그것을 유지하고 싶다 그러나 우리는 그것을 계속 유지하지 않을 것입니다 이 빌드 시스템의 목표는 어디에서나 작동합니다 그래서 저는 또 하나를 유지할 것입니다 – 지금 당장 나는 그렇다 그러나 1

0으로 전환하면 더 이상 아닙니다 청중 : 안녕하세요, [INAUDIBLE] 내 이름은 윌리엄이야 나는 Maven을 사용하여 지금까지 구축 해왔다 그래서 내가 생각하는 방식을 바꿔야하는 것처럼 보입니다

사물에 대해서 Maven이 정말 잘하는 것 중 하나는 당신이 갈 수 있다는 것입니다 끝에서 APK를 해제하십시오 그리고 모든 버전 관리를 처리하고 모든 것은 괜찮아 그걸 어떻게 Gradle과 함께 사용할 수 있을까요? XAVIER DUCROHET : 잠깐, 죄송합니다, 반복 할 수 있습니까? 관객 : Gradle에는 해제 메커니즘이없는 것 같습니다

Maven은 어디에서, 언제 가서 버전의 APK를 사용하면 버전 관리, 소스 제어 메커니즘과 상호 작용하며 빌드, 소스 컨트롤 업데이트,에 게시 귀하의 artifcat 리포지토리 등 XAVIER DUCROHET : 그래, 아마도 그 질문과 같을거야 Gradle 자체는 플러그인보다 당신은 Gradle을 알고 있습니다 그들이 Sandbox를 가지고 있고, 내가 질문을 받으면 Gradleware의 사람들이있을 것입니다 왜냐하면 그것은 전체와 더 비슷하기 때문에 워크 플로 출시 후

그리고 요람 나는 확실히 그것을지지합니다 위층에서 할거야 위층에서 질문을하겠습니다 관객 : 좋습니다 다른 하나는 APK 라이브러리입니다

꽤 흔한 수입품입니다 XAVIER DUCROHET : 예, Maven 플러그인이 다음으로 전환됩니다 AAR 형식 APK 라이브러리 지원을 찾고 있습니다 그러나 그것이 일어날 지 확신하지 못합니다

그러나 그들은 AAR로 전환하고 있습니다 그리고 몇몇 도서관이 이미 AAR에 게시하십시오 그래서 나는 잭에게 이야기한다 [? 와튼?] [알아들을 수 없는] 어느 시점에서 AAR을 배포하려고합니다 그래서 당신은 그것을 사용할 수 있습니다

관객 : 우리가 계획하고있는 도서관을 위해 게시하면 AAR을 출력물로 만들 수 있습니까? XAVIER DUCROHET : 네 관객 : 알았어 고마워 XAVIER DUCROHET : 알았어, 고마워 그래서 위층에있을거야

더 많은 질문이 있으시면 언제든지 와서 나에게 말하면 [박수 갈채]