SlideShare a Scribd company logo
Internal Library
Dependency Management
@KellyShuster
@KellyShuster
@KellyShuster
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
dependency-sample dependency-sample-lib
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Git Submodules
Google’s Repo Tool
Artifactory
Jitpack
Git Submodules
dependency-sample dependency-sample-lib
app mylibrary
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
02-git-submodules
How do you set it up?
git submodule add <lib-repo>
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
78c7046
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
dependency-sample
|
+--.gitmodules
+--dependency-sample-library
[submodule "dependency-sample-library"]
path = dependency-sample-library
url = https://github.com/KioKrofovitch/dependency-sample-library.git
.gitmodules
Add Gradle References
settings.gradle
include ':app'
include ':dependency-sample-library:mylibrary'
build.gradle (app)
dependencies {
...
compile project(':dependency-sample-library:mylibrary')
}
Check Submodule Status
git submodule
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
How do you get code?
git clone <repo> --recursive
git clone <repo>
git submodule init
git submodule update
git checkout <branch>
git submodule init
git submodule update
git checkout <branch>
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
git submodule init
git submodule update
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Upstream changes
git pull
git submodule update
Changing the library
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
ff07597
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
ff07597
123ff09
fef9878
345f67e
Committing on a Detached Head
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
How it happens
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
1bd7125
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
1bd7125
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
177458f
1bd7125
123789d
a2b789d
345a89d
678789d
dependency-sample dependency-sample-lib
177458f
498defd
145458e
1bd7125
177458f
498defd
145458e
How to recover
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Removing Submodules
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
.gitmodules
.git/modules
Pros
Versioning brought to you by git
Pros
Versioning brought to you by git
Versioning is specific and repeatable
Pros
Versioning brought to you by git
Versioning is specific and repeatable
One Android Studio Project
Pros
Versioning brought to you by git
Versioning is specific and repeatable
One Android Studio Project
Code access
Cons
Magic is involved:
Cons
Magic is involved:
Working with a detached head
Cons
Magic is involved:
Working with a detached head
Pulling down latest submodule
Cons
Magic is involved:
Working with a detached head
Pulling down latest submodule
Adding & tracking submodule reference
Cons
Magic is involved:
Working with a detached head
Pulling down latest submodule
Adding & tracking submodule reference
Library versions are commit SHAs
Google’s Repo Tool
dependency-sample dependency-sample-lib
app mylibrary
dependency-parent
manifest
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
04-repo-tool
How do you set it up?
dependency-parent
manifest
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project ... />
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="github"
fetch="https://github.com" />
<default ... />
<project ... />
<project ... />
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default revision="master"
remote="github" />
<project ... />
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
remote="github"
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
remote="github"
revision="04-repo-tool"
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
remote="github"
revision="04-repo-tool"
path="dependency-sample"/>
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
remote="github"
revision="04-repo-tool"
path="dependency-sample"/>
<project name="KioKrofovitch/dependency-sample-library"
remote="github"
path="dependency-sample-library"/>
</manifest>
default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote ... />
<default ... />
<project name="KioKrofovitch/dependency-sample"
remote="github"
revision="04-repo-tool"
path="dependency-sample"/>
<project name="KioKrofovitch/dependency-sample-library"
remote="github"
path="dependency-sample-library"/>
</manifest>
repo init -u <parent-repo>
parent
|
+--.repo
repo sync
parent
|
+--.repo
+--dependency-sample
+--dependency-sample-library
Add Gradle References
settings.gradle
include ':app'
include ':mylibrary'
settings.gradle
include ':app'
include ':mylibrary'
project(':mylibrary').projectDir
= new File('../dependency-sample-library/mylibrary')
build.gradle
dependencies {
...
compile project(':mylibrary')
}
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
78c7046
dependency-sample dependency-sample-lib
123789d
Pros
Versioning is a “flexible” version of git
Pros
Versioning is a “flexible” version of git
Versions are clearly defined in one place
Pros
Versioning is a “flexible” version of git
Versions are clearly defined in one place
One Android Studio project
Pros
Versioning is a “flexible” version of git
Versions are clearly defined in one place
One Android Studio project
Code access
Pros
Versioning is a “flexible” version of git
Versions are clearly defined in one place
One Android Studio project
Code access
It’s cool because AOSP uses it
Cons
Overkill?
Cons
Overkill?
Repo + Git
Cons
Overkill?
Repo + Git
Detached head++
Cons
Overkill?
Repo + Git
Detached head++
Documentation / Community
Cons
Overkill?
Repo + Git
Detached head++
Documentation / Community
Less repeatable builds
Multiple Repositories,
Linked Using Maven
Artifactory
dependency-sample dependency-sample-lib
app
Artifactory
mylibrary
dependency-sample dependency-sample-lib
app mylibrary
Artifactory
Reference
dependency-sample dependency-sample-lib
app
Artifactory
Publish
mylibrary
03-artifactory
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Publishing
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
build.gradle (project level)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
// NOTE: Do not place your application dependencies here; they
// belong in the individual module build.gradle files
}
}
build.gradle (project level)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
// NOTE: Do not place your application dependencies here; they
// belong in the individual module build.gradle files
}
}
build.gradle (mylibrary)
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def packageName = 'com.kiodev.myArtLibrary'
def versionMajor = '1'
def versionMinor = '0'
def versionPatch = '0'
def libraryVersion = "${versionMajor}.${versionMinor}.${versionPatch}"
android { … }
dependencies { … }
publishing { … }
artifactory { … }
build.gradle (mylibrary)
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def packageName = 'com.kiodev.myArtLibrary'
def versionMajor = '1'
def versionMinor = '0'
def versionPatch = '0'
def libraryVersion = "${versionMajor}.${versionMinor}.${versionPatch}"
android { … }
dependencies { … }
publishing { … }
artifactory { … }
build.gradle (mylibrary)
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def packageName = 'com.kiodev.myArtLibrary'
def versionMajor = '1'
def versionMinor = '0'
def versionPatch = '0'
def libraryVersion = "${versionMajor}.${versionMinor}.${versionPatch}"
android { … }
dependencies { … }
publishing { … }
artifactory { … }
build.gradle (mylibrary)
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def packageName = 'com.kiodev.myArtLibrary'
def versionMajor = '1'
def versionMinor = '0'
def versionPatch = '0'
def libraryVersion = "${versionMajor}.${versionMinor}.${versionPatch}"
android { … }
dependencies { … }
publishing { … }
artifactory { … }
build.gradle (mylibrary)
publishing {
publications {
aar(MavenPublication) {
groupId packageName
version = libraryVersion
artifactId project.getName()
// Tell maven to prepare the generated "*.aar" file for publishing
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
}
}
}
build.gradle (mylibrary)
artifactory {
contextUrl = 'http://localhost:8081/artifactory'
publish {
repository {
...
}
defaults {
...
}
}
}
build.gradle (mylibrary)
artifactory {
contextUrl = 'http://localhost:8081/artifactory'
publish {
repository {
// The Artifactory repository key to publish to
repoKey = 'libs-release-local'
// Defined in gradle.properties
username = artifactory_user
password = artifactory_password
}
defaults { … }
}
}
build.gradle (mylibrary)
artifactory {
contextUrl = 'http://localhost:8081/artifactory'
publish {
repository { ... }
defaults {
// Tell the Artifactory Plugin which artifacts to publish
publications('aar')
publishArtifacts = true
// Properties to be attached to the published artifacts.
properties = ['qa.level': 'basic', 'dev.team': 'core']
// Publish generated POM files to Artifactory (true by default)
publishPom = true
}
}
}
gradle assemble artifactoryPublish
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Referencing
build.gradle (project level)
allprojects {
repositories {
jcenter()
maven {
url "http://localhost:8081/artifactory/libs-release-local"
// Defined in gradle.properties
credentials {
username = artifactory_user
password = artifactory_password
}
}
}
}
build.gradle (app)
android {
…
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile(group: 'com.kiodev.myArtLibrary', name: 'mylibrary',
version: '1.0.0', ext: 'aar')
}
build.gradle (app)
android {
…
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile(group: 'com.kiodev.myArtLibrary', name: 'mylibrary',
version: '1.0.0', ext: 'aar')
}
gradle build --refresh-dependencies
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Github
Code changes
& commits
Github Github
Code changes
& commits
Pull request
& merge
Github Github Artifactory
Code changes
& commits
Pull request
& merge Publish
Github Artifactory
Code changes
Publish
Pros
Versioning is human readable / determined
Pros
Versioning is human readable / determined
Benefits of JAR / AAR
Pros
Versioning is human readable / determined
Benefits of JAR / AAR
Potential to be highly automated
Cons
Versioning has zero tie to git
Cons
Versioning has zero tie to git
Low security
Cons
Versioning has zero tie to git
Low security
2 Android Studio Projects
Cons
Versioning has zero tie to git
Low security
2 Android Studio Projects
Stepping through code is harder
Cons
Versioning has zero tie to git
Low security
2 Android Studio Projects
Stepping through code is harder
Extra step of publishing
Jitpack
dependency-sample dependency-sample-lib
app
Jitpack
mylibrary
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
05-jitpack
build.gradle (project level)
allprojects {
repositories {
jcenter()
maven {
url "https://jitpack.io"
credentials { username authToken }
}
}
}
build.gradle (project level)
allprojects {
repositories {
jcenter()
maven {
url "https://jitpack.io"
credentials { username authToken }
}
}
}
build.gradle (app level)
dependencies {
...
compile 'com.github.User:repo:version'
}
build.gradle (app level)
dependencies {
compile
'com.github.KioKrofovitch:
dependency-sample-library:
02-git-submodules-SNAPSHOT'
}
<tag>
-SNAPSHOT
<branch>-SNAPSHOT
<short commit SHA>
gradle build --refresh-dependencies
Pros
Versioning:
Human readable AND managed by Git
Pros
Versioning:
Human readable AND managed by Git
Benefits of JAR / AAR
Pros
Versioning:
Human readable AND managed by Git
Benefits of JAR / AAR
No publishing stress
Cons
Waiting for publishing
Cons
Waiting for publishing
Potential for non-repeatable builds
Cons
Waiting for publishing
Potential for non-repeatable builds
2 Android Studio Projects
Cons
Waiting for publishing
Potential for non-repeatable builds
2 Android Studio Projects
Stepping through code is harder
Git Submodules
Google’s Repo Tool
Artifactory
Jitpack
@KellyShuster
https://github.com/KioKrofovitch/
dependency-sample
dependency-sample-library
dependency-parent
Resources
Git submodule
https://git-scm.com/docs/git-submodule
https://git-scm.com/book/en/v2/Git-Tools-Submodules
Repo Tool
http://www.instructables.com/id/Using-Googles-repo-command-in-your-own-projects/
Artifactory Open Source
https://www.jfrog.com/open-source/
Artifactory Professional
https://www.jfrog.com/artifactory/
Artifactory OS Tutorial
https://jeroenmols.github.io/blog/2015/08/06/artifactory/
Photo Credits
Android Robot
https://commons.wikimedia.org/wiki/File:Android_robot.svg
Trinity College Library
https://en.wikipedia.org/wiki/Trinity_College,_Dublin#/media/File:Long_Room_Interior,
_Trinity_College_Dublin,_Ireland_-_Diliff.jpg
Ruby
http://nicholasjohnson.com/ruby/
Clean Desk
http://www.levo.com/articles/career-advice/what-your-desk-says-about-you
Messy Desk
http://www.telegraph.co.uk/news/newstopics/howaboutthat/10225664/Having-a-messy-desk-makes-you-more-
creative.html
Headless Horseman Gif
https://www.lovethisgif.com/tag/headless+horseman
Ghost
http://38.media.tumblr.com/d30fe069cc48e11eeb31ae08293a159e/tumblr_nbtdxg9d6n1szf0nzo1_250.gif
Photo Credits
Neverending Story Book
http://www.dailyrecord.co.uk/entertainment/tv-radio/flashback-friday-neverending-story-proves-4948514
Unicorn w/ Rainbows
http://souloftruth.com/the-race-to-nowhere/
John Wayne
http://patch.com/california/sanclemente/best-ways-recycle-water-during-californias-dry-spell
Space Pic
http://wallpapershidef.com/outer-space-desktop-wallpaper.html
Computer
https://commons.wikimedia.org/wiki/File:Gnome-computer.svg
Crying Pikachu
http://gifrific.com/wp-content/uploads/2012/06/Picachu-crying-pokemon.gif
Branch
http://townhack.github.io/git-101/img/git-branch.png
Photo Credits
Maven Logo
https://commons.wikimedia.org/wiki/File:Maven_logo.svg

More Related Content

PDF
Building maintainable app
PDF
A friend in need - A JS indeed
PDF
What’s new in Android JetPack
PDF
Advanced Dagger talk from 360andev
PDF
Improving app performance with Kotlin Coroutines
PDF
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
PDF
Building an app with Google's new suites
PDF
Exploring CameraX from JetPack
Building maintainable app
A friend in need - A JS indeed
What’s new in Android JetPack
Advanced Dagger talk from 360andev
Improving app performance with Kotlin Coroutines
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
Building an app with Google's new suites
Exploring CameraX from JetPack

What's hot (20)

PDF
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
PDF
Android App development and test environment, Understaing android app structure
PDF
Building Modern Apps using Android Architecture Components
PPTX
Angular beans
PPTX
Async task, threads, pools, and executors oh my!
PPTX
Gradle,the new build system for android
PPTX
When Enterprise Java Micro Profile meets Angular
PDF
CDI: How do I ?
PPTX
Android development with Scala and SBT
PDF
Java(ee) mongo db applications in the cloud
PDF
Reactive Streams and RxJava2
PDF
Di code steps
PPTX
Exploring the power of Gradle in android studio - Basics & Beyond
PDF
Android Building, Testing and reversing
PDF
Are app servers still fascinating
PDF
Dagger 2. Right way to do Dependency Injection
PPTX
Dagger 2. The Right Way to Dependency Injections
PDF
Overview of Android Infrastructure
KEY
Application Frameworks: The new kids on the block
PDF
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Android App development and test environment, Understaing android app structure
Building Modern Apps using Android Architecture Components
Angular beans
Async task, threads, pools, and executors oh my!
Gradle,the new build system for android
When Enterprise Java Micro Profile meets Angular
CDI: How do I ?
Android development with Scala and SBT
Java(ee) mongo db applications in the cloud
Reactive Streams and RxJava2
Di code steps
Exploring the power of Gradle in android studio - Basics & Beyond
Android Building, Testing and reversing
Are app servers still fascinating
Dagger 2. Right way to do Dependency Injection
Dagger 2. The Right Way to Dependency Injections
Overview of Android Infrastructure
Application Frameworks: The new kids on the block
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
Ad

Viewers also liked (8)

PPTX
Evolving the Android Core with Aspects
PDF
Data Binding in Action using MVVM pattern
PDF
Android Internal Library Management
PDF
Engage and retain users in the android world - Droidcon Italy 2016
PDF
Crafting Great Hypotheses - Droidcon 2016
PDF
A realtime infrastructure for Android apps: Firebase may be what you need..an...
PDF
Add ClassyShark to your Android toolbox
PDF
World-Class Testing Development Pipeline for Android
Evolving the Android Core with Aspects
Data Binding in Action using MVVM pattern
Android Internal Library Management
Engage and retain users in the android world - Droidcon Italy 2016
Crafting Great Hypotheses - Droidcon 2016
A realtime infrastructure for Android apps: Firebase may be what you need..an...
Add ClassyShark to your Android toolbox
World-Class Testing Development Pipeline for Android
Ad

Similar to Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016) (20)

PDF
20130528 solution linux_frousseau_nopain_webdev
PDF
Composer the Right Way - PHPBNL16
PPTX
China Science Challenge
PPTX
SgCodeJam24 Workshop
PDF
Plugin-based software design with Ruby and RubyGems
PDF
Get started with AAR
PDF
Composer The Right Way
PDF
Behaviour Driven Development con Behat & Drupal
PDF
Behaviour Driven Development con Behat & Drupal
PDF
Composer the right way - DPC15
PDF
Composer The Right Way #PHPjhb15
PPT
An introduction to maven gradle and sbt
PDF
Composer the right way [SweetlakePHP]
PDF
Composer The Right Way - PHPUGMRN
PPT
CICON2010: Adam Griffiths - CodeIgniter 2
PPTX
Grails plugin development
PDF
Core Android
PDF
Scaling up development of a modular code base - R Munteanu
PDF
Scaling up development of a modular code base
PPTX
20130528 solution linux_frousseau_nopain_webdev
Composer the Right Way - PHPBNL16
China Science Challenge
SgCodeJam24 Workshop
Plugin-based software design with Ruby and RubyGems
Get started with AAR
Composer The Right Way
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
Composer the right way - DPC15
Composer The Right Way #PHPjhb15
An introduction to maven gradle and sbt
Composer the right way [SweetlakePHP]
Composer The Right Way - PHPUGMRN
CICON2010: Adam Griffiths - CodeIgniter 2
Grails plugin development
Core Android
Scaling up development of a modular code base - R Munteanu
Scaling up development of a modular code base

More from Kelly Shuster (7)

PDF
Android Support Libraries
PDF
Technical speaking 101
PDF
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
PDF
Lightning Talk on Programming Accessible Software
PDF
Android Accessibility - Droidcon London
PDF
Intro to Android (WWC Denver July 2015)
PDF
Android Accessibility - DroidCon Berlin 2015
Android Support Libraries
Technical speaking 101
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Lightning Talk on Programming Accessible Software
Android Accessibility - Droidcon London
Intro to Android (WWC Denver July 2015)
Android Accessibility - DroidCon Berlin 2015

Recently uploaded (20)

PDF
STL Containers in C++ : Sequence Container : Vector
PPTX
Introduction to Windows Operating System
PDF
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PDF
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
PPTX
Monitoring Stack: Grafana, Loki & Promtail
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
Tech Workshop Escape Room Tech Workshop
PPTX
Weekly report ppt - harsh dattuprasad patel.pptx
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PPTX
Cybersecurity: Protecting the Digital World
PPTX
GSA Content Generator Crack (2025 Latest)
PDF
iTop VPN Crack Latest Version Full Key 2025
PDF
Top 10 Software Development Trends to Watch in 2025 🚀.pdf
 
PPTX
Trending Python Topics for Data Visualization in 2025
PPTX
assetexplorer- product-overview - presentation
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
chapter 5 systemdesign2008.pptx for cimputer science students
STL Containers in C++ : Sequence Container : Vector
Introduction to Windows Operating System
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
Advanced SystemCare Ultimate Crack + Portable (2025)
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
Monitoring Stack: Grafana, Loki & Promtail
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
wealthsignaloriginal-com-DS-text-... (1).pdf
Tech Workshop Escape Room Tech Workshop
Weekly report ppt - harsh dattuprasad patel.pptx
Why Generative AI is the Future of Content, Code & Creativity?
Cybersecurity: Protecting the Digital World
GSA Content Generator Crack (2025 Latest)
iTop VPN Crack Latest Version Full Key 2025
Top 10 Software Development Trends to Watch in 2025 🚀.pdf
 
Trending Python Topics for Data Visualization in 2025
assetexplorer- product-overview - presentation
Computer Software and OS of computer science of grade 11.pptx
chapter 5 systemdesign2008.pptx for cimputer science students

Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)