
License
Shizuku
Canta 是一款基于 Shizuku 的开源 Android 应用卸载工具。它让您无需 Root 权限,也能轻松卸载包括系统应用在内的任何应用程序。秉承隐私至上的原则,Canta 的所有操作都在本地设备完成,绝不收集任何用户数据。
Canta 仅请求其核心功能所必需的权限:
Canta 的核心功能依赖于与 Shizuku 的交互,其关键接口是 Android 隐藏 API 的封装,用于获取包管理服务。
// IPackageManager 接口示例,用于获取系统包管理器服务
package android.content.pm;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
/**
* IPackageManager 的 Stub 类封装,用于通过 Shizuku 调用系统服务。
* 参考自 Shizuku API Demo。
*/
public interface IPackageManager extends IInterface {
// 获取包安装器服务,用于执行安装/卸载操作
IPackageInstaller getPackageInstaller() throws RemoteException;
abstract class Stub extends android.os.Binder implements IPackageManager {
public static IPackageManager asInterface(IBinder obj) {
// 实际实现由 Shizuku 框架提供
throw new UnsupportedOperationException("Stub!");
}
}
}// IPackageInstaller 接口示例,用于执行具体的卸载会话
package android.content.pm;
import android.os.IBinder;
import android.os.IInterface;
/**
* IPackageInstaller 的 Stub 类封装。
* 参考自 Shizuku API Demo。
*/
public interface IPackageInstaller extends IInterface {
abstract class Stub extends android.os.Binder implements IPackageInstaller {
public static IPackageInstaller asInterface(IBinder binder) {
// 实际实现由 Shizuku 框架提供
throw new UnsupportedOperationException("Stub!");
}
}
}以下是 Canta 中与 Shizuku 交互的核心模块,展示了如何获取系统服务并执行卸载操作。
// 示例代码:通过 Shizuku 获取 PackageManager 并卸载应用
// 此代码片段展示了核心逻辑,具体实现请参考项目源码。
import android.content.pm.IPackageManager
import android.content.pm.IPackageInstaller
import rikka.shizuku.ShizukuBinderWrapper
import rikka.shizuku.SystemServiceHelper
class Uninstaller {
private fun getPackageInstaller(): IPackageInstaller? {
return try {
// 1. 通过 Shizuku 获取绑定的 Binder 对象,代表系统服务 "package"
val binder = ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package"))
// 2. 将 Binder 对象转换为 IPackageManager.Stub 接口
val packageManager = IPackageManager.Stub.asInterface(binder)
// 3. 通过 IPackageManager 获取 IPackageInstaller
packageManager?.packageInstaller
} catch (e: Exception) {
e.printStackTrace()
null
}
}
fun uninstallPackage(packageName: String) {
val installer = getPackageInstaller() ?: return
// 此处为简化逻辑,实际卸载需要创建卸载会话并提交
// val sessionParams = ... (创建卸载会话参数)
// val sessionId = installer.createSession(sessionParams)
// val session = installer.openSession(sessionId)
// session.uninstall(packageName, ...)
println("准备通过 Shizuku 卸载应用: $packageName")
}
}核心逻辑说明:
ShizukuBinderWrapper 和 SystemServiceHelper 获取到系统包管理器服务的 Binder 对象。这是 Shizuku 赋予应用执行特权操作的关键。IPackageManager.Stub,从而可以调用其内部方法。IPackageManager 的 getPackageInstaller() 方法获得 IPackageInstaller 对象,该对象是执行安装和卸载操作的核心。IPackageInstaller 创建卸载会话,最终完成应用的移除。整个流程权限由 Shizuku 在底层保障。FINISHED
hj11kcZ8BgI9VJuBlttWY/0qkeLFf8eoWn1Mn0Sm4IA=原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。