我很难写一些使用反射调用IConnectivityManager.startLegacyVpn的代码
我得到的错误是java.lang.SecurityException:Unauthorized Caller
浏览android源代码,我看到这是让我感到高兴的代码:
if(Binder.getCallingUid()!= Process.SYSTEM_UID){引发上述异常}
我的问题是,如果我根据我的AVD并在系统/应用程序中安装我的应用程序,这是否足以解决此错误?
如果是这样,有关如何执行此操作的任何提示(每次我尝试将我的apk移动到系统/应用程序文件夹时,它表示当我点击应用程序图标时未安装该应用程序。
谢谢!
答案 0 :(得分:2)
我有同样的问题,在android 4.01开源之后,我看到这样的事情:
public synchronized LegacyVpnInfo getLegacyVpnInfo() {
// Only system user can call this method.
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Unauthorized Caller");
}
return (mLegacyVpnRunner == null) ? null : mLegacyVpnRunner.getInfo();
}
或者,
// Only system user can revoke a package.
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Unauthorized Caller");
}
或者,
public void protect(ParcelFileDescriptor socket, String interfaze) throws Exception {
PackageManager pm = mContext.getPackageManager();
ApplicationInfo app = pm.getApplicationInfo(mPackage, 0);
if (Binder.getCallingUid() != app.uid) {
throw new SecurityException("Unauthorized Caller");
}
jniProtect(socket.getFd(), interfaze);
}
但是,上面这些代码块属于com.android.server.connectivity.Vpn
(类Vpn),未在接口IConnectivityManager
中定义。
我也在startLegacyVpnInfo()
函数中找到但我看不到任何涉及异常的内容
“未经授权的来电者”,所以我想知道为什么startLegacyVpnInfo()
函数会抛出此异常?
任何解决方案吗?
答案 1 :(得分:0)
我正在尝试拨打相同的电话。到目前为止,我可以确认根设备并将apk复制到/ system / app不起作用,它不会在系统uid下启动。
此外,这不起作用:
Field uidField = Process.class.getDeclaredField("SYSTEM_UID");
uidField.setAccessible(true);
uidField.set(null, Process.myUid());
这些调用成功,但它们似乎不会影响SYSTEM_UID字段,该字段可能在编译时进行了优化。
答案 2 :(得分:0)
如果将android: sharedUserId="android.uid.system"
包含在清单标记(而不仅仅是清单)中,则应将该应用程序作为系统运行。现在应该让你运行代码。
至于推送到/ system / app,您需要运行adb root
,然后运行adb remount
。现在,您可以将其推送到/ system / app。