3

Eclipseで開発する場合、緑色のrunボタンを押すことがよくあります。名前の付いたポップアップが表示されAndroid Device Chooser、接続されているデバイスのリストから選択できます。どの電話も表示されているので、一般的には問題ありません。Serial Numberコラムに2つの異なるものが表示されていることを確認しました。

通常はシリアル番号のみが表示されますが、デバイス名、つまりAsus Nexus 7が表示される場合もあります。これは、特にテストするデバイスが複数あり、これらすべてのシリアルを覚えていない(または覚えていない)場合に非常に役立ちます(有名なシリアルを持つデバイスが複数ある場合はさらに混乱します0x0123456789ABCDEF)。

eclipseがデバイス名を表示する理由と時期はわかりませんが、シリアルの代わりにこれらのデバイス名を収集してデバイス選択機能に表示するように、eclipseを強制する方法を見つけたいと思います。

4

1 に答える 1

3

ソースcom.android.ddmlib.Deviceをチェックして、DDMS がデバイス名/シリアル番号を生成する方法を確認します。

private static final String DEVICE_MODEL_PROPERTY = "ro.product.model"; //$NON-NLS-1$
private static final String DEVICE_MANUFACTURER_PROPERTY = "ro.product.manufacturer"; //$NON-NLS-1$

... ...

private static final char SEPARATOR = '-';

... ...

@Override
public String getName() {
    if (mName == null) {
        mName = constructName();
    }

    return mName;
}

private String constructName() {
    if (isEmulator()) {
        String avdName = getAvdName();
        if (avdName != null) {
            return String.format("%s [%s]", avdName, getSerialNumber());
        } else {
            return getSerialNumber();
        }
    } else {
        String manufacturer = cleanupStringForDisplay(
                getProperty(DEVICE_MANUFACTURER_PROPERTY));
        String model = cleanupStringForDisplay(
                getProperty(DEVICE_MODEL_PROPERTY));

        StringBuilder sb = new StringBuilder(20);

        if (manufacturer != null) {
            sb.append(manufacturer);
            sb.append(SEPARATOR);
        }

        if (model != null) {
            sb.append(model);
            sb.append(SEPARATOR);
        }

        sb.append(getSerialNumber());
        return sb.toString();
    }
}

private String cleanupStringForDisplay(String s) {
    if (s == null) {
        return null;
    }

    StringBuilder sb = new StringBuilder(s.length());
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if (Character.isLetterOrDigit(c)) {
            sb.append(Character.toLowerCase(c));
        } else {
            sb.append('_');
        }
    }

    return sb.toString();
}

DDMS がこのデバイス名/シリアル番号をレンダリングする方法を確認したい場合は、com.android.ddmuilib.DevicePanelを参照してください。

ro.product.manufacturerro.product.model/system/build.propにありadb -e shell getprop|grep "\[ro.product"、現在の値を確認するために使用できます。

[ro.product.manufacturer]: [samsung]
[ro.product.model]: [GT-I9100]

次に、DDMS パースペクティブに表示されるデバイス名/シリアル番号はsamsung-gt_i9100-0x0123456789ABCDEFです。一部の kludge ベンダーはこれら 2 つのプロパティを適切に設定していないことに注意してください。そのため、これらのデバイスではシリアル番号のみが表示されます。

Eclipseには、単純にチェックを入れて強制的に表示できる構成はありません。デバイスがルート化されている場合は、これらのプロパティを編集して、デバイスのメーカーとモデルが DDMS の観点から適切に表示されるようにすることができます。たとえば、adb shell setprop <key> <value>ファイル システムで build.prop を使用または直接編集します。


DDMSの詳細

DDMS がデバイス情報を取得するために使用する方法は非常に複雑です。一般に、AndroidDebugBridge が起動して実行されている場合、別のスレッドで DeviceMonitor が開始されます。このスレッドは、デバイスの接続をリッスンし続けgetprop、特定のデバイスにリモート シェル コマンドを発行してデバイスを照会します。ro.product.manufacturerやのような情報ですがro.product.model、このリモート シェル コマンドの実行は信頼性が低く (いくつかの要因の影響を受ける可能性があります)、常にプロパティを取得できるとは限りません。com.android.ddmlib.DeviceMonitorを参照してください。

/**
 * Queries a device for its build info.
 * @param device the device to query.
 */
private void queryNewDeviceForInfo(Device device) {
    // TODO: do this in a separate thread.
    try {
        // first get the list of properties.
        device.executeShellCommand(GetPropReceiver.GETPROP_COMMAND,
                new GetPropReceiver(device));

        queryNewDeviceForMountingPoint(device, IDevice.MNT_EXTERNAL_STORAGE);
        queryNewDeviceForMountingPoint(device, IDevice.MNT_DATA);
        queryNewDeviceForMountingPoint(device, IDevice.MNT_ROOT);

        // now get the emulator Virtual Device name (if applicable).
        if (device.isEmulator()) {
            EmulatorConsole console = EmulatorConsole.getConsole(device);
            if (console != null) {
                device.setAvdName(console.getAvdName());
            }
        }
    } catch (TimeoutException e) {
        Log.w("DeviceMonitor", String.format("Connection timeout getting info for device %s",
                device.getSerialNumber()));

    } catch (AdbCommandRejectedException e) {
        // This should never happen as we only do this once the device is online.
        Log.w("DeviceMonitor", String.format(
                "Adb rejected command to get  device %1$s info: %2$s",
                device.getSerialNumber(), e.getMessage()));

    } catch (ShellCommandUnresponsiveException e) {
        Log.w("DeviceMonitor", String.format(
                "Adb shell command took too long returning info for device %s",
                device.getSerialNumber()));

    } catch (IOException e) {
        Log.w("DeviceMonitor", String.format(
                "IO Error getting info for device %s",
                device.getSerialNumber()));
    }
}

device.executeShellCommand()によってスローされ、処理されるすべての例外に注意してくださいDeviceMonitor.queryNewDeviceForInfo()。これらのいずれかが発生した場合、DDMS はプロパティを適切に取得しません。

完全なソースを読みたい場合は、ここをチェックしてください

于 2013-01-22T09:15:34.950 に答える