android系统USB设备静默获得权限

背景:在调试一个USB设备的时候,本来已经调通了,但是遇到一个问题,就是每次使用该USB设备的时候总是弹出一个对话框说要获取USB的权限,很烦人,故想方设法去调这个对话框。

总结了一些,USB设备静默获得权限的条件,有两个

  1. root
  2. 系统app
    注意:root手机有风险,需查看各种手机的root攻略;使用“幸运破解器”可以将app安装为系统app,或者将apk复制到/system/app/然后重启手机。

判断是否为系统app

public class PermissionUtil {
    public static boolean isSystemApp(Context context) {
        return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) > 0;
    }
}

下面模拟系统对获取USB权限对话框的“允许”按钮的动作,绕开对话框,然后手动伪造一条广播发出来。

if (PermissionUtil.isSystemApp(mContext)) { // 如果是系统应用就执行尝试默默做usb权限
    Intent intent = new Intent();
    intent.setAction(ACTION_USB_PERMISSION);
    intent.putExtra(UsbManager.EXTRA_DEVICE, device);
    intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true);

    final PackageManager pm = mContext.getPackageManager();
    try {
        ApplicationInfo aInfo = pm.getApplicationInfo(mContext.getPackageName(),
                0);
        try {
            IBinder b = ServiceManager.getService(USB_SERVICE);
            IUsbManager service = IUsbManager.Stub.asInterface(b);
            service.grantDevicePermission(device, aInfo.uid);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (PackageManager.NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    mContext.sendBroadcast(intent);
}

注意:由于android.hardware.usb.IUsbManager和android.os.ServiceManager是系统层面的代码,本来程序需要在android系统源码里编译,但这样直接复制这两个类的源码集成进项目工程里也可以实现。

Android清空Activity栈的做法

以前的思路是这样的:

在MainActivity设置singleTask,然后跳转到MainActivity,此时的栈就会被清空,然后再跳转到其他页面进行业务操作。

现在还可以这样实现:

直接跳转业务页面即可,设置intent的flag属性:Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK

购买nexus5,nexus6后应该对机器做的事情

前言:对于开发者而言,拥有一台google的亲儿子是多么棒的事情啊,原因就是可以很轻易的安装最新的原生系统,最快的体验到当前最新系统的最新体验。故无论如何也要入手一部可以安装最新系统的手机,当然,土豪多买几台也是好的。不管是去哪里买的手机,到手后检查是否是正品后就可以折腾了。

刷最新的原生系统

不建议用其他大神优化过的rom,这样不利于开发排除问题,建议直接从官网下载对应手机的rom,然后安装。

https://developers.google.com/android/nexus/images~

进去后对最后的提醒进行打钩就可以看到所有nexus设备的工厂镜像了。把对应的nexus最新系统镜像下载下来。如nexus6,就下载”shamu” for Nexus 6的6.0.1 (MOB30W),下载到本地后是一个zip文件,解压,里面有几个img文件和几个shell文件,其中有一个叫flash-all.sh,待会要用到。
把nexus设备关机,然后按住“音量-”键,同时按住电源键,大概2秒后进入bootloader,此时用数据线连接nexus设备和电脑,然后打开电脑的终端。输入命令fastboot devices看看有没有识别到设备,如果有东西显示出来,证明已经识别到nexus设备。
用终端定位到nexus镜像的文件夹,输入命令

./flash_all.sh     

此时看到终端里不断闪着英文,大概意思就是说清空用户数据,分析nexus设备的存储空间分布清空,然后就依次刷入几个img镜像文件,只要等待完成后nexus设备自动重启。

涉及到的命令有

fastboot devices
fastboot flash xxx  xxx.img

刷完进去系统的波折

nexus设备重启后看说明下一步,该忽略的忽略,有个主意的地方是连接wifi,该地方跳过的按钮是灰色的,如果是可以点的,那么选择跳过是最好的选择,但偏偏就是灰色不能点。此时可以连接附近的wifi,但是wifi始终提示是没有连接。猜想是因为没有三清,就去三清,(具体操作为:关机状态“音量-”+电源键,进去bootloader后按音量键选择recovery mode,发现出来一只残了的机器人,此时先按住电源键,再按一下音量+,马上就进去recovery mode,点相关三清的选项就可以了)。三清后还是一样,就猜想是需要翻墙,准备用wifi里设置sock5的shadowsocks,但是一直没有成功,最后使用http的代理,还是在连接的wifi里填同一个局域网的http代理(在mac里用sock5转的http代理),然后就连接上去了,一路next,之后进入系统原生界面。

原生系统的设置

设置界面里打开“开发者选项”(在关于手机->版本号上面点击n下就出现)、“系统界面调谐器”(在导航栏下拉后右上角有个齿轮,按住10秒后出现)。在“安全”里打开“未知来源”、在“开发者选项”里打开“USB调试”。
安装一个shadowsocks 的android客户端,下载地址在github上的 shadowsocks项目的wiki里可以找到。翻墙后系统的软件就会自动更新。

系统的root

nexus 5和6 root都好简单,只要先刷入第三方的recovery,然后再刷入superSU就可以完成root。
在网上找到类似 twrp-2.8.7.1-shamu.img 的twrp第三方recovery,刷入的方法是在bootloader模式下输入命令

fastboot flash recovery twrp-2.8.7.1-shamu.img

在网上找到类似 BETA-SuperSU-v2.64-20151220185127.zip 的superSU包,输入的方法是进入twrp第三方recovery (关机状态按音量+和电源键),点击install按钮,选择superSU 的zip包,刷入即可,关于把zip包放到手机sdcard里的步骤如下

先让手机处于twrp第三方recovery下~
输入命令 adb push BETA-SuperSU-v2.64-20151220185127.zip /sdcard/

系统刷入xposed框架

1、在豌豆荚里找到Xposed 3.0 alpha 4 ,然后进行安装。5.0以上的系统都需要Xposed 3.0。
2、刷入Xposed的系统核心包,得在xposed官网下载,选择对应的sdk版本,选择好cpu的位数,高通805以下都是32位,然后下载最新版本的核心包即可,比如nexus6就下载xposed-v86-sdk23-arm.zip,下载地址为

http://dl-xda.xposed.info/framework/~

刷入的方法如上面刷superSU一样,同样是zip包,同样也需要在recovery里刷入。然后重启,稍微有点久,进入系统后打开xposed install app,检查是否安装成功,如没有提示异常,则安装成功。

PS:
至此,nexus设备前期应该做的都做完了。该冲浪的冲浪,该码字的码字,该开发的开发,该约会的约会。

cordova自定义插件入门

前言:该文章是自定义插件的入门,记录了从零到一的自定义插件的创建过程。 而后面创建的类的名字都是奇奇怪怪的,为的就是不重复,从而让读者更加清楚的理解每个字符串对应的地方。

  • 创建一个插件文件夹
mkdir pluginExample2 
  • 创建android插件里面需要的文件夹和文件
mkdir pluginExample2 
mkdir src
mkdir www
touch plugin.xml
cd www
touch pinging.js
cd ..
cd src 
mkdir android
cd android
touch Pinging11.java
  • 编辑插件的配置文件,让后续cordova项目可以根据配置文件去完成跨平台代码的搬移。(./plugin.xml)

以下是plugin.xml的代码片段

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        id="com.example.cordova.plugin.pinging" version="0.0.1">      ------<1>
    <name>pinging</name>        ------<2>
    <description>example pinging</description>
    <license>Apache 2.0</license>
    <keywords>cordova,pinging</keywords>
    <js-module src="www/pinging.js" name="pinging">      ------<3>
        <clobbers target="com.example.cordova.plugin.Pinging22" />      ------<4>
    </js-module>
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">       ------<5>
            <feature name="pinging22">         ------<6>
                <param name="android-package" value="com.example.cordova.plugin.Pinging11"/>       ------<7>
            </feature>
        </config-file>
       <source-file src="src/android/Pinging11.java" target-dir="src/com/example/cordova/plugin" />         ------<8>
    </platform>
</plugin>

<1>:该插件的id和版本,类似maven的包名和版本,后续会出现在项目的cordova_plugins.js文件的module.exports.metadata里。
<2>:该插件的名字
<3>:该插件定义的js接口,主要是指定了文件的路径,属性name貌似没有什么作用
<4>:该插件的js调用的命名空间,后续在项目js调用该插件时使用,如com.example.cordova.plugin.Pinging22.init()
<5>:指定特定平台的配置文件位置。
<6>:该插件某一个模块的名称,后续在www/pinging.js里js调用native类时候出现。如cordova.exec(success, error, ‘pinging22’, ‘init’, );
<7>:该插件生成的native文件所在的包名,故native类里必须以这个包名去写代码
< 8>:声明该插件使用到的所有源文件,插件存在的文件路径和未来要放置到该平台的包完整路径。

  • 插件的js接口声明,目的是为了简化js应用层的调用,所有有关native的信息全都封装在这里。

以下是 pinging.js的代码片段

var cordova = require('cordova');       ------<1>
var pinging = function() {};       ------<2>

pinging.prototype.init = function(success, error) {       ------<3>
    cordova.exec(success, error, 'pinging22', 'init', []);        ------<4>
};

module.exports = new pinging();       ------<5>

<1>:引入cordova库
<2>:声明一个空白类
<3>:在类里创建一个叫init的方法
<4>:使用exec调用pinging22这个feature里的init方法
<5>:导出到cordova里,让其他代码可以调用该文件的内容。

  • 插件的特定平台android类,提供给js调用的所有方法

以下是 Pinging11.java 的代码片段

package com.example.cordova.plugin;

import android.util.Log;
import android.widget.Toast;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;

import java.util.List;


public class Pinging11 extends CordovaPlugin {
    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);         ------<1>
      }

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("init".equals(action)) {            ------<2>
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("test", "test");
            callbackContext.success(jsonObject);         ------<3>
            Toast.makeText(cordova.getActivity().getApplicationContext(), "Pinging11->init()", Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }
}

<1>: CordovaPlugin的生命周期里的初始化插件
<2>:通过判断不同的action,处理不同的方法
<3>:方法执行成功后返回成功给前端js调用方

  • 使用cordova命令生成cordova项目,并添加自定义的插件
cordova create cordovaExample2 
cd cordovaExample2
cordova platform add android
cordova platform add browser
cordova plugin add ../pluginExample2

此时,插件的代码被搬运到具体的平台里去

  • 在index.js->onDeviceReady里面写业务代码,在需要调用插件的地方写上调用插件的代码。如下
com.example.cordova.plugin.Pinging22.init(function() {
    alert("success");
}, function() {
    alert("failed");
});
  • 最后,运行工程,看看效果。
cordova build android
cordova run android

如果发生报错,在使用build命令的时候就会打印出错误日志。

附上参考网址:

http://cordova.apache.org/docs/en/6.x/plugin_ref/spec.html

android 开发板操作出现“Read-only file system”

对开发板进行命令行操作,准备对/system/下的东西进行操作,后面出现Read-only file system,需要挂载文件系统后才能可以操作,否则就仅仅制度的权限。在android系统里面使用app Re文件管理器可以挂载文件系统为可读可写,故可以进去操作,前提是需要root权限。
找了一下终于找到解决方案
打相应的命令:

1、su 
2、mount  

可以查到这个android开发板的设备块名称是/dev/block/by-name/system

root@octopus-perf:/ # su          ----------1
root@octopus-perf:/ # mount         ---------2
rootfs / rootfs rw,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600,ptmxmode=000 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
/dev/block/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0       ---------------*
/dev/block/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,data=ordered 0 0
/dev/block/by-name/UDISK /data ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,noauto_da_alloc,data=ordered 0 0
none /proc/bus/usb usbfs rw,relatime,devmode=666 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/vold/179:25 /mnt/extsd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/extsd fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

打命令:

1、mount -o remount /dev/block/by-name/system /system
2、mount

得到下面的结果

root@octopus-perf:/ # mount -o remount /dev/block/by-name/system /system              ----------------1
root@octopus-perf:/ # mount            -------------2                                             
rootfs / rootfs rw,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600,ptmxmode=000 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
/dev/block/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0            ---------------*
/dev/block/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,data=ordered 0 0
/dev/block/by-name/UDISK /data ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,noauto_da_alloc,data=ordered 0 0
none /proc/bus/usb usbfs rw,relatime,devmode=666 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/vold/179:25 /mnt/extsd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/extsd fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

最后使用完后要还原回来(设置为只读状态):

1、mount -o remount,r /dev/block/by-name/system /system

参考:
http://wojiushiwolxw.spaces.eepw.com.cn/articles/article/item/97054

android开发板上做debug,不是用usb线连接

如何在android开发板上做debug,没有插口,只能无线
遇到一个问题,如何在android系统上开机运行几行shell指令。
解决方案:
android开发板上运行app,app监听系统广播自动启动,然后运行shell指令,前提是已经取得root权限。

String  wifiStrings = new String {
        "su -c 'setprop service.adb.tcp.port 5555'",
        "su -c 'stop adbd'",
        "su -c 'start adbd'"
};
CommandExecution.execCommand(wifiStrings, false);

android开发板跟pc要在同一个局域网里。然后运行下面的命令。

adb devices
adb disconnect
adb connect 192.168.31.171
adb -s 192.168.31.171:5555 shell

【学习笔记】使用idea自带生成webservice客户端client的问题

导入web service的证书到本地jdk的证书库里

报错
com.sun.xml.ws.client.ClientTransportException: HTTP 传输错误: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
原因
ip的问题,如果是域名就没问题。
解决方案
jdk1.8 的话
在代码里面加入HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals(“10.173.235.52”));

解决的链接
http://stackoverflow.com/questions/10258101/sslhandshakeexception-no-subject-alternative-names-present

报错
由于 accessExternalSchema 属性设置的限制而不允许 ‘file’ 访问, 因此无法读取方案文档 ‘xjc.xsd’。
解决方案
Create a file named jaxp.properties (if it doesn’t exist) under /path/to/jdk1.8.0/jre/lib and then write this line in it:
javax.xml.accessExternalSchema = all
解决的链接
http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8

【学习笔记】android安全机制相关

android安全机制之秘钥交换

1、非对称秘钥安全性足够高
2、没有密钥交换的问题
3、效率低,对于大数据加密很慢

实时产生的sessionkey,通过加一层rsa安全传输到对方,然后就可以用对称密钥去加密传输。
Diffie-Hellman密钥交换协议
甲 :A, 乙:B
甲 :(A,keyX) -> MsgA 乙:(B,keyY) -> MsgB
甲 :(keyX,MsgB) = 乙:(keyY,MsgA)
最后的变换结果都是一样的,结果作为sessionKey

android安全机制之消息摘要

一、HASH与散列函数的定义和特点
MD5(128bit),SHA1(160bit)易变性和不可逆
二、消息摘要和数字指纹
三、HASH的应用场景:防篡改
1.文件下载时的MD5
2.消息传送时尾部额外传MD
四、HASH的应用场景:防损坏
1.CRC校验
2.MD校验恶劣环境
3.应用程序读写鲁棒性保护
五、Hash的应用场景:认证和鉴别
1、不可逆
2、可认证对端
六、保证不密文放在客户端。
HMAC
HMAC就是使用Key对原始消息交换后再进行HASH。先随机数+key,再hash

android安全机制之电子签名

签名解决的问题
公钥密码术的两面性
HASH+公钥密码术:电子签名
1、完整性保护
2、签名人不可否认
DprivateKey(EpublicKey(P))P 保密场景
DpublicKey(EprivateKey(P))P 电子签名场景

直接对原始消息进行私钥签名太慢,应该先HASH后在私钥签名,原因是HASH后就是这个很短的字符串了。

android安全机制之证书与PKI

公钥的存储与交换
证书的作用
证书链和PKI

数字证书就是一个文件,包含公钥,电子签名
证书的信任链,根证书自签名,非根证书父 签名
传个证书下来到client,由client去验证父级到根证书,如果信任了,就通过
ski 公钥系统

【学习笔记】基于xposed的入门和安全漏洞的实战

入门

1、新建工程(高德地图demo),对一般的方法进行hook。
1) 集成XposedBridgeApi-54.jar ,按照版本去下载集成,如果是as的话,scope为Provided
2)在AndroidManifest.xml文件中添加如下配置:

<!-- xposed支持 -->
        <meta-data
            android:name="xposedmodule"
            anafterHookedMethoddroid:value="true" />
        <meta-data
            android:name="xposedminversion"
            android:value="54" />
        <meta-data
            android:name="xposeddescription"
            android:value="xposeddemo" />

3) 在assets文件夹下定义访问入口xposed_init文件,内容书写为核心hook类的存放路径。
4)写一个类继承IXposedHookLoadPackage,在handleLoadPackage里写相关处理代码

// 只处理目标app
if (!loadPackageParam.packageName.equals("com.hgsoft.wk.main")) {
           return;
 }

4)安装后,在Xposed Installer中激活该模块并重启手机
5)打开目标app,在Xposed Installer里的日志模块可以看到log
2、注意的点
1)hook方法:findAndHookMethod

public static Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) {
        return findAndHookMethod(findClass(className, classLoader), methodName, parameterTypesAndCallback);
}

第一个参数是类名称,第二个参数是ClassLoader,一般里面参数有提供,直接引用,如果是class里面的class,要用$,第三个参数是要hook的方法名,第四个是可以多个参数,放hook的方法的参数列表,最后的参数是hook的回调。
比如:

XposedHelpers.findAndHookMethod("org.json.JSONObject", loadPackageParam.classLoader, "put",
                String.class, boolean.class, new XC_MethodHook());

2)hook构造方法:findAndHookConstructor

public static Unhook findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
        return findAndHookConstructor(findClass(className, classLoader), parameterTypesAndCallback);
}

关于构造方法这个没有用出效果来,比较郁闷,以后尝试出来再补充。。。。。。
3)关于回调XC_MethodHook

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {};
protected void afterHookedMethod(MethodHookParam param) throws Throwable {};

MethodHookParam的用法上,args方法的参数列表,thisObject提供方法的类,getResult方法的返回值,可以通过setResult设置方法的返回值。

实战

1、反编译周报日报,然后对定位这块进行hook。
找到 class BdLocation extends CordovaPlugin,分析里面所有的方法,尝试对他们进行hook.

class MyBDLocationListener implements BDLocationListener {
        MyBDLocationListener() {
        }
        public void onReceiveLocation(BDLocation bdLocation) 

找到上面代码块后,准备hook onReceiveLocation,写个程序hook上去后发现posed框架没有报错,但就是什么都没有反应。查了一下官方说明,xposed只能hook普通方法或者构造方法,不能hook接口和抽象类。只能作罢,找其他的方法hook。

在尝试hook 类BdLocation里的其他方法后,发现都没有反应,故猜想是因为继承了CordovaPlugin的原因,具体没有深究,等以后有机会再研究是不是因为CordovaPlugin的原因,并且怎么去hook cordova的东西。

最后进行了一次尝试,看到app里面用到org.json.JSONObject的put,那么就开始hook put吧

XposedHelpers.findAndHookMethod("org.json.JSONObject", loadPackageParam.classLoader, "put", String.class, boolean.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        XposedBridge.log("hello->weekreport:before put=" + param.args[0] + "," + param.args[1]);
                        if (param.args[0].equals("inScope")) {
                            param.args[1] = false;
                        }
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        XposedBridge.log("hello->weekreport:after put=" + param.args[0] + "," + param.args[1]);
                    }
                });

可以看到,把值inScope改成了false,运行,终于跑进去方法里面,激动啊。改完后app的定位就一直失效。

引用一下OverAndroid博客提到的功能:
_ ▪ 渗透测试_
_ ▪ 测试数据构造_
_ ▪ 环境监控_
_ ▪ 动态埋点_
_ ▪ 热补丁_
_ ▪ 自动化录制_

学习链接:
https://github.com/rovo89/XposedBridge/wiki/
https://segmentfault.com/a/1190000002883122
http://blog.csdn.net/wzgiceman/article/details/50607020

【学习笔记】找蓝牙通讯方法pc与android

今天主要是要找一种解决方案,如何让android手机蓝牙连接电脑pc的蓝牙,然后实现文字的通信。

目标很明确,主要是找电脑端的蓝牙相关的调试工具,因为android的自己有把握完成。接下来花了1个半小时找工具。

  • 找到一个pc蓝牙串口调试助手2.2.3,没有什么用,看起来是那种开发板然后自带串口和蓝牙的设备。

  • 找到一个【蓝牙软件】BlueCom蓝牙管理,不过在win8.1上装不上,提示说是需要.net2.0,但明明我是.net4.5了,放弃。

  • 最后就是这个蓝牙驱动管理软件 千月 ivtbluesoleil,这个更恶心,还要注册,下载下来测试了一下,发现可以搜到蓝牙,可以连接得上,就是没有发送文本的方法。

    而发送文件的window系统本身就可以传输,哎,目测是没有什么办法,先研究到这里,以后再看看。