Android gradle插件打印时间戳的方法详解

Android中时间戳的详细解释:

(1).定义:

时间戳就是根据当前系统时间生成的一组随机数字。

(2).作用:

作为对数据唯一性的一种判断依据。避免了重复修改数据所带来的错误!

(3).应用:

(1).在银行account表中建立时间戳字段timestamp,设定为文本类型varchar。

(2).当银行A读取account表中的存款字段时,同时也读取时间戳字段,比如123456。

(3).当银行A修改完存款数值后,进行存盘操作时,将先前读取的时间戳123456与当时表中的时间戳进行一次对比,如果一致,那么允许存盘,然后生成一个新的时间戳比如456789替换表中原有的时间戳123456。
若没有使用时间戳:

银行A和银行B同时打开你的账户,看到的金额都是1000元。与此同时,两个银行读取的时间戳都是12345.

若使用时间戳:

当银行A打开账户的时候,把1000元改成1500元,存盘,系统将对比先前的时间戳与存盘时表中的时间戳是否一致,现在一致,允许存盘。存盘时,将生成了一个新的时间戳45678。B银行也将1000元修改成了1500元,存盘,系统对比先前的时间戳123456是否与存盘时表中的时间戳一致,发现先前的时间戳123456已经与现在的时间戳456789相异,系统拒绝存盘,要求刷新数据,那么数据刷新之后1000元已经因为之前A银行存入了500元而成为了1500元,那么B银行就会在1500元的基础上改为2000元,再次存盘,系统允许.

简而言之:就是在操作的时候,通过对比修改之前的数据表中的时间戳与修改之后的数据表中的时间戳是否一致。

若一致,允许存储,同时生成一个新的时间戳。

若不一致,就要求刷新数据,在新的数据上进行修改。再次存储。

引言

在性能调优时经常要打印函数执行时间、参数值等, 为了调试加了很多代码,调完后还要删掉, 这个事很繁琐。 我们可以用Android Profiler或methodtracing打印函数执行时间,但日志太多了且缺少参数值。所以JakeWharton写了个hugo库, 是用AspectJ实现的,基于AOP思想。 我看了hugo源码,总共四个文件左右,代码量很少。
我想做个同功能的插件,顺便学习一下gradle插件制作方法和字节码注入。

用法很简单,参考https://github.com/brycegao/TimePlugin/tree/master/demo

项目build.gradle文件里添加classpath和maven。

buildscript {
repositories {
google()
jcenter()
maven { url "https://dl.bintray.com/brycegmail/maven" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath 'com.brycegao.timeplugin:timeplugin:1.0.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://dl.bintray.com/brycegmail/maven" }
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

在app模块的build.gradle文件添加

apply plugin: 'timeplugin'
...
implementation 'com.brycegao.tpannotation:tpannotation:1.0.2'

在想打印日志的类或方法前添加注解@DebugLogger即可,用法参照hugo实现的。

@DebugLogger
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

showMsg(1, "this is test");

findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}

private void showMsg(int i, String msg) {
try {
Thread.sleep(100); //仅仅为了测试
} catch (Exception ex) {
ex.printStackTrace();
}
}

@Override public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
}
}

运行程序:

原理:

注解的作用表示要修改哪个函数, gradle插件的作用是遍历.class, Javassist是字节码注入工具。
在编译期间进行字节码注入, 打开./app/build/intermediates/classes/debug/transforms/TPTransform/1目录可以看到修改后的字节码。

优点:在编译期间注入业务逻辑代码,比在源码里加log更方便,不用feature时只要配置gradle 插件不参与编译即可。

展望:在编译期间加日志只是一个点, 还可以实现很多其它业务逻辑。

完整代码:https://github.com/brycegao/TimePlugin 求star

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 给Android初学者的Gradle知识普及

    Gradle build android 历史 Android Tools 主页 ,大概是2016年2月份发布 adt21.1 的时候,忽然在主页发现了New Build System 原来是可以用gradle 来构建android项目,至于gradle是什么(既然点击进来看了应该都知道了吧.).然后,又看了一下RoadMap 那时候,还并不支持Proguard 打包,于是就没看了. android studio 发布,终于gradle 0.4 也跟着出来了,于是,先把gradle 学了一遍,然

  • Spring Boot使用Thymeleaf + Gradle构建war到Tomcat

    Spring Boot 以Jar的方式部署启动,这个不用介绍了, 之前也介绍了关于 Spring Boot + thymeleaf 的简单使用 ,但是今天遇到一个问题, 我先描述下问题的场景: 由于运维部门的需求,项目需要以war的形式放到tomcat运行 ,而不是原定的jar的方式运行 配置了一下午,也查了一下午的资料,以war的方式在Tomcat能运行,并且能访问Controller,但是在返回html视图时,找不到视图模板.最终发现问题在Thymeleaf的配置,话不多说,具体看操作步骤:

  • 关于gradle你应该知道的一些小事

    前言 gradle的定义(来自维基百科) Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言限于Java.Groovy和Scala,计划未来将支持更多的语言. 通俗的理解:gradle是一种构建工具,我们可以用他来对多工程进行各种管理(依赖,打包,部署,发布,各种渠道的差异管理): 有些时候,我们会有一些个性化的构建需求,比如我们引入了第三方库,或者我们想要在通

  • Android Studio Gradle插件版本与Gradle版本之间的对应关系

    1.gradle插件版本配置位置: project对应的build.gradle文件中 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } } 2.gradle版本配置位置: gradle-wrapper.properties 中 distributionUrl=https\://services.gradle.org/distribu

  • spring boot使用sonarqube来检查技术债务

    作为代码质量检查的流行工具,比如Sonarqube能够检查代码的"七宗罪",跟代码结合起来能够更好地提高代码的质量,让我们来看一下,刚刚写的Springboot2的HelloWorld的代码有什么"罪". Sonarqube Sonarqube可以使用docker版本快速搭建,可以参看一下Easypack整理的镜像,具体使用可以参看如下链接,这里不再赘述: https://hub.docker.com/r/liumiaocn/sonarqube/ 环境假定 本文使用

  • Android中的build.gradle文件深入讲解

    一.什么是Gradle gradle是一个项目构建工具,java开发中有两个大名鼎鼎的项目构建Maven,Ant,其中maven简单易控深受开发者喜爱. 项目构建工具是什么?能干吗? 开发某些项目时,需要很多jar或者库的支持,还没开始开发就下载了n多个库,浪费了时间不说,这些库之间兼容性又无法保证.删了?白下载了.不删?又不兼容.此时就需要使用项目构建工具,简单的说就是一个可以根据简单的配置文件自动去下载相应包/库的软件.自动的还很简单,不用岂不亏了.多个项目构建工具各有特点,但是核心思想一样

  • Spring Boot配置Thymeleaf(gradle)的简单使用

    最近项目用到了Spring Boot ,但是在控制器返回html视图并渲染参数的时候,存在了疑问.后面考虑用Thymeleaf ,感觉真的不错,下面分享给大家 总共四步: jar 引入 控制器参数传递 html标签引入 Thymeleaf 缓存设置 一.相关Jar的引用 1.maven的引用方式: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    作为代码质量检查的流行工具,比如Sonarqube能够检查代码的"七宗罪",跟代码结合起来能够更好地提高代码的质量,这篇文章将会介绍如何结合gradle和sonarqube对代码质量与测试覆盖率进行分析. Sonarqube Sonarqube可以使用docker版本快速搭建,可以参看一下Easypack整理的镜像,具体使用可以参看如下链接,这里不再赘述: https://hub.docker.com/r/liumiaocn/sonarqube/ 环境假定 本文使用到的sonarqub

  • 使用Sonarqube扫描Javascript代码的示例

    使用sonarqube对javascript代码进行扫描,分析代码质量,最简单的方式莫过于使用缺省的sonar-way中的javascript的规则,使用sonar-scanner进行扫描,这篇文章通过最简单的例子,来进行说明. 事前准备 Sonarqube Sonarqube可以使用docker版本快速搭建,可以参看一下Easypack整理的镜像,具体使用可以参看如下链接,这里不再赘述: https://hub.docker.com/r/liumiaocn/sonarqube/ 环境假定 本文

  • 优化Gradle提升Gradle编译速度

    一. 我们先说一下提升Gralde编译速度. 针对这个问题, 先讲一下配置相关设置提升编译速度.  我发现在build.gradle文件中如果设置了很多渠道, 在编译时会影响编译速度, 尤其是windows系统下运行. 对gradle中渠道进行优化, 可以提升编译速度 1. 在user/.gradle文件下创建gradle.properties文件, 并在中写上org.gradle.daemon=true , 保存. 2. 设置studio, 打开setting >> gradle>&g

随机推荐