private var callback0: Any? = null
private var callback1: Any? = null
private var callback2: Any? = null
private var callback3: Any? = null
private var callback4: Any? = null
private var method: Method? = null
private fun hook() {
var mChoreographer = Choreographer.getInstance()
var mCallbackQueuesField = mChoreographer.javaClass.getDeclaredField("mCallbackQueues")
mCallbackQueuesField.isAccessible = true
var mCallbackQueues = mCallbackQueuesField.get(mChoreographer) as? Array<*>
if (mCallbackQueues != null && mCallbackQueues.size > 0) {
LogUtils.i("zengbobo MainActivity hook size = ${mCallbackQueues.size}")
for (i in mCallbackQueues.indices) {
var callback: Any? = mCallbackQueues?.get(i) ?: continue
if (method == null) {
method = callback?.javaClass?.getDeclaredMethod(
"addCallbackLocked",
Long::class.java, Any::class.java, Any::class.java
)
method?.isAccessible = true
}
if (i == 0) {
callback0 = callback
method?.invoke(callback, 0, runnable1, null)
} else if (i == 1) {
callback1 = callback
method?.invoke(callback, 0, runnable2, null)
} else if (i == 2) {
callback2 = callback
method?.invoke(callback, 0, runnable3, null)
} else if (i == 3) {
callback3 = callback
method?.invoke(callback, 0, runnable4, null)
} else if (i == 4) {
callback4 = callback
method?.invoke(callback, 0, runnable5, null)
}
}
}
}
private fun hook(i: Int) {
if (i == 0) {
method?.invoke(callback0, 0, runnable1, null)
} else if (i == 1) {
method?.invoke(callback1, 0, runnable2, null)
} else if (i == 2) {
method?.invoke(callback2, 0, runnable3, null)
} else if (i == 3) {
method?.invoke(callback3, 0, runnable4, null)
} else if (i == 4) {
method?.invoke(callback4, 0, runnable5, null)
}
}
private fun hook1(position: Int) {
var mChoreographer = Choreographer.getInstance()
var mCallbackQueuesField = mChoreographer.javaClass.getDeclaredField("mCallbackQueues")
mCallbackQueuesField.isAccessible = true
var mCallbackQueues = mCallbackQueuesField.get(mChoreographer) as? Array<*>
if (mCallbackQueues != null && mCallbackQueues.size > 0) {
LogUtils.i("zengbobo MainActivity hook position=$position size=${mCallbackQueues.size}")
for (i in mCallbackQueues.indices) {
var callback: Any? = mCallbackQueues?.get(i) ?: continue
// var removeCallbacksLocked = callback?.javaClass?.getDeclaredMethod(
// "removeCallbacksLocked", Any::class.java, Any::class.java
// )
// removeCallbacksLocked?.isAccessible = true
// if (i == position) {
// removeCallbacksLocked?.invoke(callback, runnable1, null)
// } else if (i == position) {
// removeCallbacksLocked?.invoke(callback, runnable2, null)
// } else if (i == position) {
// removeCallbacksLocked?.invoke(callback, runnable3, null)
// } else if (i == position) {
// removeCallbacksLocked?.invoke(callback, runnable4, null)
// } else if (i == position) {
// removeCallbacksLocked?.invoke(callback, runnable5, null)
// }
var method = callback?.javaClass?.getDeclaredMethod(
"addCallbackLocked",
Long::class.java, Any::class.java, Any::class.java
)
method?.isAccessible = true
if (i == position && position == 0) {
method?.invoke(callback, 0, runnable1, null)
} else if (i == position && position == 1) {
method?.invoke(callback, 0, runnable2, null)
} else if (i == position && position == 2) {
method?.invoke(callback, 0, runnable3, null)
} else if (i == position && position == 3) {
method?.invoke(callback, 0, runnable4, null)
} else if (i == position && position == 4) {
method?.invoke(callback, 0, runnable5, null)
}
}
}
}
private var time1 = 0L
private val runnable1 by lazy {
Runnable {
LogUtils.i("zengbobo MainActivity runnable1 run ${System.currentTimeMillis() - time5}")
var t = System.currentTimeMillis()
LogUtils.i("zengbobo MainActivity runnable1 start ${System.currentTimeMillis() - time1}")
hook(0)
LogUtils.i("zengbobo MainActivity runnable1 end ${System.currentTimeMillis() - time1}")
time1 = System.currentTimeMillis()
}
}
private var time2 = 0L
private val runnable2 by lazy {
Runnable {
LogUtils.i("zengbobo MainActivity runnable2 run ${System.currentTimeMillis() - time1}")
var t = System.currentTimeMillis()
LogUtils.i("zengbobo MainActivity runnable2 start ${System.currentTimeMillis() - time2}")
hook(1)
LogUtils.i("zengbobo MainActivity runnable2 end ${System.currentTimeMillis() - time2}")
time2 = System.currentTimeMillis()
}
}
private var time3 = 0L
private val runnable3 by lazy {
Runnable {
LogUtils.i("zengbobo MainActivity runnable3 run ${System.currentTimeMillis() - time2}")
var t = System.currentTimeMillis()
LogUtils.i("zengbobo MainActivity runnable3 start ${System.currentTimeMillis() - time3}")
hook(2)
LogUtils.i("zengbobo MainActivity runnable3 end ${System.currentTimeMillis() - time3}")
time3 = System.currentTimeMillis()
}
}
private var time4 = 0L
private val runnable4 by lazy {
Runnable {
LogUtils.i("zengbobo MainActivity runnable4 run ${System.currentTimeMillis() - time3}")
var t = System.currentTimeMillis()
LogUtils.i("zengbobo MainActivity runnable4 start ${System.currentTimeMillis() - time4}")
hook(3)
LogUtils.i("zengbobo MainActivity runnable4 end ${System.currentTimeMillis() - time4}")
time4 = System.currentTimeMillis()
}
}
private var time5 = 0L
private val runnable5 by lazy {
Runnable {
LogUtils.i("zengbobo MainActivity runnable5 run ${System.currentTimeMillis() - time4}")
var t = System.currentTimeMillis()
LogUtils.i("zengbobo MainActivity runnable5 start ${System.currentTimeMillis() - time5}")
hook(4)
LogUtils.i("zengbobo MainActivity runnable5 end ${System.currentTimeMillis() - time5}")
time5 = System.currentTimeMillis()
}
}
Choreographer字段:mCallbackQueues
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咒林,“玉大人熬拒,你說我怎么就攤上這事〉婢海” “怎么了澎粟?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長欢瞪。 經(jīng)常有香客問我活烙,道長,這世上最難降的妖魔是什么遣鼓? 我笑而不...
- 正文 為了忘掉前任啸盏,我火速辦了婚禮,結(jié)果婚禮上骑祟,老公的妹妹穿的比我還像新娘回懦。我一直安慰自己,他們只是感情好次企,可當(dāng)我...
- 文/花漫 我一把揭開白布怯晕。 她就那樣靜靜地躺著,像睡著了一般缸棵。 火紅的嫁衣襯著肌膚如雪舟茶。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼也搓,長吁一口氣:“原來是場噩夢啊……” “哼赏廓!你這毒婦竟也來了涵紊?” 一聲冷哼從身側(cè)響起傍妒,我...
- 正文 年R本政府宣布绘雁,位于F島的核電站橡疼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庐舟。R本人自食惡果不足惜欣除,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挪略。 院中可真熱鬧历帚,春花似錦、人聲如沸杠娱。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽墨辛。三九已至卓研,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睹簇,已是汗流浹背奏赘。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 學(xué)習(xí)娛樂,分享下如何通過Xposed讓自己的資產(chǎn)看起來實現(xiàn)了小目標(biāo)搪锣,文章如果有紕漏歡迎指出改正 上篇文章傳送門:X...
- 前言 RxHttp是基于RxJava2+Retrofit 2.9.0+OkHttp 4.9.0實現(xiàn)的輕量級努咐,完美兼...
- 1. ARouter 的依賴問題 What went wrong: Execution failed for ta...
- 前言 人生苦多苦蒿,快來 Kotlin ,快速學(xué)習(xí)Kotlin渗稍! 什么是Kotlin佩迟? Kotlin 是種靜態(tài)類型編程...
- 前言 之前寫過一篇關(guān)于Paging的文章,結(jié)合Room數(shù)據(jù)庫使用的 Paging 這篇內(nèi)容是關(guān)于請求網(wǎng)絡(luò)數(shù)據(jù)的免胃。P...