Commit 80c21a83 authored by liuyang's avatar liuyang

APK图片抓取识别及轮播流地址抓取, 增加自动清理图片缓存逻辑及部分异常捕捉

#BYLSERVER-1438
parent 74a9b4f1
...@@ -13,7 +13,7 @@ android { ...@@ -13,7 +13,7 @@ android {
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 22 targetSdkVersion 22
versionCode 15 versionCode 15
versionName "1.4.40" versionName "1.4.45"
} }
signingConfigs { signingConfigs {
......
...@@ -104,6 +104,7 @@ class Task : Thread, IAppBaseCallback { ...@@ -104,6 +104,7 @@ class Task : Thread, IAppBaseCallback {
var success = this.processChannels(0) var success = this.processChannels(0)
// 再次尝试 // 再次尝试
if (!success) { if (!success) {
Log.i(TAG, "app seems to be quit,so try again")
if (this.status == State.MANUAL_STOP) { if (this.status == State.MANUAL_STOP) {
Log.i(TAG, "manual exit") Log.i(TAG, "manual exit")
return return
...@@ -116,8 +117,13 @@ class Task : Thread, IAppBaseCallback { ...@@ -116,8 +117,13 @@ class Task : Thread, IAppBaseCallback {
} }
success = this.processChannels(this.channelIndex) success = this.processChannels(this.channelIndex)
if (!success && this.status == State.MANUAL_STOP) if (!success) {
return Log.i(TAG, "interrupt on channel: $channelIndex")
if (this.status == State.MANUAL_STOP) {
Log.i(TAG, "manual exit and interrupt")
return
}
}
} }
// 上传图片 // 上传图片
...@@ -126,6 +132,7 @@ class Task : Thread, IAppBaseCallback { ...@@ -126,6 +132,7 @@ class Task : Thread, IAppBaseCallback {
} catch (e: java.lang.Exception) { } catch (e: java.lang.Exception) {
this.status = State.INTERRUPT this.status = State.INTERRUPT
e.printStackTrace() e.printStackTrace()
Log.i(TAG, "exception : ${e.message}")
} }
// 退出应用 // 退出应用
AdbUtil.stopApp(this.apkInfo.packageName) AdbUtil.stopApp(this.apkInfo.packageName)
...@@ -199,7 +206,7 @@ class Task : Thread, IAppBaseCallback { ...@@ -199,7 +206,7 @@ class Task : Thread, IAppBaseCallback {
* @param index 频道序号 * @param index 频道序号
*/ */
private fun processChannels(index: Int): Boolean { private fun processChannels(index: Int): Boolean {
Log.i(TAG, "processChannels") Log.i(TAG, "processChannels...count:${this.apkInfo.channelCount}")
quitCapture() quitCapture()
processChannelItem() processChannelItem()
...@@ -236,51 +243,57 @@ class Task : Thread, IAppBaseCallback { ...@@ -236,51 +243,57 @@ class Task : Thread, IAppBaseCallback {
*/ */
private fun processChannelItem() { private fun processChannelItem() {
Log.i(TAG, "processChannelItem channel ${this.channelIndex}") Log.i(TAG, "processChannelItem channel ${this.channelIndex}")
// 处理抓包数据
var playUrlItems = analysisCapture()
// 如果没有抓取到地址,再次尝试
if (playUrlItems.size <= 0) {
capture(this.apkInfo.captureDelay)
playUrlItems = analysisCapture()
}
val channels = this.reportJson.optJSONArray("channels")
val channelJson = JSONObject()
val playUrls = JSONArray() try {
for (playUrl in playUrlItems) { // 处理抓包数据
playUrls.put(playUrl) var playUrlItems = analysisCapture()
} // 如果没有抓取到地址,再次尝试
if (playUrlItems.size <= 0) {
capture(this.apkInfo.captureDelay)
playUrlItems = analysisCapture()
}
val channels = this.reportJson.optJSONArray("channels")
val channelJson = JSONObject()
channelJson.putOpt("playUrls", playUrls) val playUrls = JSONArray()
for (playUrl in playUrlItems) {
playUrls.put(playUrl)
}
channelJson.putOpt("playUrls", playUrls)
// 处理图片上传信息 // 处理图片上传信息
val screenImages = ArrayList<String>() val screenImages = ArrayList<String>()
var time = imageDateFormat.format(Date()) var time = imageDateFormat.format(Date())
val absName = this.taskPath + "/${this.apkInfo.packageName}_${channelIndex}_$time" val absName = this.taskPath + "/${this.apkInfo.packageName}_${channelIndex}_$time"
screenShot(absName) screenShot(absName)
screenImages.add("$absName.jpg") screenImages.add("$absName.jpg")
AdbUtil.sendMultiKey(this.apkInfo.menuKeyEvent) AdbUtil.sendMultiKey(this.apkInfo.menuKeyEvent)
time = imageDateFormat.format(Date()) time = imageDateFormat.format(Date())
val absOkName = this.taskPath + "/${this.apkInfo.packageName}_${channelIndex}_${time}_ok" val absOkName = this.taskPath + "/${this.apkInfo.packageName}_${channelIndex}_${time}_ok"
screenShot(absOkName) screenShot(absOkName)
screenImages.add("$absOkName.jpg") screenImages.add("$absOkName.jpg")
// 对于一些epg弹出时间过长的应用,模拟点击一次返回键,比如电视家3.0 // 对于一些epg弹出时间过长的应用,模拟点击一次返回键,比如电视家3.0
if (this.apkInfo.epgBack) if (this.apkInfo.epgBack)
AdbUtil.sendMultiKey("back") AdbUtil.sendMultiKey("back")
if (screenImages.size > 0) if (screenImages.size > 0)
uploadImages.addAll(screenImages) uploadImages.addAll(screenImages)
val channelImageFile = File(screenImages[0]) val channelImageFile = File(screenImages[0])
channelJson.putOpt("channelImage", channelImageFile.name) channelJson.putOpt("channelImage", channelImageFile.name)
val channelEpgImageFile = File(screenImages[1]) val channelEpgImageFile = File(screenImages[1])
channelJson.putOpt("channelEpgImage", channelEpgImageFile.name) channelJson.putOpt("channelEpgImage", channelEpgImageFile.name)
channelJson.putOpt("channelId", this.channelIndex) channelJson.putOpt("channelId", this.channelIndex)
channels.put(channelJson) channels.put(channelJson)
} catch (e : Exception) {
e.printStackTrace()
Log.i(TAG, "exception processChannelItem channel ${this.channelIndex}")
}
} }
// 抓包处理 // 抓包处理
...@@ -322,49 +335,58 @@ class Task : Thread, IAppBaseCallback { ...@@ -322,49 +335,58 @@ class Task : Thread, IAppBaseCallback {
var timeStr = "" var timeStr = ""
val tagGet = "GET /" val tagGet = "GET /"
lines.forEach { lines.forEach {
if (it.contains("IP (")) {
val end = it.indexOf('.')
timeStr = it.substring(0, end)
}
if (it.contains(tagGet)) { try {
val start = it.indexOf(tagGet) + tagGet.length - 1 if (it.contains("IP (")) {
val end = it.lastIndexOf(' ') val end = it.indexOf('.')
partUrl = it.substring(start, end) timeStr = it.substring(0, end)
} }
if (it.contains("Host")) { if (it.contains(tagGet)) {
val start = it.indexOf(' ') + 1 val start = it.indexOf(tagGet) + tagGet.length - 1
val host = it.substring(start) val end = it.lastIndexOf(' ')
val url = "http://$host$partUrl" if (start < end && end < it.length)
partUrl = it.substring(start, end)
else
partUrl = "/"
}
Log.i(TAG, "capture url: $url") if (it.contains("Host")) {
val start = it.indexOf(' ') + 1
val host = it.substring(start)
val url = "http://$host$partUrl"
var add = true Log.i(TAG, "capture url: $url")
// 如果筛选url不为空,这里需要进行过滤
if (!this.apkInfo.filterUrl.isEmpty()) { var add = true
if (!url.contains(this.apkInfo.filterUrl)) // 如果筛选url不为空,这里需要进行过滤
add = false if (!this.apkInfo.filterUrl.isEmpty()) {
} if (!url.contains(this.apkInfo.filterUrl))
add = false
}
if (add) { if (add) {
// 这里进行媒体视频播放地址识别 // 这里进行媒体视频播放地址识别
add = false add = false
val extArr = this.apkInfo.mediaExt.split("|") val extArr = this.apkInfo.mediaExt.split("|")
for (ext in extArr) { for (ext in extArr) {
if (url.contains(ext)) { if (url.contains(ext)) {
add = true add = true
break break
}
} }
} }
}
if (add && !playUrlItems.contains(url)) { if (add && !playUrlItems.contains(url)) {
playUrlItems.add(url) playUrlItems.add(url)
} }
partUrl = "" partUrl = ""
}
} catch (e: Exception) {
e.printStackTrace()
Log.i(TAG, "exception at line: $it")
} }
} }
...@@ -408,7 +430,7 @@ class Task : Thread, IAppBaseCallback { ...@@ -408,7 +430,7 @@ class Task : Thread, IAppBaseCallback {
* 先上报数据,截图上传继续在后台进行 * 先上报数据,截图上传继续在后台进行
*/ */
private fun report() { private fun report() {
Log.i(TAG, "report....") Log.i(TAG, "report....status: ${this.status}")
val postJson = JSONObject() val postJson = JSONObject()
val reportArray = JSONArray() val reportArray = JSONArray()
try { try {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment