Android11编译第五弹:开启VPN权限

问题:智能货柜上线以后,因为分布在全国各地,或者在国外,遇到问题需要调试设备的时候,需要及时连接设备,查看设备信息,拉取日志。

一种方式是直接上传日志到云端,通过云端查看日志信息,但是耗费流量,而且浪费云端资源;

二种方式:采用VPN网络,通过adb tcp连接设备,就能访问设备,拉取日志,查看设备状态。

采用第二种方案比较好。

一、什么是VPN网络?

虚拟专用网(VPN)是一条通信隧道,可以在不可信的中间网络上提供身份认证和数据通信的点对点传输。大多数VPN使用加密技术来保护封装的通信数据,但是加密对于VPN 连接而言并非必需的。

简单来说,设备不论连接什么类型的网络,只要和VPN服务器提供的网络,那么这些设备就在VPN网络中,相当于在同一个虚拟局域网内。因此就可以使用adb访问智能货柜设备。

因为需要支持VPN访问,因此AOSP需要定制支持VPN权限。

二、集成步骤

2.1 去掉VPN授权确认弹窗

应用连接VPN,需要授权弹窗用户确认,默认直接授权。

frameworks/base/packages/VpnDialogs/src/com/android/dialogs/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 ====
    }

 2.2 关闭VPN授权申请

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已经自动授权了。

2.3 集成open APK

需要继承一个VPN客户端,用于连接VPN服务器。

open.apk内置到系统中。

前面第一弹已经写过,此处就不再重复。

packages/apps/Sandstar/Sandstar/Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE        := open
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := APPS
LOCAL_CERTIFICATE   := platform
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES     := open.apk
LOCAL_DEX_PREOPT    := false
include $(BUILD_PREBUILT)

这样,使用VPN的时候,下发VPN key, 然后客户端通过VPN key连接网络。

你可能感兴趣的:(Framework,framework,android)