diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 92a57a6833a816428b0f2ae166bed3fb80deb2f4..e45adee2b38c3cf5540b6bc68baadd3ac1f580b7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,7 @@ () + private var channelIndex = 0 private var reportProtocol: ApkReportProtocol @@ -50,7 +56,7 @@ class Task : IAppBaseCallback { this.apkInfo = apkInfo // this.imagePath = this.context.cacheDir.absolutePath + "/" + apkInfo.packageName this.imagePath = Environment - .getExternalStorageDirectory().absolutePath + "/" + apkInfo.packageName + .getExternalStorageDirectory().absolutePath + "/upload/" + apkInfo.packageName val dir = File(this.imagePath) if (!dir.exists()) dir.mkdirs() @@ -82,29 +88,34 @@ class Task : IAppBaseCallback { } AdbUtil.launchApp("${this.apkInfo.packageName}/${this.apkInfo.launcher}") + Thread.sleep(2 * 1000L) + // 启动2s开始抓取,避免第一个频道没有抓到 + capture(this.apkInfo.launchDelay + this.apkInfo.captureDelay) Thread.sleep(this.apkInfo.launchDelay * 1000L) } private fun processChannels() { Log.i(TAG, "processChannels") step() - for (i in 1..this.apkInfo.channelCount) { + for (i in 1 until this.apkInfo.channelCount) { // 模拟按键事件. 切换频道进行抓取 this.channelIndex = i + capture(apkInfo.captureDelay) AdbUtil.sendMultiKey(this.apkInfo.channelKeyEvent) step() } } private fun step() { - capture() // 截图保存 val screenShots = saveScreenShot() + if (screenShots.size > 0) + uploadImages.addAll(screenShots) val playUrlItems = analysisCapture() } // 抓包处理 - private fun capture() { + private fun capture(delay: Int) { Log.i(TAG, "capture") val file = File(this.capturePath) if (file.exists()) @@ -112,8 +123,8 @@ class Task : IAppBaseCallback { Thread(Runnable { proc = AdbUtil.tcpCapture(this.capturePath) }).start() - Log.i(TAG, "capture sleep ${this.apkInfo.captureDelay} seconds") - Thread.sleep(this.apkInfo.captureDelay * 1000L) + Log.i(TAG, "capture sleep $delay seconds") + Thread.sleep(delay * 1000L) proc?.destroy() AdbUtil.killTcpdump() Thread.sleep(2000L) @@ -122,8 +133,10 @@ class Task : IAppBaseCallback { // 分析http抓包文件 private fun analysisCapture(): ArrayList { val playUrlItems = ArrayList() - val file = File(Environment - .getExternalStorageDirectory().absolutePath + "/capture.txt") + val file = File(this.capturePath) + if (!file.exists()) + return playUrlItems + val lines = file.readLines() var partUrl = "" @@ -206,24 +219,62 @@ class Task : IAppBaseCallback { AppUtil.pngToJpg(pngPath, jpgPath) } + private fun uploadComplete(errorCount: Int) { + report() + } + + private fun uploadImageCallback(): UploadStatusDelegate { + val totalUpload = this.uploadImages.size + var uploadCount = 0 + + 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?) { + Log.i(TAG, "upload error " + uploadInfo?.toString()) + uploadCount++ + if (uploadCount == totalUpload) { + uploadComplete(uploadCount - uploadInfo?.successfullyUploadedFiles!!.size) + } + } + + override fun onCompleted(context: Context?, uploadInfo: UploadInfo?, serverResponse: ServerResponse?) { + uploadCount++ + if (uploadCount == totalUpload) { + uploadComplete(uploadCount - uploadInfo?.successfullyUploadedFiles!!.size) + } + } + } + } + private fun uploadImage() { + try { - val uploadRequest = FTPUploadRequest(context, "ftp.duolebo.com", 21) - .setUsernameAndPassword("user", "password") + val uploadRequest = FTPUploadRequest(context, Config.instance.getFtpServer(), 21) + .setUsernameAndPassword(Config.instance.getFtpUserName(), Config.instance.getFtpPassword()) .setNotificationConfig(UploadNotificationConfig()) + .setCreatedDirectoriesPermissions(UnixPermissions("777")) + .setSocketTimeout(5000) + .setConnectTimeout(5000) + .setDelegate(uploadImageCallback()) .setMaxRetries(4) - val dir = File(imagePath) - dir.listFiles().forEach { - uploadRequest.addFileToUpload(it.absolutePath, "/remote/path") + this.uploadImages.forEach { + val uploadFile = File(it) + if (uploadFile.exists()) { + uploadRequest.addFileToUpload(it, Config.instance.getFtpRemotePath()) + } } val uploadId = uploadRequest.startUpload() Log.i(TAG, "upload id $uploadId") } catch (exc: Exception) { - Log.e("AndroidUploadService", exc.message, exc) + Log.e(TAG, exc.message, exc) } - } private fun report() { diff --git a/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt b/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt index 4cf8bc30717f0f29c9cbc9c3bdbd79da7e26e7f9..2387816c7a164a40ee2ff2352ab9a6a191b73bbd 100644 --- a/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt +++ b/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt @@ -55,7 +55,9 @@ class TaskManager { } fun stop() { - this.tasks.clear() + this.tasks.forEach { + + } this.isRunning = false } diff --git a/app/src/main/java/com/duolebo/blyrobot/util/AdbUtil.kt b/app/src/main/java/com/duolebo/blyrobot/util/AdbUtil.kt index 9a73cea546da6568652babd0b2ec389eab7bed98..7e289ee9bd767e7303c03c34744443c38d35bef4 100644 --- a/app/src/main/java/com/duolebo/blyrobot/util/AdbUtil.kt +++ b/app/src/main/java/com/duolebo/blyrobot/util/AdbUtil.kt @@ -210,6 +210,7 @@ object AdbUtil { try { dos = DataOutputStream(proc!!.outputStream) dos.write(captureCmd.toByteArray()) + dos.writeBytes(LINE_BREAK) dos.flush() val result = proc.waitFor() @@ -292,6 +293,18 @@ object AdbUtil { } } + fun isAppActive(packageName: String): Boolean { + val result = exeCmdEcho("dumpsys activity | grep mFocusedActivity", true) + if (result.status == 0) { + for (line in result.successLines) { + if (line.contains(packageName)) + return true + } + } + + return false + } + fun resetApp(packageName: String) { exeCmdEcho("pm clear $packageName", true) } diff --git a/app/src/main/java/com/duolebo/blyrobot/util/Config.kt b/app/src/main/java/com/duolebo/blyrobot/util/Config.kt index a65319f3ef5163f709e107e8adfc9950f500d2e5..00fd7ec4bca9a668b2f9f2fdbcf8deb962d43523 100644 --- a/app/src/main/java/com/duolebo/blyrobot/util/Config.kt +++ b/app/src/main/java/com/duolebo/blyrobot/util/Config.kt @@ -25,6 +25,22 @@ class Config: IProtocolConfig { return "http://test.duolebo.com/staging/apkReport/report.do" } + fun getFtpServer(): String { + return "192.168.2.195" + } + + fun getFtpUserName(): String { + return "mateng" + } + + fun getFtpPassword(): String { + return "qwertasdfg" + } + + fun getFtpRemotePath(): String { + return "/upload" + } + companion object { val instance = Config() }