내부 이더넷 네트워크 구성

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 집합을 정의합니다.