曾学慬 2024-03-12 14:31 采纳率: 75%
浏览 5

Android frameworks代码如何追踪

最近在学习Android frameworks的源码,看到一篇配置iptable的文章比较感兴趣,原文链接https://www.jianshu.com/p/d4b9a599b9da

博主在追INetd的时候,直接追到了system/netd/server/NetdNativeService.cpp

img


我尝试着看源码跟一下,INetd.FIREWALL_ALLOWLIST和INetd.FIREWALL_DENYLIST都是导入的静态变量

// \frameworks\base\services\core\java\com\android\server\NetworkManagementService.java

package com.android.server;


import static android.net.INetd.FIREWALL_ALLOWLIST;
import static android.net.INetd.FIREWALL_DENYLIST;
......
    @Override
    public void setFirewallEnabled(boolean enabled) {
        enforceSystemUid();
        try {
            mNetdService.firewallSetFirewallType(
                    enabled ? INetd.FIREWALL_ALLOWLIST : INetd.FIREWALL_DENYLIST);
            mFirewallEnabled = enabled;
        } catch (RemoteException | ServiceSpecificException e) {
            throw new IllegalStateException(e);
        }
    }

然后就断了,根本找不到是哪里定义的,后续也不知道如何追踪

img


我有试过将整个项目导入Android Studio,想用工具直接跳转。建立索引,导入项目,一通操作花了几个小时,将整个工程导入AS真的很慢,然后发现代码一片红,还是有大部分代码不能跳转。

想知道这种代码应该怎么继续追踪

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-03-12 14:46
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

    追踪Android源码的过程中,你遇到的问题主要是两个方面:静态变量的定义和代码的跳转问题。下面我会分别给出解决建议:

    1. 静态变量的定义INetd.FIREWALL_ALLOWLISTINetd.FIREWALL_DENYLIST 是常量,通常在接口或者常量类中定义。在Android源码中,这些常量可能定义在C++或者Java层。由于你给出的链接是Java代码,我们可以假设它们在Java层定义。在Android源码中,常量通常定义在.java文件的public static final字段中。由于这里没有直接的导入路径,我们需要手动搜索。你可以尝试在Android源码的搜索功能中(如果使用AS,可以使用Shift + Shift快捷键全局搜索)输入这两个常量的名字,找到它们的定义位置。

    2. 代码跳转和编译问题

      • 代码跳转:在Android Studio中,如果你已经正确导入了源码项目并建立了索引,可以通过Ctrl + 鼠标左键点击变量或方法名来跳转到定义处。如果代码是红色的,说明可能没有正确导入依赖或者编译失败。
      • 编译问题:导入完整的Android源码项目确实需要一些时间,并且可能因为缺少环境或者依赖导致编译问题。确保你已经安装了Android SDK Build-Tools、NDK等必要的工具,并且在项目的local.properties文件中指定了正确的SDK目录。如果仍然有错误,可能需要查看具体的编译日志以找出问题所在。

    如果你已经尝试过上述步骤但仍然无法解决问题,可能是由于某些库或模块没有正确加载。在这种情况下,你可能需要查看官方的源码构建指南,例如Android源码构建指南,确保你的构建过程是正确的。

    另外,对于NetdNativeService.cpp中的代码,这部分是C++代码,可能涉及到JNI调用。要理解这部分,你需要了解Android的JNI机制以及C++的部分知识。在Java层调用mNetdService.firewallSetFirewallType()实际上会通过JNI调用到C++的实现。你可以在NetdNativeService.cpp中查找与firewallSetFirewallType相关的函数,然后顺着这个函数找到它如何处理FIREWALL_ALLOWLISTFIREWALL_DENYLIST的逻辑。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月12日

悬赏问题

  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下
  • ¥15 android 蓝牙闪退
  • ¥15 绝缘子污秽comsol仿真参数
  • ¥15 Fatal error in Process MEMORY
  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时