apk被play protect blocked的解决方案(ADB+Appium+webdriverio)

2024-03-27 07:04

本文主要是介绍apk被play protect blocked的解决方案(ADB+Appium+webdriverio),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

起因:公司有海外项目,需要推广apk ,数量多,但是由于被play protect阻止安装,初版解决方案 apk加固、换签名、垃圾代码、修改资源文件的MD5,但是由于原生代码标记过于严重,推广成本高,又换了一种方案,有所缓解,原先每天固定时间查看是否被block,效果不是很好,需要写一些脚本程序自动检测,

前期准备
国际版手机,代理,play保护机制保持最新(某些带谷歌服务的模拟器也行,但是效果有时候会差),USB调试打开-通过USB验证应用
第一版方案

通过ADB命令安装app,查看是否有弹窗,而弹窗是play应用的弹窗,adb解决不了,需要人工点击弹窗确认,有一定成本,

//安装前先检测是否已安装,卸载已安装应用
adb uninstall com.xx.xx
//安装应用
adb install com.xx.xx
第二版

在上面的基础上使用Appium+webdriverio来实现自动检测、点击弹窗(其实也可以安装apk,但是第一版已经实现了就没再用),加固-签名-上传-清缓存

官网

Welcome - Appium Documentation

官网讲解很详细,配置好环境,使用Appium Inspector来查看页面元素,第一次使用还遇到版本有bug,通过回退才能用(Error: Cannot start Appium session on real android device with Mac M1 - Device UDID is being dropped by Appium · Issue #19713 · appium/appium (github.com)),当然最新版本已经修复

主要代码如下,逻辑上可以循环检测,也可以监听,根据业务实现就好

const { remote } = require('webdriverio');const capabilities = {"platformName": "Android", "appium:udid": "xxxxxx","appium:platformVersion": "9","appium:automationName": "UiAutomator2"
};const wdOpts = {hostname: process.env.APPIUM_HOST || 'localhost',port: parseInt(process.env.APPIUM_PORT, 10) || 4723,logLevel: 'info',capabilities,
};
const driver = await remote(wdOpts);
const  btn= await driver.$('//*[@text="知道了"]');
await btn.click();

检测完,把有问题的apk,加固好换签名(可api实现,可人工),上传,刷新缓存

签名

const { execSync } = require('child_process');execSync(` java -jar apksigner.jar sign --ks ./bazel_debug.keystore -ks-key-alias xxx  -ks-pass pass:xxx -key-pass pass:xxx --out ./signed/xxx.apk ./unsigned/xxx.apk `);

上传 、清缓存

公司使用的oss、aws,需要接对应的SDK上传、刷新DNS或者失效。

这篇关于apk被play protect blocked的解决方案(ADB+Appium+webdriverio)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851286

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red