내부 이더넷 네트워크 구성

Android Auto OS 13 이상에는 다음 작업을 할 수 있는 기능이 포함되어 있습니다. 이더넷 네트워크를 구성하고 관리합니다. 그림 1은 네트워크의 예를 보여줍니다. 자동차 다이어그램:

Android Auto 네트워킹

그림 1. Android Auto 네트워킹

이 그림은 온보드 이더넷 네트워크를 구성하고 관리하는 EthernetManager 클래스 eth0.1, eth0.2, eth0.3입니다. 그림 1의 나머지 부분은 이 문서를 참조하세요

기본 이더넷 네트워크 설정

기본 네트워크 설정을 지정하려면 리소스 오버레이 config_ethernet_interfaces:

<string-array translatable="false" name="config_ethernet_interfaces">
        <!--
        <item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item>
        <item>eth2;;ip=192.168.0.11/24</item>
        <item>eth3;12,13,14,15;ip=192.168.0.12/24;1</item>
        -->
    </string-array>

config_ethernet_interfaces 리소스 오버레이를 보여주는 예입니다. config.xml

코드에 대한 핵심 사항

  • eth1, eth2, eth3은 구성 중인 네트워크 인터페이스의 이름입니다.
  • 연속되는 12, 13, 14, 15 숫자는 다음을 나타냅니다. 네트워크 기능 있습니다.
  • ip=, gateway=, dns는 초기 IP 주소, 게이트웨이, 네트워크용 DNS입니다.

네트워크 인터페이스 사용 또는 사용 중지

네트워크 인터페이스를 사용 설정하려면 다음을 호출합니다. EthernetManager.enableInterface():

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void enableInterface(String ifaceName) {
        mEthernetManager.enableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

코드에 대한 핵심 사항

  • ifaceName은 사용 설정할 네트워크 인터페이스의 이름입니다.
  • getMainExecutor()는 앱 컨텍스트를 반환합니다.
  • OutcomeReceiver는 다음을 반환하는 완료를 전달하는 데 사용되는 콜백입니다. 성공 시 네트워크 이름 업데이트 또는 EthernetNetworkManagementException 실행 시 오류가 발생했습니다.

네트워크 인터페이스를 사용하도록 설정하면 EthernetManager.updateConfiguration() 구성이 설정되지 않은 경우 EthernetManager.updateConfiguration()의 경우 네트워크 인터페이스는 리소스 오버레이 config_ethernet_interfaces 또는 기본 이더넷 네트워크 구성을 사용할 수 있습니다.

네트워크 인터페이스를 사용 중지하려면 EthernetManager.disableInterface():

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void disableInterface(String ifaceName) {
        mEthernetManager.disableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

코드에 대한 핵심 사항

  • ifaceName은 사용 중지할 네트워크 인터페이스의 이름입니다.
  • getMainExecutor()는 앱 컨텍스트를 반환합니다.
  • OutcomeReceiver는 다음을 반환하는 완료를 전달하는 데 사용되는 콜백입니다. 성공 시 네트워크 이름 업데이트 또는 EthernetNetworkManagementException 실행 시 오류가 발생했습니다.

네트워크 구성 업데이트

업데이트 방법 이더넷 네트워크 구성, 호출 EthernetManager.updateConfiguration():

public final class ConfigurationUpdater {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mCallback;

    public ConfigurationUpdater(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mCallback = callback;
    }

    public void updateNetworkConfiguration(String packageNames,
            String ipConfigurationText,
            String networkCapabilitiesText,
            String interfaceName)
            throws IllegalArgumentException, PackageManager.NameNotFoundException {

        EthernetNetworkUpdateRequest request = new EthernetNetworkUpdateRequest.Builder()
                .setIpConfiguration(getIpConfiguration(ipConfigurationText))
                .setNetworkCapabilities(getCapabilities(
                        interfaceName, networkCapabilitiesText, packageNames))
                .build();

        mEthernetManager.updateConfiguration(interfaceName, request,
                mApplicationContext.getMainExecutor(), mCallback);

    }
}

코드에 대한 핵심 사항

  • getCapabilities() 드림 현재 네트워크 및 클라이언트 ID를 가져오는 기능을 실행하고 convertToUIDs()를 호출하여 전환 사람이 읽을 수 있는 패키지 이름을 Linux 고유 식별자 (UID)로 변환합니다. 일반적으로 UID를 모름 이를 관련 패키지에 미리 추가할 수 있습니다 따라서 kubectl 명령어 EthernetManager.updateConfiguration(): 일부 앱에 대한 액세스를 제한하는 경우 UID를 사용해야 합니다
  • request 드림 내부 네트워크에 사용할 구성입니다. 이 요청에는 IP 구성 및 네트워크에 대한 새 설정이 포함될 수 있습니다. 기능을 제공합니다 만약 네트워크가 연결 스택에 등록되면 구성할 수 있습니다 이 구성은 재부팅 시 유지되지 않습니다.
  • getMainExecutor()는 리스너가 호출되는 실행자를 반환합니다.
  • mCallback는 다음을 반환하는 완료를 전달하는 데 사용되는 콜백입니다. 성공 시 네트워크 이름 업데이트 또는 EthernetNetworkManagementException 실행 시 오류가 발생했습니다.

updateConfiguration()가 고려된 네트워크의 특성을 업데이트할 수 있음 변경할 수 없습니다. 이 네트워크 다운, 업데이트, 복구 작업을 수행할 수 있으며 업데이트할 속성입니다.

네트워크를 일부 앱으로 제한

EthernetManager#updateConfiguration을(를) 사용하여 허용되는 UID의 하위 집합입니다. 이 메서드를 사용하여 내부 차량 네트워크처럼 소규모 하위 집합에서만 사용 가능한 설계하는 방법을 알아봅니다.

Android는 주로 UID를 기준으로 앱을 추적합니다. 다음 코드는 UIDToPackageNameConverter.java 드림 패키지 이름 문자열에서 일련의 UID를 가져오는 방법을 보여줍니다.

public static Set<Integer> convertToUids(Context applicationContext, String packageNames)
            throws PackageManager.NameNotFoundException {
        final PackageManager packageManager = applicationContext.getPackageManager();
        final UserManager userManager = applicationContext.getSystemService(UserManager.class);

        final Set<Integer> uids = new ArraySet<>();
        final List<UserHandle> users = userManager.getUserHandles(true);

        String[] packageNamesArray = packageNames.split(",");
        for (String packageName : packageNamesArray) {
            boolean nameNotFound = true;
            packageName = packageName.trim();
            for (final UserHandle user : users) {
                try {
                    final int uid =
                            packageManager.getApplicationInfoAsUser(packageName, 0, user).uid;
                    uids.add(uid);
                    nameNotFound = false;
                } catch (PackageManager.NameNotFoundException e) {
                    // Although this may seem like an error scenario, it is OK as all packages are
                    // not expected to be installed for all users.
                    continue;
                }
            }

            if (nameNotFound) {
                throw new PackageManager.NameNotFoundException("Not installed: " + packageName);
            }
        }
        return uids;

코드에 대한 핵심 사항

  • getApplicationInfoAsuser().uid는 다음에서 UID를 가져오는 데 사용됩니다. 패키지 이름
  • uids는 생성된 정수 배열입니다.

다음 코드는 EthernetManagerTest.kt 드림 앱의 UID로 네트워크 인터페이스 구성을 업데이트하는 방법을 보여줍니다. 네트워크 사용 허용:

val allowedUids = setOf(Process.myUid())
        val nc = NetworkCapabilities.Builder(request.networkCapabilities)
                .setAllowedUids(allowedUids).build()
        updateConfiguration(iface, capabilities = nc).expectResult(iface.name)

여기서 다음과 같습니다.

  • allowUids는 네트워크를 사용할 수 있는 앱 UID의 집합입니다.
  • updateConfiguration()는 구성을 업데이트하여 네트워크를 다음과 같이 제한합니다. UID 집합을 정의합니다.