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:
commit
42da6261fd
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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("文件写入", "成功")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue