Blocker:高效管理Android应用组件的全能工具箱
项目标题与描述
Blocker 是一款功能强大的Android应用组件控制器。它致力于解决Android应用中组件冗余、资源占用过高的问题,通过提供便捷的控制接口,帮助用户禁用非必要的应用组件,从而优化应用运行效率并节省系统资源。
项目采用现代Android开发技术栈,支持多种组件控制模式,并且提供了完善的模块化架构。目前项目已在Google Play和F-Droid上架,拥有活跃的开发者社区。
功能特性
- 双模式组件控制:支持通过 Package Manager (PM) 和 Intent Firewall (IFW) 两种底层机制来管理应用组件状态,用户可根据设备条件和需求自由切换。
- 规则导入与导出:支持将应用管理规则进行导出和导入,方便备份与迁移。同时支持导出纯IFW规则。
- 第三方规则兼容:能够直接导入并转换由 MyAndroidTools 生成的备份文件,将其无缝转换为Blocker可用的规则或Intent Firewall规则,方便老用户迁移。
- 模块化与可扩展架构:项目采用清晰的Gradle模块化设计,通过
build-logic定义项目级约定插件,便于维护和未来功能扩展。 - 轻量与高性能:应用本身设计轻量,专注于核心功能,不增加系统额外负担。
- 直观的用户界面:提供易于使用的操作界面,简化复杂的组件管理操作。
安装指南
从应用商店安装
最简单的方式是通过官方应用商店安装:
从源码构建
如果你想从源码构建项目,需要满足以下条件:
系统要求:
- JDK 17
- Android SDK
- Git
构建步骤:
- 克隆仓库:
git clone https://github.com/lihenggui/blocker.git cd blocker - 准备环境:
- 确保
JAVA_HOME环境变量指向JDK 17。 - 确保
ANDROID_HOME环境变量指向你的Android SDK路径。
- 确保
- 复制配置文件:
# 根据内部构建脚本的提示,某些构建需要特定配置文件 # 注意:公开构建可能不需要此步骤,具体请参考项目文档。 - 执行构建:
构建产物将位于./gradlew :app-compose:assembleMarketReleaseapp/build/outputs/apk/market/release/目录下。
注意事项:
- 使用PM模式管理第三方应用组件需要设备具有 Root 权限。
- IFW模式需要Android 4.4.2 (API 19) 及以上版本,并且写入规则文件通常也需要Root权限(或通过Shizuku等授权工具)。
使用说明
基础使用
Blocker的主要功能是查看和管理已安装应用的组件(Activity、Service、Receiver、Provider)。用户可以通过应用列表选择目标应用,查看其组件详情,并通过开关按钮启用或禁用特定组件。
模式切换
在应用设置中,用户可以在 PM模式 和 IFW模式 之间切换。
- PM模式:通过调用Android系统的
PackageManager接口或pm命令行工具修改组件状态,修改记录在package restrictions.xml文件中。 - IFW模式(默认):通过创建/修改
/data/system/ifw/目录下的XML规则文件来控制Intent的流转,从而拦截特定组件的启动。
规则管理
- 导出规则:可以将对某个或所有应用的组件禁用规则导出为Blocker专用格式或纯IFW XML格式。
- 导入规则:可以导入之前导出的规则文件。此外,应用还提供了一个关键功能:导入MyAndroidTools的备份文件(
.mat格式),并可以将其转换为IFW规则。
与系统交互的核心接口
Blocker为了实现深度管理功能,通过AIDL或反射等方式与系统服务进行交互。以下是一些核心的系统接口定义(位于项目的core:ifw-api等模块中),这些接口展示了Blocker所能实现的部分底层操作能力:
/*
* IPackageManager 接口定义
* 这是Android框架中PackageManager服务的Binder接口。
* Blocker通过此接口查询应用信息和修改组件状态。
*/
public interface IPackageManager extends IInterface {
// 获取已安装包列表
ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId)
throws RemoteException;
// 关键方法:设置组件(Activity/Service等)的启用状态
void setComponentEnabledSetting(ComponentName componentName, int newState, int flags, int userId)
throws RemoteException;
// 获取组件当前启用状态
int getComponentEnabledSetting(ComponentName componentName, int userId)
throws RemoteException;
}
/*
* IActivityManager 接口定义
* 这是Android框架中ActivityManager服务的Binder接口。
* Blocker通过此接口执行如强制停止应用、获取运行进程等高级操作。
*/
public interface IActivityManager extends IInterface {
// 强制停止指定包名的应用
void forceStopPackage(String packageName, int userId) throws RemoteException;
// 获取当前运行的应用进程列表
List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() throws RemoteException;
// 获取正在运行的服务列表
List<ActivityManager.RunningServiceInfo> getServices(int maxNum, int flags) throws RemoteException;
// 杀死指定应用的背景进程
void killBackgroundProcesses(String packageName) throws RemoteException;
}
/*
* 组件状态控制器抽象层示例
* 此段代码展示了Blocker如何抽象不同的控制模式。
* 这里以禁用组件为例,定义了一个通用的接口。
*/
public interface IComponentController {
/**
* 禁用指定应用的某个组件
* @param packageName 应用包名
* @param componentName 组件全名(包括类名)
* @return 操作是否成功
*/
boolean disableComponent(String packageName, String componentName);
/**
* 启用指定应用的某个组件
* @param packageName 应用包名
* @param componentName 组件全名
* @return 操作是否成功
*/
boolean enableComponent(String packageName, String componentName);
// 可能还有基于IFW的特定方法,如:
// boolean addIfwRule(Rule rule);
// boolean removeIfwRule(String packageName);
}
注意:上述系统接口(如IPackageManager, IActivityManager)通常无法直接被第三方应用调用,它们需要系统级权限。Blocker在Root环境下,通过获取系统服务的Binder代理来调用这些方法;在非Root环境下,则可能使用其他受限方式或依赖IFW文件操作。
核心代码
Blocker项目结构清晰,采用现代Android开发实践。以下是体现其核心架构和功能的部分代码概览:
1. 项目构建逻辑 (Convention Plugins)
// 示例:一个基础的Android库约定插件 (简化概念)
class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
}
extensions.configure<LibraryExtension> {
// 统一配置编译SDK、最小SDK等
compileSdk = 34
defaultConfig {
minSdk = 21
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
// 可能还有统一的构建类型、依赖排除等配置
}
// 统一依赖管理
dependencies {
add("implementation", libs.findBundle("androidx.core").get())
add("testImplementation", libs.findBundle("test").get())
}
}
}
}
2. 模块依赖关系生成脚本
#!/bin/bash
# 脚本核心循环:为每个非排除模块生成依赖图
echo "$module_paths" | while read -r module_path; do
if [[ ! " ${excluded_modules[@]} " =~ " ${module_path} " ]]; then
file_name="dep_graph${module_path//:/_}"
file_name="${file_name//-/_}"
# 使用Gradle任务生成Graphviz文本
./gradlew generateModulesGraphvizText \
-Pmodules.graph.output.gv="/tmp/${file_name}.gv" \
-Pmodules.graph.of.module="${module_path}" </dev/null
# 使用dot和svgo工具生成并优化SVG图
dot -Tsvg "/tmp/${file_name}.gv" |
svgo --multipass --pretty --output="docs/images/graphs/${file_name}.svg" -
rm "/tmp/${file_name}.gv"
fi
done
3. 持续集成测试脚本
项目通过Kokoro进行持续集成,包含在多种物理设备和API版本上进行测试的脚本,确保了应用的兼容性和质量。
#!/bin/bash
# 使用Firebase Test Lab并行运行多个模块的测试
testApks=($(./gradlew -q fossDebugPrintTestApk))
for testApk in ${testApks[@]}; do
# 对每个测试APK,在指定设备上运行测试,最多重试3次
run_firebase_test_lab $testApk &
pids="$pids $!"
done
# 等待所有并行测试完成
for pid in ${pids[@]}; do
wait $pid || let "result=1"
done
exit $result
项目模块示例:
从代码中可以看到,Blocker包含众多模块,例如:
:app-compose: 主应用模块(使用Compose UI):core:component-controller: 组件控制核心逻辑:core:data,:core:database,:core:datastore: 数据处理与存储:core:ifw-api: IFW相关API定义:feature:applist,:feature:appdetail: 应用列表和详情功能模块:feature:search: 搜索功能模块
每个功能模块都可能有对应的依赖关系图,位于docs/images/graphs/目录下,方便开发者查阅。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码




浙公网安备 33010602011771号