You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从安卓设备获取FirmwareVersionPreferenceController.java文件?

解决小众国产安卓设备开发者选项密码锁定问题

一、定位FirmwareVersionPreferenceController类的实际位置

由于是国产定制ROM,该类大概率不在默认的com.android.settings APK中,可能存在于以下位置:

  • 系统框架Jar包:检查/system/framework/目录下的厂商定制Jar(如framework-xxx.jar这类厂商命名的文件),使用jadx或jd-gui工具打开这些Jar包搜索目标类名。
  • 厂商定制Settings组件:部分厂商会将定制逻辑拆分到独立APK中,比如com.xxx.settings、com.xxx.systemui,可以通过以下命令列出系统所有APK并排查:
    find /system /product /oem -name "*.apk" | grep -i settings
    
  • 动态加载的Dex文件:有些ROM会把定制逻辑放在APK的assets或lib目录下的Dex/ODEX文件中,反编译Settings APK时注意查看这些目录,用jadx加载整个APK目录(包含子文件)进行搜索。

二、解决反射找不到类的问题

反射失败通常是因为类加载器隔离或类不在当前进程的类路径中,可以尝试以下方法:

  • 使用目标进程的类加载器:Settings应用可能使用自定义类加载器,先获取Settings进程的类加载器再加载类:
    // 获取Settings应用的Context
    Context settingsContext = createPackageContext("com.android.settings", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
    ClassLoader loader = settingsContext.getClassLoader();
    Class<?> c = loader.loadClass("com.android.settings.deviceinfo.FirmwareVersionPreferenceController");
    
  • 检查类的完整签名:异常信息中的类名可能存在内部类或拼写误差,确认是否是com.android.settings.deviceinfo.FirmwareVersionPreferenceController$PasswordDialog这类内部类形式。

三、获取密码对话框实例的方案

不需要直接找到类文件,可通过Hook框架拦截对话框的创建和验证逻辑:

  1. 使用Xposed/LSPosed Hook:
    • HookDialog.show()方法,筛选标题为Please enter password的对话框,获取实例后可直接关闭或修改其验证逻辑:
      XposedHelpers.findAndHookMethod(Dialog.class, "show", new XC_MethodHook() {
          @Override
          protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
              Dialog dialog = (Dialog) param.thisObject;
              if ("Please enter password".equals(dialog.getTitle())) {
                  // 直接关闭对话框
                  dialog.dismiss();
              }
          }
      });
      
    • 直接HookFirmwareVersionPreferenceController的PasswordDialog方法,拦截对话框的创建:
      XposedHelpers.findAndHookMethod("com.android.settings.deviceinfo.FirmwareVersionPreferenceController", 
          lpparam.classLoader, "PasswordDialog", new XC_MethodHook() {
              @Override
              protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                  // 阻止对话框弹出
                  param.setResult(null);
              }
          });
      
  2. 通过日志追踪验证逻辑:
    • 输入错误密码时,使用logcat过滤相关日志:
      logcat -v time *:V | grep -i "password\|verify\|FirmwareVersion"
      
    • 查看日志中是否有密码验证的关键方法或存储位置(如SharedPreferences、系统属性),直接修改对应值绕过验证。

四、其他可行思路

  • 提取系统镜像:如果设备已Root,可通过dd命令提取/system分区镜像,然后在镜像中全局搜索目标类的字节码文件,找到后反编译查看。
  • 使用Frida动态分析:Attach到Settings进程,动态查找并Hook目标类的方法:
    Java.perform(function() {
        var cls = Java.use("com.android.settings.deviceinfo.FirmwareVersionPreferenceController");
        cls.PasswordDialog.implementation = function() {
            // 不执行原方法,直接返回
            return null;
        };
    });
    

内容的提问来源于stack exchange,提问作者Athwale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:28:21