在日常的app测试过程中,除了常规的功能验证外,app端还需要验证隐私与权限合规测试,因为如果app在随意获取用户隐私和权限的话,软件很容易被工商局给强制下线,所以我们测试,在测试过程中还需要注意测试隐私权限方面的内容,下面文章将从剪切板的权限获取测试来切入,深入的了解一下我们如何开发一个用于隐私测试的工具;
某天产品提出一个需求叫帮忙测试,规则如下: app一进入后会获取用户剪切板的数据,识别剪辑版文字来跳转到对应的页面(比如拼多多的助力链接一样); 这里存在一个问题,首次安装app进入后,会有一个用户协议,需要用户点击同意后,软件才能去获取剪切板的权限,不同意的话,软件是不能去获取,不然会违反工信部的规定; 之前的app是用户未点击同意的时候,软件也会获取剪切板的信息,这次改动后,需要点击同意后才能去获取。 针对此次改动,我们常用的测试方法已经无法实现测试验证;这时需要我们去hook开发的代码才能验证这个功能。


文章大致主要采用的技术: java语言
开发工具: Android Studio
准备环境: 安卓开发环境,电脑端安卓模拟器(夜神模拟器,已root), xposed
成型工具: xposed 模块(不了解的同学可以百度一下,就是安卓的一些插件,如微信抢红包之类的)
检测实现原理:利用模块中的hook钩子来监测app在运行过程中,调用的方法和类; 通过识别固定的类名称和方法名来判断app是否调用了权限获取。
点击New Project 新建一个安卓项目

默认选中Empty Activity,点击Next

设置名称,点击创建

将项目设置为 project 模式,便于后期讲解

开发Xposed模块,流程可以参照下图:

下面,我们来一一实现
1. 让手机知道,这个apk是xposed的一个模块
打开 项目名称/app/src/main/AndroidMainifest.xml 文件, 加入下面代码
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="这是一个xposed程序的用途" />
<meta-data
android:name="xposedminversion"
android:value="53" />

2. 加入带有xposed API的第三方jar包到程序中
这边提供的有82版本的api jar包; 链接:https://pan.baidu.com/s/1QI7nU7wu–X1fkXARao0UA
提取码:5ue0
将jar包放入 app/libs 文件夹中


点击Add As libray 将jar包加入项目中

3.编写hook程序,监测目标app
在 com.example.myapp文件夹下创建一个java类

叫做HookTest 类型选Class

HookTest .class 编写代码:
1.导入xposed API的包
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

2.编写Hook函数
public class HookTest implements IXposedHookLoadPackage {
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable{
// 如果没有发现应用信息就返回,不进行后续的判断处理
if (loadPackageParam == null) {
return;
}
// 打日志
XposedBridge.log("开始进入Hook程序------------->");
// 模板 使用其他方法的话也这样写
//hook获取剪切板信息方法
XposedHelpers.findAndHookMethod(
android.content.ClipboardManager.class.getName(), // 写获取剪切版权限的方法的类名
loadPackageParam.classLoader, // 固定写法
"getPrimaryClip", // 对应的方法名
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("getPrimaryClip()获取了当前的剪切板内容");
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 打印调用类信息
// XposedBridge.log(getMethodStack());
super.afterHookedMethod(param);
}
}
);
}
}

4.让程序知道,那个文件是放hook模块方法的
首先在main文件夹下 创建一个 Assets Folder文件


创建一个文件 ,名称为:xposed_init


在该文件中写入hook测试类的路径

至此:所以代码层都已编写完成,可以将代码打包为apk,安装到模拟器中了, 点击顶部的播放按钮,安装软件到手机中,注意需要连接上手机或者模拟器

构建完成后,能看到已经安装上了

打开Xposed模块,能够看到,已经可以识别刚刚安装上的程序了;这时,我们点击勾选,重启模拟器

1.首先启动刚刚安装的app.再打开xposed日志,清空之前的日志

2. 打开被测试app,调用获取剪切板权限的功能

3.再次打开日志文件,能够看到,我们已经监测到了app调用了这个方法

总结:
使用上面的方法,我们可以实现对,app获取剪切板权限的测试; 只需要在软件刚进入后,用户不点击同意协议前,监测软件,查看一下日志,即可知道开发是否调用了剪切板权限的方法; 向其他方法,如获取mac地址,GPS定位等功能,也是在模块中填写对应的方法名和类名称即可进行监测; 如果不知道对应权限的类名和方法名的话可以百度或者咨询一下开发;
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?