aflog data

This commit is contained in:
Administrator 2025-07-29 16:47:47 +08:00
parent 72168ba702
commit 1250e0150b
6 changed files with 140 additions and 40 deletions

View File

@ -3,6 +3,7 @@ package com.android.grape
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels import androidx.activity.viewModels
@ -14,12 +15,14 @@ import com.android.grape.databinding.ActivityMainBinding
import com.android.grape.job.MonitorService import com.android.grape.job.MonitorService
import com.android.grape.util.BackupUtils.killRecordProcess import com.android.grape.util.BackupUtils.killRecordProcess
import com.android.grape.util.ClashUtil import com.android.grape.util.ClashUtil
import com.android.grape.util.FileUtils
import com.android.grape.util.MockTools import com.android.grape.util.MockTools
import com.android.grape.util.NotificationPermissionHandler import com.android.grape.util.NotificationPermissionHandler
import com.android.grape.util.ScriptUtils.registerScriptResultReceiver import com.android.grape.util.ScriptUtils.registerScriptResultReceiver
import com.android.grape.util.ScriptUtils.unregisterScriptResultReceiver import com.android.grape.util.ScriptUtils.unregisterScriptResultReceiver
import com.android.grape.util.ShellUtil import com.android.grape.util.ShellUtil
import com.android.grape.util.StoragePermissionHelper import com.android.grape.util.StoragePermissionHelper
import com.android.grape.util.TaskUtils
/** /**
* public class MainActivity extends AppCompatActivity * public class MainActivity extends AppCompatActivity

View File

@ -2,6 +2,7 @@ package com.android.grape.job
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Environment
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import androidx.core.app.JobIntentService import androidx.core.app.JobIntentService
@ -24,11 +25,13 @@ import com.android.grape.data.AppState.lastUpdateTime
import com.android.grape.data.AppState.logBuffer import com.android.grape.data.AppState.logBuffer
import com.android.grape.data.AppState.preClickRecordId import com.android.grape.data.AppState.preClickRecordId
import com.android.grape.data.AppState.recordId import com.android.grape.data.AppState.recordId
import com.android.grape.data.AppState.recordPackageName
import com.android.grape.data.AppState.reloginRecordId 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.InstallUtils.isInstallRet
import com.android.grape.util.MockTools
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
@ -68,6 +71,7 @@ class SendCallbackJobService : JobIntentService() {
} else { } else {
sendLogEvent() sendLogEvent()
} }
MockTools.exec("rm -rf ${Environment.getExternalStorageDirectory()}/script/${recordPackageName}/afLog.txt")
} }
setFinish(this@SendCallbackJobService) setFinish(this@SendCallbackJobService)
} }
@ -116,7 +120,7 @@ class SendCallbackJobService : JobIntentService() {
// logInfoJo.put("setConfLog", Util.getParamsJson()); // logInfoJo.put("setConfLog", Util.getParamsJson());
paramsJo.put("logInfo", logInfoJo) paramsJo.put("logInfo", logInfoJo)
var params: String? = null var params: String? = null
params = paramsJo?.toString() ?: "error" params = paramsJo.toString()
var nRetryCount = 0 var nRetryCount = 0
do { do {
@ -179,7 +183,7 @@ class SendCallbackJobService : JobIntentService() {
paramsJo.put("backUpFiles", backupResult) paramsJo.put("backUpFiles", backupResult)
} }
var params: String? = null var params: String? = null
params = paramsJo?.toString() ?: "error" params = paramsJo.toString()
var nRetryCount = 0 var nRetryCount = 0
do { do {

View File

@ -90,14 +90,11 @@ object BackupUtils {
getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + context.packageName + ".txt" getBaseFilesDir(context) + "/" + monitorDir + "/" + apkDir + "/" + context.packageName + ".txt"
) )
chownSh(getMonitorDir(context), uid) chownSh(getMonitorDir(context), uid)
val copySucc = File(zipDirName).exists() val copySucc = FileUtils.copyFolderSh(apkDataPath,zipDirName)
Log.i("BackupUtils", "copyFolder($apkDataPath,$zipDirName) = $copySucc") Log.i("BackupUtils", "copyFolder($apkDataPath,$zipDirName) = $copySucc")
//TODO将apk包所在的文件夹备份到DownLoad文件夹下
//TODO将新生成的文件夹进行压缩
if (copySucc) { if (copySucc) {
FileUtils.writeAfLog()
chownSh(zipDirName, getMainUserAndGroup(context)) chownSh(zipDirName, getMainUserAndGroup(context))
val afFile = File("$zipDirName/AFPOST.txt") val afFile = File("$zipDirName/AFPOST.txt")
zipSh(zipDirName, zipFileName) zipSh(zipDirName, zipFileName)
delFileSh(zipDirName) delFileSh(zipDirName)

View File

@ -279,11 +279,12 @@ object FileUtils {
) )
try { try {
val zipDir = File(zipDirName) val zipDir = File(zipDirName)
val zipFile = File(zipFileName) // val zipFile = File(zipFileName)
var cmd = "cd " + (zipDir.parentFile?.absolutePath ?: "") + "|" //// var cmd = "cd " + (zipDir.parentFile?.absolutePath ?: "") + "|"
cmd += "tar -zcvf " + zipFile.name + " " + zipDir.name //// cmd += "tar -zcvf " + zipFile.name + " " + zipDir.name
Log.i("FileUtils", "zipSh-> cmd:$cmd") val cmdString = "tar -zcvf $zipFileName -C ${zipDir.parentFile?.absolutePath ?: ""} ${zipDir.name}"
MockTools.exec(cmd) Log.i("FileUtils", "zipSh-> cmd:$cmdString")
MockTools.exec(cmdString)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@ -379,30 +380,7 @@ object FileUtils {
* @return 返回内容 * @return 返回内容
*/ */
fun getString(filePath: String, filename: String): String { fun getString(filePath: String, filename: String): String {
var inputStream: FileInputStream? = null return File(filePath, filename).takeIf { it.exists() }?.readText() ?: ""
try {
inputStream = FileInputStream(File(filePath + filename))
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
var inputStreamReader: InputStreamReader? = null
try {
inputStreamReader = InputStreamReader(inputStream, "UTF-8")
} catch (e1: UnsupportedEncodingException) {
e1.printStackTrace()
}
val reader = BufferedReader(inputStreamReader)
val sb = StringBuffer("")
var line: String?
try {
while ((reader.readLine().also { line = it }) != null) {
sb.append(line)
sb.append("\n")
}
} catch (e: IOException) {
e.printStackTrace()
}
return sb.toString()
} }
/** /**
@ -598,6 +576,36 @@ object FileUtils {
} }
} }
fun writeAfLog() {
val filePath = "/data/data/${recordPackageName}/log.txt"
ShellUtils.execRootCmdAndGetResult("chmod 777 $filePath")
val afLog = ShellUtil.execRootCmdAndGetResult("cat $filePath")
val file = File(
Environment.getExternalStorageDirectory(),
"script/${recordPackageName}/afLog.txt"
)
val parentDir = file.getParentFile()
if (parentDir != null && !parentDir.exists()) {
val dirsCreated = parentDir.mkdirs()
if (!dirsCreated) {
Log.e("FileWrite", "Failed to create directories: $parentDir")
return
}
}
LogUtils.d("FileUtils", "afLog: $afLog", null)
try {
BufferedOutputStream(
FileOutputStream(file)
).use { bos ->
bos.write(afLog.toByteArray(StandardCharsets.UTF_8))
bos.flush() // 确保数据写入磁盘
}
} catch (e: IOException) {
Log.e("FileWrite", "Failed to write afLog: $afLog", e)
// 6. 可以考虑添加重试机制或通知用户
}
}
fun writeDevice(packageName: String, device: String) { fun writeDevice(packageName: String, device: String) {
LogUtils.d("FileUtils", "writeDevice: $device") LogUtils.d("FileUtils", "writeDevice: $device")
val base64Content: String = val base64Content: String =
@ -607,7 +615,6 @@ object FileUtils {
val cmd = "sh -c 'printf %s '\''" + base64Content + "'\'' > " + filePath + "'" val cmd = "sh -c 'printf %s '\''" + base64Content + "'\'' > " + filePath + "'"
val result = ShellUtils.execRootCmdAndGetResult(cmd) val result = ShellUtils.execRootCmdAndGetResult(cmd)
ShellUtils.execRootCmdAndGetResult("chmod 777 $filePath") ShellUtils.execRootCmdAndGetResult("chmod 777 $filePath")
LogUtils.d("FileUtils", "writeDevice: $result")
} }
fun runPlugin(packageName: String) { fun runPlugin(packageName: String) {
@ -692,4 +699,87 @@ object FileUtils {
return "" return ""
} }
fun copyFolderSh(oldPath: String, newPath: String): Boolean {
Log.i("TaskUtil", "start copyFolderSh : $oldPath ; $newPath")
try {
// 使用 File API 确保路径处理正确
val src = File(oldPath)
val dst = File(newPath)
// if (!src.exists()) {
// LogUtils.d(
// Log.ERROR,
// "TaskUtil",
// "Source path does not exist: $oldPath",
// null
// )
// return false
// }
// 构造命令(注意 shell 特殊字符的转义)
val safeOldPath = src.absolutePath.replace(" ", "\\ ").replace("\"", "\\\"")
val safeNewPath = dst.absolutePath.replace(" ", "\\ ").replace("\"", "\\\"")
val cmd = "cp -r -f \"$safeOldPath\" \"$safeNewPath\""
Log.i("TaskUtil", "copyFolderSh cmd: $cmd")
// 调用 MockTools 执行
val result: String = ShellUtils.execRootCmdAndGetResult(cmd)
val chmod = "chmod 777 \"$safeNewPath\""
val chmodResult: String? = ShellUtils.execRootCmdAndGetResult(chmod)
recursiveChmod777(dst)
// LogUtils.d(
// "TaskUtil",
// "chmodResult. Result: $chmodResult",
// null
// )
// if ( result.trim { it <= ' ' }.isEmpty()) {
// LogUtils.d(
// "TaskUtil",
// "Command execution failed. Result: $result",
// null
// )
// return false
// }
Log.i("TaskUtil", "Command executed successfully: $result")
return true
} catch (e: java.lang.Exception) {
LogUtils.d(
Log.ERROR,
"TaskUtil",
"Error occurred during copyFolderSh operation",
e
)
return false
}
}
fun recursiveChmod777(dir: File?) {
if (dir == null || !dir.exists()) {
Log.e("Chmod", "目录不存在或为null")
return
}
// 先修改当前目录权限
val currentPath = dir.getAbsolutePath().replace(" ", "\\ ").replace("\"", "\\\"")
var chmodCmd = "chmod 777 \"$currentPath\""
ShellUtils.execRootCmdAndGetResult(chmodCmd)
// 递归处理子项
val children = dir.listFiles()
if (children != null) {
for (child in children) {
if (child.isDirectory()) {
recursiveChmod777(child) // 递归处理子目录
} else {
val filePath = child.getAbsolutePath().replace(" ", "\\ ").replace("\"", "\\\"")
chmodCmd = "chmod 777 \"$filePath\""
ShellUtils.execRootCmdAndGetResult(chmodCmd)
}
}
}
}
} }

View File

@ -377,7 +377,6 @@ object JsonUtils {
@Throws(Exception::class) @Throws(Exception::class)
fun execSetJson(context: Context) { fun execSetJson(context: Context) {
try { try {
MockTools.exec("rm -rf /data/system/Logs.txt")
JsonUtils.afterJson() JsonUtils.afterJson()
if (JsonUtils.initParamsJson(context)) { if (JsonUtils.initParamsJson(context)) {
execRecord(context) execRecord(context)

View File

@ -2,6 +2,7 @@ package com.android.grape.util
import android.R.attr.name import android.R.attr.name
import android.content.Context import android.content.Context
import android.os.Environment
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.provider.Settings import android.provider.Settings
@ -45,6 +46,7 @@ import com.android.grape.job.UnInstallService
import com.android.grape.manager.ConfigManager import com.android.grape.manager.ConfigManager
import com.android.grape.manager.ConfigManager.initDefaultAppJo import com.android.grape.manager.ConfigManager.initDefaultAppJo
import com.android.grape.manager.ConfigManager.initDefaultProxyJo import com.android.grape.manager.ConfigManager.initDefaultProxyJo
import com.android.grape.sai.Utils
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
@ -143,8 +145,13 @@ object TaskUtils {
} }
fun getAfLog(): String { fun getAfLog(): String {
//return Util.afLog; File(
return ServiceUtils.readFile("/data/system/Logs.txt") Environment.getExternalStorageDirectory(),
"script/${recordPackageName}/afLog.txt"
)
val afLog = FileUtils.getString("${Environment.getExternalStorageDirectory()}/script/${recordPackageName}", "afLog.txt")
Log.d("TaskUtils", "getAfLog: $afLog")
return afLog
} }