Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题

Posted 林新发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题相关的知识,希望对你有一定的参考价值。

一、前言:莫名其妙的ACCESS_FINE_LOCATION权限

嗨,大家好,我是新发。
最近上传包到Google Play被拒了,原因是apk中申请了ACCESS_FINE_LOCATION权限。
在这里插入图片描述
事实上我们并没有使用地理位置相关的SDK,在androidManifest.xml中也没有申请这个权限。
但是打出包后,拆包发现确实多了ACCESS_FINE_LOCATION权限。
在这里插入图片描述
为什么呢?
在这里插入图片描述

二、猜想与验证

1、猜想

我想起了我之前写的这篇文章:《无需接入SDK即可在Unity中获取经纬度(Android/iOS),告诉我你的坐标》
我们通过Input.location即可获得地理位置的经纬度信息,在Android设备上,肯定是需要对应的权限的,而我们使用Input.location时并不需要手动在AndroidManifest.xml中申请对应的权限,这是怎么做到的?
直觉告诉我,Unity自己帮我们加上去的,为了验证这个猜想,我弄个小Demo测试一下。

2、验证猜想

首先,创建一个空工程,转Android平台,不写任何代码,打包apk
在这里插入图片描述
将打出来的apk拖到AndroidStudio中,可以直接查看包内的AndroidManifest.xml,可以看到,没有申请ACCESS_FINE_LOCATION权限。
在这里插入图片描述
接着,回到Unity中,我们创建一个脚本,在脚本中访问一下Input.location,如下:
在这里插入图片描述

using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var location = Input.location;
    }
}

然后重新打包apk,再使用AndroidStudio查看打出来的apkAndroidManifest.xml
好家伙,真的自己加上了ACCESS_FINE_LOCATION权限。
在这里插入图片描述
猜想验证成功,也就是说,只要引用了Input.location,打包apkUnity就会自动加上ACCESS_FINE_LOCATION权限。

事实上,在Unity手册中也有提到这个。见这里:https://docs.unity3d.com/Manual/android-manifest.html
在这里插入图片描述

三、真相与解决

1、真相

根据我们上面的结论,回到提审Google Play的项目工程中,查找Input.location的引用,发现,居然是tolua的锅。
因为工程中使用了tolua框架,里面为Input类生成了UnityEngine_InputWrap类,在UnityEngine_InputWrap中引用了Input.location

// UnityEngine_InputWrap.cs

[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int get_location(IntPtr L)
{
	try
	{
		ToLua.PushObject(L, UnityEngine.Input.location);
		return 1;
	}
	catch(Exception e)
	{
		return LuaDLL.toluaL_exception(L, e);
	}
}

关于tolua框架的使用,可以参见我之前写的这篇文章:《Unity使用tolua框架教程: LuaFramewrk》

2、解决办法

解决办法就是把UnityEngine_InputWrap中的get_location注释掉,

// UnityEngine_InputWrap.cs

// 不要引用Input.location,否则会自动引入ACCESS_FINE_LOCATION权限
// L.RegVar("location", get_location, null);

// ...

/* 不要引用Input.location,否则会自动引入ACCESS_FINE_LOCATION权限
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int get_location(IntPtr L)
{
	try
	{
		ToLua.PushObject(L, UnityEngine.Input.location);
		return 1;
	}
	catch(Exception e)
	{
		return LuaDLL.toluaL_exception(L, e);
	}
}
*/

接着,将UnityEngine_InputWrap.cs移动到LuaFramework/ToLua/BaseType目录中,
再接着,把CustomSettings.cs中的_GT(typeof(Input))注释掉。

// CustomSettings.cs

// 不要主动生成`UnityEngine_InputWrap类,移动到BaseType目录中
//_GT(typeof(Input)),  

最后,记得在LuaState.cs中加上UnityEngine_InputWrap.Register(this);

// LuaState.cs

BeginModule("UnityEngine");
// ...
UnityEngine_InputWrap.Register(this);
// ...
EndModule();

四、结束语

完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

以上是关于Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题的主要内容,如果未能解决你的问题,请参考以下文章

Unity的Inspector面板挂载的脚本显示中文变量名

一个关于集合的问题,为什么添加进List集合中的元素被莫名其妙的改变了

[Unity3D]URP中,除了主摄像机的PIPELINE,其他PIPELINE无法获得默认的ScreenColor

unity里面导入模型或素材电脑就蓝屏是怎么情况呀

unity播放时没变化

诡异,Unity在安卓运行崩溃问题,求助