refactor(util): 重构实用工具类并优化文件路径方法

- 重构了多个实用工具类,优化了文件路径获取方法
- 将文件路径相关方法统一移至 ContextUtils 类
- 优化了 AppUtils、InstallUtils、TaskUtils 等类的结构- 删除了 FileUtils 类中的冗余方法
- 调整了 ShellUtils、ServiceUtils 等类的实现
This commit is contained in:
yjj38 2025-07-18 15:40:28 +08:00
parent af757222c1
commit dadf5c7551
18 changed files with 256 additions and 269 deletions

View File

@ -10,6 +10,7 @@ import com.android.grape.data.AppState.isClickRet
import com.android.grape.data.AppState.proxyCountry import com.android.grape.data.AppState.proxyCountry
import com.android.grape.data.AppState.ua import com.android.grape.data.AppState.ua
import com.android.grape.net.MyGet import com.android.grape.net.MyGet
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
class CheckIpJobService : JobIntentService() { class CheckIpJobService : JobIntentService() {
@ -18,7 +19,7 @@ class CheckIpJobService : JobIntentService() {
InstallService.onEvent(this) InstallService.onEvent(this)
} else { } else {
isClickRet = false isClickRet = false
TaskUtils.setInstallRet(false) setInstallRet(false)
clickErrReason = "networkErr" clickErrReason = "networkErr"
TaskUtils.setFinish(this) TaskUtils.setFinish(this)
} }

View File

@ -5,6 +5,7 @@ import android.content.Intent
import androidx.core.app.JobIntentService import androidx.core.app.JobIntentService
import com.android.grape.data.AppState.clickErrReason import com.android.grape.data.AppState.clickErrReason
import com.android.grape.data.AppState.isClickRet import com.android.grape.data.AppState.isClickRet
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
@ -28,7 +29,7 @@ class DownloadAppJobService : JobIntentService() {
StartVpnPortJobService.onEvent(this) StartVpnPortJobService.onEvent(this)
} else { } else {
isClickRet = false isClickRet = false
TaskUtils.setInstallRet(false) setInstallRet(false)
clickErrReason = "downloadErr" clickErrReason = "downloadErr"
TaskUtils.setFinish(this) TaskUtils.setFinish(this)
} }

View File

@ -9,6 +9,7 @@ import androidx.core.app.JobIntentService
import com.android.grape.data.AppState.isNeedRestored import com.android.grape.data.AppState.isNeedRestored
import com.android.grape.data.AppState.recordPackageName import com.android.grape.data.AppState.recordPackageName
import com.android.grape.util.AppUtils.installRecord import com.android.grape.util.AppUtils.installRecord
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
class InstallService : JobIntentService() { class InstallService : JobIntentService() {
@ -18,7 +19,7 @@ class InstallService : JobIntentService() {
if (installRecord(this)) { if (installRecord(this)) {
Log.i(TAG, "installRecord succ") Log.i(TAG, "installRecord succ")
tryNum = 0 tryNum = 0
TaskUtils.setInstallRet(true) setInstallRet(true)
println("IOSTQ:isNeedRestored == " + isNeedRestored) println("IOSTQ:isNeedRestored == " + isNeedRestored)
if (isNeedRestored) { if (isNeedRestored) {

View File

@ -28,13 +28,13 @@ import com.android.grape.data.AppState.reloginRecordId
import com.android.grape.net.AfClient.postData import com.android.grape.net.AfClient.postData
import com.android.grape.util.AppUtils.getAppAfVer import com.android.grape.util.AppUtils.getAppAfVer
import com.android.grape.util.DeviceUtils.getMainUserAndGroup import com.android.grape.util.DeviceUtils.getMainUserAndGroup
import com.android.grape.util.InstallUtils.isInstallRet
import com.android.grape.util.MyPost import com.android.grape.util.MyPost
import com.android.grape.util.ShellUtils.chownSh import com.android.grape.util.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.delFileSh import com.android.grape.util.ShellUtils.delFileSh
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
import com.android.grape.util.TaskUtils.HkVer import com.android.grape.util.TaskUtils.HkVer
import com.android.grape.util.TaskUtils.getAfLog import com.android.grape.util.TaskUtils.getAfLog
import com.android.grape.util.TaskUtils.isInstallRet
import com.android.grape.util.TaskUtils.setFinish import com.android.grape.util.TaskUtils.setFinish
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull

View File

@ -11,9 +11,9 @@ import com.android.grape.data.AppState.proxyCountry
import com.android.grape.net.MyGet import com.android.grape.net.MyGet
import com.android.grape.util.ClashUtil import com.android.grape.util.ClashUtil
import com.android.grape.util.ClashUtil.getProxyPort import com.android.grape.util.ClashUtil.getProxyPort
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
import com.android.grape.util.TaskUtils.setFinish import com.android.grape.util.TaskUtils.setFinish
import com.android.grape.util.TaskUtils.setInstallRet
import java.util.Locale import java.util.Locale
class StartVpnPortJobService : JobIntentService() { class StartVpnPortJobService : JobIntentService() {

View File

@ -6,10 +6,10 @@ import androidx.core.app.JobIntentService
import com.android.grape.data.AppState.recordPackageName import com.android.grape.data.AppState.recordPackageName
import com.android.grape.util.BackupUtils.backUp import com.android.grape.util.BackupUtils.backUp
import com.android.grape.util.FileUtils.delFiles import com.android.grape.util.FileUtils.delFiles
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.MockTools import com.android.grape.util.MockTools
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
import com.android.grape.util.TaskUtils.setFinish import com.android.grape.util.TaskUtils.setFinish
import com.android.grape.util.TaskUtils.setInstallRet
class UnInstallService : JobIntentService() { class UnInstallService : JobIntentService() {

View File

@ -23,8 +23,8 @@ import com.android.grape.sai.prefers.PreferencesHelper
import com.android.grape.sai.rootless.AndroidPackageInstallerError import com.android.grape.sai.rootless.AndroidPackageInstallerError
import com.android.grape.sai.shell.MiuiUtils import com.android.grape.sai.shell.MiuiUtils
import com.android.grape.sai.shell.Shell import com.android.grape.sai.shell.Shell
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils import com.android.grape.util.TaskUtils
import com.android.grape.util.TaskUtils.setInstallRet
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import java.io.File import java.io.File
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService

View File

@ -17,15 +17,7 @@ class AndroidFileDownloader(private val context: Context) {
private val client = OkHttpClient() private val client = OkHttpClient()
/**
* 下载文件到指定路径
*
* @param url 文件下载URL
* @param relativePath 相对于外部存储目录的路径 "Downloads/MyApp/file.zip"
* @param fileName 文件名可选如未提供则从URL提取
* @param progressCallback 进度回调
* @param completionCallback 完成回调
*/
fun downloadFile( fun downloadFile(
url: String, url: String,
relativePath: String, relativePath: String,

View File

@ -40,17 +40,17 @@ import com.android.grape.sai.param.SaiPiSessionParams
import com.android.grape.sai.prefers.PreferencesHelper import com.android.grape.sai.prefers.PreferencesHelper
import com.android.grape.util.ContextUtils.getBaseFilesDir import com.android.grape.util.ContextUtils.getBaseFilesDir
import com.android.grape.util.ContextUtils.getRecordDataDirName import com.android.grape.util.ContextUtils.getRecordDataDirName
import com.android.grape.util.ContextUtils.getRecordDataFileName
import com.android.grape.util.ContextUtils.getRecordExtraFileName import com.android.grape.util.ContextUtils.getRecordExtraFileName
import com.android.grape.util.ContextUtils.getRecordSdcardApkVerFileName
import com.android.grape.util.ContextUtils.getSessionTxtFileName
import com.android.grape.util.DeviceUtils.getUserAndGroupSh import com.android.grape.util.DeviceUtils.getUserAndGroupSh
import com.android.grape.util.FileUtils.forceMakeDir import com.android.grape.util.FileUtils.forceMakeDir
import com.android.grape.util.FileUtils.getFileContent import com.android.grape.util.FileUtils.getFileContent
import com.android.grape.util.FileUtils.getRecordDataFileName
import com.android.grape.util.FileUtils.getRecordSdcardApkVerFileName
import com.android.grape.util.FileUtils.getSessionTxtFileName
import com.android.grape.util.InstallUtils.installApks4Tmp import com.android.grape.util.InstallUtils.installApks4Tmp
import com.android.grape.util.InstallUtils.isInstallRet
import com.android.grape.util.ShellUtils.chownSh import com.android.grape.util.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.unzipAPkSh import com.android.grape.util.ShellUtils.unzipAPkSh
import com.android.grape.util.TaskUtils.isInstallRet
import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ActivityUtils
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
@ -183,7 +183,7 @@ object AppUtils {
} }
} }
public fun recordAppInstalled(context: Context): Boolean { fun recordAppInstalled(context: Context): Boolean {
return checkAppInstalled( return checkAppInstalled(
context, context,
recordPackageName recordPackageName
@ -276,7 +276,7 @@ object AppUtils {
} }
public fun filterStr(s: String?): String { fun filterStr(s: String?): String {
var s = s var s = s
val sb = StringBuffer() val sb = StringBuffer()
@ -303,7 +303,7 @@ object AppUtils {
return "101" == tt || "100" == tt return "101" == tt || "100" == tt
} }
public fun getApkDataDir(context: Context, packageName: String): String? { fun getApkDataDir(context: Context, packageName: String): String? {
var apkDataPath: String? = null var apkDataPath: String? = null
try { try {
apkDataPath = context.packageManager.getApplicationInfo(packageName, 0).dataDir apkDataPath = context.packageManager.getApplicationInfo(packageName, 0).dataDir
@ -350,7 +350,7 @@ object AppUtils {
appAfVer = appAfVerV appAfVer = appAfVerV
} }
public fun clientInstallSplit(context: Context, apkFile: File, extraFile: File): Boolean { fun clientInstallSplit(context: Context, apkFile: File, extraFile: File): Boolean {
val PrintWriter: PrintWriter? = null val PrintWriter: PrintWriter? = null
val process: Process? = null val process: Process? = null
try { try {
@ -378,7 +378,7 @@ object AppUtils {
} }
public fun clientInstallObb(context: Context, apkFile: File, extraFile: File): Boolean { fun clientInstallObb(context: Context, apkFile: File, extraFile: File): Boolean {
Log.i( Log.i(
"AppUtils", "AppUtils",
"start clientInstallObb : $apkFile ; $extraFile" "start clientInstallObb : $apkFile ; $extraFile"
@ -394,7 +394,7 @@ object AppUtils {
return false return false
} }
public fun installObb(context: Context, extraFile: File) { fun installObb(context: Context, extraFile: File) {
val userAndGroup = getUserAndGroupSh( val userAndGroup = getUserAndGroupSh(
context, context,
context.packageName, context.packageName,
@ -442,7 +442,7 @@ object AppUtils {
} }
} }
public fun clientInstallOther(context: Context, apkFile: File): Boolean { fun clientInstallOther(context: Context, apkFile: File): Boolean {
Log.e("AppUtils", "clientInstallOther: $apkFile") Log.e("AppUtils", "clientInstallOther: $apkFile")
if (apkFile.toString().contains("xapk")) { if (apkFile.toString().contains("xapk")) {
@ -500,7 +500,7 @@ object AppUtils {
return false return false
} }
public fun clientInstall(apkFile: File): Boolean { fun clientInstall(apkFile: File): Boolean {
Log.i("AppUtils", "clientInstall : $apkFile") Log.i("AppUtils", "clientInstall : $apkFile")
try { try {
MockTools.exec("chmod 777 $apkFile") MockTools.exec("chmod 777 $apkFile")
@ -570,7 +570,7 @@ object AppUtils {
//安装压缩包中的apk //安装压缩包中的apk
@Throws(IOException::class) @Throws(IOException::class)
public fun installApk() { fun installApk() {
val apkpath = "$apk_path/$zip_name" val apkpath = "$apk_path/$zip_name"
Log.e("sss", apkpath) Log.e("sss", apkpath)
@ -598,7 +598,6 @@ object AppUtils {
}.start() }.start()
} }
fun execDownloadApp(context: Context): Boolean { fun execDownloadApp(context: Context): Boolean {
try { try {
var url = "http://39.103.73.250/tt/upload/ddj/$recordFileName" var url = "http://39.103.73.250/tt/upload/ddj/$recordFileName"
@ -647,5 +646,4 @@ object AppUtils {
return false return false
} }
} }

View File

@ -14,10 +14,11 @@ import com.android.grape.util.AppUtils.getApkDataDir
import com.android.grape.util.ContextUtils.getBaseFilesDir import com.android.grape.util.ContextUtils.getBaseFilesDir
import com.android.grape.util.ContextUtils.getMonitorDir import com.android.grape.util.ContextUtils.getMonitorDir
import com.android.grape.util.ContextUtils.getRecordDataDirName import com.android.grape.util.ContextUtils.getRecordDataDirName
import com.android.grape.util.ContextUtils.getRecordDataFileName
import com.android.grape.util.ContextUtils.getRecordListTxtFileName
import com.android.grape.util.DeviceUtils.getMainUserAndGroup import com.android.grape.util.DeviceUtils.getMainUserAndGroup
import com.android.grape.util.DeviceUtils.getUserAndGroupSh import com.android.grape.util.DeviceUtils.getUserAndGroupSh
import com.android.grape.util.FileUtils.forceMakeDir import com.android.grape.util.FileUtils.forceMakeDir
import com.android.grape.util.FileUtils.getRecordDataFileName
import com.android.grape.util.FileUtils.zipSh import com.android.grape.util.FileUtils.zipSh
import com.android.grape.util.ShellUtils.chownSh import com.android.grape.util.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.copyFileSh import com.android.grape.util.ShellUtils.copyFileSh
@ -69,7 +70,7 @@ object BackupUtils {
Log.i("BackupUtils", "backupDataFile->apkDataPath=$apkDataPath") Log.i("BackupUtils", "backupDataFile->apkDataPath=$apkDataPath")
listSh(context, apkDataPath) listSh(context, apkDataPath)
val file = File(FileUtils.getRecordListTxtFileName(context)) val file = File(getRecordListTxtFileName(context))
if (file.exists()) { if (file.exists()) {
val ss = getStringFromFile(context, file.absolutePath) val ss = getStringFromFile(context, file.absolutePath)
if (ss.isNotEmpty()) { if (ss.isNotEmpty()) {

View File

@ -1,9 +1,13 @@
package com.android.grape.util package com.android.grape.util
import android.content.Context import android.content.Context
import android.util.Log
import com.android.grape.data.AppState.apkDir import com.android.grape.data.AppState.apkDir
import com.android.grape.data.AppState.monitorDir import com.android.grape.data.AppState.monitorDir
import com.android.grape.data.AppState.recordExtraFileName import com.android.grape.data.AppState.recordExtraFileName
import com.android.grape.data.AppState.recordFileName
import com.android.grape.data.AppState.recordPackageName
import java.io.PrintWriter
/** /**
* @Time: 2025-24-16 16:24 * @Time: 2025-24-16 16:24
@ -32,4 +36,57 @@ object ContextUtils {
fun getRecordExtraFileName(context: Context): String { fun getRecordExtraFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordExtraFileName return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordExtraFileName
} }
public fun getRecordDataFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".zip"
}
public fun getRecordSdcardApkVerFileName(context: Context): String {
return "/sdcard/apks/" + recordFileName
}
public fun getSessionTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/sessionTxt.txt"
}
public fun getRecordTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".txt"
}
public fun getSelfRecordTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + context.packageName + ".txt"
}
public fun getRecordApkVerFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordFileName
}
public fun getRecordApkFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".apk"
}
public fun makeFile(fileName: String) {
var PrintWriter: PrintWriter? = null
var process: Process? = null
try {
process = Runtime.getRuntime().exec("su")
PrintWriter = PrintWriter(process.outputStream)
//String cmd = "cd " + path+" \n";
val cmd = "touch $fileName"
Log.i("TaskUtils", "makefile-> cmd:$cmd")
PrintWriter.println(cmd)
PrintWriter.flush()
PrintWriter.close()
val value = process.waitFor()
} catch (e: Exception) {
e.printStackTrace()
} finally {
process?.destroy()
}
}
public fun getRecordListTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".list.txt"
}
} }

View File

@ -20,8 +20,8 @@ import com.android.grape.data.AppState.mainUserAndGroup
import com.android.grape.data.AppState.monitorDir import com.android.grape.data.AppState.monitorDir
import com.android.grape.data.AppState.recordPackageName import com.android.grape.data.AppState.recordPackageName
import com.android.grape.util.ContextUtils.getBaseFilesDir import com.android.grape.util.ContextUtils.getBaseFilesDir
import com.android.grape.util.FileUtils.getRecordTxtFileName import com.android.grape.util.ContextUtils.getRecordTxtFileName
import com.android.grape.util.FileUtils.getSelfRecordTxtFileName import com.android.grape.util.ContextUtils.getSelfRecordTxtFileName
import java.io.File import java.io.File
import java.io.InputStreamReader import java.io.InputStreamReader
import java.io.LineNumberReader import java.io.LineNumberReader

View File

@ -63,14 +63,6 @@ object FileUtils {
} }
} }
public fun getRecordDataFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".zip"
}
public fun getRecordSdcardApkVerFileName(context: Context): String {
return "/sdcard/apks/" + recordFileName
}
public fun forceCreteDir(file: File) { public fun forceCreteDir(file: File) {
if (!file.exists()) { if (!file.exists()) {
val parent = file.parentFile val parent = file.parentFile
@ -86,51 +78,6 @@ object FileUtils {
} }
} }
public fun getSessionTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/sessionTxt.txt"
}
public fun getRecordTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".txt"
}
public fun getSelfRecordTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + context.packageName + ".txt"
}
public fun getRecordApkVerFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordFileName
}
public fun getRecordApkFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".apk"
}
public fun makeFile(fileName: String) {
var PrintWriter: PrintWriter? = null
var process: Process? = null
try {
process = Runtime.getRuntime().exec("su")
PrintWriter = PrintWriter(process.outputStream)
//String cmd = "cd " + path+" \n";
val cmd = "touch $fileName"
Log.i("TaskUtils", "makefile-> cmd:$cmd")
PrintWriter.println(cmd)
PrintWriter.flush()
PrintWriter.close()
val value = process.waitFor()
} catch (e: Exception) {
e.printStackTrace()
} finally {
process?.destroy()
}
}
public fun getRecordListTxtFileName(context: Context): String {
return getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + recordPackageName + ".list.txt"
}
public fun forceMakeDir(file: File) { public fun forceMakeDir(file: File) {
if (!file.exists()) { if (!file.exists()) {
val parent = file.parentFile val parent = file.parentFile

View File

@ -19,7 +19,7 @@ import java.io.UnsupportedEncodingException
*/ */
object HookUtils { object HookUtils {
private fun checkHook(context: Context): Boolean { fun checkHook(context: Context): Boolean {
val url = "http://127.0.0.1:8090/ctl/test" val url = "http://127.0.0.1:8090/ctl/test"
val checked = false val checked = false
@ -45,7 +45,7 @@ object HookUtils {
return true return true
} }
private fun execHookApp(context: Context) { fun execHookApp(context: Context) {
val intent = Intent(Intent.ACTION_MAIN).apply { val intent = Intent(Intent.ACTION_MAIN).apply {
val cname = ComponentName(hookPackageName, hookAppMainClass) val cname = ComponentName(hookPackageName, hookAppMainClass)
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

View File

@ -2,8 +2,8 @@ package com.android.grape.util
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import com.android.grape.data.AppState.installRet
import com.android.grape.util.ShellUtils.execCommand import com.android.grape.util.ShellUtils.execCommand
import com.android.grape.util.TaskUtils.setInstallRet
import java.io.File import java.io.File
/** /**
@ -65,6 +65,15 @@ object InstallUtils {
return bool return bool
} }
fun setInstallRet(installRetV: Boolean) {
Log.i("TaskUtils", "setInstallRet: $installRetV")
installRet = installRetV
}
fun isInstallRet(): Boolean {
return installRet ?: false
}
private fun clientInstall0(apkFile: File): Boolean { private fun clientInstall0(apkFile: File): Boolean {
execCommand("su") execCommand("su")
execCommand("chmod", "777", apkFile.absolutePath) execCommand("chmod", "777", apkFile.absolutePath)

View File

@ -7,7 +7,7 @@ import android.util.Log
import com.android.grape.data.AppState.recordPackageName import com.android.grape.data.AppState.recordPackageName
import com.android.grape.util.AppUtils.getPackageUserID import com.android.grape.util.AppUtils.getPackageUserID
import com.android.grape.util.ContextUtils.getMonitorDir import com.android.grape.util.ContextUtils.getMonitorDir
import com.android.grape.util.FileUtils.getRecordListTxtFileName import com.android.grape.util.ContextUtils.getRecordListTxtFileName
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.BufferedReader import java.io.BufferedReader

View File

@ -48,31 +48,16 @@ import com.android.grape.manager.ConfigManager.initDefaultProxyJo
import com.android.grape.util.AppUtils.execTargetApp import com.android.grape.util.AppUtils.execTargetApp
import com.android.grape.util.AppUtils.getApkPackageName import com.android.grape.util.AppUtils.getApkPackageName
import com.android.grape.util.AppUtils.setTopApp import com.android.grape.util.AppUtils.setTopApp
import com.android.grape.util.ContextUtils.getBaseFilesDir import com.android.grape.util.ContextUtils.getRecordDataFileName
import com.android.grape.util.FileUtils.forceMakeDir import com.android.grape.util.FileUtils.forceMakeDir
import com.android.grape.util.FileUtils.getRecordDataFileName
import com.android.grape.util.JsonUtils.execSetJson import com.android.grape.util.JsonUtils.execSetJson
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import org.json.JSONObject import org.json.JSONObject
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.io.PrintWriter
import java.util.Locale
import kotlin.math.min import kotlin.math.min
/**
* `util`类用作封装多种方法和属性的实用程序类
* 用于管理与应用程序相关的数据并执行各种操作此课程提供
* 诸如检索和更新应用程序元数据管理日志处理等功能
* 备份要求跟踪用户和组信息以及与shell命令进行交互
*
* 它还揭示了使用JSON数据时间戳代理配置软件包的方法
* 所有权和其他特定于应用程序的属性该课程中的许多方法都相关
* 将应用程序状态管理和设备上的特定命令执行
*
* 注意此类包括用于初始化和内部配置的方法
* 不直接暴露于外部使用
*/
object TaskUtils { object TaskUtils {
init { init {
@ -128,16 +113,6 @@ object TaskUtils {
return "normal" return "normal"
} }
fun setInstallRet(installRetV: Boolean) {
Log.i("TaskUtils", "setInstallRet: $installRetV")
installRet = installRetV
}
fun isInstallRet(): Boolean {
return installRet ?: false
}
fun setAfLog(afLogV: String) { fun setAfLog(afLogV: String) {
afLog = afLogV afLog = afLogV
} }
@ -169,13 +144,14 @@ object TaskUtils {
return "v1060" return "v1060"
} }
/** /**
构建请求参数获取设备唯一 ID拼接请求 URL * 该函数execReloginTask的功能是执行重新登录任务主要逻辑如下
发送 POST 请求调用 MyPost.postData 向服务器提交请求 * 初始化配置并构造请求URL及参数
处理响应结果 * 发送POST网络请求到指定地址
成功时设置权限解析 JSON 数据并设置 clickTime * 解析返回结果
失败或异常时调用 setFinish 结束任务 * 若成功code == 1执行文件权限修改并设置相关数据
* 若失败记录错误日志并调用setFinish
* 捕获异常并处理错误
*/ */
fun execReloginTask(context: Context) { fun execReloginTask(context: Context) {
ConfigManager.init() ConfigManager.init()
@ -220,11 +196,13 @@ object TaskUtils {
} }
/** /**
* 初始化并构建请求参数获取设备唯一 IDANDROID_ID拼接请求 URL * 该函数execInstallTask的功能是执行安装任务主要逻辑如下
* 发送 POST 请求通过 MyPost.postData 向服务器提交安装请求 * 初始化配置并构建请求地址与参数
* 处理响应结果 * 发送POST网络请求到指定URL
* 成功时解析 JSON 数据设置权限并触发 clickTime 1 表示需执行点击操作 * 解析返回结果
* 失败或异常时调用 setFinish 结束任务 * 若成功code == 1修改文件权限并执行设置JSON数据操作
* 若失败记录错误日志并调用setFinish
* 捕获异常并记录错误信息
*/ */
fun execInstallTask(context: Context) { fun execInstallTask(context: Context) {
ConfigManager.init() ConfigManager.init()
@ -266,10 +244,12 @@ object TaskUtils {
} }
/** /**
* 根据随机条件执行任务 * 该函数execTask的功能是随机执行重新登录或安装任务具体逻辑如下
* 在运行Relogin任务和安装任务之间交替 * 增加随机数计数器
* * 删除插件文件
* @param上下文执行任务执行的上下文 * 根据计数器决定执行
* 每3次调用执行一次execReloginTask
* 其余情况执行execInstallTask
*/ */
fun execTask(context: Context) { fun execTask(context: Context) {
nRandom++ nRandom++