安卓原始代码中的串口SerialPort SerialManger SerialService ISerialService.aidl 等都是@hide隐藏的,外部应用无法调用,定制需要,所以将该Manager启用。下面记录下过程
1.启用SerialService
其掉这三个文件中的@hide标识:
frameworks/base/core/java/android/hardware/SerialManager.java
frameworks/base/core/java/android/hardware/SerialPort.java
frameworks/base/core/java/android/hardware/ISerialManager.aidl
SerialService文件位置:
frameworks/base/services/java/com/android/server/SerialService.java
该服务会在SystemSever.java中进行初始化,这里还需要将Context.java中的SERIAL_SERVICE的@hide去掉:
frameworks/base/core/java/android/content/Context.java
- /*
- * @hide
- */
public static final String SERIAL_SERVICE = "serial";
还有, SerialService是通过读取R.array.config_serialPorts这个String array来加载的/dev/设备节点:
public SerialService(Context context) {
mContext = context;
mSerialPorts = context.getResources().getStringArray(
com.android.internal.R.array.config_serialPorts);
}
所以还需要添加下,文件位置:
framework/base/core/res/res/values/config.xml
在config_serialPorts中添加相应设备节点
在使用时应用需要添加uses-permission权限 android.permission.SERIAL_PORT ;
2.安卓提供了个测试工具,在framework/base/tests/SerialChat, 可以进入该目录, 输入mm 进行编译,输出在 out/target/product/xxx/data/app/中,可以push到手机里验证。
3.权限授权问题, 我在测试这个SerialChat程序时发现android.permission.SERIAL_PORT并未被授权, 通过pm.checkPermission("android.permission.SERIAL_PORT", pinfo.packageName) 检查可以看到。
查看frameworks/base/core/res/AndroidManifest.xml中发现,该permission定义如下:
android:description="@string/permdesc_serialPort"
android:protectionLevel="signature|system" />
可以看到protectionLevel是signature|systeml;
signature表示当申请此权限的应用程序的签名与声明此权限的应用的签名相同时才会授权, 该应用是framwork-res.apk,使用的签名是platform,所以需要应用也要使用platform签名。
system表示是系统应用;
所以这里修改Android.mk,添加LOCAL_CERTIFICATE := platform 再重新编译
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := SerialChat
include $(BUILD_PACKAGE)