Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题
文章目录
一、前言:莫名其妙的ACCESS_FINE_LOCATION权限
二、猜想与验证
1、猜想
2、验证猜想
三、真相与解决
1、真相
2、解决办法
四、结束语
一、前言:莫名其妙的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;
}
}
1
2
3
4
5
6
7
8
9
然后重新打包apk,再使用AndroidStudio查看打出来的apk的AndroidManifest.xml。
好家伙,真的自己加上了ACCESS_FINE_LOCATION权限。
猜想验证成功,也就是说,只要引用了Input.location,打包apk时Unity就会自动加上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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
关于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);
}
}
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
接着,将UnityEngine_InputWrap.cs移动到LuaFramework/ToLua/BaseType目录中,
再接着,把CustomSettings.cs中的_GT(typeof(Input))注释掉。
// CustomSettings.cs
// 不要主动生成`UnityEngine_InputWrap类,移动到BaseType目录中
//_GT(typeof(Input)),
1
2
3
4
最后,记得在LuaState.cs中加上UnityEngine_InputWrap.Register(this);
// LuaState.cs
BeginModule("UnityEngine");
// ...
UnityEngine_InputWrap.Register(this);
// ...
EndModule();
1
2
3
4
5
6
7
四、结束语
完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~
————————————————
版权声明:本文为CSDN博主「林新发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linxinfa/article/details/116587037