diff --git a/app/src/main/java/com/android/grape/job/CheckIpJobService.kt b/app/src/main/java/com/android/grape/job/CheckIpJobService.kt index 5f6898c..7484df6 100644 --- a/app/src/main/java/com/android/grape/job/CheckIpJobService.kt +++ b/app/src/main/java/com/android/grape/job/CheckIpJobService.kt @@ -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) } diff --git a/app/src/main/java/com/android/grape/job/DownloadAppJobService.kt b/app/src/main/java/com/android/grape/job/DownloadAppJobService.kt index eb2da81..d26a695 100644 --- a/app/src/main/java/com/android/grape/job/DownloadAppJobService.kt +++ b/app/src/main/java/com/android/grape/job/DownloadAppJobService.kt @@ -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) } diff --git a/app/src/main/java/com/android/grape/job/InstallService.kt b/app/src/main/java/com/android/grape/job/InstallService.kt index 60f2167..5880c19 100644 --- a/app/src/main/java/com/android/grape/job/InstallService.kt +++ b/app/src/main/java/com/android/grape/job/InstallService.kt @@ -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) { diff --git a/app/src/main/java/com/android/grape/job/SendCallbackJobService.kt b/app/src/main/java/com/android/grape/job/SendCallbackJobService.kt index fc464a1..677b52e 100644 --- a/app/src/main/java/com/android/grape/job/SendCallbackJobService.kt +++ b/app/src/main/java/com/android/grape/job/SendCallbackJobService.kt @@ -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 diff --git a/app/src/main/java/com/android/grape/job/StartVpnPortJobService.kt b/app/src/main/java/com/android/grape/job/StartVpnPortJobService.kt index 7a17664..4830938 100644 --- a/app/src/main/java/com/android/grape/job/StartVpnPortJobService.kt +++ b/app/src/main/java/com/android/grape/job/StartVpnPortJobService.kt @@ -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() { diff --git a/app/src/main/java/com/android/grape/job/UnInstallService.kt b/app/src/main/java/com/android/grape/job/UnInstallService.kt index 1f32932..078c787 100644 --- a/app/src/main/java/com/android/grape/job/UnInstallService.kt +++ b/app/src/main/java/com/android/grape/job/UnInstallService.kt @@ -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() { diff --git a/app/src/main/java/com/android/grape/sai/ShellSaiPackageInstaller.kt b/app/src/main/java/com/android/grape/sai/ShellSaiPackageInstaller.kt index a1c8651..55b53c6 100644 --- a/app/src/main/java/com/android/grape/sai/ShellSaiPackageInstaller.kt +++ b/app/src/main/java/com/android/grape/sai/ShellSaiPackageInstaller.kt @@ -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 diff --git a/app/src/main/java/com/android/grape/util/AndroidFileDownloader.kt b/app/src/main/java/com/android/grape/util/AndroidFileDownloader.kt index 17375cb..4b06a4e 100644 --- a/app/src/main/java/com/android/grape/util/AndroidFileDownloader.kt +++ b/app/src/main/java/com/android/grape/util/AndroidFileDownloader.kt @@ -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, @@ -125,4 +117,4 @@ class AndroidFileDownloader(private val context: Context) { outputStream.flush() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/android/grape/util/AppUtils.kt b/app/src/main/java/com/android/grape/util/AppUtils.kt index e796f75..3c8b281 100644 --- a/app/src/main/java/com/android/grape/util/AppUtils.kt +++ b/app/src/main/java/com/android/grape/util/AppUtils.kt @@ -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 } - } diff --git a/app/src/main/java/com/android/grape/util/BackupUtils.kt b/app/src/main/java/com/android/grape/util/BackupUtils.kt index 1000ca0..8879e84 100644 --- a/app/src/main/java/com/android/grape/util/BackupUtils.kt +++ b/app/src/main/java/com/android/grape/util/BackupUtils.kt @@ -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()) { diff --git a/app/src/main/java/com/android/grape/util/ContextUtils.kt b/app/src/main/java/com/android/grape/util/ContextUtils.kt index 37b053e..75aca5a 100644 --- a/app/src/main/java/com/android/grape/util/ContextUtils.kt +++ b/app/src/main/java/com/android/grape/util/ContextUtils.kt @@ -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" + } } diff --git a/app/src/main/java/com/android/grape/util/DeviceUtils.kt b/app/src/main/java/com/android/grape/util/DeviceUtils.kt index f6d5c26..fb412fc 100644 --- a/app/src/main/java/com/android/grape/util/DeviceUtils.kt +++ b/app/src/main/java/com/android/grape/util/DeviceUtils.kt @@ -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 diff --git a/app/src/main/java/com/android/grape/util/FileUtils.kt b/app/src/main/java/com/android/grape/util/FileUtils.kt index 7fe0d1d..8990ec5 100644 --- a/app/src/main/java/com/android/grape/util/FileUtils.kt +++ b/app/src/main/java/com/android/grape/util/FileUtils.kt @@ -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 diff --git a/app/src/main/java/com/android/grape/util/HookUtils.kt b/app/src/main/java/com/android/grape/util/HookUtils.kt index b6b3abc..0fd02b0 100644 --- a/app/src/main/java/com/android/grape/util/HookUtils.kt +++ b/app/src/main/java/com/android/grape/util/HookUtils.kt @@ -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") + } } diff --git a/app/src/main/java/com/android/grape/util/InstallUtils.kt b/app/src/main/java/com/android/grape/util/InstallUtils.kt index 6ce51e5..eabdedc 100644 --- a/app/src/main/java/com/android/grape/util/InstallUtils.kt +++ b/app/src/main/java/com/android/grape/util/InstallUtils.kt @@ -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 + } } diff --git a/app/src/main/java/com/android/grape/util/ServiceUtils.kt b/app/src/main/java/com/android/grape/util/ServiceUtils.kt index 33c17a3..a963f2e 100644 --- a/app/src/main/java/com/android/grape/util/ServiceUtils.kt +++ b/app/src/main/java/com/android/grape/util/ServiceUtils.kt @@ -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("文件写入", "成功") + } } diff --git a/app/src/main/java/com/android/grape/util/ShellUtils.kt b/app/src/main/java/com/android/grape/util/ShellUtils.kt index cb5fd09..1dded6d 100644 --- a/app/src/main/java/com/android/grape/util/ShellUtils.kt +++ b/app/src/main/java/com/android/grape/util/ShellUtils.kt @@ -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 diff --git a/app/src/main/java/com/android/grape/util/TaskUtils.kt b/app/src/main/java/com/android/grape/util/TaskUtils.kt index e1d9668..10d4f43 100644 --- a/app/src/main/java/com/android/grape/util/TaskUtils.kt +++ b/app/src/main/java/com/android/grape/util/TaskUtils.kt @@ -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 { } /** - * 初始化并构建请求参数:获取设备唯一 ID(ANDROID_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++