Android导出已安装应用程序apk文件(命令行模式)
参考文章
1.列出当前手机上已经安装的apk:
adb shell pm list packages
2.找到想要提取的apk存放路径:
adb shell pm path com.huawei.camera
3.使用命令: adb pull ,将其导出保存到自己电脑桌面上:
adb pull /system/priv-app/HwCamera2/HwCamera2.apk C:/Users/fly/Desktop
使用pm查看“相册”软件apk包所在位置时,发现有三个包:
对应分别为:主包、分辨率相关包、语言包
测试安卓原生软件:deskclock、photos
deskclock
-
场景一:
录制内容:秒表功能,点击开始计时,10s后点击暂停计时
重放效果:成功点击开始和暂停,但是两次点击之间的时间差不是10s,而是接近12s。这是因为录制重放引入的时间开销
-
场景二:
录制内容:添加一个8:40的闹钟,通过滑动指针位置设定时间,单击确定添加闹钟
重放效果:成功重放
photos
- 测试输入:对图片进行多指缩放
- 使用aoktool解析相册软件photos时,未能解析出软件界面,录制失败
测试安卓多点触控
问题:sara由于应用场景限制,并未实现多指触控。而是重写dispatchTouchEvent方法做单点触控
多点触控录制出的trace.log不正确,尝试采用
处理多点触控手势
在Android中,将屏幕的左上角的顶点作为Android坐标系的原点,这个原点向右是X轴正方向,原点向下是Y轴正方向。如下图所示:
getRawX():获取点击事件距离整个屏幕左边距离,即绝对坐标
getRawY():获取点击事件距离整个屏幕顶边的的距离,即绝对坐标
sara因场景需求,只实现了单点触控,而没有处理多点触控(例如两指缩放操作)
拟将毕设的创新点放在处理多点触控方向,在录制转换重放阶段调整对应代码。
问题:将录制到trace.log的坐标用matplotlib进行轨迹绘制,只能看到一个手指的轨迹。
经过查阅android开发文档,在多点触控处理上通过pointerId、pointerIndex来区分不同的手指触控。
getPointerCount() 获取在屏幕上手指的个数来判断当前是否为多点触控事件。修改api再次测试录制:
可以看到下图中提示**getRawX()**参数个数不匹配
翻阅安卓开发文档,确实是有int类型参数用来区分不手指的坐标。针对此问题还在查阅修改中
4/19-4/25
对于实现多点触控操作,我的思路是将多点触控分离成几个单点触控,然后根据记录的时间同时重放几个单点操作,从而实现多点触控的录制重放。
一、多点触控录制
-
首先要录制下多点触控的轨迹,并将不同手指的轨迹分离到不同的操作序列
-
重写‘dispatchTouchEvent’方法:使用getRawX()、getRawY()获取当前手指触摸位置相对于手机屏幕左上角的位置;但是上周测试getRawX()、getRawY()的有参数调用方式来获取每个手指的坐标,提示参数错误。
-
转换思路,尝试使用getX()、getY()获取手指相对当前操作组件的坐标,然后结合当前操作组件相对于手机左上角的坐标,计算出当前手指触摸位置相对于手机屏幕左上角的位置。实际使用中发现在dispatchTouchEvent方法下,getX()、getY()获取的坐标就是相对于屏幕左上角的(吐槽一下安卓官方开发文档。。。这种特殊情况竟然不标注);测试代码和测试结果如下:
setImmediate(function(){
console.log("[*] Starting script");
Java.perform(function(){
var activity = Java.use("com.byted.camp.todolist.MainActivity");
activity.dispatchTouchEvent.implementation = function(ev){
var actionId = ev.getAction();
var pointerCount = ev.getPointerCount() ;
for(var i = 0; i < pointerCount; i++) {
send({
i: i,
RawX: ev.getRawX(),
RawY: ev.getRawY(),
x: ev.getX(i),
y: ev.getY(i)
});
}
return this.dispatchTouchEvent(ev);
};
})
console.log("[*] Ending script");
});
- 基于此修改录制滑动操作部分的代码如下:
if(isInstrument){
existsDispatchTouchHandles.