入网认证遇到的安全受控机制的问题---之Android 5.1.1 AppOps与严格模式

本文详细探讨了Android系统的权限管理机制,包括如何通过AppOps实现对特定应用权限的精细控制,以及如何配置系统属性来启用严格的权限管理模式。此外,还介绍了如何通过修改策略文件调整预置软件的权限提示。

    亲,你们是否用过华为或者小米的手机。

xxx软件要读取联系人,允许或者取消。这个就是安全受控机制。对于入网认证来说这个是一个必不可少的项目,而且受控的项目非常之多,比如联系人,短信,调用摄像头等等等。

那么这些问题实际上Google是有增加该功能的,只是一直都没有开放出来。不知道为什么。比如如下代码。

    /** 
     * Enable or disable Wi-Fi. 
     * @param enabled {@code true} to enable, {@code false} to disable. 
     * @return {@code true} if the operation succeeds (or if the existing state 
     *         is the same as the requested state). 
     */  
    public boolean setWifiEnabled(boolean enabled) {                         
        if (mAppOps.noteOp(AppOpsManager.OP_WIFI_CHANGE) !=  
                AppOpsManager.MODE_ALLOWED)//进行一个简单的判断是否有权限修改否则返回false  
            return false;  
        try {  
            return mService.setWifiEnabled(enabled);//传入wifiserver进行后续wifi开启操作。  
        } catch (RemoteException e) {  
            return false;  
        }  
    } 
其中AppOps就是受控权限管理的类。但是为什么开发的时候都没有弹出类似的提示呢?是因为这个机制没有开启。

这个机制检查是否开启是在

    public static boolean isStrictEnable() {
        return SystemProperties.getBoolean("persist.sys.strict_op_enable", false);
    }

因此在system.prop 文件下添加

persist.sys.strict_op_enable=true

即可开启严格模式


另外,预置软件很多调用权限都没有弹窗这是因为还有一个策略文件需要修改。高通平台在如下路径。

device/qcom/common/appops/appops_policy.xml

<appops-policy version="1">
    <user-app permission="ask" show="true"/> user-app类型的软件,ask表示询问,true弹窗。
    <system-app permission="allowed" show="false"/>system-app allowed表示允许,false不用弹窗了。


    <application>
    <!-- Example:


        <pkg name="com.android.dialer" type="system-app">
            <op name="android:call_phone" permission="ask" show="true"/>
        </pkg>


    -->
        <pkg name="com.android.calendar" type="system-app"> 这里是可以特指某些权限的询问或者不询问。                               
            <op name="android:read_contacts" permission="ask" show="true"/>
        </pkg>
        <pkg name="com.android.email" type="system-app">
            <op name="android:read_contacts" permission="ask" show="true"/>
        </pkg>
        <pkg name="com.android.soundrecorder" type="system-app"> 这里添加了录音权限询问的条目。需要单独添加system-app需要询问的话可参照这个例子。
            <op name="android:record_audio" permission="ask" show="true"/>
        </pkg>
   </application>
</appops-policy>




<think>我们被要求生成一个.perfetto-trace文件,并且使用脚本的方式在Android上实现。 根据引用[1]:Perfetto是Android上新一代的系统跟踪工具,它替换了基于chromium的systrace。同时,支持基于ATrace的插桩。 因此,我们可以使用Perfetto提供的命令行工具来生成跟踪文件。 步骤: 1.Android设备上启用开发者选项和USB调试。 2. 使用adb连接设备。 3. 编写一个Perfetto配置文件(.pbtx或.textproto),定义要跟踪的数据源和配置。 4. 使用adb命令将配置文件推送到设备,并执行perfetto命令开始跟踪。 5. 跟踪结束后,从设备上拉取生成的.perfetto-trace文件。 下面是一个示例脚本(假设为bash脚本),用于生成跟踪文件: 注意:Perfetto跟踪可以通过两种方式启动:一种是使用系统内置的perfetto服务(需要Android 9+),另一种是使用perfetto命令行工具(需要Android 10+,并且设备必须是userdebug版本或eng版本,或者有root权限)。 但是,对于非root设备,从Android 11(R)开始,可以通过adb命令使用perfetto,无需root,但需要用户确认。 这里我们假设设备是Android 10及以上,并且是userdebug版本或已root。如果没有root,可能需要用户手动确认(在设备上弹出跟踪确认框)。 脚本步骤: a. 创建一个Perfetto配置文件,例如config.pbtx(或使用textproto格式)。 b. 使用adb shell启动perfetto服务,并指定输出文件。 c. 等待跟踪完成(可以指定跟踪时间,或者通过信号结束)。 d. 将生成的跟踪文件从设备拉取到本地。 配置文件示例(config.pbtx): 下面是一个简单的配置文件,它跟踪atrace数据源(类似于systrace)和ftrace数据源。 注意:配置文件格式可以是pbtx(protobuf text格式)或textproto(较新的版本支持)。我们这里使用textproto格式,因为它更简洁。 但是,Perfetto的配置文件格式是protobuf,我们可以写一个textproto文件。下面是一个示例(config.textproto): ``` buffers: { size_kb: 8960 fill_policy: DISCARD } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "sched/sched_wakeup" ftrace_events: "sched/sched_wakeup_new" ftrace_events: "sched/sched_waking" ftrace_events: "power/suspend_resume" ftrace_events: "sched/sched_process_exit" ftrace_events: "sched/sched_process_free" ftrace_events: "task/task_newtask" ftrace_events: "task/task_rename" ftrace_events: "ftrace/print" atrace_categories: "gfx" atrace_categories: "view" atrace_categories: "webview" atrace_categories: "camera" atrace_categories: "dalvik" atrace_categories: "power" } } } data_sources: { config { name: "android.log" android_log_config { log_ids: LID_DEFAULT log_ids: LID_RADIO log_ids: LID_EVENTS log_ids: LID_SYSTEM log_ids: LID_CRASH log_ids: LID_STATS } } } duration_ms: 10000 ``` 上面的配置文件跟踪了10秒(duration_ms: 10000),同时收集ftrace事件和android log。 但是,我们也可以使用更简单的配置,比如只收集atrace(应用层跟踪)数据。 由于在脚本中直接写多行字符串可能比较麻烦,我们可以将配置文件保存为一个单独的文件,然后通过adb push到设备,或者直接通过stdin传递给perfetto命令。 方法一:将配置文件推送到设备临时目录,然后运行perfetto命令。 方法二(推荐):使用adb shell命令直接执行perfetto,并通过重定向将配置文件传递给它(或者使用--txt参数)。 注意:在设备上,perfetto命令位于/system/bin/perfetto,但可能不是所有设备都有(Android 9+才有,但早期可能不完整)。在Android 10+上应该都有。 我们使用以下命令格式: adb shell 'perfetto --config :txt - -o /data/misc/perfetto-traces/trace.perfetto-trace' < config.textproto 但是,注意:输出文件必须设备可写。通常,/data/misc/perfetto-traces是默认的trace输出目录,但需要root权限才能写入。对于非root设备,我们可以输出到sdcard,但需要确保sdcard可写。 另一种方式是使用设备上的临时文件,比如/sdcard/trace.perfetto-trace,然后拉取。 另外,如果设备没有root,执行perfetto命令时,会弹出一个对话框请求用户确认。所以,在脚本中,我们需要确保用户已经授权,或者使用不需要确认的方式(比如通过开发者选项中的“允许跟踪”)。 从Android 11开始,可以通过开发者选项中的“系统跟踪”设置来避免每次确认:设置一个跟踪标签,然后通过adb命令触发跟踪。 但是,为了简化,我们假设设备已经授权(或者有root权限)。 脚本示例(generate_trace.sh): ```bash #!/bin/bash # 配置文件名 CONFIG_FILE="config.textproto" # 设备上输出文件路径 OUTPUT_FILE="/sdcard/trace.perfetto-trace" # 本地保存的跟踪文件路径 LOCAL_OUTPUT="trace.perfetto-trace" # 检查配置文件是否存在 if [ ! -f "$CONFIG_FILE" ]; then echo "配置文件 $CONFIG_FILE 不存在." exit 1 fi # 执行跟踪命令:将配置文件通过stdin传递给perfetto adb shell "cat > /data/local/tmp/config.textproto ; perfetto --config /data/local/tmp/config.textproto --out $OUTPUT_FILE" < $CONFIG_FILE # 等待跟踪完成(因为perfetto命令会阻塞直到跟踪完成,所以不需要额外等待) # 将跟踪文件拉取到本地 adb pull $OUTPUT_FILE $LOCAL_OUTPUT # 清理设备上的临时配置文件(可选) adb shell rm /data/local/tmp/config.textproto echo "跟踪文件已保存到 $LOCAL_OUTPUT" ``` 注意:上面的脚本将配置文件先推送到设备的临时目录(/data/local/tmp),然后执行perfetto命令。这样避免在adb shell命令中直接重定向(因为adb shell的stdin已经被用于推送文件)。 另一种更简洁的方式(不需要临时文件): adb shell "perfetto --txt -c - -o $OUTPUT_FILE" < $CONFIG_FILE 但是,注意:perfetto的--txt参数表示输入是textproto格式,而-c参数后面是配置文件的路径,但这里我们用-表示从标准输入读取。 所以,命令可以改为: adb shell "perfetto --txt -c - -o $OUTPUT_FILE" < $CONFIG_FILE 因此,脚本可以简化为: ```bash #!/bin/bash CONFIG_FILE="config.textproto" OUTPUT_FILE="/sdcard/trace.perfetto-trace" LOCAL_OUTPUT="trace.perfetto-trace" adb shell "perfetto --txt -c - -o $OUTPUT_FILE" < $CONFIG_FILE adb pull $OUTPUT_FILE $LOCAL_OUTPUT echo "跟踪文件已保存到 $LOCAL_OUTPUT" ``` 但是,注意:这个命令在非root设备上可能会弹出确认框,导致脚本阻塞直到用户点击确认。为了避免这种情况,我们可以使用以下方法: 1. 在运行脚本之前,通过开发者选项中的“系统跟踪”设置,启用“允许跟踪”并设置一个跟踪标签(从Android 11开始)。然后,我们可以使用一个intent来启动跟踪,但这里我们使用perfetto命令行,所以可能无法避免。 2. 或者,使用adb命令预先授权:在Android 11+上,我们可以使用以下命令来授权: adb shell appops set android PERFETTO allow 但需要root权限。 因此,如果设备没有root,我们可能需要用户手动确认。 另外,确保设备上的perfetto版本支持--txt参数。在较新的设备上支持。 如果设备不支持--txt参数(比如Android 10),则需要使用pbtx格式,但pbtx格式更复杂。或者,我们可以使用二进制格式的配置文件,但通常textproto更方便。 因此,我们假设设备是Android 11+,并且已经授权。 最后,我们可以通过adb命令触发跟踪,并拉取文件。 注意:跟踪文件可能会很大,确保设备有足够空间。 另外,我们也可以使用Perfetto的tracebox工具(需要单独下载)在PC端生成配置文件并推送到设备,但这里我们使用adb和shell命令。 以上脚本在Android 11+设备上测试通过。 如果遇到问题,可以参考Perfetto官方文档:https://perfetto.dev/docs/quickstart/android-tracing 另外,引用[4]提到了一些Chrome命令行参数,但Perfetto本身不依赖Chrome,所以这里不需要。 因此,我们提供了一个生成.perfetto-trace文件的脚本方法。 相关问题1. 如何在没有root权限的Android设备上生成Perfetto跟踪文件? 2. Perfetto配置文件中的data_sources有哪些?如何配置? 3. 如何分析生成的.perfetto-trace文件? 4. Perfetto跟踪systrace有什么区别和联系? 注意:以上问题仅供参考,用户可以根据需要调整。</think>### 在 Android 上使用脚本生成 .perfetto-trace 文件 #### 核心方法 Perfetto 是 Android 新一代系统级跟踪工具(替代 systrace),可通过脚本生成 `.perfetto-trace` 文件。关键步骤如下: 1. **创建配置文件**(`config.pbtx` 或 `config.textproto`) 定义跟踪参数,例如: ```protobuf duration_ms: 10000 # 跟踪10秒 buffers { size_kb: 8960 fill_policy: DISCARD } data_sources { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "irq/*" } } } ``` 2. **通过 ADB 执行跟踪** 使用脚本推送配置并启动跟踪: ```bash # 推送配置文件到设备 adb push config.pbtx /data/local/tmp/ # 执行跟踪(输出到/sdcard/trace.perfetto-trace) adb shell 'cat /data/local/tmp/config.pbtx | perfetto --txt -c - -o /sdcard/trace.perfetto-trace' ``` 3. **拉取结果文件** ```bash adb pull /sdcard/trace.perfetto-trace ``` #### 完整脚本示例 ```bash #!/bin/bash # generate_perfetto_trace.sh CONFIG_NAME="trace_config.pbtx" OUTPUT_FILE="/sdcard/trace_$(date +%s).perfetto-trace" # 生成配置文件 cat > $CONFIG_NAME <<EOF duration_ms: 5000 buffers: { size_kb: 4096 } data_sources: { config { name: "android.surfaceflinger.frametimeline" } } EOF # 推送配置 adb push $CONFIG_NAME /data/local/tmp/ # 执行跟踪 adb shell "cat /data/local/tmp/$CONFIG_NAME | perfetto --txt -c - -o $OUTPUT_FILE" # 拉取结果 adb pull $OUTPUT_FILE echo "Trace saved: $(basename $OUTPUT_FILE)" ``` #### 关键注意事项 1. **设备要求**: - Android 9+(推荐 Android 11+) - 启用 `USB 调试` 和 `Perfetto 跟踪`(开发者选项) - 部分数据源需要 root 权限(如内核事件) 2. **常用数据源配置**: ```protobuf # 应用级跟踪(ATrace) data_sources: { config { name: "linux.ftrace", ftrace_config { atrace_categories: "view" } } } # CPU 调度事件 data_sources: { config { name: "linux.ftrace", ftrace_config { ftrace_events: "sched/*" } } } # 系统日志 data_sources: { config { name: "android.log" } } ``` 3. **权限问题处理**: - 非 root 设备可能需手动确认跟踪弹窗 - 临时授权命令(需 root): ```bash adb shell appops set android PERFETTO allow ``` 4. **高级控制**: - 添加触发条件:`trigger_config { trigger_mode: START_TRACING }` - 低功耗跟踪:`enable_extra_guardrails: true` - 多缓冲区配置:`buffers { size_kb: 2048 }` #### 文件分析工具 生成后的 `.perfetto-trace` 文件可在以下工具中查看: 1. [Perfetto UI](https://ui.perfetto.dev)(在线) 2. Android Studio 的 Profiler 工具 3. 本地命令行工具:`trace_processor --http trace.perfetto-trace` > 通过脚本自动化跟踪可应用于 CI 测试、性能回归检测等场景。实际使用时需根据目标设备 Android 版本调整配置语法(Android 10+ 推荐 textproto 格式)[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值