21

I have two smart phones (ZTEV788d, system Android 2.3.6) connected to a computer (Ubuntu 11.10) at the same time, using command: adb devices I got this:

List of devices attached
P753A12D    device
P753A12D    device

The serial numbers are the same!

I wrote an application in the computer side to communicate with these two phones, for example install app and push files.

I used these commands:

adb -s P753A12D install XXX.apk
adb -s P753A12D push XXX /sdcard

Now these two phones have the same serial no (P753A12D), when I run these commands I get this error:

error:more than one device

So, my questions are:

  1. Is that normal that two phones to have the same serial no?
  2. Can I change the serial no? if yes, how?
  3. Is there any way to run these install, push commands successfully even if the serial no are the same?

BTW, the WiFi/3G network will be turned off when I'll run the test.

Jason Aller
  • 3,541
  • 28
  • 38
  • 38
Alen
  • 211
  • 1
  • 2
  • 4

7 Answers7

26

Today I found an easy solution for this issue.

adb devices -l

You'll get list of devices with their qualifiers

List of devices attached
P753A12D device usb:26200000 transport_id:1
P753A12D device usb:24400000 transport_id:2

Then you can use qualifiers instead of serial numbers like this

adb -s usb:26200000 install xxx.apk

or with transport_id and -t

adb -t 1 install xxx.apk
Aleksei Potapkin
  • 1,021
  • 12
  • 23
  • 1
    This doesn't seem to work on my Windows box as I get the first one showing up with a long listing but the second one always shows up as 'offline'. Part of the problem, I think, is that the long listing doesn't show the usb identifier but uses the model number as in 'device:XXXXX' instead of 'usb:yyyy' – melston Aug 05 '15 at 22:53
  • 1
    Now `adb` support `-t ID use device with given transport id`, you could also use like `adb -t 1 install xxx.apk` – Xiao Jan 03 '19 at 03:52
  • Thanks, will add up it to the answer. – Aleksei Potapkin Jan 03 '19 at 12:42
9

if your device is rooted try this way
to change serial number your devices , first connect one of them to your pc then type this in cmd

adb devices

this shows your device id (serial number).

List of devices attached
P753A12D    device

pick some new name ,for example NAME1
then type this commands

adb shell
su 
device_name="NEW_NAME"
cd /sys/class/android_usb/android0/
echo -n $device_name > iSerial
cat iSerial

exit exit from root
exit exit from shell


START
now unplug the usb cable and run this commands

adb kill-server

connect your device again and type

adb devices

now you can see changes

List of devices attached
New_NAME    device

END

note : if it did not work first time
disconnect your phone and do this parts of my guide from START to END again.

Rahmat Waisi
  • 1,293
  • 1
  • 15
  • 36
6

I faced the very same problem. It's because the adb tool uses the serial numbers for identification of devices connected to usb instead of their device paths (which are unique for sure).

If you feel up to getting your hands dirty, download the Android source tree, go to system/core/adb/transport.c, change it to something like that:

void register_usb_transport(usb_handle *usb, const char *serial, const char *devpath, unsigned writeable)
{
    atransport *t = calloc(1, sizeof(atransport));
    D("transport: %p init'ing for usb_handle %p (sn='%s')\n", t, usb,
      serial ? serial : "");
    init_usb_transport(t, usb, (writeable ? CS_OFFLINE : CS_NOPERM));
//    if(serial) {
//        t->serial = strdup(serial);
//    }
    if(devpath) {
        t->devpath = strdup(devpath);
        t->serial = strdup(devpath);
    }

type make adb from the top level path and voila. Devices use usb paths for identification. Now you can install & execute all of the devices from Eclipse with one click.

Seraphim's
  • 12,559
  • 20
  • 88
  • 129
Miro Kropacek
  • 2,742
  • 4
  • 26
  • 41
  • 1
    It turns out that this doesn't seem to work for Windows. If you look at the file usb_windows.cpp where register_usb_transport is called it appears to always be called with devpath set to NULL. – melston Aug 05 '15 at 22:51
5

1. Is that normal that two phones to have the same serial number?

The purpose of the serial number is to uniquely identify the device, so they should be different. That being said, some manufacturers don't bother. It's also possible that the firmware is reporting the number incorrectly.

https://stackoverflow.com/questions/4636794/strange-output-of-adb-devices?rq=1

You can check the serial number on the actual devices, and see if it matches what adb is reporting.

Settings > About Device > Phone Identity > Device Serial Number

2. Can I change the serial number? if yes, how?

There isn't an easy or consistent method for doing this that I'm aware of. Here are some examples where others have accomplished this feat (but I have not):

xda-developers.com - Change Wifi , BT , IMEI , Serial Number of any mtk android phone

hugestreet.info - How To Change IMEI, Device ID of Any Android Device


3. Is there any way to run these install, push commands successfully even if the serial numbers are the same?

There shouldn't be any problem running commands if only one device is connected at a time.

Community
  • 1
  • 1
CodeShane
  • 6,480
  • 1
  • 18
  • 24
  • I checked the actual devices,the serial number is the same in these two phones. thanks Codeshane! – Alen Dec 24 '12 at 02:30
  • You're welcome. Were you able to get this working? If you're happy with my answer, please "accept" it, otherwise please let me know what else I can do. thanks! – CodeShane Dec 25 '12 at 20:29
  • The link to mailinglistarchive.com is dead. Could you update it? – Bruno Parmentier Jun 01 '15 at 08:40
1

The answer given by @mirokropacek works for Linux (and presumably Mac, too) but doesn't work for Windows, unfortunately. This is due to the way the register_usb_transport function is called in Windows. It turns out the devpath parameter is always NULL in Windows. I needed to handle the same situation so I adapted the solution given above to randomly generate a device ID for each device if the serial parameter is NULL or it is empty (zero length).

I don't need to worry about differentiating devices over long periods of time and many devices so generating a pseudo-random number for the device ID with rand, then using sprintf to create a string representation of that ID seems to be sufficient for my needs but YMMV. It only generates a 4-digit hex number but it works well enough for me (for now at least).

melston
  • 2,198
  • 22
  • 39
0

If you don't want to change the device itself, and/or don't have root access, and the device has network access, you could switch to using TCPIP instead of USB:

  1. Switch adb to using TCPIP: adb tcpip 5555
  2. Have adb connect to the device using the network: adb connect yourhostname

I've run this through SSH tunnels where it would connect to localhost, so all devices show up as 'localhost' which is quite unuseful. Adding hosts to /etc/hosts (that all pointed to localhost) fixed that for me.

0

Additionally you can use below commands when to handle multiple instance attached (device + emulator)

adb -d shell #(or adb -e shell if you're connecting to an emulator).

-d stands for device and -e stands for emulator

Sazzad Hissain Khan
  • 37,929
  • 33
  • 189
  • 256