diff --git a/app/src/main/java/com/duolebo/blyrobot/data/ImageUploadTask.kt b/app/src/main/java/com/duolebo/blyrobot/data/ImageUploadTask.kt new file mode 100644 index 0000000000000000000000000000000000000000..94d1bbc39469c0bcac3563fafe9d050ec8e64b34 --- /dev/null +++ b/app/src/main/java/com/duolebo/blyrobot/data/ImageUploadTask.kt @@ -0,0 +1,137 @@ +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() + 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 diff --git a/app/src/main/java/com/duolebo/blyrobot/data/Task.kt b/app/src/main/java/com/duolebo/blyrobot/data/Task.kt index 59fc996cfb16926dccc6e9e5c32abad092bfc12f..4bcfe1749591721b9ed055de2a41be571d7658af 100644 --- a/app/src/main/java/com/duolebo/blyrobot/data/Task.kt +++ b/app/src/main/java/com/duolebo/blyrobot/data/Task.kt @@ -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() - private var uploadId = "" + var uploadImages = ArrayList() + 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 } /** diff --git a/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt b/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt index 7d7d699cbec3369455c46b26de8217cf7b06b7f1..0ac634f17fc752b3e787e1b49ee4c6e8352bed7b 100644 --- a/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt +++ b/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt @@ -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() } diff --git a/app/src/main/java/com/duolebo/blyrobot/tools/FtpManager.kt b/app/src/main/java/com/duolebo/blyrobot/tools/FtpManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..b7036552c9c9422ef2531457396596ee98ec0124 --- /dev/null +++ b/app/src/main/java/com/duolebo/blyrobot/tools/FtpManager.kt @@ -0,0 +1,66 @@ +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() + 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