ソース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.manufacturerとro.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 はプロパティを適切に取得しません。
完全なソースを読みたい場合は、ここをチェックしてください。