Commit f6747eed authored by liuyang's avatar liuyang

APK图片抓取识别及轮播流地址抓取,客户端获取配置信息

#BYLSERVER-1438
parent 25f6fdc3
...@@ -9,7 +9,7 @@ android { ...@@ -9,7 +9,7 @@ android {
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 22 targetSdkVersion 22
versionCode 1 versionCode 1
versionName "1.0" versionName "1.1"
} }
signingConfigs { signingConfigs {
......
{ {
"name": "电视家", "name": "电视家2.0",
"packageName": "com.elinkway.tvlive2", "packageName": "com.elinkway.tvlive2",
"launcher": "com.elinkway.tvlive2.activity.SplashActivity", "launcher": "com.elinkway.tvlive2.activity.SplashActivity",
"launchDelay": "15", "launchDelay": "15",
......
package com.duolebo.blyrobot package com.duolebo.blyrobot
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.support.v4.content.LocalBroadcastManager import android.support.v4.content.LocalBroadcastManager
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
...@@ -12,7 +13,9 @@ import android.widget.Toast ...@@ -12,7 +13,9 @@ import android.widget.Toast
import com.duolebo.appbase.AppBaseHandler import com.duolebo.appbase.AppBaseHandler
import com.duolebo.appbase.IAppBaseCallback import com.duolebo.appbase.IAppBaseCallback
import com.duolebo.appbase.IProtocol import com.duolebo.appbase.IProtocol
import com.duolebo.blyrobot.activity.PackageListActivity
import com.duolebo.blyrobot.data.ApkInfo import com.duolebo.blyrobot.data.ApkInfo
import com.duolebo.blyrobot.data.ApkPackageInfo
import com.duolebo.blyrobot.data.AppInfoData import com.duolebo.blyrobot.data.AppInfoData
import com.duolebo.blyrobot.data.Task import com.duolebo.blyrobot.data.Task
import com.duolebo.blyrobot.protocol.GetAppInfoProtocol import com.duolebo.blyrobot.protocol.GetAppInfoProtocol
...@@ -22,6 +25,7 @@ import com.duolebo.blyrobot.ui.AppConfigListItem ...@@ -22,6 +25,7 @@ import com.duolebo.blyrobot.ui.AppConfigListItem
import com.duolebo.blyrobot.util.AdbUtil import com.duolebo.blyrobot.util.AdbUtil
import com.duolebo.blyrobot.util.Config import com.duolebo.blyrobot.util.Config
import com.duolebo.blyrobot.util.Constants import com.duolebo.blyrobot.util.Constants
import com.minhui.vpn.utils.ThreadProxy
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import java.util.* import java.util.*
...@@ -33,13 +37,14 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { ...@@ -33,13 +37,14 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
private lateinit var appInfoAdapter: AppConfigAdapter private lateinit var appInfoAdapter: AppConfigAdapter
private lateinit var refreshTimer: Timer private lateinit var refreshTimer: Timer
private var apkPackageInfo: List<ApkPackageInfo>? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Log.i(TAG, "onCreate....") Log.i(TAG, "onCreate....")
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
apkInfoProtocol = GetAppInfoProtocol(this, Config.instance) getLocalAppList()
this.dataHandler = AppBaseHandler(this)
this.appInfoAdapter = AppConfigAdapter() this.appInfoAdapter = AppConfigAdapter()
listView.adapter = this.appInfoAdapter listView.adapter = this.appInfoAdapter
...@@ -65,6 +70,22 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { ...@@ -65,6 +70,22 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
stopRobot() stopRobot()
} }
startBtn.requestFocus() startBtn.requestFocus()
requestAppList()
}
private fun requestAppList() {
apkInfoProtocol = GetAppInfoProtocol(this, Config.instance)
this.dataHandler = AppBaseHandler(this)
apkInfoProtocol.execute(this.dataHandler)
}
private fun getLocalAppList() {
ThreadProxy.getInstance().execute(object : Runnable {
override fun run() {
apkPackageInfo = ApkPackageInfo.getAppInfos(applicationContext)
}
})
} }
private fun initRefreshTimer() { private fun initRefreshTimer() {
...@@ -122,6 +143,21 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { ...@@ -122,6 +143,21 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
} }
} }
private fun getAppIcon(packageName: String): Drawable? {
var drawable:Drawable ?= null
apkPackageInfo?.run {
val targetPackage = this.find {
it.packageName == packageName
}
if (targetPackage != null) {
drawable = targetPackage.applicationInfo.loadIcon(packageManager)
}
}
return drawable
}
class AppConfigAdapter: BaseAdapter() { class AppConfigAdapter: BaseAdapter() {
private val dataList = ArrayList<ApkInfo>() private val dataList = ArrayList<ApkInfo>()
...@@ -132,10 +168,12 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { ...@@ -132,10 +168,12 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
} }
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var itemView = convertView as AppConfigListItem var itemView: AppConfigListItem
if (convertView == null) { if (convertView == null) {
itemView = AppConfigListItem(parent.context) itemView = AppConfigListItem(parent.context)
} }
else
itemView = convertView as AppConfigListItem
itemView.setData(dataList[position]) itemView.setData(dataList[position])
......
package com.duolebo.blyrobot.data package com.duolebo.blyrobot.data
import com.duolebo.appbase.IModel
import com.duolebo.appbase.prj.XMLHelper import com.duolebo.appbase.prj.XMLHelper
import com.duolebo.appbase.prj.bmtv.model.ModelBase
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
class AppInfoData : IModel { class AppInfoData : ModelBase() {
val apkInfos = ArrayList<ApkInfo>() val apkInfos = ArrayList<ApkInfo>()
var result = -1
override fun from(json: JSONObject): Boolean { override fun from(json: JSONObject): Boolean {
val data = json.optJSONArray("data") val data = json.optJSONArray("data")
if (data != null) { if (data != null) {
for (i in 0..data.length()) { for (i in 0 until data.length()) {
val apkInfo = ApkInfo() val apkInfo = ApkInfo()
apkInfo.from(data.getJSONObject(i)) apkInfo.from(data.getJSONObject(i))
apkInfos.add(apkInfo) apkInfos.add(apkInfo)
} }
} }
result = 0
return true return true
} }
...@@ -27,4 +30,8 @@ class AppInfoData : IModel { ...@@ -27,4 +30,8 @@ class AppInfoData : IModel {
override fun from(p0: XMLHelper?): Boolean { override fun from(p0: XMLHelper?): Boolean {
return false return false
} }
override fun getCode(): Int {
return result
}
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.duolebo.blyrobot.data ...@@ -3,6 +3,7 @@ package com.duolebo.blyrobot.data
import android.content.Context import android.content.Context
import android.os.Environment import android.os.Environment
import android.util.Log import android.util.Log
import android.widget.Toast
import com.duolebo.appbase.AppBaseHandler import com.duolebo.appbase.AppBaseHandler
import com.duolebo.appbase.IAppBaseCallback import com.duolebo.appbase.IAppBaseCallback
import com.duolebo.appbase.IProtocol import com.duolebo.appbase.IProtocol
...@@ -10,10 +11,7 @@ import com.duolebo.blyrobot.protocol.ApkReportProtocol ...@@ -10,10 +11,7 @@ import com.duolebo.blyrobot.protocol.ApkReportProtocol
import com.duolebo.blyrobot.util.AdbUtil import com.duolebo.blyrobot.util.AdbUtil
import com.duolebo.blyrobot.util.AppUtil import com.duolebo.blyrobot.util.AppUtil
import com.duolebo.blyrobot.util.Config import com.duolebo.blyrobot.util.Config
import net.gotev.uploadservice.ServerResponse import net.gotev.uploadservice.*
import net.gotev.uploadservice.UploadInfo
import net.gotev.uploadservice.UploadNotificationConfig
import net.gotev.uploadservice.UploadStatusDelegate
import net.gotev.uploadservice.ftp.FTPUploadRequest import net.gotev.uploadservice.ftp.FTPUploadRequest
import net.gotev.uploadservice.ftp.UnixPermissions import net.gotev.uploadservice.ftp.UnixPermissions
import org.json.JSONObject import org.json.JSONObject
...@@ -43,10 +41,12 @@ class Task : IAppBaseCallback { ...@@ -43,10 +41,12 @@ class Task : IAppBaseCallback {
.getExternalStorageDirectory().absolutePath + "/capture.txt" .getExternalStorageDirectory().absolutePath + "/capture.txt"
private var uploadImages = ArrayList<String>() private var uploadImages = ArrayList<String>()
private var uploadId = ""
private var channelIndex = 0 private var channelIndex = 0
private var status = "0" private var status = "0"
private var reportProtocol: ApkReportProtocol private var reportProtocol: ApkReportProtocol
private var dataHandler:AppBaseHandler private var dataHandler:AppBaseHandler
private lateinit var reportJson: JSONObject private lateinit var reportJson: JSONObject
...@@ -91,6 +91,18 @@ class Task : IAppBaseCallback { ...@@ -91,6 +91,18 @@ class Task : IAppBaseCallback {
AdbUtil.stopApp(this.apkInfo.packageName) AdbUtil.stopApp(this.apkInfo.packageName)
} }
fun destroy() {
// 杀掉tcpdump进程
AdbUtil.killTcpdump()
// 退出应用
AdbUtil.stopApp(this.apkInfo.packageName)
// 取消ftp上传
if (!uploadId.isNullOrEmpty())
UploadService.stopUpload(uploadId)
}
private fun finish(result: Boolean) { private fun finish(result: Boolean) {
this.taskListener?.run { this.taskListener?.run {
onComplete(result) onComplete(result)
...@@ -290,7 +302,7 @@ class Task : IAppBaseCallback { ...@@ -290,7 +302,7 @@ class Task : IAppBaseCallback {
} }
} }
val uploadId = uploadRequest.startUpload() this.uploadId = uploadRequest.startUpload()
Log.i(TAG, "upload id $uploadId") Log.i(TAG, "upload id $uploadId")
} catch (exc: Exception) { } catch (exc: Exception) {
Log.e(TAG, exc.message, exc) Log.e(TAG, exc.message, exc)
......
...@@ -2,6 +2,7 @@ package com.duolebo.blyrobot.protocol ...@@ -2,6 +2,7 @@ package com.duolebo.blyrobot.protocol
import android.content.Context import android.content.Context
import com.duolebo.appbase.IModel import com.duolebo.appbase.IModel
import com.duolebo.appbase.net.Parser
import com.duolebo.appbase.prj.bmtv.protocol.IProtocolConfig import com.duolebo.appbase.prj.bmtv.protocol.IProtocolConfig
import com.duolebo.appbase.prj.bmtv.protocol.ProtocolBase import com.duolebo.appbase.prj.bmtv.protocol.ProtocolBase
import com.duolebo.blyrobot.data.AppInfoData import com.duolebo.blyrobot.data.AppInfoData
...@@ -10,6 +11,10 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol ...@@ -10,6 +11,10 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
val model = AppInfoData() val model = AppInfoData()
override fun prepareHttpBody(): ByteArray {
return "".toByteArray()
}
override fun prepareProtocolBody(p0: MutableMap<String, String>?) { override fun prepareProtocolBody(p0: MutableMap<String, String>?) {
} }
...@@ -21,4 +26,7 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol ...@@ -21,4 +26,7 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
return "" return ""
} }
override fun requestHttpMethod(): Parser.ParserClient.HttpMethod {
return Parser.ParserClient.HttpMethod.GET
}
} }
\ No newline at end of file
...@@ -33,7 +33,6 @@ class BylRobotService: Service() { ...@@ -33,7 +33,6 @@ class BylRobotService: Service() {
Constants.CMD_START -> loadTask() Constants.CMD_START -> loadTask()
Constants.CMD_STOP -> stopTask() Constants.CMD_STOP -> stopTask()
} }
loadTask()
} }
} }
} }
...@@ -78,12 +77,6 @@ class BylRobotService: Service() { ...@@ -78,12 +77,6 @@ class BylRobotService: Service() {
TaskManager.instance.stop() TaskManager.instance.stop()
} }
private fun screenShot() {
Thread(Runnable {
}).start()
}
private fun testKey() { private fun testKey() {
Thread(Runnable { Thread(Runnable {
AdbUtil.sendMultiKey("down/up/right") AdbUtil.sendMultiKey("down/up/right")
......
...@@ -9,9 +9,13 @@ class TaskManager { ...@@ -9,9 +9,13 @@ class TaskManager {
val tasks = ArrayList<Task>() val tasks = ArrayList<Task>()
private var isRunning = false private var isRunning = false
private var currentTask: Task ?= null private var currentTask: Task ?= null
// 处理时间
var updateTime = 0L
private val runnable = Runnable { private val runnable = Runnable {
while (isRunning && tasks.size > 0) { val dist = System.currentTimeMillis() - updateTime
while (isRunning && tasks.size > 0 && dist > 6*60*60*1000) {
this.updateTime = System.currentTimeMillis()
currentTask = tasks[0] currentTask = tasks[0]
currentTask!!.start() currentTask!!.start()
} }
...@@ -20,7 +24,7 @@ class TaskManager { ...@@ -20,7 +24,7 @@ class TaskManager {
fun add(task: Task) { fun add(task: Task) {
task.taskListener = object : Task.OnTaskListener { task.taskListener = object : Task.OnTaskListener {
override fun onComplete(result: Boolean) { override fun onComplete(result: Boolean) {
remove(task) Log.i(TAG, "task ${task.apkInfo.name} complete with result: $result")
} }
} }
this.tasks.add(task) this.tasks.add(task)
...@@ -55,9 +59,12 @@ class TaskManager { ...@@ -55,9 +59,12 @@ class TaskManager {
} }
fun stop() { fun stop() {
updateTime = 0L
this.tasks.forEach { this.tasks.forEach {
it.destroy()
} }
this.tasks.clear()
this.isRunning = false this.isRunning = false
} }
......
...@@ -5,11 +5,20 @@ ...@@ -5,11 +5,20 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_width="match_parent"> android:layout_width="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"/>
<LinearLayout <LinearLayout
android:id="@+id/btnGroup" android:id="@+id/btnGroup"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:orientation="horizontal"> android:orientation="horizontal">
<Button <Button
...@@ -24,13 +33,6 @@ ...@@ -24,13 +33,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:text="停止"/> android:text="停止"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:layout_marginTop="20dp"/>
</LinearLayout> </LinearLayout>
<ListView <ListView
......
...@@ -4,13 +4,24 @@ ...@@ -4,13 +4,24 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<ImageView
android:id="@+id/appIcon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
tools:src="@drawable/sym_def_app_icon" />
<TextView <TextView
android:id="@+id/appName" android:id="@+id/appName"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="40dp" android:minHeight="40dp"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:textSize="22sp" android:layout_toRightOf="@id/appIcon"
android:textSize="18sp"
android:gravity="center_vertical" android:gravity="center_vertical"
tools:text="电视家" /> tools:text="电视家" />
...@@ -20,9 +31,10 @@ ...@@ -20,9 +31,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="30dp" android:minHeight="30dp"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/appIcon"
android:layout_below="@+id/appName" android:layout_below="@+id/appName"
android:gravity="center_vertical" android:gravity="center_vertical"
android:textSize="18sp" android:textSize="16sp"
tools:text="com.elinkway.tvlive2" /> tools:text="com.elinkway.tvlive2" />
<TextView <TextView
......
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