head first android apps dev tools
DESCRIPTION
@ MOPCON talks about genymotion & gradleTRANSCRIPT
A Brain-Friendly Guide
Android App Dev ToolsHead First
MOPCON shakalaca
Hello ! I’m Shaka
• CTO @ SmarTapper Co., Ltd.
• Consultant @ SleepNOVA, Inc.
http://about.me/shakalaca
Today’s topic
• Genymotion (101 session)
• w/ demo
• Gradle (201 session)
• w/ sample scripts
• Android Studio (201 session)
Genymotion
Myth : App development on Android is
FREE (or cheaper) than iOS
Really ?
• Don’t have to buy a Mac ... you’ll buy one eventually (look at me)
• There’s an emulator... you really use it ?
• Android phone is way cheaper than iPhone !... you mean those in the next page ?
http://goo.gl/tt8Rp
There’s no such thing as free lunch ..
Problems with emulator
• No play services (sort of)
• No camera
• “telnet localhost 5554” doesn’t make sense
• f5g really slow in arm based emulator
Survival guide !
• Intel x86 Emulator Accelerator
• Snapshot or Host GPU
Buy real phone(s) !
• For platform/screen specific issues
• Nexus is enough ...
• ... I’m not sure
Developers’ pain
https://www.youtube.com/watch?v=cOUK0JZvbwI
Is it the one ?
• Android x86 emulator based on AndroVM open source project
• http://androvm.org/
• (In some case) faster than SDK emulator
• Multi-platform
• IDE plugins
Good for ..
• Test applications
• Fast & cable free
• Screencast
• Use your favorite software (for me: QuickTime for OS X)
And gamers love it ..
https://www.google.com.tw/search?q=神魔之塔+genymotion
Features (HW)
• Camera
• GPS
• Battery
• Speaker / Microphone
• Rotation
• Physical keys
Features (SW)
• API 16 & 17, 18 in preview
• Play store (service)
• Root access
• OpenGL
• Virtual keys
• Full screen (F11)
Resolution
• 1280x800
• 720x1080
• 1080x1920
• 480x800
• 1024x600
• Customizable
Screen size• Nexus One (3.7”)
• Nexus S (4”)
• Galaxy Nexus (4.65”)
• Nexus 7 (7”)
• Galaxy S4/HTC One/Xperia Z (5”)
• WSVGA Tablet (7”)
• WXGA Tablet (10.1”)
Demo time !
Tips !
Control• Buttons
• Rotation: ctrl + F11
• Full screen: F11
• Gestures
• Zoom: ctrl + mouse left/right
• Tile: ctrl + mouse up/down
• Rotate: ctrl + shift + mouse left/right
Launch from CLI
• VBoxManage list vms • "Galaxy Nexus - 4.2.2 - with Google Apps - API 17 -
720x1280" {fbbd7f3e-188d-4a9b-8cdc-5b70c1554f5b}
• player --vm-name <VM name/id> • /Application/Genymotion.app/Contents/MacOS/player --vm-name "Galaxy
Nexus - 4.2.2 - with Google Apps - API 17 - 720x1280"
genyshell• Example: Setup gps to somewhere in Taipei
• Content of file “gps_loc”
• gps setstatus enabled
• gps setlatitude 25.03
• gps setlongitude 121.54
• Command to apply configurations
• genyshell -f gps_loc
Change resolution• Dummy way: Set in menu before launch
• Geek way: Set through adb
• adb shell am display-size 800x480
• adb shell am display-density 240
• adb shell am display-size reset
• For 4.3+
• adb shell wm size 800x480
• adb shell wm density 240
Use my scripts :p
• adb root
• https://gist.github.com/shakalaca/6716635
• screenshot
• https://gist.github.com/shakalaca/6822570
• migration tool
• https://github.com/shakalaca/GenymotionVMMigrationTool
Gradle enabled android project
What is gradle ?Gradle is build automation evolved. Gradle can automate the building, testing, publishing, deployment and more of software packages or other types of projects such as generated static websites, generated documentation or indeed anything else. !Gradle combines the power and flexibility of Ant with the dependency management and conventions of Maven into a more effective way to build. Powered by a Groovy DSL and packed with innovation, Gradle provides a declarative way to describe all kinds of builds through sensible defaults. Gradle is quickly becoming the build system of choice for many open source projects, leading edge enterprises and legacy automation challenges.
- http://www.gradle.org/
.. short version
An open source build system that combines the power of Ant & Maven but easy to use
Why (google wants to change the
build system to) gradle ?
• My guess..
• Simplify and unify project dependency management in IDE & CLI
• Think about Eclipse & ant (ci server)
• Android Studio is coming !BETA
Should I use it ?
• For small project
• Easy to convert
• For large project
• Worth trying if it can simplify the configurations (dependency)
• For project with variants
• Time for better management tool
Will it blow up my projects ?
It’s 2013 now, you should have SCM … right ?
How gradle works ?• Lifecycle
• Initialization
• Configuration
• Execution
• Build scripts
• build.gradle
• settings.gradle (optional)
• gradle.properties (optional)
http://www.gradle.org/docs/current/userguide/build_lifecycle.html
Command
• gradle <task name>
• tasks
• clean
• assemble
• assembleRelease
• assembleDebug
• aR / asD
Android integration
• gradle android plugin
• http://tools.android.com/tech-docs/new-build-system/
• output
• <project>/build/apk/
Step by step tutorial
• Basic
• Dependency
• Sign / Proguard
• Variant
Eclipse project
Dependencies
• compile files(‘libs/android-support-v4.jar’)
• compile fileTree(dir: ‘libs’, include: ‘*.jar’)
• compile ‘com.android.support:support-v4:18.0.0’
Android packages!
• com.android.support:support-v4:18.0.0
• com.android.support:appcompat-v7:18.0.0
• com.android.support:gridlayout-v7:18.0.0
• com.android.support:support-v7-mediarouter:18.0.0
• com.android.support:support-v13:18.0.0
• com.google.android.gms:play-services:3.2.65
defaultConfig
• versionCode
• versionName
• minSdkVersion
• targetSdkVersion
• packageName
• signingConfig
• proguardFile
• proguardFiles
• testPackageName
• testInstrumentationRunner
Happy building
• Put build.gradle in project directory
• Build: gradle assemble
• build/apk/
• Install: gradle installDebug or gradle installRelease
Step by step tutorial
• Basic
• Dependency
• Sign / Proguard
• Variant
Project structure
app
include library project
ActionBarSherlock
Happy building
• Put build.gradle & settings.gradle in app project directory
• Put build.gradle in library project directory
• Build: gradle assemble
• build/apk/
settings.gradle
• Used in multi-project hierarchy
• Define projects to be used in build
settings.gradle
er.. no direct way ?
Known issue
• Library project is always “release” build
• define your own debug flags..
• <application /> in AndroidManifest.xml
Step by step tutorial
• Basic
• Dependency
• Sign / Proguard
• Variant
Build types
• default 2 types: debug & release
• for debugging & signing
Build types
• debuggable
• jniDebugBuild
• renderscriptDebugBuild
• renderscriptOptimLevel
• packageNameSuffix
• versionNameSuffix
• signingConfig
• zipAlign
• runProguard
• proguardFile
• proguardFiles
Tips
• Save your gradle.properties in ~/.gradle/
• .. If you work alone
Step by step tutorial
• Basic
• Dependency
• Sign / Proguard
• Variant
Build variant
• Creating different versions of same application
• free/paid
• multi-apk
• Build Variant = Build Type + Product Flavor
Product flavor
• Defines a customised version of application build by the project
• Free / Paid
• Amazon / Play Store / blah store
• Same type as defaultConfig
Build
• gradle assemblePaid
• gradle aPD / gradle aPR
• gradle assembleFree
• gradle aFD / gradle aFR
One more thing..
gradle wrapper
• Setup gradle automatically
• $ANDROID_HOME/tools/templates/gradle/wrapper/
• for gradle 1.7+
• execute “gradle wrapper”
Compatible with older version of gradle
• change gradleVersion
• run ‘./gradlew wrapper’
Summary
• Simple android project
• Sign release key
• Run proguard
• Build variants
• Wrapper
All samples are here
http://github.com/shakalaca/learning_gradle_android
Maven repository
Why & How ?
• Time is money
• Use aar instead of re-compiling everything
• aar: Binary distribution of an Android Library Project
• http://tools.android.com/tech-docs/new-build-system/aar-format
Project layout
root-build.gradle
library/build.gradle
project/build.gradle
• archivesBaseName
• version
app/build.gradle
How
• deploy library
• ./gradlew deploy
• use local repository
• ./gradlew as -PuseRepo
Performance boost
• in ~/.gradle/gradle.properties
• org.gradle.daemon=true
• org.gradle.parallel=true (be careful)
• stop the daemon
• gradle --stop
Refresh cache
• --refresh-dependencies
• stay up-to-date (?)
http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:cache_command_line_options
References• Documentation
• http://tools.android.com/tech-docs/new-build-system (Guide / Samples)
• http://www.gradle.org/documentation
• Forums
• https://plus.google.com/u/0/communities/114791428968349268860
• https://groups.google.com/forum/#!forum/adt-dev
• http://stackoverflow.com/questions/tagged/gradle
• Tool
• http://gradleplease.appspot.com/
Or follow me @
• G+
• http://google.com/profiles/shakalaca
• Blog
• http://23pin.logdown.com
• Taipei GDG (G+ Community)
• https://plus.google.com/communities/100566773212437391191
Q & A
Bonus !
Remove jars in output apk
Remove jars in certain build type
Launch after install
Move out and rename output apk files
• android.applicationVariant.all { variant -> variant.assemble.doLast { do_the_magic } }
• variant.zipAlign
• true: extra variant.outputFile
• false: variant.packageApplication.outputFile
• https://gist.github.com/shakalaca/6422811
NDK support
• https://gist.github.com/pboos/5802233#file-ndk-build-gradle
For other issues ..
• Google Maps Android API v2 gradle integration
• Different resources for build types
• http://23pin.logdown.com/posts/144771-google-maps-android-api-v2-gradle-integration
• Gradle and GCM project integration
• Difference in AndroidManifest.xml
• http://23pin.logdown.com/posts/144770-gradle-and-gcm-project-integration