SlideShare a Scribd company logo
1 of 96
Download to read offline
A Brain-Friendly Guide

Head First

Android App Dev Tools

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
It’s a bird.. It’s a plane..
It’s Genymotion !

http:/
/www.genymotion.com
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)
BETA

Android Studio is coming !
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/newbuild-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:supportv4: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
testInstrumentation
Runner
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

•

for gradle 1.7+

$ANDROID_HOME/tools/templates/gradle/
wrapper/

•

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/newbuild-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#filendk-build-gradle
For other issues ..
•

•

Google Maps Android API v2 gradle integration

•
•

Different resources for build types
http:/
/23pin.logdown.com/posts/144771-googlemaps-android-api-v2-gradle-integration

Gradle and GCM project integration

•
•

Difference in AndroidManifest.xml
http:/
/23pin.logdown.com/posts/144770-gradle-andgcm-project-integration

More Related Content

What's hot

Project a day 2 introduction to android studio
Project a day 2   introduction to android studioProject a day 2   introduction to android studio
Project a day 2 introduction to android studio
Goran Djonovic
 
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
Jason Conger
 
Android SDK and PhoneGap
Android SDK and PhoneGapAndroid SDK and PhoneGap
Android SDK and PhoneGap
Doncho Minkov
 

What's hot (20)

Eclipse platform news and how to contribute to the Eclipse Open Source project
Eclipse platform news and how to contribute to the Eclipse Open Source projectEclipse platform news and how to contribute to the Eclipse Open Source project
Eclipse platform news and how to contribute to the Eclipse Open Source project
 
Eclipse 2011 Hot Topics
Eclipse 2011 Hot TopicsEclipse 2011 Hot Topics
Eclipse 2011 Hot Topics
 
Project a day 2 introduction to android studio
Project a day 2   introduction to android studioProject a day 2   introduction to android studio
Project a day 2 introduction to android studio
 
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
Building your Own Mobile Enterprise Application: It’s Not as Hard as You Migh...
 
Creating iOS and Android Apps with Visual Studio and C#
Creating iOS and Android Apps with Visual Studio and C# Creating iOS and Android Apps with Visual Studio and C#
Creating iOS and Android Apps with Visual Studio and C#
 
Android development session 5 - Debug android studio
Android development   session 5 - Debug android studioAndroid development   session 5 - Debug android studio
Android development session 5 - Debug android studio
 
Android Introduction on Java Forum Stuttgart 11
Android Introduction on Java Forum Stuttgart 11 Android Introduction on Java Forum Stuttgart 11
Android Introduction on Java Forum Stuttgart 11
 
Android testing
Android testingAndroid testing
Android testing
 
Introduction_to_android_and_android_studio
Introduction_to_android_and_android_studioIntroduction_to_android_and_android_studio
Introduction_to_android_and_android_studio
 
[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...
 
New to android studio
New to android studioNew to android studio
New to android studio
 
Android testing
Android testingAndroid testing
Android testing
 
Exploring App Compat
Exploring App CompatExploring App Compat
Exploring App Compat
 
Android Studio簡介
Android Studio簡介Android Studio簡介
Android Studio簡介
 
Android SDK and PhoneGap
Android SDK and PhoneGapAndroid SDK and PhoneGap
Android SDK and PhoneGap
 
Android Automation Using Robotium
Android Automation Using RobotiumAndroid Automation Using Robotium
Android Automation Using Robotium
 
Continuous Integration of Mobile Apps with Docker and Appium
Continuous Integration of Mobile Apps with Docker and AppiumContinuous Integration of Mobile Apps with Docker and Appium
Continuous Integration of Mobile Apps with Docker and Appium
 
Cross Platform Application Development Using Flutter
Cross Platform Application Development Using FlutterCross Platform Application Development Using Flutter
Cross Platform Application Development Using Flutter
 
Mobile Day - Intel XDK & Testing
Mobile Day - Intel XDK & TestingMobile Day - Intel XDK & Testing
Mobile Day - Intel XDK & Testing
 
Selenium web driver_2.0_presentation
Selenium web driver_2.0_presentationSelenium web driver_2.0_presentation
Selenium web driver_2.0_presentation
 

Similar to Head first android apps dev tools

August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Howard Greenberg
 
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx PluginGr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
Yasuharu Nakano
 

Similar to Head first android apps dev tools (20)

Next Step, Android Studio!
Next Step, Android Studio!Next Step, Android Studio!
Next Step, Android Studio!
 
Exploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & BeyondExploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & Beyond
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
 
Android Studio 3 - Dependency-Aware Build Variants and Product Flavors
Android Studio 3 - Dependency-Aware Build Variants and Product FlavorsAndroid Studio 3 - Dependency-Aware Build Variants and Product Flavors
Android Studio 3 - Dependency-Aware Build Variants and Product Flavors
 
Gradle enabled android project
Gradle enabled android projectGradle enabled android project
Gradle enabled android project
 
Android Platform Debugging & Development
Android Platform Debugging & Development Android Platform Debugging & Development
Android Platform Debugging & Development
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
Phonegap - An Introduction
Phonegap - An IntroductionPhonegap - An Introduction
Phonegap - An Introduction
 
Droidcon Spain 2105 - One app to rule them all: Methodologies, Tools & Tricks...
Droidcon Spain 2105 - One app to rule them all: Methodologies, Tools & Tricks...Droidcon Spain 2105 - One app to rule them all: Methodologies, Tools & Tricks...
Droidcon Spain 2105 - One app to rule them all: Methodologies, Tools & Tricks...
 
Android Platform Debugging and Development
Android Platform Debugging and DevelopmentAndroid Platform Debugging and Development
Android Platform Debugging and Development
 
Headless browser: puppeteer and git client : GitKraken
Headless browser: puppeteer and git client : GitKrakenHeadless browser: puppeteer and git client : GitKraken
Headless browser: puppeteer and git client : GitKraken
 
Desktop apps with node webkit
Desktop apps with node webkitDesktop apps with node webkit
Desktop apps with node webkit
 
Android Platform Debugging and Development
Android Platform Debugging and DevelopmentAndroid Platform Debugging and Development
Android Platform Debugging and Development
 
Google App Engine Java, Groovy and Gaelyk
Google App Engine Java, Groovy and GaelykGoogle App Engine Java, Groovy and Gaelyk
Google App Engine Java, Groovy and Gaelyk
 
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx PluginGr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
 
Auf Augenhöhe mit Android Studio und Gradle
Auf Augenhöhe mit Android Studio und GradleAuf Augenhöhe mit Android Studio und Gradle
Auf Augenhöhe mit Android Studio und Gradle
 
Android Studio und gradle
Android Studio und gradleAndroid Studio und gradle
Android Studio und gradle
 
Masterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsMasterin Large Scale Java Script Applications
Masterin Large Scale Java Script Applications
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Android Platform Debugging and Development
Android Platform Debugging and DevelopmentAndroid Platform Debugging and Development
Android Platform Debugging and Development
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Recently uploaded (20)

Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 

Head first android apps dev tools