未经授权的来电错误

时间:2012-08-09 15:55:02

标签: android root vpn avd

我很难写一些使用反射调用IConnectivityManager.startLegacyVpn的代码

我得到的错误是java.lang.SecurityException:Unauthorized Caller

浏览android源代码,我看到这是让我感到高兴的代码:

if(Binder.getCallingUid()!= Process.SYSTEM_UID){引发上述异常}

我的问题是,如果我根据我的AVD并在系统/应用程序中安装我的应用程序,这是否足以解决此错误?

如果是这样,有关如何执行此操作的任何提示(每次我尝试将我的apk移动到系统/应用程序文件夹时,它表示当我点击应用程序图标时未安装该应用程序。

谢谢!

3 个答案:

答案 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。