Commit 2d3f8212 authored by liuyang's avatar liuyang

APK抓包>从频道1开始依次抓取, ftp上传优化

#BYLSERVER-1693
parent c76d67f3
package com.duolebo.blyrobot.data
import android.content.Context
import android.util.Log
import com.duolebo.blyrobot.tools.FtpManager
import com.duolebo.blyrobot.util.Config
import net.gotev.uploadservice.*
import net.gotev.uploadservice.ftp.FTPUploadRequest
import net.gotev.uploadservice.ftp.UnixPermissions
import java.io.File
/**
* 图片上传任务
*/
class ImageUploadTask(private var context: Context) : Thread() {
var uploadImages = ArrayList<String>()
var uploadId: String = ""
var reUpload = false
var isRunning = false
fun from(task: Task) {
this.uploadImages.clear()
this.uploadImages.addAll(task.uploadImages)
}
fun needReUpload(): Boolean {
if (this.isRunning)
return false
if (!this.reUpload)
return false
if (isUploadRunning())
return false
return true
}
// 任务是否在上传队列中
private fun isUploadRunning(): Boolean {
val runningTaskIds = UploadService.getTaskList()
if (this.uploadId in runningTaskIds)
return true
return false
}
override fun start() {
this.isRunning = true
super.start()
}
override fun run() {
uploadImage()
}
private fun uploadImage() {
Log.i(FtpManager.TAG, "upload image....")
try {
val uploadRequest = FTPUploadRequest(context, Config.instance.getFtpServer(), 21)
.setUsernameAndPassword(Config.instance.getFtpUserName(), Config.instance.getFtpPassword())
.setNotificationConfig(UploadNotificationConfig())
.setCreatedDirectoriesPermissions(UnixPermissions("777"))
.setSocketTimeout(15000)
.setConnectTimeout(15000)
.setDelegate(uploadImageCallback())
.setMaxRetries(4)
this.uploadImages.forEach {
val uploadFile = File(it)
if (uploadFile.exists()) {
uploadRequest.addFileToUpload(it, Config.instance.getFtpRemotePath() + uploadFile.name)
}
}
this.uploadId = uploadRequest.startUpload()
Log.i(FtpManager.TAG, "upload id $uploadId")
} catch (exc: Exception) {
Log.e(FtpManager.TAG, exc.message, exc)
}
}
private fun uploadComplete(errorCount: Int) {
Log.i(FtpManager.TAG, "upload errorCount: $errorCount")
this.isRunning = false
if (errorCount > 0 && errorCount > this.uploadImages.size / 3) {
this.reUpload = true
} else {
// 上传完毕直接删除问题
this.uploadImages.forEach {
val uploadFile = File(it)
if (uploadFile.exists()) {
uploadFile.delete()
}
}
}
}
/**
* ftp 上传回调监听
*/
private fun uploadImageCallback(): UploadStatusDelegate {
val totalUpload = this.uploadImages.size
Log.i(FtpManager.TAG, "total upload count : $totalUpload")
return object : UploadStatusDelegate {
override fun onCancelled(context: Context?, uploadInfo: UploadInfo?) {
}
override fun onProgress(context: Context?, uploadInfo: UploadInfo?) {
}
override fun onError(context: Context?, uploadInfo: UploadInfo?, serverResponse: ServerResponse?, exception: java.lang.Exception?) {
val uploadSize = uploadInfo?.successfullyUploadedFiles!!.size
Log.i(FtpManager.TAG, "onError...uploadCount: $uploadSize")
}
override fun onCompleted(context: Context?, uploadInfo: UploadInfo?, serverResponse: ServerResponse?) {
val uploadSize = uploadInfo?.successfullyUploadedFiles!!.size
Log.i(FtpManager.TAG, "onCompleted...uploadCount: $uploadSize")
uploadComplete(totalUpload - uploadSize)
}
}
}
var uploadTaskListener: OnUploadTaskListener? = null
/**
* 图片上传任务状态
*/
interface OnUploadTaskListener {
fun onComplete()
}
}
\ No newline at end of file
......@@ -9,12 +9,10 @@ import com.duolebo.appbase.AppBaseHandler
import com.duolebo.appbase.IAppBaseCallback
import com.duolebo.appbase.IProtocol
import com.duolebo.blyrobot.protocol.ApkReportProtocol
import com.duolebo.blyrobot.tools.FtpManager
import com.duolebo.blyrobot.util.AdbUtil
import com.duolebo.blyrobot.util.AppUtil
import com.duolebo.blyrobot.util.Config
import net.gotev.uploadservice.*
import net.gotev.uploadservice.ftp.FTPUploadRequest
import net.gotev.uploadservice.ftp.UnixPermissions
import org.json.JSONArray
import org.json.JSONObject
import java.io.File
......@@ -39,8 +37,8 @@ class Task : Thread, IAppBaseCallback {
// 抓包存放路径
private var capturePath = AppUtil.getAbsoluteSdcardPath() + "/capture.txt"
private var uploadImages = ArrayList<String>()
private var uploadId = ""
var uploadImages = ArrayList<String>()
var uploadTask: ImageUploadTask ?= null
private var channelIndex = 0
var status: State = State.IDLE
......@@ -96,10 +94,6 @@ class Task : Thread, IAppBaseCallback {
* 执行任务
*/
private fun execute() {
//如果之前的上传任务还在执行,进行取消
if (!uploadId.isNullOrEmpty()) {
UploadService.stopUpload(uploadId)
}
this.status = State.RUNNING
this.prepareReport()
......@@ -147,15 +141,6 @@ class Task : Thread, IAppBaseCallback {
this.status = State.IDLE
this.channelIndex = 0
this.uploadImages.clear()
val dir = File(this.taskPath)
if (dir.exists()) {
for (file in dir.listFiles()) {
if (file.name.endsWith(".log"))
continue
file.delete()
}
}
}
fun release() {
......@@ -166,8 +151,10 @@ class Task : Thread, IAppBaseCallback {
AdbUtil.stopApp(this.apkInfo.packageName)
// 取消ftp上传
// if (!uploadId.isNullOrEmpty())
// UploadService.stopUpload(uploadId)
this.uploadTask?.run {
FtpManager.instance.cancelTask(this)
}
}
fun exit() {
......@@ -409,63 +396,12 @@ class Task : Thread, IAppBaseCallback {
}
}
private fun uploadComplete(errorCount: Int) {
Log.i(TAG, "upload errorCount: $errorCount")
}
/**
* ftp 上传回调监听
*/
private fun uploadImageCallback(): UploadStatusDelegate {
val totalUpload = this.uploadImages.size
Log.i(TAG, "total upload count : $totalUpload")
return object : UploadStatusDelegate {
override fun onCancelled(context: Context?, uploadInfo: UploadInfo?) {
}
override fun onProgress(context: Context?, uploadInfo: UploadInfo?) {
}
override fun onError(context: Context?, uploadInfo: UploadInfo?, serverResponse: ServerResponse?, exception: java.lang.Exception?) {
val uploadSize = uploadInfo?.successfullyUploadedFiles!!.size
Log.i(TAG, "onError...uploadCount: $uploadSize")
}
override fun onCompleted(context: Context?, uploadInfo: UploadInfo?, serverResponse: ServerResponse?) {
val uploadSize = uploadInfo?.successfullyUploadedFiles!!.size
Log.i(TAG, "onCompleted...uploadCount: $uploadSize")
uploadComplete(totalUpload - uploadSize)
}
}
}
//通过ftp上传图片到服务器
private fun uploadImage() {
Log.i(TAG, "upload image....")
try {
val uploadRequest = FTPUploadRequest(context, Config.instance.getFtpServer(), 21)
.setUsernameAndPassword(Config.instance.getFtpUserName(), Config.instance.getFtpPassword())
.setNotificationConfig(UploadNotificationConfig())
.setCreatedDirectoriesPermissions(UnixPermissions("777"))
.setSocketTimeout(15000)
.setConnectTimeout(15000)
.setDelegate(uploadImageCallback())
.setMaxRetries(4)
this.uploadImages.forEach {
val uploadFile = File(it)
if (uploadFile.exists()) {
uploadRequest.addFileToUpload(it, Config.instance.getFtpRemotePath() + uploadFile.name)
}
}
this.uploadId = uploadRequest.startUpload()
Log.i(TAG, "upload id $uploadId")
} catch (exc: Exception) {
Log.e(TAG, exc.message, exc)
}
val uploadTask = ImageUploadTask(context)
uploadTask.from(this)
FtpManager.instance.addTask(uploadTask)
this.uploadTask = uploadTask
}
/**
......
......@@ -16,6 +16,7 @@ import com.duolebo.blyrobot.data.ApkInfo
import com.duolebo.blyrobot.data.AppInfoData
import com.duolebo.blyrobot.data.Task
import com.duolebo.blyrobot.protocol.GetAppInfoProtocol
import com.duolebo.blyrobot.tools.FtpManager
import com.duolebo.blyrobot.tools.TaskManager
import com.duolebo.blyrobot.util.AdbUtil
import com.duolebo.blyrobot.util.AppUtil
......@@ -47,6 +48,7 @@ class BylRobotService: Service(), IAppBaseCallback {
override fun onCreate() {
super.onCreate()
FtpManager.instance.init(this)
initBroadcast()
// requestAppList()
}
......
package com.duolebo.blyrobot.tools
import com.duolebo.blyrobot.data.ImageUploadTask
import net.gotev.uploadservice.UploadService
import java.util.*
/**
* ftp上传管理类
* 因为ftp upload service 并不稳定,这里自己处理重新上传逻辑
*/
class FtpManager {
companion object {
val instance = FtpManager()
val TAG = "RobotTaskFtpManager"
}
var isRunning = false
val uploadTasks = ArrayList<ImageUploadTask>()
private var scheduleTime: Timer? = null
fun start() {
scheduleTime?.run { cancel() }
this.isRunning = true
scheduleTime = Timer()
scheduleTime!!.schedule(object : TimerTask() {
override fun run() {
while (isRunning) {
for (uploadTask in uploadTasks) {
if (uploadTask.needReUpload()) {
uploadTask.start()
}
}
Thread.sleep(1 * 60 * 1000)
}
}
}, 0)
}
fun addTask(task: ImageUploadTask) {
this.uploadTasks.add(task)
task.uploadTaskListener = object : ImageUploadTask.OnUploadTaskListener {
override fun onComplete() {
uploadTasks.remove(task)
}
}
task.start()
}
fun cancelTask(task: ImageUploadTask) {
//如果之前的上传任务还在执行,进行取消
if (!task.uploadId.isEmpty()) {
UploadService.stopUpload(task.uploadId)
}
this.uploadTasks.remove(task)
}
fun stop() {
scheduleTime?.run { cancel() }
for (uploadTask in uploadTasks) {
cancelTask(uploadTask)
}
}
}
\ No newline at end of file
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