gpt4 book ai didi

android - Android Q中访问/proc/net/tcp

转载 作者:行者123 更新时间:2023-11-29 00:52:04 34 4
gpt4 key购买 nike

在 Android-9 之前的 VPN 应用程序中,可以从目标 API 级别 < 28 的应用程序读取 /proc/net/tcp 文件。从应用程序访问似乎不再适用Android Q。我在尝试读取文件时遇到错误 /proc/net/tcp: open failed: EACCES (Permission denied)

谷歌在 Android-Q 隐私变更中解决了 Restriction on access to /proc/net filesystem

我认为 ConnectivityManager.getConnectionOwnerUid()如果应用程序 compileSDK 版本为 29,则可以使用。但不幸的是,目前我无法更改我的 compileSDK 版本,但我将 targetSDK 版本更新为最新的 IE,29。

在 Android-10 中读取文件的任何其他可能方法?发布我的代码以供引用

public static final int INDEX_UID_COL = 7;
public static final int INDEX_LOCAL_ADDRESS_COL = 1;
public static final String PROC_FILE = "/proc/net/tcp";

public static String getPackageName(Context context, int srcPort) {
String packageName = "";
try {

BufferedReader br = new BufferedReader(new FileReader(PROC_FILE));

//Ignore first line
String line = br.readLine();
while ((line = br.readLine()) != null) {
/**
* Proc file table column sequence
* sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
*/
String[] parts = line.trim().split("\\s+");
if (parts.length >= 8) {
String localAddress = parts[INDEX_LOCAL_ADDRESS_COL];
if (!localAddress.isEmpty()) {
String[] localAddressParts = localAddress.split(":");
if (localAddressParts.length == 2) {
int port = Integer.parseInt(localAddressParts[1], 16);
if (port == srcPort) {
int uid = Integer.parseInt(parts[INDEX_UID_COL]);
packageName = context.getPackageManager().getNameForUid(uid);
break;
}
}
}
}
}
br.close();
} catch (Exception ex) {
Log.e("ProcFileParser", ex.getMessage());
}
return packageName;
}

最佳答案

ConnectivityManager是平台级API。您可以尝试使用 java 反射来访问 getConnectionOwnerUid在你的上下文中。 但我建议您将 compileSdk 版本更新到最新版本

import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;

InetSocketAddress remoteInetSocketAddress = new InetSocketAddress(finalHost, srcPort);
InetSocketAddress localInetSocketAddress = new InetSocketAddress(1234);

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Method method = ConnectivityManager.class.getMethod("getConnectionOwnerUid", int.class, InetSocketAddress.class, InetSocketAddress.class);
int uid = (int) method.invoke(connectivityManager, IPPROTO_TCP, localInetSocketAddress, remoteInetSocketAddress);
if (uid != INVALID_UID) {
// UID access here
}

注意:该方法仅允许 VPN 应用查找网络连接的 UID 所有者。这意味着只会解析适用于调用方 VPN 应用的 UID 的连接。

关于android - Android Q中访问/proc/net/tcp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497492/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com