软件平台:Android11
硬件平台:QCS6125
需求:同一套代码基线支持多个产品型号,如S2N、S2C、E1等,但是编译的时候model属性字段在build目录就是配置好不可再更改的,如何动态的实现展示不同的mtp设备名称呢?
主要涉及两个部分的代码变更:
1、framework目录相关改动:
java
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index 798bf6e2f8e..a63e4229317 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -665,13 +665,28 @@ public class MtpDatabase implements AutoCloseable {
}
}
+ private String getDeviceName() {
+ String devDefName = "S2";
+ String devS2N = "S2N";
+ String getName = null;
+
+ getName = SystemProperties.get("ro.product.yfdsubmodel");
+ if (null == getName) return devDefName;
+
+ if (getName.contains("S2N"))
+ return devS2N;
+ else
+ return devDefName;
+ }
+
@VisibleForNative
private int getDeviceProperty(int property, long[] outIntValue, char[] outStringValue) {
switch (property) {
case MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER:
case MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME:
// writable string properties kept in shared preferences
- String value = mDeviceProperties.getString(Integer.toString(property), "");
+ //String value = mDeviceProperties.getString(Integer.toString(property), "");
+ String value = getDeviceName();
int length = value.length();
if (length > 255) {
length = 255;
上述submodel属性是系统首次启动init根据内核硬件检测初始化的boardid值去初始化的,用于区分细微硬件差别。
2、packages/services/Mtp目录改动:
java
diff --git a/src/com/android/mtp/MtpService.java b/src/com/android/mtp/MtpService.java
index 8520b9e..1fa1aaa 100644
--- a/src/com/android/mtp/MtpService.java
+++ b/src/com/android/mtp/MtpService.java
@@ -32,6 +32,7 @@ import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.os.SystemProperties;
import android.os.storage.StorageEventListener;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
@@ -165,6 +166,27 @@ public class MtpService extends Service {
return START_REDELIVER_INTENT;
}
+ private String getDeviceName() {
+ String devDefName = "S2";
+ String getName = null;
+
+ getName = SystemProperties.get("ro.product.yfdsubmodel");
+ if (null == getName) return devDefName;
+
+ if (getName.contains("S2N"))
+ return "S2N";
+ else if (getName.contains("S2C"))
+ return "S2C";
+ else if (getName.contains("S2A"))
+ return "S2A";
+ else if (getName.contains("S3"))
+ return "S3";
+ else if (getName.contains("E1"))
+ return "E1";
+ else
+ return devDefName;
+ }
+
private synchronized void startServer(StorageVolume primary, String[] subdirs) {
if (!(UserHandle.myUserId() == ActivityManager.getCurrentUser())) {
return;
@@ -200,10 +222,14 @@ public class MtpService extends Service {
fd = controlFd.getFileDescriptor();
}
+ //final MtpServer server =
+ // new MtpServer(database, fd, mPtpMode,
+ // new OnServerTerminated(), Build.MANUFACTURER,
+ // Build.MODEL, "1.0");
final MtpServer server =
new MtpServer(database, fd, mPtpMode,
new OnServerTerminated(), Build.MANUFACTURER,
- Build.MODEL, "1.0");
+ getDeviceName(), "1.0");
database.setServer(server);
sServerHolder = new ServerHolder(server, database);
之所以需要此改动,是因为我本地一台windows一台mac,改动第一条,在win生效,但是在mac没效果,添加第二条改动后,mac显示也正常。