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

@ -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,
@ -125,4 +117,4 @@ class AndroidFileDownloader(private val context: Context) {
outputStream.flush() outputStream.flush()
} }
} }

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

@ -19,48 +19,48 @@ 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
try { try {
val ret: String = postData("".toByteArray(charset("utf-8")), url) ?: "" val ret: String = postData("".toByteArray(charset("utf-8")), url) ?: ""
Log.i("TaskUtils", "checkHook ret : $ret") Log.i("TaskUtils", "checkHook ret : $ret")
if ("it works!" == ret) { if ("it works!" == ret) {
return true return true
}
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
} }
} catch (e: UnsupportedEncodingException) {
execHookApp(context) e.printStackTrace()
try {
Thread.sleep((1000 * 10).toLong())
} catch (e: InterruptedException) {
e.printStackTrace()
}
return true
} }
private fun execHookApp(context: Context) { execHookApp(context)
val intent = Intent(Intent.ACTION_MAIN).apply {
val cname = ComponentName(hookPackageName, hookAppMainClass) try {
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) Thread.sleep((1000 * 10).toLong())
setComponent(cname) } catch (e: InterruptedException) {
context.startActivity(this) 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) { 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.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
/** /**
@ -16,61 +16,70 @@ import java.io.File
object InstallUtils { object InstallUtils {
fun installApks4Tmp(apkName: String?, context: Context): Boolean { fun installApks4Tmp(apkName: String?, context: Context): Boolean {
var result = MockTools.execRead("pm install-create") var result = MockTools.execRead("pm install-create")
Log.d("TaskUtils", "installApks4Tmp: successMsg $result") Log.d("TaskUtils", "installApks4Tmp: successMsg $result")
val session = result.substring(result.indexOf("[") + 1, result.indexOf("]")) val session = result.substring(result.indexOf("[") + 1, result.indexOf("]"))
Log.d("TaskUtils", "installApks4Tmp: session $session") Log.d("TaskUtils", "installApks4Tmp: session $session")
val file = File(ContextUtils.getRecordDataDirName(context)) val file = File(ContextUtils.getRecordDataDirName(context))
Log.d("TaskUtils", "installApks4Tmp: ${file.absolutePath}") Log.d("TaskUtils", "installApks4Tmp: ${file.absolutePath}")
val files = file.listFiles() val files = file.listFiles()
var bool = true var bool = true
var currentApkFile = 1 var currentApkFile = 1
files?.let { files?.let {
for (f in it) { for (f in it) {
val extraName = f.name.substring(f.name.lastIndexOf('.') + 1) val extraName = f.name.substring(f.name.lastIndexOf('.') + 1)
Log.d( Log.d(
"TaskUtils", "TaskUtils",
"installApks4Tmp: extraName $extraName" "installApks4Tmp: extraName $extraName"
) )
if ("apk" == extraName) { if ("apk" == extraName) {
//Log.d("TaskUtils", "installApks4Tmp: getPath " + f.getPath()); //Log.d("TaskUtils", "installApks4Tmp: getPath " + f.getPath());
val commond = val commond =
"pm install-write " + session + " " + currentApkFile + ".apk " + f.path "pm install-write " + session + " " + currentApkFile + ".apk " + f.path
currentApkFile++ currentApkFile++
//Log.d("TaskUtils", "installApks4Tmp: " + commond); //Log.d("TaskUtils", "installApks4Tmp: " + commond);
result = MockTools.execRead(commond) result = MockTools.execRead(commond)
if (!result.contains("Success")) { if (!result.contains("Success")) {
bool = false bool = false
break 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 { private fun clientInstall0(apkFile: File): Boolean {
execCommand("su") execCommand("su")
execCommand("chmod", "777", apkFile.absolutePath) execCommand("chmod", "777", apkFile.absolutePath)
execCommand("export", "LD_LIBRARY_PATH=/vendor/lib:/system/lib") execCommand("export", "LD_LIBRARY_PATH=/vendor/lib:/system/lib")
execCommand("pm", "install", "-r", apkFile.absolutePath) 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) { fun writeFile1(context: Context?, dirName: String, fileName: String, contents: String) {
val fs = File("$dirName/$fileName") val fs = File("$dirName/$fileName")
forceMakeDir(fs) forceMakeDir(fs)
var outputStream: FileOutputStream? = null var outputStream: FileOutputStream? = null
try { try {
outputStream = FileOutputStream(fs) outputStream = FileOutputStream(fs)
outputStream.write(contents.toByteArray()) outputStream.write(contents.toByteArray())
outputStream.flush() outputStream.flush()
outputStream.close() outputStream.close()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
}
} }
}
fun writeFile(context: Context, dirName: String, fileName: String, contents: String) { fun writeFile(context: Context, dirName: String, fileName: String, contents: String) {
val fs = File(getBaseFilesDir(context) + "/" + dirName + "/" + fileName) val fs = File(getBaseFilesDir(context) + "/" + dirName + "/" + fileName)
forceMakeDir(fs) forceMakeDir(fs)
var outputStream: FileOutputStream? = null var outputStream: FileOutputStream? = null
try { try {
outputStream = FileOutputStream(fs) outputStream = FileOutputStream(fs)
outputStream.write(contents.toByteArray()) outputStream.write(contents.toByteArray())
outputStream.flush() outputStream.flush()
outputStream.close() outputStream.close()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
}
} }
}
fun WriteFile(fileName: String?, content: String?) { fun WriteFile(fileName: String?, content: String?) {
try { try {
val writer = FileWriter(fileName, false) val writer = FileWriter(fileName, false)
writer.write(content) writer.write(content)
writer.close() writer.close()
} catch (e: IOException) { } catch (e: IOException) {
e.printStackTrace() e.printStackTrace()
}
} }
}
@Throws(IOException::class) @Throws(IOException::class)
private fun writeFileToSDCard(message: String) { private fun writeFileToSDCard(message: String) {
// 比如可以将一个文件作为普通的文档存储,那么先获取系统默认的文档存放根目录 // 比如可以将一个文件作为普通的文档存储,那么先获取系统默认的文档存放根目录
val parent_path = Environment.getExternalStorageDirectory() val parent_path = Environment.getExternalStorageDirectory()
// String AppPath = "/data/data/"+ Util.getRecordPackageName() + "/"; // String AppPath = "/data/data/"+ Util.getRecordPackageName() + "/";
val AppPath = "/data/data/sperixlabs.proxyme/" val AppPath = "/data/data/sperixlabs.proxyme/"
val dir = File(AppPath) val dir = File(AppPath)
if (!dir.exists()) { if (!dir.exists()) {
dir.mkdirs() 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("文件写入", "成功")
} }
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.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