有没有办法在 Android 应用程序中访问 android.net.EthernetManager?

Is there a way to access android.net.EthernetManager in an Android app?

有没有办法在 Android 应用程序中访问 android.net.EthernetManager? Class.forName("android.net.ethernet.EthernetManager") 和 Class.forName("android.net.EthernetManager") 都会生成 ClassNotFoundException。

IIRC 只有在您的设备已获得 root 权限后才能执行此操作。

这里有一个很好的解释:Ethernet Connectivity through Programatically (Android) (Rooted Device)

似乎 android.net.EthernetManager 是一个隐藏的 class,被 Javadoc 标记为 @hide。您可以使用here定制的SDK平台访问它,并且不需要root设备。

Android 隐藏 API 库 是一个修改后的 jar 文件,它将 Android SDK 中的 android.jarframework.jar 来自真实设备。这个 jar 使您能够在开发中使用 Android internal/hidden API。

什么是Android内部和隐藏APIs?内部API位于com.android.internal包中可用在真实 Android 设备的 framework.jar 文件中,而隐藏的 API 位于具有 @hide Javadoc 属性的 android.jar 文件中。虽然 classes & 方法是 public,但您无法访问它。您可以从这个包中使用漂亮的方法和资源。我假设这是一个 API 并将其称为隐藏 API。详细了解隐藏 API here.

所以,看看这个 @hide 标记:

此 class 可用于 API 22 级及更高级别。但是,自定义的 API 有局限性。 Android 隐藏 API 不适用于 Lollipop 5.1.1 (API 22) 和 Marshmallow 6.0 (API 23),因为我找不到任何人拥有这个设备。如果有,请从位于 /system/framework/framework.jar 的物理设备上传 framework.jar 文件到 here。我会做一个新的!

另一个限制

Hidden API 的另一个限制我还没有解释。当您使用某些仅在特定 API 级别可用的隐藏 API 功能、方法、资源或 classes 时,您的应用只能在适当设备的 API级。例如,您在应用程序中使用 android.net.EthernetManager,您必须将目标和编译 SDK 设置为 android-22(因为此 class 仅适用于 API 22 级及更高级别).一旦您 运行 您的应用程序在具有 API 级别 22 及更高级别的设备上,则不会显示任何错误。但是,一旦您 运行 API 级别 21 和更低级别的应用程序,将抛出错误,例如 java.lang.NoClassDefFoundError,因为 android.net.EthernetManager class 仅构建API 22 岁及以上。