自启动导致上架被打回的处理

1,552 阅读3分钟

第三方sdk带来的问题

项目因为需要用到推送服务,故接入友盟推送。然而在上架小米应用市场的时候被打回了。 在打回的报告《小米移动应用隐私合规检测报告》中提示是因为自启动的缘故

image.png 而在附件的xml文档中,关于自启动的只有(七鱼客服的不用理会)

image.png

com.miaoding.hddd/com.taobao.accs.EventReceiver action=android.intent.action.BOOT_COMPLETED

image.png

同时检查了代码,发现自身的代码没有任何的广播和服务涉及到保活和自启动,但是,没办法,小米把EventReceiver的行为算在自身应用而非第三方sdk上,而上一个提交的版本在最初的弹窗上做了文案提示,但是小米不认,只要从根本上处理自启动问题。

判断apk到底申请了哪些权限

aapt

首先先判断下apk在配置文件中到底有哪些权限。 根据aapt(sdk文件夹的build-tools文件夹下的aapt.ext)

aapt dump bump badging XXX.apk

可见

image.png 可见,虽然没有在AndroidManifest.xml文件中申请android.permission.RECEIVE_BOOT_COMPLETED 但是,最后apk文件打包整合的过程中将友盟的权限同时申请下来。

manifest-merger-report.txt文件

app/build/outputs/logs/manifest-merger-release-report 文件中有整合报告

image.png 友盟的一篮子sdk都申请了监听开机的广播。

这个有点麻烦了,因为项目采取的是自动依赖的方式,修改代码也是无济于事。

想到反射,但是不会啊。想到手动依赖,怕麻烦。再找找还有没有别的方案。

解决方案

tools:node="remove"

后来在一篇文章 中了解到tools:node="remove",这个方法可以直接删除第三方申请的权限。 在AndroidManifest.xml文件中增加

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

重新运行下,用上面的方法,用aapt在检查一遍,发现成功回收监听开机广播的权限了,大功告成。

再度尝试

结果没过两天,运营部门的同事又来反馈说,apk又双叒叕被打回来了,仍然是自启动的问题。

哎,产品经理都找我指导了,如果不会的话,可以找比你优秀的开发(被一个非技术的嘲笑了)。

重新检查了打回的信息,发现仍然是那两个自启动第三方SDK,七鱼客服和友盟的频繁自启动。可是权限都被收回了?没办法,重新去找相关资料。

好在七鱼客服的合规指南 中有提到频繁自启动导致不合规的解决办法。既然如此,那边在配置文件AndroidManifest.xml中再加入几段代码

<!--友盟自启动-->
<receiver
    android:name="com.taobao.accs.EventReceiver"
    android:exported="true"
    tools:node="remove">
    <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
</receiver>
<!--七鱼客服自启动-->
<receiver
    android:name="com.qiyukf.nimlib.service.NimReceiver"
    android:exported="false"
    android:process=":core"
    tools:node="remove">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
<service
    android:name="com.qiyukf.nimlib.job.NIMJobService"
    android:exported="true"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":core"
    tools:node="remove" />

重新申请上架。

结语

对于友盟申请这个权限,感觉可能是用于离线推送,走厂商通道,在app被杀死后让用户仍能接受到推送消息。

但是,重要的是,友盟的开发者文档中竟然搜索不到任何关于自启动相关的文章和相关问题。可明明友盟在接入文档里有合规指南,其中提及隐私协议,但却丝毫未提及自启动相关的内容,好气呦!