32
1

Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

  • Upload
    yandex

  • View
    671

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

1

Page 2: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

2

Building next-gen

Android library

with Gradle

Anton Rutkevich

Android developer

Page 3: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

3

About me

3+ years of Android development

Mobile game-dev experience

At Yandex:

Android development

Continuous Integration

Page 4: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

4

Old-style library projects

The past, the present…

Page 5: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

5

What’s wrong?

• Hard to update

• Hard to distribute

• Eclipse, eclipse…

Page 6: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

6

Gradle &

The New Build System

The present, the future…

Page 7: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

7

Gradle - build automation evolved

• Build scripts on Groovy

• Flexible build setup

• Runs everywhere (Java required)

• Dependency management

Page 8: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

8

Dependency management

• Maven artifacts

• Local artifacts

• Library projects

dependencies {

compile ‘com.google.code.gson:gson:2.2.4’

compile fileTree(dir: ‘libs’,

include: ‘*.jar’)

compile project(‘:my-library’)

}

Page 9: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

9

The New Build System

• Brings Gradle features to Android builds

• Provides Android Studio integration

Page 10: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

10

.aar format

• Zip archive

• Structure is similar to old-style library project

• /AndroidManifest.xml

• /classes.jar

• /res/

• /R.txt

• /assets/

• /libs/*.jar

• /jni/<abi>/*.so

• /proguard.txt

Page 11: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

11

A good library

Page 12: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

12

Self sufficient

• plain java jar-file ?

• maven plain java jar?

• maven Android jar ?

- dependencies

+/- obfuscation

- AndroidManifest.xml

Page 13: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

13

Friendly

• Does not create conflicts with other

libraries

Page 14: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

14

Stable

• Behavior does not change over time

Page 15: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

15

Building next-gen

Android library

The right way

Page 16: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

16

Key components

/AndroidManifest.xml

/classes.jar

/res/

/R.txt

/assets/

/libs/*.jar

/jni/<abi>/*.so

/proguard.txt

Page 17: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

17

Resources

Lint will warn you!

android {

resourcePrefix 'mylib_'

}

Use resource prefix for library resources

Page 18: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

18

Obfuscation. DON’Ts for library

-repackageclasses ‘’

-allowaccessmodification

// hidden -> public

a.class b.class …

a.class b.class …

first.jar second.jar

error: duplicate class

Page 19: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

19

Obfuscation. Rules for users

Will be packaged into aar

defaultConfig {

consumerProguardFiles ‘pro-consumer.txt’

}

Page 20: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

20

Dependencies.

Stable vs dynamic versions

Stable versions give stable builds

dependencies {

// 1.6.0 only

compile ‘com.squareup.okhttp:okhttp:1.6.0’

// Latest version

compile ‘com.squareup.okhttp:okhttp:+’

}

Dynamic versions do not require redeploy

Use stable versions for library dependencies

Page 21: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

21

Dependencies. Maven only!

What’s wrong with

local jars? libs/ lib-1.0.jar

libs/ lib-1.0.jar

first.aar second.aar

In extreme cases –

use jarjar tool error: duplicate class

Page 22: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

22

Manifest. Static values

Will be copies into app’s manifest file ‘as is’.

<uses-permission android:name="android.permission.INTERNET"

/>

<application>

<activity android:name="com.my.app.SomeActivity”/>

</application>

Include required values only!

Page 23: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

23

Manifest. Dynamic values 1

defaultConfig {

manifestPlaceholders

= [ userAppPackage: "\${packageName}” ]

}

<uses-permission

android:name="${userAppPackage}.LIB_PERMISSION" />

Library’s build.gradle

Library’s AndroidManifest.xml

Page 24: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

24

Manifest. Dynamic values 2

<uses-permission

android:name="${packageName}.LIB_PERMISSION" />

Will give

in library’s aar AndroidManifest.xml

Page 25: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

25

Manifest. Dynamic values 3

Library’s aar AndroidManifest.xml

Application’s build.gradle

<uses-permission

android:name="${packageName}.LIB_PERMISSION" />

defaultConfig {

packageName = "com.my.app”

}

Page 26: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

26

How to use it

depending on your build system

Page 27: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

27

Case 1. Using Eclipse, etc

1. Unzip aar

2. Attach as library project

3. Add classes.jar (and libs/) to classpath

4. Add native libraries

5. Add proguard entries

6. …

Page 28: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

28

Case 2. Using Gradle & local aar

project-folder/

build.gradle

repo/library-1.0.aar

repositories {

flatDir { dirs ‘repo’ }

}

dependencies {

compile ‘com.company:library:1.0@aar’

}

Page 29: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

29

Case 3. Using Gradle & Maven

dependencies {

compile ‘com.company:library:1.0’

// or

compile ‘com.company:library:1.0@aar’

}

Page 30: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

30

What’s next?

Page 31: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

31

Uncovered topics

• Maven Central publication

• Multiple library variant generation

• Native libraries

• …

Page 32: Антон Руткевич, Сборка Android-библиотеки нового поколения с помощью Gradle

32

Thank you for your attention!

Anton Rutkevich [email protected]