ODM: Open Device Manager for Android


View on GitHub

[ Problems with the YouTube video? Try VIMEO: https://vimeo.com/83928836 ]

[Featured on XDA Developers: http://www.xda-developers.com/and... ]

Open Device Manager, or ODM, is a fully free, open source, end-to-end encrypted alternative to Google’s Android Device Manager that can be installed in right around 10 seconds. Building on the look and feel of the original ADM, ODM focuses on supporting additional features while giving users the security and privacy of a self-hosted, open source platform.

ODM was created because of the lack of fully open source and secure device managers on the market. While there are solutions that offer open source web components, the Android Applications are not, and are known to use Google Analytics or ad networks that pull information such as IP address, all of which eliminate 100% privacy. ODM overcomes this by offering everything up for grabs on github. We will also be submitting the github repository to F-Droid, an alternative App Store that compiles open source applications directly from github, so you know you’re getting a safe APK.

Features include:

  • Open source web interface
  • Open source Android Application
  • All notifications/commands sent through Google are encrypted first
  • Full AJAX interface
  • 10 second server install
  • Multi-user support
  • Multi-device per user support
  • Last and previous locations
  • Google maps integration
  • Lock device
  • Take photos with rear and front cameras
  • Alert ringer to locate the phone
  • Receive an SMS to identify insertion of new SIM
  • Send a custom notification
  • Wipe device
  • Log of all previous activity


10 Second Installation

Installation is simple and straightforward. Use the below or watch the video embedded above.

  1. Extract the web archive to any folder on a system running PHP.
  2. Edit include/config.php to turn on registrations (and change any other settings you would like): $ALLOW_REGISTRATIONS = true
  3. Open mysql: mysql
  4. Create the database: create database odm;
  5. Exit mysql: exit;
  6. Import database structure: mysql odm < sql/odm.sql

Also, be sure php5-mcrypt and php5-curl are installed on your system.

Please pose any questions or discussion to the thread at: http://forum.xda-developers.com/showthread.php?t=2601720


The following variables can be edited in config.php.

Sets the database connection information:

   $DB_HOST = "localhost";
   $DB_USER = "root";
   $DB_PASSWORD = "";
   $DB_DATABASE = "odm";

Whether or not to allow user registration. This must be true to create the first user, but can be disabled after that for security.



  • User testing
  • Fix bug in Android 4.0+ that crashes some devices when using the camera in a service
  • Improve new user registration process with email validation
  • Expert security audit of encryption scheme (I am not a security expert, and used samples provided online for the PHP to android methodology)

Change Log

v0.01 beta

  • Beta release (see To-Do)


Please do not distribute ODM outside of github or this site.  Directing links here will ensure the latest version of ODM is always in circulation.

Download the latest Web Panel source: https://github.com/Fmstrat/odm-web/archive/master.zip

Download the latest APK: https://github.com/Fmstrat/odm/raw/master/latest/odm.apk

Remember to check out the rest of the site!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

34 Responses to “ODM: Open Device Manager for Android”

[...] Sebbene sia una soluzione che potrebbe interessare solo un ristretto gruppo di utenti, potete trovare download e maggiori informazioni sul sito del progetto. [...]

[...] Sebbene sia una soluzione che potrebbe interessare solo un ristretto gruppo di utenti, potete trovare download e maggiori informazioni sul sito del progetto. [...]

[...] Sebbene sia una soluzione che potrebbe interessare solo un ristretto gruppo di utenti, potete trovare download e maggiori informazioni sul sito del progetto. [...]

[...] molto completo e perciò per maggiori informazioni vi consigliamo di dirigervi direttamente sul sito ufficiale, oppure di dare un’occhiata al thread aperto nel forum di XDA. Qui in basso trovate invece [...]

Andy says:

Love it!
Thanks for doing this!

tempo says:

Great work!
For the heck of it, I tried to start the client on an old htc hero (gsm) running a freshly installed cm 7.2.
It crashed. :)
Maybe the logcat helps you IF you want to support this old device:

01-11 19:13:43.303: I/ActivityManager(155): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0×10200000 cmp=com.nowsci.odm/.StartupActivity } from pid 258
01-11 19:13:43.473: I/ActivityManager(155): Start proc com.nowsci.odm for activity com.nowsci.odm/.StartupActivity: pid=946 uid=10057 gids={3003, 1006, 1015}
01-11 19:13:43.733: D/dalvikvm(155): GC_CONCURRENT freed 745K, 37% free 5614K/8903K, external 600K/1112K, paused 15ms+15ms
01-11 19:13:44.113: D/szipinf(946): Initializing inflate state
01-11 19:13:44.313: I/ActivityManager(155): Starting: Intent { cmp=com.nowsci.odm/.MainActivity } from pid 946
01-11 19:13:44.773: I/ActivityManager(155): Displayed com.nowsci.odm/.MainActivity: +389ms (total +5s763ms)
01-11 19:13:44.983: W/GCM(246): DIR: /data/data/com.google.android.gms/app_APP /data/data/com.google.android.gsf
01-11 19:13:45.193: D/dalvikvm(246): GC_CONCURRENT freed 535K, 45% free 4044K/7239K, external 0K/0K, paused 11ms+8ms
01-11 19:13:45.433: W/dalvikvm(946): threadid=10: thread exiting with uncaught exception (group=0×40018560)
01-11 19:13:45.443: E/AndroidRuntime(946): FATAL EXCEPTION: AsyncTask #2
01-11 19:13:45.443: E/AndroidRuntime(946): java.lang.RuntimeException: An error occured while executing doInBackground()
01-11 19:13:45.443: E/AndroidRuntime(946): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.lang.Thread.run(Thread.java:1019)
01-11 19:13:45.443: E/AndroidRuntime(946): Caused by: java.lang.ClassCastException: org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl
01-11 19:13:45.443: E/AndroidRuntime(946): at com.nowsci.odm.CommonUtilities.invalidPost(CommonUtilities.java:260)
01-11 19:13:45.443: E/AndroidRuntime(946): at com.nowsci.odm.CommonUtilities.post(CommonUtilities.java:174)
01-11 19:13:45.443: E/AndroidRuntime(946): at com.nowsci.odm.ServerUtilities$1.doInBackground(ServerUtilities.java:37)
01-11 19:13:45.443: E/AndroidRuntime(946): at com.nowsci.odm.ServerUtilities$1.doInBackground(ServerUtilities.java:1)
01-11 19:13:45.443: E/AndroidRuntime(946): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-11 19:13:45.443: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-11 19:13:45.443: E/AndroidRuntime(946): … 4 more
01-11 19:13:45.463: W/ActivityManager(155): Force finishing activity com.nowsci.odm/.MainActivity
01-11 19:13:46.533: I/ActivityManager(155): No longer want com.koushikdutta.rommanager (pid 549): hidden #16
01-11 19:13:48.723: I/Process(946): Sending signal. PID: 946 SIG: 9
01-11 19:13:48.833: E/JavaBinder(155): !!! FAILED BINDER TRANSACTION !!!
01-11 19:13:48.833: E/JavaBinder(155): !!! FAILED BINDER TRANSACTION !!!
01-11 19:13:48.883: I/ActivityManager(155): Process com.nowsci.odm (pid 946) has died.
The screen showed “trying to register…” but immediately crashed.

Benjamin Curtis says:

@tempo: I literally just fixed this. Re-download the APK and it should work!

tempo says:

sadly it didn’t change.
I redonloaded an installed the new apk (a slightly different file size affirmed that it was a newer version), but the same error. Again, this is a very old device, so there might be a memory issue or something. But if you are interestet here is the new logcat:
01-11 21:30:53.433: I/ActivityManager(155): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0×10200000 cmp=com.nowsci.odm/.StartupActivity bnds=[163,339][237,418] } from pid 258
01-11 21:30:53.543: I/ActivityManager(155): Start proc com.nowsci.odm for activity com.nowsci.odm/.StartupActivity: pid=1315 uid=10057 gids={3003, 1006, 1015}
01-11 21:30:53.963: D/szipinf(1315): Initializing inflate state
01-11 21:30:54.173: I/ActivityManager(155): Starting: Intent { cmp=com.nowsci.odm/.MainActivity } from pid 1315
01-11 21:30:54.783: I/ActivityManager(155): Displayed com.nowsci.odm/.MainActivity: +554ms (total +22s217ms)
01-11 21:30:54.893: W/GCM(246): DIR: /data/data/com.google.android.gms/app_APP /data/data/com.google.android.gsf
01-11 21:30:55.073: D/dalvikvm(155): GC_CONCURRENT freed 704K, 40% free 5619K/9223K, external 600K/1112K, paused 36ms+57ms
01-11 21:30:55.203: D/dalvikvm(246): GC_CONCURRENT freed 502K, 44% free 4096K/7239K, external 0K/0K, paused 27ms+8ms
01-11 21:30:55.513: W/dalvikvm(1315): threadid=10: thread exiting with uncaught exception (group=0×40018560)
01-11 21:30:55.523: E/AndroidRuntime(1315): FATAL EXCEPTION: AsyncTask #2
01-11 21:30:55.523: E/AndroidRuntime(1315): java.lang.RuntimeException: An error occured while executing doInBackground()
01-11 21:30:55.523: E/AndroidRuntime(1315): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.lang.Thread.run(Thread.java:1019)
01-11 21:30:55.523: E/AndroidRuntime(1315): Caused by: java.lang.ClassCastException: org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl
01-11 21:30:55.523: E/AndroidRuntime(1315): at com.nowsci.odm.CommonUtilities.invalidPost(CommonUtilities.java:260)
01-11 21:30:55.523: E/AndroidRuntime(1315): at com.nowsci.odm.CommonUtilities.post(CommonUtilities.java:174)
01-11 21:30:55.523: E/AndroidRuntime(1315): at com.nowsci.odm.ServerUtilities$1.doInBackground(ServerUtilities.java:37)
01-11 21:30:55.523: E/AndroidRuntime(1315): at com.nowsci.odm.ServerUtilities$1.doInBackground(ServerUtilities.java:1)
01-11 21:30:55.523: E/AndroidRuntime(1315): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-11 21:30:55.523: E/AndroidRuntime(1315): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-11 21:30:55.523: E/AndroidRuntime(1315): … 4 more
01-11 21:30:55.533: W/ActivityManager(155): Force finishing activity com.nowsci.odm/.MainActivity
01-11 21:30:56.393: I/ActivityManager(155): No longer want com.android.packageinstaller (pid 1104): hidden #16
01-11 21:30:58.733: I/Process(1315): Sending signal. PID: 1315 SIG: 9
01-11 21:30:58.783: W/InputManagerService(155): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4074c0e8
01-11 21:30:58.833: I/ActivityManager(155): Process com.nowsci.odm (pid 1315) has died.
PS: Feel free to delete my posts if you don’t want the comment section spammed with logfiles. :)

Benjamin Curtis says:

@tempo It should run fine in 7.2, though I’ve not tested on a device running it. Are you able to get to the registration screen? Did it ask for admin access at start? Out of curiosity do you have require valid SSL on but using a non SSL server?

tempo says:

Installed -> startet -> gave device admin -> configure server -> [client trying to connect to server] -> CRASH
Server is http, I DID uncheck the require SSL box.
Probably important:
My server is in the root of a subdomain, meaning the address is http://sub.domain.tld WITHOUT any subfolder.
The server side is running well (easy install, map works), it displays “no device connected”, so the crash happends befor/during registration.

Benjamin Curtis says:

@tempo: Finally! Your comment helped me find it. Latest APK should solve your issue. Please keep in mind submitting via HTTP is leaving some of your data unencrypted.

Jeff says:

Installed website onto a windows home server 2011 and apk onto a HTC One running .4.4 and it’s working flawlessly. even taking pictures from both cameras. Thanks!

tempo says:

Success. The newest apk works well with the above settings!

Thank you for the ssl-warning. Right now I just use a freshly installed ROM with no personal information and I do not have a real SSL certificate on the server.

PS: The link “offering everything up for grabs on github” links to the github main page not your repository

PPS: I tried to import your repository into the ADT-eclipse environment, but failed. Any tipps? This is my first experience with android development.

Park says:

Installed website on to a Ubuntu clean install. Website loads fine, but when trying to register I get the following error:
“Fatal error: Call to undefined function mcrypt_create_iv() in /var/www/odm/register.php on line 26″

I have installed both php5_mcrypt and php5_curl libs. Do you know what could be causing the error?

Thanks for all of your work on this!

Benjamin Curtis says:

@tempo: Look up guides on using Google Play Services with Eclipse. That’s likely the culprit for the import.
@Park: This is usually due to simply needing to restart HTTPD after installing mcrypt, or mcrypt not being enabled in php.ini. Take a look at: http://stackoverflow.com/questions/12479983/cant-find-mcrypt-call-to-undefined-function-laravel-mcrypt-create-iv

tempo says:

That (among some other minor errors on my side) was actually the solution. I have the project running now.

This is what worked for me:
Checkout ODM
-> import odm (not google-play-services_lib) into workplace
-> open odm project settings (context menu) and update build target to the version you have installed
-> add google_play_services to buildpath
-> remove from Manifest-File:

-> update build target as above in manifest

I can build it now with just three android lint warning.

Thanks again!

Alex says:

Gave this a try: From download to registered working device: 10 Minutes
Great work!
I think you know that taking pictures on Android 4.4.2/Nexus 4 crashes the App, right?

Frank M. says:

Force close on Galaxy S3 i9300 using CM11

[...] dem, Open Device Manager for Android, kurz ODM , handelt es sich um das OpenSource-Pendant des von Google bekannten Android Gerätemanager. Mit [...]

[...] das Vertrauen in das Projekt ODM wird für mich in der Form getrübt, dass ich doch Googleanwendungen, welche ich nicht einen µ  [...]

[...] ODM: Open Device Manager for Android [...]

[...] ODM: Open Device Manager for Android Interessante Open-Source-Alternative zum Android-Gerätemanager und für den eigenen Webserver (Permalink) [...]

sensati says:

are you still alive?

zkvvoob says:


I’d very much like to have ODM as part of my ownCloud server, given that it itself is a way to avoid using cloud services we cannot control.

In view of this, could anyone help me figure out how to use the existent ownCloud user database, instead of having to register a special ODM one?

Thanks in advance!

Larry says:

Hi -
How would we set up the option to “Receive an SMS to identify insertion of new SIM”



karol says:

I have “Attempting to register” and instatntly “Server registration failed…” on 4.4.2 KitKat. Any sugestions?

karol says:

WEB Access authentication could be the problem…?

Daniel says:

Hello, I get the following error while trying to deploy on my godaddy server, can you please help??

Undefined class constant ‘MYSQL_ATTR_MAX_BUFFER_SIZE’ in D:\Hosting\9149369\html\odm-web-master\odm\include\db.php on line 7


Tom says:

Cool project, thanx

However, I can not use it, for the app depends on google play services.

[...] Odm: open device manager for android | nowsci.com [...]

[...] Odm: open device manager for android | nowsci.com [...]

[...] Odm: open device manager for android | nowsci.com [...]

Pablo says:

I installed the server and it seems to work. I created my user and I can login.
I installed the apk and it seems to connect to the server.
But something is missing. The apk leaves messages on the server (I see them on the database) but the webUI never shows my device. It says I have no devices registered.

Rainer Bendig says:

the mobile app did not connect to my server (according to php-fpm logs and apache logs) but keeps telling registration failed. ;-( accessing the odm url via mobile browser works.

Following the hottest hardware and software for today's digital junkie.

Off the wall articles and interviews from the technology sector.

The latest happenings in the technology industry.

Techviews Random Bits News Tools

Help us out, become a fan!

We provide tools such as the Registry Changer and MythMediaMonitor along with current news and reviews free of charge to our audience. To help keep us going, please take a brief moment to follow us on any of the networks you have an account on.

We've detected an Ad-Blocker

It appears as though you are using an ad blocking program. Sites like nowsci.com are only able to provide content for free with support from our sponsors.

Please consider disabling your ad blocking program on our site. Thank you.