问题:智能货柜上线以后,因为分布在全国各地,或者在国外,遇到问题需要调试设备的时候,需要及时连接设备,查看设备信息,拉取日志。
一种方式是直接上传日志到云端,通过云端查看日志信息,但是耗费流量,而且浪费云端资源;
二种方式:采用VPN网络,通过adb tcp连接设备,就能访问设备,拉取日志,查看设备状态。
采用第二种方案比较好。
虚拟专用网(VPN)是一条通信隧道,可以在不可信的中间网络上提供身份认证和数据通信的点对点传输。大多数VPN使用加密技术来保护封装的通信数据,但是加密对于VPN 连接而言并非必需的。
简单来说,设备不论连接什么类型的网络,只要和VPN服务器提供的网络,那么这些设备就在VPN网络中,相当于在同一个虚拟局域网内。因此就可以使用adb访问智能货柜设备。
因为需要支持VPN访问,因此AOSP需要定制支持VPN权限。
应用连接VPN,需要授权弹窗用户确认,默认直接授权。
frameworks/base/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
- mService = IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
-
- // ==== modify start ==== zhouronghua VPN Authorize
- try {
- if (mService.prepareVpn(null, mPackage, UserHandle.myUserId())) {
- // Authorize this app to initiate VPN connections in the future without user
- // intervention.
- mService.setVpnPackageAuthorization(mPackage, UserHandle.myUserId(), mVpnType);
- setResult(RESULT_OK);
- finish();
- }
- } catch (Exception e) {
- Log.e(TAG, "onClick", e);
- }
- // ==== modify end ====
- if (prepareVpn()) {
- setResult(RESULT_OK);
- finish();
- return;
- }
- // ==== modify start ==== zhouronghua VPN Authorize
- /** View view = View.inflate(this, R.layout.confirm, null);
- ((TextView) view.findViewById(R.id.warning)).setText(
- Html.fromHtml(getString(R.string.warning, getVpnLabel()),
- this, null /* tagHandler ));
- mAlertParams.mTitle = getText(R.string.prompt);
- mAlertParams.mPositiveButtonText = getText(android.R.string.ok);
- mAlertParams.mPositiveButtonListener = this;
- getWindow().setCloseOnTouchOutside(false);
- getWindow().addPrivateFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
- Button button = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- button.setFilterTouchesWhenObscured(true); ***/
- // ==== modify end ====
- }
frameworks/base/services/core/java/com/android/server/connectivity/Vpn.java
- // ==== modidy start ==== zhouronghua
- private void enforceControlPermission() {
- // mContext.enforceCallingPermission(Manifest.permission.CONTROL_VPN, "Unauthorized Caller");
- }
-
- private void enforceControlPermissionOrInternalCaller() {
- // Require the caller to be either an application with CONTROL_VPN permission or a process
- // in the system server.
- //mContext.enforceCallingOrSelfPermission(Manifest.permission.CONTROL_VPN,
- // "Unauthorized Caller");
- }
-
- private void enforceSettingsPermission() {
- // mContext.enforceCallingOrSelfPermission(Manifest.permission.NETWORK_SETTINGS,
- // "Unauthorized Caller");
- }
- // ==== modidy end ====
注释掉VPN强制授权。2.1已经自动授权了。
需要继承一个VPN客户端,用于连接VPN服务器。
openvpn.apk内置到系统中。
前面第一弹已经写过,此处就不再重复。
packages/apps/Sandstar/Sandstar/Android.mk
- include $(CLEAR_VARS)
- LOCAL_MODULE := openvpn
- LOCAL_MODULE_TAGS := optional
- LOCAL_MODULE_CLASS := APPS
- LOCAL_CERTIFICATE := platform
- LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
- LOCAL_SRC_FILES := openvpn.apk
- LOCAL_DEX_PREOPT := false
- include $(BUILD_PREBUILT)
这样,使用VPN的时候,下发VPN key, 然后客户端通过VPN key连接网络。