Commit f6747eed authored by liuyang's avatar liuyang

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

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