阅读 153

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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐