Android gradle插件打印時(shí)間戳的方法詳解
Android中時(shí)間戳的詳細(xì)解釋:
(1).定義:
時(shí)間戳就是根據(jù)當(dāng)前系統(tǒng)時(shí)間生成的一組隨機(jī)數(shù)字。
(2).作用:
作為對(duì)數(shù)據(jù)唯一性的一種判斷依據(jù)。避免了重復(fù)修改數(shù)據(jù)所帶來(lái)的錯(cuò)誤!
(3).應(yīng)用:
(1).在銀行account表中建立時(shí)間戳字段timestamp,設(shè)定為文本類型varchar。
(2).當(dāng)銀行A讀取account表中的存款字段時(shí),同時(shí)也讀取時(shí)間戳字段,比如123456。
(3).當(dāng)銀行A修改完存款數(shù)值后,進(jìn)行存盤操作時(shí),將先前讀取的時(shí)間戳123456與當(dāng)時(shí)表中的時(shí)間戳進(jìn)行一次對(duì)比,如果一致,那么允許存盤,然后生成一個(gè)新的時(shí)間戳比如456789替換表中原有的時(shí)間戳123456。
若沒(méi)有使用時(shí)間戳:
銀行A和銀行B同時(shí)打開你的賬戶,看到的金額都是1000元。與此同時(shí),兩個(gè)銀行讀取的時(shí)間戳都是12345.
若使用時(shí)間戳:
當(dāng)銀行A打開賬戶的時(shí)候,把1000元改成1500元,存盤,系統(tǒng)將對(duì)比先前的時(shí)間戳與存盤時(shí)表中的時(shí)間戳是否一致,現(xiàn)在一致,允許存盤。存盤時(shí),將生成了一個(gè)新的時(shí)間戳45678。B銀行也將1000元修改成了1500元,存盤,系統(tǒng)對(duì)比先前的時(shí)間戳123456是否與存盤時(shí)表中的時(shí)間戳一致,發(fā)現(xiàn)先前的時(shí)間戳123456已經(jīng)與現(xiàn)在的時(shí)間戳456789相異,系統(tǒng)拒絕存盤,要求刷新數(shù)據(jù),那么數(shù)據(jù)刷新之后1000元已經(jīng)因?yàn)橹癆銀行存入了500元而成為了1500元,那么B銀行就會(huì)在1500元的基礎(chǔ)上改為2000元,再次存盤,系統(tǒng)允許.
簡(jiǎn)而言之:就是在操作的時(shí)候,通過(guò)對(duì)比修改之前的數(shù)據(jù)表中的時(shí)間戳與修改之后的數(shù)據(jù)表中的時(shí)間戳是否一致。
若一致,允許存儲(chǔ),同時(shí)生成一個(gè)新的時(shí)間戳。
若不一致,就要求刷新數(shù)據(jù),在新的數(shù)據(jù)上進(jìn)行修改。再次存儲(chǔ)。
引言
在性能調(diào)優(yōu)時(shí)經(jīng)常要打印函數(shù)執(zhí)行時(shí)間、參數(shù)值等, 為了調(diào)試加了很多代碼,調(diào)完后還要?jiǎng)h掉, 這個(gè)事很繁瑣。 我們可以用Android Profiler或methodtracing打印函數(shù)執(zhí)行時(shí)間,但日志太多了且缺少參數(shù)值。所以JakeWharton寫了個(gè)hugo庫(kù), 是用AspectJ實(shí)現(xiàn)的,基于AOP思想。 我看了hugo源碼,總共四個(gè)文件左右,代碼量很少。
我想做個(gè)同功能的插件,順便學(xué)習(xí)一下gradle插件制作方法和字節(jié)碼注入。
用法很簡(jiǎn)單,參考https://github.com/brycegao/TimePlugin/tree/master/demo
項(xiàng)目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實(shí)現(xiàn)的。
@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); //僅僅為了測(cè)試
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
}
}
運(yùn)行程序:

原理:
注解的作用表示要修改哪個(gè)函數(shù), gradle插件的作用是遍歷.class, Javassist是字節(jié)碼注入工具。
在編譯期間進(jìn)行字節(jié)碼注入, 打開./app/build/intermediates/classes/debug/transforms/TPTransform/1目錄可以看到修改后的字節(jié)碼。

優(yōu)點(diǎn):在編譯期間注入業(yè)務(wù)邏輯代碼,比在源碼里加log更方便,不用feature時(shí)只要配置gradle 插件不參與編譯即可。
展望:在編譯期間加日志只是一個(gè)點(diǎn), 還可以實(shí)現(xiàn)很多其它業(yè)務(wù)邏輯。
完整代碼:https://github.com/brycegao/TimePlugin 求star
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 為Android Studio編寫自定義Gradle插件的教程
- 詳解如何使用Android Studio開發(fā)Gradle插件
- 詳解Android Gradle插件3.0挖坑日記
- Android Studio Gradle插件版本與Gradle版本之間的對(duì)應(yīng)關(guān)系
- AndroidStudio升級(jí)4.1坑(無(wú)法啟動(dòng)、插件plugin不好用、代碼不高亮)
- AndroidStudio升級(jí)4.1后啟動(dòng)失敗Plugin問(wèn)題解決
- 解決Android Studio4.1沒(méi)有Gsonfomat插件,Plugin “GsonFormat” is incompatible的問(wèn)題
- Android自定義Gradle插件的詳細(xì)過(guò)程
- Android?Studio?中Gradle配置sonarqube插件(推薦)
- Android?Gradle?插件自定義Plugin實(shí)現(xiàn)注意事項(xiàng)
相關(guān)文章
Android TextView實(shí)現(xiàn)垂直滾動(dòng)效果的方法
這篇文章主要介紹了Android TextView實(shí)現(xiàn)垂直滾動(dòng)效果的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android TextView控件垂直滾動(dòng)效果的相關(guān)屬性功能與設(shè)置技巧,需要的朋友可以參考下2016-10-10
Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
這篇文章主要介紹了Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時(shí)時(shí)間
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時(shí)時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Android進(jìn)階之從IO到NIO的模型機(jī)制演進(jìn)
這篇文章主要為大家介紹了Android進(jìn)階之從IO到NIO的模型機(jī)制演進(jìn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android RecyclerView item選中放大被遮擋問(wèn)題詳解
這篇文章主要介紹了Android RecyclerView item選中放大被遮擋問(wèn)題詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
在Android開發(fā)中替換資源圖片不起作用的解決方法
這篇文章主要介紹了在Android開發(fā)中替換資源圖片不起作用的解決方法,需要的朋友可以參考下2014-07-07
Android開發(fā)之實(shí)現(xiàn)手勢(shì)滑動(dòng)的功能
這篇文章主要介紹了Android開發(fā)之實(shí)現(xiàn)手勢(shì)滑動(dòng)的功能的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
Android自定義控件實(shí)現(xiàn)下拉刷新效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)下拉刷新效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android 判斷某個(gè)服務(wù)(service)是否運(yùn)行
這篇文章主要介紹了 Android 判斷某個(gè)服務(wù)(service)是否運(yùn)行的相關(guān)資料,需要的朋友可以參考下2017-06-06

