Blocker:高效管理Android应用组件的全能工具箱

项目标题与描述

Blocker 是一款功能强大的Android应用组件控制器。它致力于解决Android应用中组件冗余、资源占用过高的问题,通过提供便捷的控制接口,帮助用户禁用非必要的应用组件,从而优化应用运行效率并节省系统资源。

项目采用现代Android开发技术栈,支持多种组件控制模式,并且提供了完善的模块化架构。目前项目已在Google Play和F-Droid上架,拥有活跃的开发者社区。

Get it on F-Droid
Get it on Google Play

功能特性

  • 双模式组件控制:支持通过 Package Manager (PM)Intent Firewall (IFW) 两种底层机制来管理应用组件状态,用户可根据设备条件和需求自由切换。
  • 规则导入与导出:支持将应用管理规则进行导出和导入,方便备份与迁移。同时支持导出纯IFW规则。
  • 第三方规则兼容:能够直接导入并转换由 MyAndroidTools 生成的备份文件,将其无缝转换为Blocker可用的规则或Intent Firewall规则,方便老用户迁移。
  • 模块化与可扩展架构:项目采用清晰的Gradle模块化设计,通过build-logic定义项目级约定插件,便于维护和未来功能扩展。
  • 轻量与高性能:应用本身设计轻量,专注于核心功能,不增加系统额外负担。
  • 直观的用户界面:提供易于使用的操作界面,简化复杂的组件管理操作。

安装指南

从应用商店安装

最简单的方式是通过官方应用商店安装:

从源码构建

如果你想从源码构建项目,需要满足以下条件:

系统要求:

  • JDK 17
  • Android SDK
  • Git

构建步骤:

  1. 克隆仓库
    git clone https://github.com/lihenggui/blocker.git
    cd blocker
    
  2. 准备环境
    • 确保JAVA_HOME环境变量指向JDK 17。
    • 确保ANDROID_HOME环境变量指向你的Android SDK路径。
  3. 复制配置文件
    # 根据内部构建脚本的提示,某些构建需要特定配置文件
    # 注意:公开构建可能不需要此步骤,具体请参考项目文档。
    
  4. 执行构建
    ./gradlew :app-compose:assembleMarketRelease
    
    构建产物将位于app/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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-12-10 14:13  qife  阅读(0)  评论(0)    收藏  举报