Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/src/main/java/com/android/grape/sai/ShellSaiPackageInstaller.kt
#	app/src/main/java/com/android/grape/util/FileUtils.kt
#	app/src/main/java/com/android/grape/util/TaskUtils.kt
This commit is contained in:
Administrator 2025-07-18 18:34:28 +08:00
commit 42da6261fd
15 changed files with 233 additions and 173 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

@ -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

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

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
/**
@ -65,6 +65,15 @@ object InstallUtils {
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)

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