forked from qt-creator/qt-creator
Android: select device with "adb -d" if it have invalid serial no
Works only if no correctly detected devices attached to adb. Sometimes serial number becomes '????-????-????' on linux because udev rules are not configured, handling them without configuring will be useful. Also i have 2 phones that have no serial number at all on stock rom. Serial number disappears on some smartphones with CyanogenMod http://forum.cyanogenmod.org/topic/64522-i-have-no-serial-number/ Change-Id: I1a992eb2537342934c60d79c9180edd955aa7862 Reviewed-by: BogDan Vatra <bogdan@kde.org>
This commit is contained in:
@@ -350,8 +350,23 @@ QVector<AndroidDeviceInfo> AndroidConfigurations::connectedDevices(int apiLevel)
|
||||
QList<QByteArray> adbDevs = adbProc.readAll().trimmed().split('\n');
|
||||
adbDevs.removeFirst();
|
||||
AndroidDeviceInfo dev;
|
||||
|
||||
// workaround for '????????????' serial numbers:
|
||||
// can use "adb -d" when only one usb device attached
|
||||
int usbDevicesNum = 0;
|
||||
QStringList serialNumbers;
|
||||
foreach (const QByteArray &device, adbDevs) {
|
||||
dev.serialNumber = QString::fromLatin1(device.left(device.indexOf('\t')).trimmed());
|
||||
const QString serialNo = QString::fromLatin1(device.left(device.indexOf('\t')).trimmed());;
|
||||
if (!serialNo.startsWith(QLatin1String("emulator")))
|
||||
++usbDevicesNum;
|
||||
serialNumbers << serialNo;
|
||||
}
|
||||
|
||||
foreach (const QString &serialNo, serialNumbers) {
|
||||
if (serialNo.contains(QLatin1String("????")) && usbDevicesNum > 1)
|
||||
continue;
|
||||
|
||||
dev.serialNumber = serialNo;
|
||||
dev.sdk = getSDKVersion(dev.serialNumber);
|
||||
if (apiLevel != -1 && dev.sdk != apiLevel)
|
||||
continue;
|
||||
@@ -522,12 +537,13 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
|
||||
|
||||
int AndroidConfigurations::getSDKVersion(const QString &device) const
|
||||
{
|
||||
// workaround for '????????????' serial numbers
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(device);
|
||||
arguments << QLatin1String("shell") << QLatin1String("getprop")
|
||||
<< QLatin1String("ro.build.version.sdk");
|
||||
|
||||
QProcess adbProc;
|
||||
adbProc.start(adbToolPath().toString(),
|
||||
QStringList() << QLatin1String("-s") << device
|
||||
<< QLatin1String("shell") << QLatin1String("getprop")
|
||||
<< QLatin1String("ro.build.version.sdk"));
|
||||
adbProc.start(adbToolPath().toString(), arguments);
|
||||
if (!adbProc.waitForFinished(-1)) {
|
||||
adbProc.kill();
|
||||
return -1;
|
||||
@@ -644,6 +660,17 @@ void AndroidConfigurations::updateAutomaticKitList()
|
||||
KitManager::instance()->registerKit(kit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Workaround for '????????????' serial numbers
|
||||
* @return ("-d") for buggy devices, ("-s", <serial no>) for normal
|
||||
*/
|
||||
QStringList AndroidDeviceInfo::adbSelector(const QString &serialNumber)
|
||||
{
|
||||
if (serialNumber.startsWith(QLatin1String("????")))
|
||||
return QStringList() << QLatin1String("-d");
|
||||
return QStringList() << QLatin1String("-s") << serialNumber;
|
||||
}
|
||||
|
||||
AndroidConfigurations &AndroidConfigurations::instance(QObject *parent)
|
||||
{
|
||||
if (m_instance == 0)
|
||||
|
Reference in New Issue
Block a user