最近用appium写自动化撸羊毛撸得有点多

李魔佛 发表了文章 • 0 个评论 • 2717 次浏览 • 2020-11-22 02:03 • 来自相关话题

还是用python写代码方便。
前阵子用autojs写,用的js开发语言,写完在手机上运行,无论稳定性,还是业务逻辑,还和在python上开发差太远,无论是功能,还是代码。
 







撸支付宝基金红包,就挂着等红包吧。
 





 
  查看全部
还是用python写代码方便。
前阵子用autojs写,用的js开发语言,写完在手机上运行,无论稳定性,还是业务逻辑,还和在python上开发差太远,无论是功能,还是代码。
 


捕获.PNG


撸支付宝基金红包,就挂着等红包吧。
 

微信图片_20201122155958.jpg

 
 

appium xpath获取属性clickable=true的空间

李魔佛 发表了文章 • 0 个评论 • 2237 次浏览 • 2020-11-21 19:51 • 来自相关话题

推荐一下这种写法:
在找不到id,text等情况下,刚好有2个textview可以点击的,那么我们就选择这两个按钮
answer_list = self.driver.find_elements_by_xpath('//android.view.View[@clickable="true"]') 查看全部
推荐一下这种写法:
在找不到id,text等情况下,刚好有2个textview可以点击的,那么我们就选择这两个按钮
answer_list = self.driver.find_elements_by_xpath('//android.view.View[@clickable="true"]')

autojs基础教程 入门篇

李魔佛 发表了文章 • 0 个评论 • 9672 次浏览 • 2020-10-30 11:09 • 来自相关话题

1. 脚本存放路径:内部存储设置(内置存储卡)根目录 /storage/脚本"/storage/emulated/0/脚本/"2. 对于一些封装的模块的调用
像下面笔者自己封装的一个模块:
 function Helper(packageName) {

this.packageName = packageName;
if (packageName && !getAppName(packageName)) {
toast("找不到此应用, 无法提供服务");
this.sleep(1000);
exit();
}

this.click = function (x, y) {
return click(x, y);
};
this.clickCenter = function (widget) {
if (!widget) {
toast('找不到控件');
return false;
}
let rect = widget.bounds();
return click(rect.centerX(), rect.centerY());
};
this.clickSelectorCenter = function (selector) {
if (!selector) {
toast('找不到控件');
return false;
}
let widget = selector.findOne(2000);
return this.clickCenter(widget);
};
this.clickMulti = function (points, interval) {
points.forEach(function (point) {
this.click(point[0], point[1]);
this.sleep(interval);
}.bind(this));
};

this.clickMultiCenter = function (widgets) {
if (!widgets || widgets.length == 0)
return;

var points = ;
widgets.forEach(function (widget) {
var rect = widget.bounds();
points.push([rect.centerX(), rect.centerY()]);
});
this.clickMulti(points);
};
this.clickIdCenter = function (idStr) {
if (!idStr) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(id(idStr));
};
this.clickTextCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(text(str));
};
this.clickRegTextCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(textMatches(str));
};
this.clickDescCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(desc(str));
};
this.clickRegDescCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(descMatches(str));
};

this.clickClassCenter = function (classNameStr) {
if (!className) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(className(classNameStr));
};


// index表示第几个文字, 从1开始
this.clickNTextCenter = function (str, index) {
if (!str)
return false;
let widgets = text(str).find();
if (!widgets)
return false;

index--
for (let i = 0; i < widgets.length; i++) {
let widget = widgets[i];
if (i == index)
return this.clickCenter(widget);
else
continue;
}
return false;
};


this.pageUp = (counter, time) => {
if (counter && time) {
for (let i = 0; i < counter; i++) {
scrollUp();
this.sleep(time);
}
} else {
scrollUp();
}
};
this.pageDown = (counter, time) => {
if (counter && time) {
for (let i = 0; i < counter; i++) {
scrollDown();
this.sleep(time);
}
} else {
scrollDown();
}
};
this.swipe = function (x1, y1, x2, y2, duration) {
swipe(x1, y1, x2, y2, duration);
};
this.sleep = (second) => {
sleep(second * 1000);
};
this.back = function () {
back();
};
this.home = function () {
home();
};
this.shell = function (command) {
shell(command, true);
};
this.launch = function () {
launch(this.packageName);
};
this.waitForActivity = function (activityName) {
waitForActivity(activityName);
};
this.launchActivity = function (activityName) {
shell("am start -n " + this.packageName + "/" + activityName, true);
waitForActivity(activityName);
};
this.kill = function () {
shell("am force-stop " + this.packageName, true);
};
this.before = function (ignoreSleep) {
let source = engines.myEngine().source.toString();
source = source.replace("/storage/emulated/0/脚本/", "");
toast("开始执行[" + source + "]...");

const WIDTH = Math.min(device.width, device.height);
const HEIGHT = Math.max(device.width, device.height);
setScreenMetrics(WIDTH, HEIGHT);
if (!ignoreSleep)
this.sleep(random() * 10); //随机睡眠[0-10]秒, 使签到\打卡时间不固定
};
this.after = function () {
let source = engines.myEngine().source.toString();
source = source.replace("/storage/emulated/0/脚本", "");
toast("结束执行[" + source + "]...");
exit();
};


this.getCaptureImg = () => {
var img = captureScreen();
if (!img || typeof (img) == "undifined") {
console.log("截图失败,退出脚本");
exit();
} else {
return img;
}
}
}

module.exports = Helper;[/i]
可以把文件保存为Helper.js, 然后要放到 手机的 "脚本" 文件夹下 
 
然后在其他文件中,如果要调用
 [i]var Helper = require("Helper.js");
var helper = new Helper("com.galaxy.stock");[/i]
然后后续可以用helper来正常操作,比如上面我要自动启动 银河证券[i]helper.launch()[/i] 就可以了
 
华宝油气自动化申购脚本 AutoJS
 

更新待续。。。。
  查看全部
1. 脚本存放路径:内部存储设置(内置存储卡)根目录 /storage/脚本
"/storage/emulated/0/脚本/"
2. 对于一些封装的模块的调用
像下面笔者自己封装的一个模块:
 
function Helper(packageName) {

this.packageName = packageName;
if (packageName && !getAppName(packageName)) {
toast("找不到此应用, 无法提供服务");
this.sleep(1000);
exit();
}

this.click = function (x, y) {
return click(x, y);
};
this.clickCenter = function (widget) {
if (!widget) {
toast('找不到控件');
return false;
}
let rect = widget.bounds();
return click(rect.centerX(), rect.centerY());
};
this.clickSelectorCenter = function (selector) {
if (!selector) {
toast('找不到控件');
return false;
}
let widget = selector.findOne(2000);
return this.clickCenter(widget);
};
this.clickMulti = function (points, interval) {
points.forEach(function (point) {
this.click(point[0], point[1]);
this.sleep(interval);
}.bind(this));
};

this.clickMultiCenter = function (widgets) {
if (!widgets || widgets.length == 0)
return;

var points = ;
widgets.forEach(function (widget) {
var rect = widget.bounds();
points.push([rect.centerX(), rect.centerY()]);
});
this.clickMulti(points);
};
this.clickIdCenter = function (idStr) {
if (!idStr) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(id(idStr));
};
this.clickTextCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(text(str));
};
this.clickRegTextCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(textMatches(str));
};
this.clickDescCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(desc(str));
};
this.clickRegDescCenter = function (str) {
if (!str) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(descMatches(str));
};

this.clickClassCenter = function (classNameStr) {
if (!className) {
toast('找不到控件');
return false;
}
return this.clickSelectorCenter(className(classNameStr));
};


// index表示第几个文字, 从1开始
this.clickNTextCenter = function (str, index) {
if (!str)
return false;
let widgets = text(str).find();
if (!widgets)
return false;

index--
for (let i = 0; i < widgets.length; i++) {
let widget = widgets[i];
if (i == index)
return this.clickCenter(widget);
else
continue;
}
return false;
};


this.pageUp = (counter, time) => {
if (counter && time) {
for (let i = 0; i < counter; i++) {
scrollUp();
this.sleep(time);
}
} else {
scrollUp();
}
};
this.pageDown = (counter, time) => {
if (counter && time) {
for (let i = 0; i < counter; i++) {
scrollDown();
this.sleep(time);
}
} else {
scrollDown();
}
};
this.swipe = function (x1, y1, x2, y2, duration) {
swipe(x1, y1, x2, y2, duration);
};
this.sleep = (second) => {
sleep(second * 1000);
};
this.back = function () {
back();
};
this.home = function () {
home();
};
this.shell = function (command) {
shell(command, true);
};
this.launch = function () {
launch(this.packageName);
};
this.waitForActivity = function (activityName) {
waitForActivity(activityName);
};
this.launchActivity = function (activityName) {
shell("am start -n " + this.packageName + "/" + activityName, true);
waitForActivity(activityName);
};
this.kill = function () {
shell("am force-stop " + this.packageName, true);
};
this.before = function (ignoreSleep) {
let source = engines.myEngine().source.toString();
source = source.replace("/storage/emulated/0/脚本/", "");
toast("开始执行[" + source + "]...");

const WIDTH = Math.min(device.width, device.height);
const HEIGHT = Math.max(device.width, device.height);
setScreenMetrics(WIDTH, HEIGHT);
if (!ignoreSleep)
this.sleep(random() * 10); //随机睡眠[0-10]秒, 使签到\打卡时间不固定
};
this.after = function () {
let source = engines.myEngine().source.toString();
source = source.replace("/storage/emulated/0/脚本", "");
toast("结束执行[" + source + "]...");
exit();
};


this.getCaptureImg = () => {
var img = captureScreen();
if (!img || typeof (img) == "undifined") {
console.log("截图失败,退出脚本");
exit();
} else {
return img;
}
}
}

module.exports = Helper;[/i]

可以把文件保存为Helper.js, 然后要放到 手机的 "脚本" 文件夹下 
 
然后在其他文件中,如果要调用
 
[i]var Helper = require("Helper.js");
var helper = new Helper("com.galaxy.stock");[/i]

然后后续可以用helper来正常操作,比如上面我要自动启动 银河证券
[i]helper.launch()[/i]
 就可以了
 

华宝油气自动化申购脚本 AutoJS
 

更新待续。。。。
 

android monitor 系统找不到文件 lib\monitor-Could。

李魔佛 发表了文章 • 0 个评论 • 3656 次浏览 • 2019-10-17 09:53 • 来自相关话题

最新的android studio删除了android monitor 
但我觉得这是一个很好用的监控日志工具。
 
在sdk的tool目录底下启动
 
monitor.bat
 
然后就可以看到报错:
 
系统找不到文件 lib\monitor-Could
 
解决办法:
使用android-studio的sdk管理工具下载一个android-19的API,最新的api少了部分jar文件。
  查看全部
最新的android studio删除了android monitor 
但我觉得这是一个很好用的监控日志工具。
 
在sdk的tool目录底下启动
 
monitor.bat
 
然后就可以看到报错:
 
系统找不到文件 lib\monitor-Could
 
解决办法:
使用android-studio的sdk管理工具下载一个android-19的API,最新的api少了部分jar文件。
 

删除MIUI ROM里面的内置软件

李魔佛 发表了文章 • 0 个评论 • 8041 次浏览 • 2018-04-29 15:44 • 来自相关话题

抽屉利的三星S4手机,打算拿来做接收邮件专用的。 但是系统很久,旧到无法安装微信。
于是下载了小米的MIUI7的ROM, 根据官方的教程刷好了小米的ROM。
 
刚开始还是很流畅的。 可是后面发现越来越多的广告和app弹窗。太烦了,有豌豆荚,今日头条,搜狗浏览器,搜狗助手,而且还有一些不知道是什么app来的,经常在通知栏里面弹出来,屏保的时候整个画面都是广告。 烦不胜烦,在设置里面,看到这些app都没有可以选择卸载的地方。 把它们的服务停止了,问题依然存在,广告弹个不停,最大的问题是整个手机一直处于下载广告状态, 网速栏里面一直看到网速800-900,后台某些程序在一直联网。
 
忍无可忍后,把数据线接入手机,使用adb把这些流氓软件给删除掉。 打开手机的root权限。
 
然后运行
adb root
adb remount
然后你就可以对手机为所欲为了。
 
首先进入如下的目录:ls一下




看到了这些软件的包名,然后不客气,直接rm -f *
删除之。
 
然后还可以把小米的一些无用的app也删除,像自带的百度输入法(定制版,经常有广告,屏保也有广告)。




同样rm xxx.apk
删除你不想要的app名字。
 
最后重启下手机就可以,手机顿时清净很多。
 
  查看全部
抽屉利的三星S4手机,打算拿来做接收邮件专用的。 但是系统很久,旧到无法安装微信。
于是下载了小米的MIUI7的ROM, 根据官方的教程刷好了小米的ROM。
 
刚开始还是很流畅的。 可是后面发现越来越多的广告和app弹窗。太烦了,有豌豆荚,今日头条,搜狗浏览器,搜狗助手,而且还有一些不知道是什么app来的,经常在通知栏里面弹出来,屏保的时候整个画面都是广告。 烦不胜烦,在设置里面,看到这些app都没有可以选择卸载的地方。 把它们的服务停止了,问题依然存在,广告弹个不停,最大的问题是整个手机一直处于下载广告状态, 网速栏里面一直看到网速800-900,后台某些程序在一直联网。
 
忍无可忍后,把数据线接入手机,使用adb把这些流氓软件给删除掉。 打开手机的root权限。
 
然后运行
adb root
adb remount
然后你就可以对手机为所欲为了。
 
首先进入如下的目录:ls一下
Screenshot_from_2018-04-29_15-39-52.png

看到了这些软件的包名,然后不客气,直接rm -f *
删除之。
 
然后还可以把小米的一些无用的app也删除,像自带的百度输入法(定制版,经常有广告,屏保也有广告)。
Screenshot_from_2018-04-29_15-43-08.png

同样rm xxx.apk
删除你不想要的app名字。
 
最后重启下手机就可以,手机顿时清净很多。
 
 

shield tablet 英伟达神盾平板变砖修复

李魔佛 发表了文章 • 7 个评论 • 13756 次浏览 • 2017-12-12 00:24 • 来自相关话题

因为最近经常弹出一个OTA的更新包,以前一直都是对这些更新不感冒,通常都是直接忽略的。 但是看到这一个版本好像修复了不少的bugs,想着升级一次把所有的bug修复了也好。 
 
结果就坑爹了 (因为是因为系统是从安卓5.0直接OTA到7.0,系统的一些分区信息作了比较大的改动,导致启动分区数据丢失)。
重启后一直卡在启动logo,无法再进入系统。 按着音量+和电源键, 可以进入到BootLoader模式,然后选择recovery模式,等待进入recovery模式,结果看到的是一个躺着的安卓机器人。 Org!
 
然后准备尝试用fastboot的方式重新刷入一个新的系统。
 
ROM选择英伟达官方的:https://developer.nvidia.com/gameworksdownload#?search=SHIELD%20Tablet%20WiFi%20Recovery%20OS%20Image&tx=$additional,shield
 
然后安装官方教程进行刷机。以下步骤:
1. 按着音量上键和电源键进入BootLoader,如果你的系统是第一次进入BootLoader,那么第一次需要解锁BootLoader。 
连接平板到电脑,然后安装fastboot的驱动, 下载连接 https://developer.nvidia.com/shield-open-source
运行命令 fastboot devices
如果驱动成功的话,会显示你的平板序列号。然后才能进行以下的操作。
 
fastboot oem unlock
 
解锁oem锁,需要你在平板上再次按下电源键 进行确认。 几秒钟后,平板的BootLoader就会被解锁。
 
2. 然后按照ROM的说明文件readme,进行刷机:
fastboot flash recovery recovery.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot erase userdata
fastboot flash staging blob
3. 刷完后,使用fastboot reboot 进行重启设备。
 
设备重启后第一次需要大概几分钟的时间进行初始化设置。 
 
经过漫长的等待后,居然发现系统还是卡在那个nvidia的logo那里。
 
感觉自己应该是刷错ROM了,因为官方那里有WIFI版,有LTE版,有美版和欧版,而且也分Shield Tablet K1 和非K1的, 我应该用了K1的rom,所以失败了。因为我的机子应该是非K1的,虽然二者硬件没什么大的区别。
 
然后重新按照上面的步骤,重新刷入非K1的ROM。 重启后,发现问题依然没有解决。
 
没办法,只能上国外的论坛去找办法。
 
尝试刷入第三方的recovery,用recovery来恢复系统。
 
首先,下载一个第三方的recovery,TWRP image。 具体链接百度一下就可以了。
 
下载后刷入到平板 : fastboot flash recovery xxxxx.img 
xxxx.img就是下载的recovery文件名。
 
刷好后再次进入BootLoader,选择recovery mode,可以看到很多的选项,这个时候看到了希望了。
 
不过进入到TWRP recovery后,也无法看到系统的内置存储。不过里面有一个adb sideload的功能。
这个时候连上USB线,在电脑端输入 adb sideload xxxx.zip, zip为你的OTA的单独文件包,这里你可以去下载一个第三方的ROM文件,不过我试过之后,发现居然可以开机了,但是开完机会有一个加密的密码,随便输入一个密码,居然能够进去,然后需要重启进行恢复出厂设置。 等待重启完成之后,却又见到这个加密的选项。看来没有进行出厂设置成功。 
 
重试几次,发现问题依然存在。
 
那么只能重新尝试刷入官方的rom,但是不刷官方的recovery rom。
 

fastboot flash boot boot.img
fastboot flash system system.img
fastboot erase userdata
然后重启,发现能够开机并且初始化,也没有那个加密的菜单了。
问题得到解决。 查看全部
因为最近经常弹出一个OTA的更新包,以前一直都是对这些更新不感冒,通常都是直接忽略的。 但是看到这一个版本好像修复了不少的bugs,想着升级一次把所有的bug修复了也好。 
 
结果就坑爹了 (因为是因为系统是从安卓5.0直接OTA到7.0,系统的一些分区信息作了比较大的改动,导致启动分区数据丢失)。
重启后一直卡在启动logo,无法再进入系统。 按着音量+和电源键, 可以进入到BootLoader模式,然后选择recovery模式,等待进入recovery模式,结果看到的是一个躺着的安卓机器人。 Org!
 
然后准备尝试用fastboot的方式重新刷入一个新的系统。
 
ROM选择英伟达官方的:https://developer.nvidia.com/gameworksdownload#?search=SHIELD%20Tablet%20WiFi%20Recovery%20OS%20Image&tx=$additional,shield
 
然后安装官方教程进行刷机。以下步骤:
1. 按着音量上键和电源键进入BootLoader,如果你的系统是第一次进入BootLoader,那么第一次需要解锁BootLoader。 
连接平板到电脑,然后安装fastboot的驱动, 下载连接 https://developer.nvidia.com/shield-open-source
运行命令 fastboot devices
如果驱动成功的话,会显示你的平板序列号。然后才能进行以下的操作。
 
fastboot oem unlock
 
解锁oem锁,需要你在平板上再次按下电源键 进行确认。 几秒钟后,平板的BootLoader就会被解锁。
 
2. 然后按照ROM的说明文件readme,进行刷机:
fastboot flash recovery recovery.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot erase userdata
fastboot flash staging blob

3. 刷完后,使用fastboot reboot 进行重启设备。
 
设备重启后第一次需要大概几分钟的时间进行初始化设置。 
 
经过漫长的等待后,居然发现系统还是卡在那个nvidia的logo那里。
 
感觉自己应该是刷错ROM了,因为官方那里有WIFI版,有LTE版,有美版和欧版,而且也分Shield Tablet K1 和非K1的, 我应该用了K1的rom,所以失败了。因为我的机子应该是非K1的,虽然二者硬件没什么大的区别。
 
然后重新按照上面的步骤,重新刷入非K1的ROM。 重启后,发现问题依然没有解决。
 
没办法,只能上国外的论坛去找办法。
 
尝试刷入第三方的recovery,用recovery来恢复系统。
 
首先,下载一个第三方的recovery,TWRP image。 具体链接百度一下就可以了。
 
下载后刷入到平板 : fastboot flash recovery xxxxx.img 
xxxx.img就是下载的recovery文件名。
 
刷好后再次进入BootLoader,选择recovery mode,可以看到很多的选项,这个时候看到了希望了。
 
不过进入到TWRP recovery后,也无法看到系统的内置存储。不过里面有一个adb sideload的功能。
这个时候连上USB线,在电脑端输入 adb sideload xxxx.zip, zip为你的OTA的单独文件包,这里你可以去下载一个第三方的ROM文件,不过我试过之后,发现居然可以开机了,但是开完机会有一个加密的密码,随便输入一个密码,居然能够进去,然后需要重启进行恢复出厂设置。 等待重启完成之后,却又见到这个加密的选项。看来没有进行出厂设置成功。 
 
重试几次,发现问题依然存在。
 
那么只能重新尝试刷入官方的rom,但是不刷官方的recovery rom。
 

fastboot flash boot boot.img
fastboot flash system system.img
fastboot erase userdata

然后重启,发现能够开机并且初始化,也没有那个加密的菜单了。
问题得到解决。

在英伟达 神盾tv shield TV 游戏盒子上用手柄玩王者荣耀?

绫波丽 发表了文章 • 0 个评论 • 32390 次浏览 • 2017-04-11 22:42 • 来自相关话题

最近不少人都在玩王者荣耀这个游戏。 而且部分发烧友希望在55寸甚至更大的尺寸的屏幕上畅玩这个游戏。
 
对于游戏性能,目前最强悍的莫过于英伟达的shield TV , 中文翻译暂且叫做神盾tv吧, 有pro版和非pro版。 在操作上区别不大。
 
如果你在小米电视上打算玩王者荣耀, 会非常的卡。 而且点击后要等10多秒才会有反应,不过大部分时候程序会直接崩溃,退出。 所以在小米电视上大部分的大型游戏都不具备可玩性。(体积大于100MB的游戏都算大型游戏)
 
一下均为本人在英伟达shield TV上亲测。
 
首先如果刷的是官方的rom,默认自带google的应用商场,国内的话等于装饰。 所以需要手工安装一个国内的应用商场,下面我安装的是沙发管家。 那么要怎么安装呢? 
有2种方法:
 
1. 你有sd卡的话,可以把沙发管家的安装程序拷贝到sd卡上,然后插入shield TV中。 在shield TV中使用ES文件管理器安装
 
2.
 






























 
 
 
原创地址:http://www.30daydo.com/article/164 
欢迎转载,请注明出处。
  查看全部
最近不少人都在玩王者荣耀这个游戏。 而且部分发烧友希望在55寸甚至更大的尺寸的屏幕上畅玩这个游戏。
 
对于游戏性能,目前最强悍的莫过于英伟达的shield TV , 中文翻译暂且叫做神盾tv吧, 有pro版和非pro版。 在操作上区别不大。
 
如果你在小米电视上打算玩王者荣耀, 会非常的卡。 而且点击后要等10多秒才会有反应,不过大部分时候程序会直接崩溃,退出。 所以在小米电视上大部分的大型游戏都不具备可玩性。(体积大于100MB的游戏都算大型游戏)
 
一下均为本人在英伟达shield TV上亲测。
 
首先如果刷的是官方的rom,默认自带google的应用商场,国内的话等于装饰。 所以需要手工安装一个国内的应用商场,下面我安装的是沙发管家。 那么要怎么安装呢? 
有2种方法:
 
1. 你有sd卡的话,可以把沙发管家的安装程序拷贝到sd卡上,然后插入shield TV中。 在shield TV中使用ES文件管理器安装
 
2.
 

1491921108207.jpg


1491921116332.jpg


1491921123964.jpg


1491921129157.jpg


1491921134717.jpg


1491921139890.jpg

 
 
 
原创地址:http://www.30daydo.com/article/164 
欢迎转载,请注明出处。
 

怎样获取android某个包的包名和activity的启动名字?

李魔佛 发表了文章 • 0 个评论 • 5847 次浏览 • 2017-01-18 22:35 • 来自相关话题

不需要对原apk进行反编译然后读取Manifest.xml 文件就可以获取android的某个包的包名和activity启动名字。
 
首先安装好eclipse或者android studio,实在没有直接用adb命令也可以搞定,裸手操作。
 
打开android studio,连接上手机,确保adb的驱动能用。 (如果驱动不能用,就可以安装一个豌豆荚或者91助手之类的,然后连上手机,这时它会自动帮你安装驱动的,好用!用完就把豌豆荚或者91助手删掉。)
然后在底部找到android Monitor
 





 
看到了吗? 好多log日志输出。
 
然后进行过滤。 这里以中国移动手机客户端为例。
先把所有的log清空,然后在手机上点击 中国移动的手机客户端
然后就看到很多log即时输出来。
这个时候你就需要过滤
ActivityManager: Start proc
这句话,它是显示启动一个app时输出的信息。
 
这这里就可以看到打出的包名和activity名字





 
然后你需要怎样自动启动这个中国移动的客户端app吗?
 
只需要执行
adb shell am start -n com.kingpoint.gmcchh/.ui.home.StartUpActivity
就可以了。
  查看全部
不需要对原apk进行反编译然后读取Manifest.xml 文件就可以获取android的某个包的包名和activity启动名字。
 
首先安装好eclipse或者android studio,实在没有直接用adb命令也可以搞定,裸手操作。
 
打开android studio,连接上手机,确保adb的驱动能用。 (如果驱动不能用,就可以安装一个豌豆荚或者91助手之类的,然后连上手机,这时它会自动帮你安装驱动的,好用!用完就把豌豆荚或者91助手删掉。)
然后在底部找到android Monitor
 

android_monitor.PNG

 
看到了吗? 好多log日志输出。
 
然后进行过滤。 这里以中国移动手机客户端为例。
先把所有的log清空,然后在手机上点击 中国移动的手机客户端
然后就看到很多log即时输出来。
这个时候你就需要过滤
ActivityManager: Start proc
这句话,它是显示启动一个app时输出的信息。
 
这这里就可以看到打出的包名和activity名字

activity.PNG

 
然后你需要怎样自动启动这个中国移动的客户端app吗?
 
只需要执行
adb shell am start -n com.kingpoint.gmcchh/.ui.home.StartUpActivity
就可以了。
 

锤子手机T2 屏幕录像文件保存在哪里?

绫波丽 发表了文章 • 0 个评论 • 8121 次浏览 • 2016-11-26 16:54 • 来自相关话题

在根目录下的 /Video/ScreenRecorder 下面
在根目录下的 /Video/ScreenRecorder 下面

android TV版 wifi 压力测试

李魔佛 发表了文章 • 0 个评论 • 5592 次浏览 • 2016-11-03 20:34 • 来自相关话题

代码完全模拟按键进行操作。
 
1.重启设备
2.等待设备adb
3.移动到wifi设置菜单
4.连接wifi
5.检测网络是否连通
6.抓取log和截图,并把log文件压缩。
7.忘记wifi密码
8.重启设备,重复步骤1.
 
#-*-coding=utf-8-*-
__author__ = 'rocky chen'
from uiautomator import device as d
import time,subprocess,re,os

def zip_log(filename):
filename="count_%d.log" %filename
cmd='zip %s.zip %s' %(filename,filename)
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

os.remove(filename)

def move_operation(action_key):
cmd='adb shell input keyevent %s' %action_key
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
print out,err

def basic_info():
for k, v in d.info.items():
print k,v
#print info

def check_connect():
cmd='adb shell ping www.qq.com'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
print out,err

def wifi_connect(count):
print "WIFI connect in LOOP %d" %count
d.press.home()
#move_operation('KEYCODE_HOME')
d.press.down()

#move_operation('KEYCODE_DPAD_DOWN')

d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')

d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')

d.press.right()
#move_operation('KEYCODE_DPAD_RIGHT')

d.press.enter()
#move_operation('KEYCODE_ENTER')

d.press.enter()
#move_operation('KEYCODE_ENTER')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.enter()
#move_operation('KEYCODE_ENTER')

cmd='adb shell input text xiaomi2g'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
cmd='adb shell input keyevent KEYCODE_ESCAPE'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
cmd='adb shell input keyevent KEYCODE_ENTER'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()

d.press.down()
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
#d.press.down()
d.press.enter()
#move_operation('KEYCODE_ENTER')

cmd='adb shell input text test1234'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

cmd='adb shell input keyevent KEYCODE_ENTER'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
time.sleep(25)



def check_wifi_list(count):
print "check wifi list in loop %d" %count
d.press.up()
d.press.up()
d.press.up()
d.press.up()
d.press.up()
d.press.enter()
d.press.enter()
time.sleep(3)
print "########### IN LOOP %d #################" %count
cmd='adb shell screencap -p /sdcard/%d.png' %count
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

cmd='adb pull /sdcard/%d.png .' %count
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()



def check_connection(count):
print "check connection %d" %count
fp=open("capture.log",'w')
fp.write('\n')
cmd='adb shell ping -c 4 www.baidu.com'
p=subprocess.Popen(cmd,stdout=fp,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out
print err
p.wait()
fp.flush()
fp.close()
fp=open("capture.log",'r')
return_data=fp.read()
#print return_data
pettern=re.compile(r'100\% packet loss')
t=pettern.search(return_data)
#print t
if t:
print "Failed"
else:
print "Passed"

try:
os.remove("capture.log")

except:
print "Delete capture.log failed"


def reboot_device(count):
print "reboot device in loop %d" %count
cmd='adb reboot'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
p.wait()

cmd='adb wait-for-device'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
p.wait()

print "Reboot done"
time.sleep(60)

def forget_password(count):
print "Forget wifi in loop %d" %count
d.press.home()
d.press.down()
d.press.down()
d.press.down()
d.press.right()
d.press.enter()
d.press.enter()
d.press.enter()
d.press.down()
d.press.down()
d.press.enter()
d.press.enter()
time.sleep(1)

def get_log(count):

cmd="adb logcat -v time >count_%d.log &" %count
'''p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
'''
os.system(cmd)

if __name__=="__main__":

#check_connection()
#get_log(2)
#basic_info()


for i in range(3000):
reboot_device(i)
wifi_connect(i)
get_log(i)
check_wifi_list(i)
check_connection(i)
forget_password(i)
zip_log(i)

#move_operation('KEYCODE_HOME')
#move_operation('KEYCODE_DPAD_DOWN') 查看全部
代码完全模拟按键进行操作。
 
1.重启设备
2.等待设备adb
3.移动到wifi设置菜单
4.连接wifi
5.检测网络是否连通
6.抓取log和截图,并把log文件压缩。
7.忘记wifi密码
8.重启设备,重复步骤1.
 
#-*-coding=utf-8-*-
__author__ = 'rocky chen'
from uiautomator import device as d
import time,subprocess,re,os

def zip_log(filename):
filename="count_%d.log" %filename
cmd='zip %s.zip %s' %(filename,filename)
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

os.remove(filename)

def move_operation(action_key):
cmd='adb shell input keyevent %s' %action_key
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
print out,err

def basic_info():
for k, v in d.info.items():
print k,v
#print info

def check_connect():
cmd='adb shell ping www.qq.com'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
print out,err

def wifi_connect(count):
print "WIFI connect in LOOP %d" %count
d.press.home()
#move_operation('KEYCODE_HOME')
d.press.down()

#move_operation('KEYCODE_DPAD_DOWN')

d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')

d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')

d.press.right()
#move_operation('KEYCODE_DPAD_RIGHT')

d.press.enter()
#move_operation('KEYCODE_ENTER')

d.press.enter()
#move_operation('KEYCODE_ENTER')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
d.press.enter()
#move_operation('KEYCODE_ENTER')

cmd='adb shell input text xiaomi2g'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
cmd='adb shell input keyevent KEYCODE_ESCAPE'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
cmd='adb shell input keyevent KEYCODE_ENTER'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()

d.press.down()
d.press.down()
#move_operation('KEYCODE_DPAD_DOWN')
#d.press.down()
d.press.enter()
#move_operation('KEYCODE_ENTER')

cmd='adb shell input text test1234'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

cmd='adb shell input keyevent KEYCODE_ENTER'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()
time.sleep(25)



def check_wifi_list(count):
print "check wifi list in loop %d" %count
d.press.up()
d.press.up()
d.press.up()
d.press.up()
d.press.up()
d.press.enter()
d.press.enter()
time.sleep(3)
print "########### IN LOOP %d #################" %count
cmd='adb shell screencap -p /sdcard/%d.png' %count
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()

cmd='adb pull /sdcard/%d.png .' %count
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
p.wait()



def check_connection(count):
print "check connection %d" %count
fp=open("capture.log",'w')
fp.write('\n')
cmd='adb shell ping -c 4 www.baidu.com'
p=subprocess.Popen(cmd,stdout=fp,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out
print err
p.wait()
fp.flush()
fp.close()
fp=open("capture.log",'r')
return_data=fp.read()
#print return_data
pettern=re.compile(r'100\% packet loss')
t=pettern.search(return_data)
#print t
if t:
print "Failed"
else:
print "Passed"

try:
os.remove("capture.log")

except:
print "Delete capture.log failed"


def reboot_device(count):
print "reboot device in loop %d" %count
cmd='adb reboot'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
p.wait()

cmd='adb wait-for-device'
p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
p.wait()

print "Reboot done"
time.sleep(60)

def forget_password(count):
print "Forget wifi in loop %d" %count
d.press.home()
d.press.down()
d.press.down()
d.press.down()
d.press.right()
d.press.enter()
d.press.enter()
d.press.enter()
d.press.down()
d.press.down()
d.press.enter()
d.press.enter()
time.sleep(1)

def get_log(count):

cmd="adb logcat -v time >count_%d.log &" %count
'''p=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out,err=p.communicate()
print out,err
'''
os.system(cmd)

if __name__=="__main__":

#check_connection()
#get_log(2)
#basic_info()


for i in range(3000):
reboot_device(i)
wifi_connect(i)
get_log(i)
check_wifi_list(i)
check_connection(i)
forget_password(i)
zip_log(i)

#move_operation('KEYCODE_HOME')
#move_operation('KEYCODE_DPAD_DOWN')

android adb 捕获屏幕截图的命令

李魔佛 发表了文章 • 0 个评论 • 11297 次浏览 • 2016-10-19 12:16 • 来自相关话题

adb shell screencap -p /sdcard/1.png


把当前的截图保存在目录 sdcard下,名字为 1.png
 
然后 adb pull /sdcard/1.png .
就可以图片传到电脑上了

adb shell screencap -p /sdcard/1.png


把当前的截图保存在目录 sdcard下,名字为 1.png
 
然后 adb pull /sdcard/1.png .
就可以图片传到电脑上了

安卓系统常用命令 adb shell

李魔佛 发表了文章 • 0 个评论 • 4135 次浏览 • 2016-07-16 16:44 • 来自相关话题

定期更新:
1. 安卓关机(非重启): adb shell svc power shutdown
 
2. android开机的时候跳过初始化设置 (setup wizard): adb shell input text 1396611460
 
3.
定期更新:
1. 安卓关机(非重启): adb shell svc power shutdown
 
2. android开机的时候跳过初始化设置 (setup wizard): adb shell input text 1396611460
 
3.