前提是你手机拥有root权限, 这边以模拟器为例
1.进入shell模式
1 | adb shell |
2.切换root用户
1 | su |
3.更改system权限
1 | mount -o remount ,rw / |
4.接下来即可成功创建文件夹
1 | mkdir mydir |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 码出一个新世界
1 | #压缩 |
1 | -z(gzip) 用gzip来压缩/解压缩文件 |
1 | #压缩 |
1 | -r(recursive) 递归压缩目录内的所有文件和目录1 |
1 | #压缩和解压文件 |
1 | -k 产生压缩文件后保留原文件1 |
1 | #压缩 |
本文为作者原创 转载时请注明出处 谢谢

有时候,咱们不清楚自己安装的操作系统是什么架构的x86还是arm, 64位还是32位, 可以通过以下指令进行查询
uname -a 命令1 | uname -a //如果输出带有x86字样即为x86系统 带有arm字样则位arm系统 |
1 | file /sbin/init //如果输出带有x86字样即为x86系统 |
1 | getconf LONG_BIT //如果输出32即为32位系统 输出64即为64位系统 |
1 | dpkg --print-architecturemkdir mydir //如果当前 Linux 是 64 位则输出 amd64,是 32 位则会输出 i386 |
1 | arch //如果输出 x86_64 则表示为 64 位系统,如果输出 i686 或 i386 则表示为 32 位系统 |
1 | hostnamectl |
如下:
本文为作者原创 转载时请注明出处 谢谢

Android系统本身就是基于linux系统, 有时候我们需要给其配置环境变量,如下操作:
1 | adb shell |
1 | mount -o remount ,rw / |
1 | adb -s 设备名 pull /system/etc/mkshrc ./ |
使用文本编辑器编辑 mkshrc文件,找到 ${TERM:=vt100} ${HOME:=/data} ${MKSH:=/system/bin/sh} 这么一行
1 | ${TERM:=vt100} ${HOME:=/data} ${MKSH:=/system/bin/sh} |
将环境变量依葫芦画瓢添加至改行尾部, 如
1 | ${TERM:=vt100} ${HOME:=/data} ${MKSH:=/system/bin/sh} ${mypath:=/system/bin/my} |
然后找到export处,将自己的环境变量加到后面:
1 | export HOME HOSTNAME MKSH SHELL TERM USER mypath |
将修改完后的mkshrc文件push会Android系统进行替换
1 | adb -s 设备名 push ./mkshrc /system/etc/mkshrc |
1 | export |
本文为作者原创 转载时请注明出处 谢谢

最近通过docker在树莓派上部署springboot项目,然而报错了,因为直接下载的jdk不支持。
先看一下之前的docker文件
1 | FROM java:8 |
这里从docker镜像官网获取的java是64位的,树莓派32位系统不能用,所以需要自己弄一个镜像。
jdk-8u241-linux-arm32-vfp-hflt.tar.gz,注意不能下载错。/usr/lib/jvm文件夹下
~/.bashrc,增加以下内容1 | nano ~/.bashrc |


1 | source ~/.bashrc |

1 | #Docker image of JDK8 in ARM32 |
其中,from不要修改,作者可以修改,其他的不要变化即可。

1 | docker build -t arm32jdk:8 . |

\7. 创建好了以后,就可以利用这个我们自己创建的jdk镜像部署springboot项目了
我创建自己的springboot项目的Dockerfile文件:
1 | FROM arm32jdk:8 |

1 | docker run --name meeting -e TZ="Asia/Shanghai" -p 8084:8084 -d --restart=always meeting |
然后进入容器重新查看时区:
1 | docker exec -i -t gateway-server /bin/bash |

本文为作者原创 转载时请注明出处 谢谢

android-ndk-r9b (这里使用老版本库为例 ,将该库目录下的ndk-build.cmd添加至系统环境变量中,方便后续操作,不同版本的ndk库ndk-build位置可能不太一样,这里你也可以使用最新库)
Windows10
1 | ndk-build.cmd NDK_PROJECT_PATH=E:\App |
1 | ndk-build.cmd clean |
1 | APP_ABI := armeabi armeabi-v7a x86 |
APP_BUILD_SCRIPT参数进行指定:1 | ndk-build.cmd NDK_PROJECT_PATH=E:\App APP_BUILD_SCRIPT=new_android.mk |
NDK_APPLICATION_MK进行指定:1 | ndk-build.cmd NDK_PROJECT_PATH=E:\App NDK_APPLICATION_MK=new_application.mk |
编译时默认找jni目录下源码进行编译,所以需要在工程目录下新建jni子目录,原因在此
android工程在引用so库时,必须放在对应架构目录下,否则打包apk时会忽略该文件的打包, 比如指定jni目录为libs ,引用的so是x86架构的,那么必须在libs目录下再新建一个名为x86的文件夹,然后将so放进去, 否则so库不打包

ndk编译脚本文件Android.mk配置:
1 | LOCAL_PATH := $(call my-dir) |

1、在maven项目中添加依赖
1 | <dependency> |
2、编写接口,放置在service层
这里的decisionEngine.url 是配置在properties中的 是ip地址和端口号
decisionEngine.url=http://10.2.1.148:3333/decision/person 是接口名字
1 | @FeignClient(url = "${decisionEngine.url}",name="engine") |
3、在Java的启动类上加上@EnableFeignClients
1 | @EnableFeignClients //参见此处 |
4、在代码中调用接口即可
1 | @Autowired |
本文为作者原创 转载时请注明出处 谢谢

在Spring-Boot开发中,RestTemplate同样提供了对外访问的接口API,这里主要介绍Get和Post方法的使用。Get请求提供了两种方式的接口getForObject 和 getForEntity,getForEntity提供如下三种方法的实现。
该方法提供了三个参数,其中url为请求的地址,responseType为请求响应body的包装类型,urlVariables为url中的参数绑定,该方法的参考调用如下:
1 | // http://USER-SERVICE/user?name={name) |
该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK http://java.net包下的一个类,表示一个统一资源标识符(Uniform Resource Identifier)引用。参考如下:
1 | RestTemplate restTemplate=new RestTemplate(); |
getForObject方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。getForObject方法有如下:
1 | getForObject(String url,Class responseType,Object...urlVariables) |
Post请求提供有三种方法,postForEntity、postForObject和postForLocation。其中每种方法都存在三种方法,postForEntity方法使用如下:
1 | RestTemplate restTemplate=new RestTemplate(); |
postForEntity存在如下三种方法的重载
1 | postForEntity(String url,Object request,Class responseType,Object... uriVariables) |
postForEntity中的其它参数和getForEntity的参数大体相同在此不做介绍。
本文为作者原创 转载时请注明出处 谢谢

主要从事Android开发的小伙伴,偶尔进行后端开发,由于Android Studio是Idea的子系,直接使用Studio进行开发即可,无需另外下载Idea工具
前往 https://start.spring.io/下载启动demo, 我这里选择的是gradle工程java语言 已经添加web依赖

第二步 打开demo工程, 将修改gradle属性文件
这一步为非必需操作, 由于我这边使用的是all版本, 为了节省网络资源,直接复用

第三步 调整build.gradle文件, 示例如下
1 | buildscript { |
第四步 编写接口测试
1 | *注意controller包是在引导类的同一级目录或者子包 |
5.第五步 启动springBoot项目
1 | 运行引导类的main方法,观察日志 |
至此, 大功告成
本文为作者原创 转载时请注明出处 谢谢

替换系统框架资源(对所有app 起作用)需要实现 IXposedHookZygoteInit接口的 initZygote 方法,并在该方法中调用Resources.setSystemWideReplacement(...) 方法替换资源
1 | package de.robv.android.xposed.mods.tutorial; |
替换app应用资源需要实现 IXposedHookInitPackageResources 类的andleInitPackageResources方法,并在该方法中调用res.setReplacement(...)方法替换资源,注意在该方法中不要使用XResources.setSystemWideReplacement 方法
1 | package de.robv.android.xposed.mods.tutorial; |
对于复制的资源,如动画资源 ,我们也能够替换,下面我们来替换battery icon
动画资源布局
1 | <?xml version="1.0" encoding="utf-8"?> |
代码:
1 | package de.robv.android.xposed.mods.tutorial; |
Xposed框架会将模块请求资源的请求指向你模块中的资源
你可以用替换资源的方法来替换布局文件,但这样你不得不将目标apk中的整个layout文件复制出来进行修改,这样会使模块的Rom兼容性降低。并且如果两个以上的模块修改布局后,最后修改布局的模块会起作用。更重要的是,布局中指向其它资源的ID很难确定下来。推荐使用下面的方法修改布局:
1 | package de.robv.android.xposed.mods.tutorial; |
回调方法handleLayoutInflated 会在layout文件被填充后回调,在方法的 LayoutInflatedParam 对象 参数中,你可以找到你想修改的View组件。你也可以通过调用resNames来确定加载的那一个布局文件。用 variant来确定加载的布局的目录’layout-land‘。res 同时也会帮你获取资源的ID和其它的资源。
每当应用加载的时候,IXposedHookLoadPackPage接口的handLoadPackage方法就会被调用执行,为了让我们在正确的进程中执行,需要先判断被加载的包是不是正确的包
1 | package de.robv.android.xposed.mods.tutorial; |
一旦我们进入到正确的进程进后,我们就能用param变中的ClassLoad来访问该进程中加载的类
1 | package de.robv.android.xposed.mods.tutorial; |
XposedHelpers是一个重要的工具类,推荐用Eclipse的同学静态导入该类中的方法 import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;。该类能够通过反射机制来访问方法、构造器、域。findAndHookMehthod(String packageName,Class clazz, String methodName, Object... args))方法来对函数进行Hook。如果在方法前和方法后Hook,该方法最后一个参数需要实现XC_MethodHook类的beforeHookedMethod和afterHookedMethod方法,如果想要替换整个方法,则需要实现XC_MethodReplacement类的replaceHookedMethod方法
XposedBridge保存了每个Hook方法的回调方法。优先级高的回调方法被优先调用A.before -> B.before -> original method -> B.after -> A.after
1 | package de.robv.android.xposed.mods.tutorial; |
搭建本文为作者原创 转载时请注明出处 谢谢
