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.ua
import com.android.grape.net.MyGet
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils
class CheckIpJobService : JobIntentService() {
@ -18,7 +19,7 @@ class CheckIpJobService : JobIntentService() {
InstallService.onEvent(this)
} else {
isClickRet = false
TaskUtils.setInstallRet(false)
setInstallRet(false)
clickErrReason = "networkErr"
TaskUtils.setFinish(this)
}

View File

@ -5,6 +5,7 @@ import android.content.Intent
import androidx.core.app.JobIntentService
import com.android.grape.data.AppState.clickErrReason
import com.android.grape.data.AppState.isClickRet
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils
import com.blankj.utilcode.util.LogUtils
@ -28,7 +29,7 @@ class DownloadAppJobService : JobIntentService() {
StartVpnPortJobService.onEvent(this)
} else {
isClickRet = false
TaskUtils.setInstallRet(false)
setInstallRet(false)
clickErrReason = "downloadErr"
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.recordPackageName
import com.android.grape.util.AppUtils.installRecord
import com.android.grape.util.InstallUtils.setInstallRet
import com.android.grape.util.TaskUtils
class InstallService : JobIntentService() {
@ -18,7 +19,7 @@ class InstallService : JobIntentService() {
if (installRecord(this)) {
Log.i(TAG, "installRecord succ")
tryNum = 0
TaskUtils.setInstallRet(true)
setInstallRet(true)
println("IOSTQ:isNeedRestored == " + 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.util.AppUtils.getAppAfVer
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.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.delFileSh
import com.android.grape.util.TaskUtils
import com.android.grape.util.TaskUtils.HkVer
import com.android.grape.util.TaskUtils.getAfLog
import com.android.grape.util.TaskUtils.isInstallRet
import com.android.grape.util.TaskUtils.setFinish
import com.blankj.utilcode.util.LogUtils
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.util.ClashUtil
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.setFinish
import com.android.grape.util.TaskUtils.setInstallRet
import java.util.Locale
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.util.BackupUtils.backUp
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.TaskUtils
import com.android.grape.util.TaskUtils.setFinish
import com.android.grape.util.TaskUtils.setInstallRet
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.shell.MiuiUtils
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.setInstallRet
import com.blankj.utilcode.util.LogUtils
import java.io.File
import java.util.concurrent.ExecutorService

View File

@ -17,15 +17,7 @@ class AndroidFileDownloader(private val context: Context) {
private val client = OkHttpClient()
/**
* 下载文件到指定路径
*
* @param url 文件下载URL
* @param relativePath 相对于外部存储目录的路径 "Downloads/MyApp/file.zip"
* @param fileName 文件名可选如未提供则从URL提取
* @param progressCallback 进度回调
* @param completionCallback 完成回调
*/
fun downloadFile(
url: 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.util.ContextUtils.getBaseFilesDir
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.getRecordSdcardApkVerFileName
import com.android.grape.util.ContextUtils.getSessionTxtFileName
import com.android.grape.util.DeviceUtils.getUserAndGroupSh
import com.android.grape.util.FileUtils.forceMakeDir
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.isInstallRet
import com.android.grape.util.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.unzipAPkSh
import com.android.grape.util.TaskUtils.isInstallRet
import com.blankj.utilcode.util.ActivityUtils
import java.io.File
import java.io.FileInputStream
@ -183,7 +183,7 @@ object AppUtils {
}
}
public fun recordAppInstalled(context: Context): Boolean {
fun recordAppInstalled(context: Context): Boolean {
return checkAppInstalled(
context,
recordPackageName
@ -276,7 +276,7 @@ object AppUtils {
}
public fun filterStr(s: String?): String {
fun filterStr(s: String?): String {
var s = s
val sb = StringBuffer()
@ -303,7 +303,7 @@ object AppUtils {
return "101" == tt || "100" == tt
}
public fun getApkDataDir(context: Context, packageName: String): String? {
fun getApkDataDir(context: Context, packageName: String): String? {
var apkDataPath: String? = null
try {
apkDataPath = context.packageManager.getApplicationInfo(packageName, 0).dataDir
@ -350,7 +350,7 @@ object AppUtils {
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 process: Process? = null
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(
"AppUtils",
"start clientInstallObb : $apkFile ; $extraFile"
@ -394,7 +394,7 @@ object AppUtils {
return false
}
public fun installObb(context: Context, extraFile: File) {
fun installObb(context: Context, extraFile: File) {
val userAndGroup = getUserAndGroupSh(
context,
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")
if (apkFile.toString().contains("xapk")) {
@ -500,7 +500,7 @@ object AppUtils {
return false
}
public fun clientInstall(apkFile: File): Boolean {
fun clientInstall(apkFile: File): Boolean {
Log.i("AppUtils", "clientInstall : $apkFile")
try {
MockTools.exec("chmod 777 $apkFile")
@ -570,7 +570,7 @@ object AppUtils {
//安装压缩包中的apk
@Throws(IOException::class)
public fun installApk() {
fun installApk() {
val apkpath = "$apk_path/$zip_name"
Log.e("sss", apkpath)
@ -598,7 +598,6 @@ object AppUtils {
}.start()
}
fun execDownloadApp(context: Context): Boolean {
try {
var url = "http://39.103.73.250/tt/upload/ddj/$recordFileName"
@ -647,5 +646,4 @@ object AppUtils {
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.getMonitorDir
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.getUserAndGroupSh
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.ShellUtils.chownSh
import com.android.grape.util.ShellUtils.copyFileSh
@ -69,7 +70,7 @@ object BackupUtils {
Log.i("BackupUtils", "backupDataFile->apkDataPath=$apkDataPath")
listSh(context, apkDataPath)
val file = File(FileUtils.getRecordListTxtFileName(context))
val file = File(getRecordListTxtFileName(context))
if (file.exists()) {
val ss = getStringFromFile(context, file.absolutePath)
if (ss.isNotEmpty()) {

View File

@ -1,9 +1,13 @@
package com.android.grape.util
import android.content.Context
import android.util.Log
import com.android.grape.data.AppState.apkDir
import com.android.grape.data.AppState.monitorDir
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
@ -32,4 +36,57 @@ object ContextUtils {
fun getRecordExtraFileName(context: Context): String {
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.recordPackageName
import com.android.grape.util.ContextUtils.getBaseFilesDir
import com.android.grape.util.FileUtils.getRecordTxtFileName
import com.android.grape.util.FileUtils.getSelfRecordTxtFileName
import com.android.grape.util.ContextUtils.getRecordTxtFileName
import com.android.grape.util.ContextUtils.getSelfRecordTxtFileName
import java.io.File
import java.io.InputStreamReader
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) {
if (!file.exists()) {
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) {
if (!file.exists()) {
val parent = file.parentFile

View File

@ -19,48 +19,48 @@ import java.io.UnsupportedEncodingException
*/
object HookUtils {
private fun checkHook(context: Context): Boolean {
val url = "http://127.0.0.1:8090/ctl/test"
fun checkHook(context: Context): Boolean {
val url = "http://127.0.0.1:8090/ctl/test"
val checked = false
val checked = false
try {
val ret: String = postData("".toByteArray(charset("utf-8")), url) ?: ""
Log.i("TaskUtils", "checkHook ret : $ret")
if ("it works!" == ret) {
return true
}
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
try {
val ret: String = postData("".toByteArray(charset("utf-8")), url) ?: ""
Log.i("TaskUtils", "checkHook ret : $ret")
if ("it works!" == ret) {
return true
}
execHookApp(context)
try {
Thread.sleep((1000 * 10).toLong())
} catch (e: InterruptedException) {
e.printStackTrace()
}
return true
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
}
private fun execHookApp(context: Context) {
val intent = Intent(Intent.ACTION_MAIN).apply {
val cname = ComponentName(hookPackageName, hookAppMainClass)
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setComponent(cname)
context.startActivity(this)
}
execHookApp(context)
try {
Thread.sleep((1000 * 10).toLong())
} catch (e: InterruptedException) {
e.printStackTrace()
}
return true
}
fun execHookApp(context: Context) {
val intent = Intent(Intent.ACTION_MAIN).apply {
val cname = ComponentName(hookPackageName, hookAppMainClass)
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setComponent(cname)
context.startActivity(this)
}
}
fun hookOpenApp(context: Context) {
Log.i("TaskUtils", "start to hookOpenApp : ")
Log.i("TaskUtils", "start to hookOpenApp : ")
val url = "http://127.0.0.1:8090/ctl/setTarget?target=" + recordPackageName
val url = "http://127.0.0.1:8090/ctl/setTarget?target=" + recordPackageName
val ret: String = postData("".toByteArray(), url) ?: ""
val ret: String = postData("".toByteArray(), url) ?: ""
Log.i("TaskUtils", "Hook Open App ret : $ret")
}
Log.i("TaskUtils", "Hook Open App ret : $ret")
}
}

View File

@ -2,8 +2,8 @@ package com.android.grape.util
import android.content.Context
import android.util.Log
import com.android.grape.data.AppState.installRet
import com.android.grape.util.ShellUtils.execCommand
import com.android.grape.util.TaskUtils.setInstallRet
import java.io.File
/**
@ -16,61 +16,70 @@ import java.io.File
object InstallUtils {
fun installApks4Tmp(apkName: String?, context: Context): Boolean {
var result = MockTools.execRead("pm install-create")
Log.d("TaskUtils", "installApks4Tmp: successMsg $result")
val session = result.substring(result.indexOf("[") + 1, result.indexOf("]"))
Log.d("TaskUtils", "installApks4Tmp: session $session")
var result = MockTools.execRead("pm install-create")
Log.d("TaskUtils", "installApks4Tmp: successMsg $result")
val session = result.substring(result.indexOf("[") + 1, result.indexOf("]"))
Log.d("TaskUtils", "installApks4Tmp: session $session")
val file = File(ContextUtils.getRecordDataDirName(context))
Log.d("TaskUtils", "installApks4Tmp: ${file.absolutePath}")
val files = file.listFiles()
var bool = true
var currentApkFile = 1
files?.let {
for (f in it) {
val extraName = f.name.substring(f.name.lastIndexOf('.') + 1)
Log.d(
"TaskUtils",
"installApks4Tmp: extraName $extraName"
)
if ("apk" == extraName) {
//Log.d("TaskUtils", "installApks4Tmp: getPath " + f.getPath());
val commond =
"pm install-write " + session + " " + currentApkFile + ".apk " + f.path
currentApkFile++
//Log.d("TaskUtils", "installApks4Tmp: " + commond);
result = MockTools.execRead(commond)
if (!result.contains("Success")) {
bool = false
break
}
val file = File(ContextUtils.getRecordDataDirName(context))
Log.d("TaskUtils", "installApks4Tmp: ${file.absolutePath}")
val files = file.listFiles()
var bool = true
var currentApkFile = 1
files?.let {
for (f in it) {
val extraName = f.name.substring(f.name.lastIndexOf('.') + 1)
Log.d(
"TaskUtils",
"installApks4Tmp: extraName $extraName"
)
if ("apk" == extraName) {
//Log.d("TaskUtils", "installApks4Tmp: getPath " + f.getPath());
val commond =
"pm install-write " + session + " " + currentApkFile + ".apk " + f.path
currentApkFile++
//Log.d("TaskUtils", "installApks4Tmp: " + commond);
result = MockTools.execRead(commond)
if (!result.contains("Success")) {
bool = false
break
}
}
}
if (bool) {
result = MockTools.execRead("pm install-commit $session")
if (!result.contains("Success")) {
bool = false
}
} else {
result = MockTools.execRead("pm install-abandon $session")
}
files?.let {
for (f in it) {
MockTools.execRead("rm -rf $f")
}
}
setInstallRet(bool)
return bool
}
if (bool) {
result = MockTools.execRead("pm install-commit $session")
if (!result.contains("Success")) {
bool = false
}
} else {
result = MockTools.execRead("pm install-abandon $session")
}
files?.let {
for (f in it) {
MockTools.execRead("rm -rf $f")
}
}
setInstallRet(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 {
execCommand("su")
execCommand("chmod", "777", apkFile.absolutePath)
execCommand("export", "LD_LIBRARY_PATH=/vendor/lib:/system/lib")
execCommand("pm", "install", "-r", apkFile.absolutePath)
execCommand("su")
execCommand("chmod", "777", apkFile.absolutePath)
execCommand("export", "LD_LIBRARY_PATH=/vendor/lib:/system/lib")
execCommand("pm", "install", "-r", apkFile.absolutePath)
return true
}
return true
}
}

View File

@ -121,71 +121,71 @@ object ServiceUtils {
}
fun writeFile1(context: Context?, dirName: String, fileName: String, contents: String) {
val fs = File("$dirName/$fileName")
forceMakeDir(fs)
var outputStream: FileOutputStream? = null
try {
outputStream = FileOutputStream(fs)
val fs = File("$dirName/$fileName")
forceMakeDir(fs)
var outputStream: FileOutputStream? = null
try {
outputStream = FileOutputStream(fs)
outputStream.write(contents.toByteArray())
outputStream.flush()
outputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
outputStream.write(contents.toByteArray())
outputStream.flush()
outputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun writeFile(context: Context, dirName: String, fileName: String, contents: String) {
val fs = File(getBaseFilesDir(context) + "/" + dirName + "/" + fileName)
forceMakeDir(fs)
var outputStream: FileOutputStream? = null
try {
outputStream = FileOutputStream(fs)
val fs = File(getBaseFilesDir(context) + "/" + dirName + "/" + fileName)
forceMakeDir(fs)
var outputStream: FileOutputStream? = null
try {
outputStream = FileOutputStream(fs)
outputStream.write(contents.toByteArray())
outputStream.flush()
outputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
outputStream.write(contents.toByteArray())
outputStream.flush()
outputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun WriteFile(fileName: String?, content: String?) {
try {
val writer = FileWriter(fileName, false)
writer.write(content)
writer.close()
} catch (e: IOException) {
e.printStackTrace()
}
try {
val writer = FileWriter(fileName, false)
writer.write(content)
writer.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
@Throws(IOException::class)
private fun writeFileToSDCard(message: String) {
// 比如可以将一个文件作为普通的文档存储,那么先获取系统默认的文档存放根目录
val parent_path = Environment.getExternalStorageDirectory()
private fun writeFileToSDCard(message: String) {
// 比如可以将一个文件作为普通的文档存储,那么先获取系统默认的文档存放根目录
val parent_path = Environment.getExternalStorageDirectory()
// String AppPath = "/data/data/"+ Util.getRecordPackageName() + "/";
val AppPath = "/data/data/sperixlabs.proxyme/"
val dir = File(AppPath)
if (!dir.exists()) {
dir.mkdirs()
}
val file = File(AppPath + "device.txt")
if (file.exists()) {
file.delete()
}
try {
file.createNewFile()
} catch (e: IOException) {
e.printStackTrace()
}
val writer = FileWriter(AppPath + "device.txt", true)
writer.write(message)
writer.close()
Log.d("文件写入", "成功")
// String AppPath = "/data/data/"+ Util.getRecordPackageName() + "/";
val AppPath = "/data/data/sperixlabs.proxyme/"
val dir = File(AppPath)
if (!dir.exists()) {
dir.mkdirs()
}
val file = File(AppPath + "device.txt")
if (file.exists()) {
file.delete()
}
try {
file.createNewFile()
} catch (e: IOException) {
e.printStackTrace()
}
val writer = FileWriter(AppPath + "device.txt", true)
writer.write(message)
writer.close()
Log.d("文件写入", "成功")
}
}

View File

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