当前位置: 首页 > article >正文

uni-app打包为安卓APP的权限配置问题探索

uni-app打包为安卓APP的权限配置问题探索

背景

基于uni-app开发移动端应用,发布为安卓应用安装包,上传到华为应用市场,自动检测存在诸多权限,需要说明使用场景才能通过审核上架。

在权限配置与调整方面,遇到了不少问题与挑战,最终得以解决,花费了不少时间和精力,分享出来,让后来者少走一些弯路。

问题

使用的HBuilderX版本为4.28,打包方式采用云打包,DCloud的默认选中快捷广告,包括开屏和悬浮红包,其他一概未选择,如下:

此外,开启uni官方的统计功能,如下:

上传到华为应用分发平台上,自动检测结果如下:

一共检测出来9项权限,包括相机、录制音频、拨打电话、访问位置信息等等……

APP本身功能比较简洁,需要用到的权限很简单,就是能连上网络,请求到后端服务,然后登录的令牌需要存储和读取,其他的什么摄像头、位置、录制音频等统统不会使用到,因此不需要这么多权限。

通过查阅官方文档,结合摸索和验证,看看这些权限是怎么加上去的,又该如何去除。

探索

官方文档

首先,官方文档里有一章节专门说权限配置问题(https://uniapp.dcloud.net.cn/tutorial/app-permission-android.html)。

Android平台云端打包使用的权限包括以下几个方面:

  • 默认使用的权限,不做任何配置云端打包自动包含的权限,参考默认使用的权限
  • App使用模块依赖的权限,也包含模块依赖三方SDK需要的权限,参考App模块需要的权限
  • manifest.json中配置额外添加的权限,参考App配置添加权限
  • App原生插件依赖的权限

默认使用的权限

首先来看下默认使用的权限,即不做任何配置云端打包自动包含的权限,这部分官方说的很清楚,仔细阅读即可。

提交云端打包后会自动添加以下权限:

权限说明:

  • android.permission.INTERNET 使用网络权限,应用基础权限
  • android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WRITE_EXTERNAL_STORAGE 读写SD卡权限,系统授权提示未“访问设备上的照片、媒体内容和文件”,可以参考这里配置应用启动时申请读写手机存储策略
  • android.permission.READ_PHONE_STATE、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE 读取设备标识使用,用于uni统计服务,可以参考这里配置应用启动时申请访问设备信息权限策略
  • android.permission.INSTALL_PACKAGES、android.permission.REQUEST_INSTALL_PACKAGES 安装apk需要的权限,应用中使用plus.runtime.install升级应用则需要此权限 注意:HBuilder2.6.3+开始Goog Play渠道默认不再添加此权限,因为GooglePlay审核规则禁止应用下载apk更新,必须通过上传GooglePlay审核更新

特定权限说明:

  • com.asus.msa.SupplementaryDID.ACCESS 获取设备标识信息oaid在华硕设备上需要用到的权限
  • com.huawei.android.launcher.permission.CHANGE_BADGE 设置应用角标功能在华为设备上需要用到的权限
  • com.android.launcher.permission.INSTALL_SHORTCUT 创建桌面快捷方式权限,应用中使用plus.navigator.createShortcut创建桌面快捷方式则需要此权限
  • com.android.launcher.permission.UNINSTALL_SHORTCUT 删除桌面快捷方式权限,应用中使用native.js删除桌面快捷方式则需要此权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

App模块(三方SDK)的权限

这部分官方文档与HBuilderX存在不一致的情况了,官方说明如下:

提交云端打包时,勾选使用三方SDK相关的功能模块时,默认会自动添加三方SDK需要的所有权限。 为了保证三方SDK(或模块)的功能完整,默认会添加可能需要的所有权限,如果应用只用到三方SDK提供的部分功能,需通过Android原生应用清单文件配置移除Android权限。

保存后提交云端打包生效。

注意:HBuilderX中manifest.json文件的 “App权限配置” -> “Android自动添加第三方SDK需要的权限” 复选框功能已失效(即不勾选也会添加三方SDK需要的权限),后续版本将会移除此配置项

#App配置添加权限

打开项目的manifest.json文件,在“(App)模块权限配置”页的“Android权限配置”项下根据需求勾选需要的权限:

如果没有列出需要的权限,可按以下方法手动添加 在manifest.json页面,切换到“代码视图”

  • uni-app项目 在 “app-plus” -> “distribute” -> “android” -> “permissions” 下添加需要的权限如下:
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [   //这里添加需要的Android权限
            "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
        ]
        //...
      },
      //...
  },
  //...

官方有个加粗说明:

注意:HBuilderX中manifest.json文件的 “App权限配置” -> “Android自动添加第三方SDK需要的权限” 复选框功能已失效(即不勾选也会添加三方SDK需要的权限),后续版本将会移除此配置项。

实际4.28版本的HBuilderX界面如下:

其中“额外添加的权限”配置项中,应该是自动扫描到的三方SDK涉及到的权限,没有了复选框,同时在下方增加了一个“强制移除的权限”配置项,该配置没有相关说明,不确定功能是否可用。

App配置添加权限

官方说明如下:

打开项目的manifest.json文件,在“(App)模块权限配置”页的“Android权限配置”项下根据需求勾选需要的权限:

如果没有列出需要的权限,可按以下方法手动添加 在manifest.json页面,切换到“代码视图”

  • uni-app项目 在 “app-plus” -> “distribute” -> “android” -> “permissions” 下添加需要的权限如下:
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [   //这里添加需要的Android权限
            "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
        ]
        //...
      },
      //...
  },
  //...

这部分实际跟上面的App模块的权限功能存在重合,又回到了manifest.json中的权限配置。

通过uni配置移除权限尝试

对于manifest.json中额外添加的权限,如下图所示:

这6项看上去是不会用到的,比如相机、录制音频、拨打电话、获取定位、写入配置……

尝试清空下这里面的配置,然后打包,上传华为应用市场检测,结果没有任何变化,还是检测出9项权限。

然后将这6项放到强制移除的权限,如下图:

再次打包验证,检测结果依然不变,看来这个没有文档说明的“强制移除的权限”配置框只是实现了UI界面,后端功能尚未实现,此路不通。

通过原生配置移除权限尝试

官方还有一个移除权限的文档说明,地址是:https://uniapp.dcloud.net.cn/tutorial/app-nativeresource-android.html#removepermissions。

我这里就不引用原文了,只说核心步骤和关键点。

首先,需要在根目录下创建一个AndroidManifest.xml文件,注意大小写需要完全匹配,内容如下:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"   
  package="io.dcloud.nativeresouce">  
    <!--按下面方式配置需要移除的permissions-->  
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:node="remove"/>  
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove"/>  

    <application>  
        <!--meta-data-->  
    </application>  
</manifest>

注意事项:

  • 清单文件必须符合标准的xml格式
  • 清单文件必须符合Android系统规范,详情参考Google官方AndroidManifest.xml文档
    • 根节点必须是manifest
    • 根节点必须添加示例中的XML命名空间 xmlns:android 和 xmlns:tools
    • 根节点必须配置 package 属性,且属性值不能为空,属性值建议使用云端打包时配置的Android包名

要移除权限,参照范例写就好了,注意需要加tools:node="remove"属性,如下:

 <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:node="remove"/> 

然后尝试把6项权限用这种方式去除,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    package="uni.UNI43C0AD3">
    <!--按下面方式配置需要移除的permissions-->
    <uses-permission android:name="android.permission.CAMERA"  tools:node="remove" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" tools:node="remove" />
    <uses-permission android:name="android.permission.CALL_PHONE" tools:node="remove" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"  tools:node="remove" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:node="remove" />

    <application>
        <!--meta-data-->
    </application>

</manifest>

再次打包,上传检测,结果依然不变。

这……尝试了官方说明的方法,但是最终根本就不生效啊。

问题排查与尝试

首先,怀疑申请权限的是官方额外附加内容,一是DCloud的内置广告,二是uni的内置统计。

先把内置广告关闭掉,如下:

再次打包验证,上传检测,结果如下:

9项权限一下子就缩减到3项了,果然是DCloud的内置广告附带申请的权限。

再做个极端点的验证,用该方法,把3项权限也去除,如下:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />

测试结果跟上面一样。

然后再把uni的统计也关掉,再次尝试打包检测,还是没有变化,这3项看来用这种方式是无法去除了。

接下来去网上需求答案,尝试在在mainfest.json中设置如下内容,测试依旧不会改变权限。

截止当前,最小化三项权限,暂时可接受,后续如有新的解决方案,再补充说明。

如有已彻底解决该问题的思路和方案,欢迎在评论区指教~

工具推荐

打包后,每次上传华为应用市场去检测比较繁琐,期间发现一个工具,可以解析读取apk文件的信息,名称为jadxgui。

运行该软件,选择apk文件,可以找到资源文件,直接看申请了哪些安卓权限,如下图所示:

我们打开一个早期原始的打包,可以看到,确实打包中附加了摄像头、录制音频等无关权限,如下图所示:

用这个工具查看方便多了。

另外,该工具的作用不仅仅于此,在进行app备案时,需要公钥和MD5签名,也可以通过该工具获取。


http://www.kler.cn/a/421126.html

相关文章:

  • 装饰器—购物打折
  • 【人工智能-基础】SVM中的核函数到底是什么
  • 新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议
  • vue初始化脚手架
  • golang的wails框架在macos下的问题
  • Z2400032基于Java+Mysql+SSM的校园在线点餐系统的设计与实现 代码 论文
  • 高效数据分析:五款报表工具助力企业智能决策
  • Spring Boot 启动流程详解
  • CSS定位技术详解:从基础到高级应用
  • koa中间件
  • AcWing 841. 字符串哈希
  • 深入探索进程间通信:System V IPC的机制与应用
  • PLC协议
  • eBPF:现代Linux的强大内核扩展技术
  • docker搭建umami
  • PHM技术:一维信号时序全特征分析(统计域/频域/时域)| 信号处理
  • 【机器人】01 强化学习、模仿学习和运动规划 仿真平台ISAAC Lab安装与使用
  • 代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)
  • 【CUDA】Kernel Atomic Stream
  • python学opencv|读取视频(一)灰度视频制作和保存
  • Nginx 转发代理天地图服务
  • adb导出系统apk
  • vulnhub靶场【哈利波特】三部曲之Aragog
  • std::thread()函数的第一个参数的使用细节
  • FreeSWITCH mod_conference 的按键会控
  • 【C++】智能指针的使用和原理