90%答不出系统权限面试题:从APP申请到内核校验全链路剖析

Linux 性能优化实战:CPU / 内存 / IO / 网络全链路调优,线上可直接落地 本文为 Linux 线上服务器性能优化实战,从 CPU、内存、IO、网络四个维度讲解瓶颈定位方法,配套 top、vmstat、iostat、tcpdump 等工具实操,附带可直接上线的内核调优参数,适合运维工程师排查高并发服务器卡顿、负载高、延迟大等问题。 阅读详情

1 背景

在前几天vip群中有一起讨论一个关于安卓权限的面试题:
“framework层定义的权限是怎么让linux认识的”
在这里插入图片描述

针对这个题目的审题大家其实也是有一定争议的:

其实有同学就提出到底这里说的linux是系统内核认识还是linux的普通native进程认识。

所以是有两种回答方向:
1、linux系统内核识别权限方向:往framework的权限最后是如何影响到进程,gid,groups,从platform.xml解析权限到fork进设置相关gid等。

2、linux的native进程识别方向:比如SurfaceFlinger,audioserver中如何判断一些跨进程的进是否有某个权限.

那今天我们就主要针对方向1部分进行深入剖析,用一个经典的网络权限来作为案例进行说明,为啥在Manifest文件中声明一行

    <uses-permission android:name="android.permission.INTERNET" />

就可以顺利的进行网络访问了,如果不声明权限则百分百会报错如下:

E MainActivity: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
E MainActivity: 	at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150)
E MainActivity: 	at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
E MainActivity: 	at java.net.InetAddress.getAllByName(InetAddress.java:1152)

2. 第一层:Manifest 声明与框架侧权限定义

App 在 AndroidManifest.xml 里写:

<uses-permission android:name="android.permission.INTERNET" />

而这条权限的「官方定义」在框架资源里,AOSP 15 位于:

frameworks/base/core/res/AndroidManifest.xml:2096-2099

<permission android:name="android.permission.INTERNET"
    android:description="@string/permdesc_createNetworkSockets"
    android:label="@string/permlab_createNetworkSockets"
    android:protectionLevel="normal|instant" />

关键点就在 protectionLevel="normal":

  • normal 权限 → 安装时自动授予,不需要用户确认;
  • 没有 runtime 运行时授权逻辑,所以 checkSelfPermission() 对它而言意义不大。

这意味着:决定「能不能联网」的不是 PMS 的运行时检查,而是下面这套 GID 机制。


3. 第二层:权限名 → GID 的映射表 platform.xml

Android 把「权限名 → Linux 组」的映射集中放在 platform.xml,AOSP 15:

frameworks/base/data/etc/platform.xml:59-61

<permission name="android.permission.INTERNET" >
    <group gid="inet" />
</permission>

同一份文件里还有两条特殊的 assign-permission(把权限直接固定派给某个系统 uid,不走正常授权流程):

<assign-permission name="android.permission.INTERNET" uid="media" />   <!-- :169 -->
<assign-permission name="android.permission.INTERNET" uid="shell" />   <!-- :171 -->

这里揭示了一个重要事实:网络权限的载体是组名 inet,而不是什么运行时标记。

inet 这个名字对应的数字,定义在 AOSP 的 AID 表里:

system/core/libcutils/include/private/android_filesystem_config.h:166

#define AID_INET 3003         /* can create AF_INET and AF_INET6 sockets */

内核侧同样有一份(供 in_egroup_p() 使用):

kernel/xiaomi/sdm710/include/linux/android_aid.h:22

#define AID_INET         KGIDT_INIT(3003)

两处一致,都是 3003。


4. 第三层:SystemConfig 解析并落地 GID

系统启动时 SystemConfig 读取 platform.xml,把 <group gid="inet"/> 转成数字 GID:

frameworks/base/services/core/java/com/android/server/SystemConfig.java:1797-1836(readPermission)

String tagName = parser.getName();
if ("group".equals(tagName)) {
    String gidStr = parser.getAttributeValue(null, "gid");
    if (gidStr != null) {
        int gid = Process.getGidForName(gidStr);   // "inet" -> 3003
        if (gid != -1) {
            perm.gids = appendInt(perm.gids, gid);  // 写入 PermissionEntry.gids
        }
        ...
    }
}

随后 PermissionManagerServiceImpl 在构造时,把这份 PermissionEntry.gids 挂到权限对象 Permission 上:

frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java:471-473

if (perm.gids != null) {
    bp.setGids(perm.gids, perm.perUser);
}

至此,「INTERNET 权限」在 Java 世界里就等价于「Permission 对象携带 mGids = {3003}」。


5. 第四层:授权判定 → 按 uid 汇总 GID

normal 权限安装即授,所以对声明了 INTERNET 的 app,PermissionState.isGranted() 为 true。

真正把「已授权权限」折算成「进程该带的 GID 列表」的是这一段:

frameworks/base/services/core/java/com/android/server/pm/permission/UidPermissionState.java:331-349

public int[] computeGids(@NonNull int[] globalGids, @UserIdInt int userId) {
    IntArray gids = IntArray.wrap(globalGids);
    ...
    for (int i = 0; i < permissionsSize; i++) {
        PermissionState permissionState = mPermissions.valueAt(i);
        if (!permissionState.isGranted()) {     // 只统计已授权的
            continue;
        }
        final int[] permissionGids = permissionState.computeGids(userId);
        if (permissionGids.length != 0) {
            gids.addAll(permissionGids);        // 3003 被加进来
        }
    }
    return gids.toArray();
}

对外的统一入口:

PermissionManagerServiceImpl.java:5124-5136

public int[] getGidsForUid(int uid) {
    ...
    return uidState.computeGids(mGlobalGids, userId);
}

注意 Permission.computeGids() 里还有 gidsPerUser 的分支:若配置了 perUser,会把 GID 变成 userId * AID_USER_OFFSET + gid 这种 per-user 形式;inet 没有标 perUser,所以始终是裸的 3003。


6. 第五层:进程启动时把 GID 带进 zygote

真正拉 app 进程时,ActivityManager 通过 ProcessList 向 PM 要 GID:

frameworks/base/services/core/java/com/android/server/am/ProcessList.java:1892-1926

permGids = pm.getPackageGids(app.info.packageName,
        MATCH_DIRECT_BOOT_AUTO, app.userId);   // ← 拿到 [3003, ...]

// 若有被拒绝的权限,把对应 GID 摘掉
if (app.processInfo != null && app.processInfo.deniedPermissions != null) {
    for (int i = ...; i >= 0; i--) {
        int[] denyGids = mService.mPackageManagerInt.getPermissionGids(
                app.processInfo.deniedPermissions.valueAt(i), app.userId);
        if (denyGids != null) {
            for (int gid : denyGids) {
                permGids = ArrayUtils.removeInt(permGids, gid);  // 动态剔除 3003
            }
        }
    }
}

gids = computeGidsForProcess(mountExternal, uid, permGids, externalStorageAccess);

computeGidsForProcess 在 perm GID 之外再补上 sharedAppGid / cacheAppGid / userGid 等基础设施组:

ProcessList.java:1781-1802

for (int permGid : permGids) {
    gidList.add(permGid);
}
if (sharedAppGid != UserHandle.ERR_GID) gidList.add(sharedAppGid);
if (cacheAppGid  != UserHandle.ERR_GID) gidList.add(cacheAppGid);
if (userGid      != UserHandle.ERR_GID) gidList.add(userGid);

最终 app.setGids(gids)(ProcessList.java:2057),这些 GID 会作为 zygote 参数拼进启动命令:

  • --setgid=<gid>:主组
  • --setgroups=<gid1,gid2,...>:补充组列表,3003 就在这里

(参数解析见 frameworks/base/core/java/com/android/internal/os/ZygoteArguments.java:288/349。)


7. 第六层:zygote 落地为进程的 supplementary group

zygote fork 出子进程后,native 层 SpecializeCommon 调用 SetGids,最终走 POSIX setgroups(2):

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp:532-553

static void SetGids(JNIEnv* env, jintArray managed_gids, jboolean is_child_zygote,
                    fail_fn_t fail_fn) {
  ...
  ScopedIntArrayRO gids(env, managed_gids);
  ...
  if (setgroups(gids.size(), reinterpret_cast<const gid_t*>(&gids[0])) == -1) {
    fail_fn(CREATE_ERROR("setgroups failed: ..."));
  }
}

随后降权:

com_android_internal_os_Zygote.cpp:1999-2014

if (setresgid(gid, gid, gid) == -1) { ... }   // 设置真实/有效/保存组 id
...
if (setresuid(uid, uid, uid) == -1) { ... }   // 设置真实/有效/保存用户 id

到这一步,app 进程在内核里的凭证就确定了:

  • uid = 10000 + appId(应用自身 uid)
  • gid = 对应主组
  • supplementary groups 里带 3003(inet) —— 这是网络权限的唯一「落地形态」。

可以用 cat /proc/<pid>/status 里的 Groups: 行验证:有 3003 就说明该进程声明了 INTERNET。


8. 第七层:内核在网络协议栈入口做检查

有了 3003 这个补充组,内核才能在创建 socket 时「认出」这个进程有网络权限。

IPv4 的 socket 创建入口:

kernel/xiaomi/sdm710/net/ipv4/af_inet.c:273-274

if (!current_has_network())
    return -EACCES;

而 current_has_network() 的定义:

kernel/xiaomi/sdm710/net/ipv4/af_inet.c:124-136

#ifdef CONFIG_ANDROID_PARANOID_NETWORK
#include <linux/android_aid.h>

static inline int current_has_network(void)
{
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
}
#else
static inline int current_has_network(void)
{
    return 1;
}
#endif

IPv6 完全对称:

kernel/xiaomi/sdm710/net/ipv6/af_inet6.c:71-76, 138-139

static inline int current_has_network(void)
{
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
}
...
if (!current_has_network())
    return -EACCES;

这里的核心逻辑一句话:

当前进程在 inet(3003) 这个补充组里,或者具备 CAP_NET_RAW capability,才允许创建 AF_INET/AF_INET6 socket;否则 inet_create()/inet6_create() 直接返回 -EACCES。

in_egroup_p(AID_INET) 检查的就是第 7 步 setgroups() 写进进程凭证的 supplementary group。


实战验证

带上网络权限时候情况查看是否带有网络相关的gid

在这里插入图片描述声明后查看相关数据

grus:/ # cat /proc/30339/status | grep Groups                                                                                                                                                             
Groups:	3003 9997 20186 50186 

可以看到有声明网络权限时候,可以看到有3003这个值,代表属于inet(3003)组。

去除网络权限验证
在这里插入图片描述查看对应的

grus:/ # cat /proc/30118/status | grep Groups
Groups:	9997 20186 50186 

这里就没有看到inet(3003)这个组,自然访问网络就会报错。

总结

android.permission.INTERNET 本质上不是一次 Java 权限检查,而是一条「Manifest 声明 → platform.xml 里的 inet 组名 → AID_INET=3003 → PMS 按 uid 汇总 GID → ProcessList 传给 zygote → native setgroups() 写入进程补充组 → 内核 inet_create()/inet6_create() 检查 in_egroup_p(AID_INET)」的完整链路。控制点既在用户态的 GID 装配,也在内核态的 socket 创建入口,二者缺一不可。

注意误区:

很多人以为 INTERNET 是一个「运行时权限」(dangerous permission),会在安装后弹窗申请。它不是。

INTERNET 的 protectionLevel 是 normal,属于安装时自动授予、永不弹窗、用户也关不掉的权限。

那它的「控制力」到底从哪来?答案是:它根本不是靠 Java 层运行时检查起作用的,而是靠一个 Linux 补充组 GID,由内核在网络协议栈入口做访问控制。 下面把这个「权限 → GID → 内核」的转化链路逐层拆开。

全景链路图

APK AndroidManifest.xml
  <uses-permission android:name="android.permission.INTERNET"/>
        │  安装时(PackageInstaller / PMS)
        ▼
frameworks/base/core/res/AndroidManifest.xml   ← 框架侧权限声明
  <permission android:name="android.permission.INTERNET"
      android:protectionLevel="normal|instant" />
        │  系统启动时被 SystemConfig 读取
        ▼
frameworks/base/data/etc/platform.xml          ← 权限名 → GID 映射表
  <permission name="android.permission.INTERNET">
      <group gid="inet" />                     ← "inet" 这个名字
  </permission>
        │  Process.getGidForName("inet")
        ▼
AID_INET = 3003                                ← 数字 GID
        │  存入 Permission.mGids
        ▼
授权判定(normal → 安装即 granted)→ UidPermissionState.computeGids()
        │  getGidsForUid()
        ▼
进程启动 ProcessList.startProcess()
        │  pm.getPackageGids() → computeGidsForProcess()
        ▼
zygote fork + "--setgroups=...,3003,..." "--setgid=..."
        │  native SpecializeCommon → setgroups(2)
        ▼
app 进程携带 supplementary group: inet(3003)
        │
        ▼
内核 inet_create() / inet6_create()
  current_has_network() = in_egroup_p(AID_INET) || capable(CAP_NET_RAW)
  不满足 → return -EACCES

其他更多framework系统车机收开发面试题,入门到精通学习资料:
Android Framework开发rom实战合集课表/车载车机手机高级系统开发工程必会技能

微服务对接托管Kafka的平台契约实践指南 微服务架构中,消息中间件是实现服务解耦与异步通信的核心基础设施。Kafka作为主流分布式消息系统,其托管服务(Managed Kafka)在云原生环境(如App Platform)中提供高可用、免运维的消息能力,但并非简单替换自建集群——它本质是一套由网络策略、认证机制、配置约束和可观测性定义的平台契约。理解这一契约,是保障Producer稳定发送、Consumer可靠消费、事件语义准确传递的前提。本文聚焦微服务与托管Kafka协同落地的关键路径:从SSL/TLS安全连接、SASL认证适配(PLAIN/OA 阅读详情

相关推荐

AI Agent选型不是技术比拼,而是系统工程决策

AI Agent本质上是将用户意图转化为结构化业务动作的智能调度系统,其核心原理在于状态编排(如OpenClaw的YAML状态图)与意图图谱(如LangGraph的DAG节点流)两种范式的选择。技术价值不在于框架‘多先进’,而在于能否匹配真实约束:API契约完备性、团队工程能力、云原生运维水位及LLM调用成本可控性。典型应用场景包括微信智能体、电商售后自动化、社媒内容生成等需长期运行、高可靠响应的企业级服务。本文聚焦OpenClaw与LangGraph在生产环境中的真实能力边界、集成代价与避坑路径,直击‘o

weixin_33841503的博客 393

操作系统实战手册:从HTTP请求到内核调度的全链路解析

操作系统是应用程序与硬件之间的核心中介,其本质在于管理CPU、内存、文件和进程四大资源。理解其原理需穿透抽象概念,聚焦虚拟地址映射、上下文切换、页表遍历、COW写时复制等底层机制。这些技术直接决定Redis延迟、Nginx吞吐、K8s节点稳定性及OOM Killer行为。掌握`strace`、`perf`、`eBPF`等工具链,结合`/proc`、`pagemap`、`task_struct`等内核接口,可将理论转化为真实故障排查能力。本文以Linux 5.15为基准,覆盖进程创建、内存管理、文件系统I/O

weixin_34326179的博客 290

阿里运维面试文档:一份被标题耽误的Java岗面经与JVM/GC追问链路

Java后端面试常围绕JVM内存结构、类加载机制与GC展开:运行时数据区划分、双亲委派模型、分代回收与对象晋升,是解释内存分配和定位Full GC的基础。掌握这些原理后,可用jstat、jmap把GC频率、堆分布和存活对象落到运维命令,也能理解Spring/Hibernate场景中HQL注入与XSS的边界。再向Linux换源、Maven镜像、云主机发布回滚等工程链路延伸,就形成从理论到部署的排查能力。阿里运维工程师面试文档看似运维题,实则串联Java岗面经、项目追问和自测复盘,适合候选人按链路验证掌握程度。

weixin_33882452的博客 199

Android与Linux启动过程深度解析:从BootROM到SystemUI全链路

启动过程是操作系统最底层的因果链,本质是硬件复位后控制权在BootROM、Bootloader、Kernel、init四层间的精确移交。理解这一机制,才能诊断黑屏、SSH无法连接、zygote崩溃等系统级故障。本文聚焦启动时序、关键断点(如AVB验证失败、initramfs挂载异常、system_server初始化超时)及跨层依赖(如content://URI可用性取决于zygote→PMS→init.rc配置),覆盖Android 12/13与主流Linux发行版(Ubuntu/CentOS)的启动差异,

weixin_34099526的博客 442

实验手册(灾难恢复)

我们发现DC1与DC2的复制出现问题,此时我们检查了在DC2中,DC1是否被正确注册。这里选择还原系统状态,因为我们原DC1上只备份了AD的数据,所以我们在新的这台服务器上还原的也是AD数据库。因为我们是单域下的测试,只测试了一个域,所以它会出现这样的报错。我们选择远程共享文件夹,我们备份的时候,是在备份这台服务器上的。同时删除SRV记录,A记录,NS记录,SOA记录,框框里面的所有有关dc1的记录全部删除。如果在企业中AD数据的备份是每周或者每月都会有一次备份,选择恢复AD数据库的时间。

weixin_52364868的博客 1310

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 497

OpenHarmony I2C通信实战:从物理层排障到HDF驱动全链路解析

I2C总线是一种多主从、两线制、带地址寻址的同步串行通信协议,其核心在于起始/停止信号、7位设备地址与应答机制构成的可靠事务模型。理解SCL/SDA电平特性、上拉电阻选型与总线电容限制,是保障100kHz/400kHz稳定通信的物理基础;而OpenHarmony通过HDF框架抽象I2C控制器,依赖设备树(DTS)精准描述硬件资源,并要求应用层严格遵循多消息组合(如先写地址后读数据)完成寄存器访问。本文聚焦I2C在OpenHarmony嵌入式开发中的真实落地场景——涵盖SHT30温湿度传感器、GT911触摸芯

weixin_33884611的博客 482

SCHUNK SVH五指灵巧手 | 熵洛智能

雄克仿真五指机械手产品系列可以如人手操作那般完美地完成抓取操作。电子装置完全集成于腕关节中,使五指机械手几乎可以完成所有的人体手部动作。凭借带有9个驱动器的运动指骨,机械手可高精度地 执行多种抓取操作。富有弹性的抓取表面确保了对物体的可靠抓取。除了开启抓取和操作任务的全新领域之外,雄克还为在五指机械手的手势基础上进行人与机器人的交流开创了无限可能。编辑切换为居中添加图片注释,不超过 140 字(可选)产品特点:机械手有左手或右手两种版本适合移动应用耗能低,使用 24 V DC 在腕关节处完整集成了控制、调节

ShannonTech的博客 1335

Android Visualizer 实战:把声音画出来

是系统提供的音频效果(AudioEffect)之一。它挂在音频链路上,,把数据回吐给你——画波形、画频谱、做响度表。

Android的专栏 310

人形机器人构成及成本估算(附报告)

这些执行器本身由螺杆、减速器、电机、传感器、滚珠轴承和编码器等组件构成。实现线性与旋转运动互转。人形机器人的运动系统可以由电驱动、液压驱动或气动驱动组成,但由于电驱动具有更高的精度和更快的响应速度,正在成为主流设计方案。执行器:NSK、THK、Harmonic Drive、Leaderdrive、Nidec、Moons。由螺杆、减速器、电机、传感器、轴承和编码器组成(如上为Tesla Optimus执行器设计示意)。传感器:Keyence、Robosense、Sensata、ATI、TE、Sony。

具身机器人和通用AI 1779

小秋SLAM入门实战ubuntu所有文章汇总

ubuntu 终端如何停止快速打印的输出以及恢复命令 ubuntu 终端如何快速打开当前路径下的图形化窗口界面? killall -9用途用法 ps -xu | grep这个命令的用途 linux 下 top命令显示的是内存是堆内存吗? zip分割和合并 关闭除当前 GNOME 终端窗口以外的所有其他 GNOME 终端窗口 如何在安装系统后设置短密码 【如何使用getrusage获取消耗的CPU时间和进程使用的最大物理内存】 【webots安装使用教程】 Linux系统下查看当前运行的进程和线程的几种方法

小秋 AI SLAM 入门实战教程 1406

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 341

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2463

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 206

科技英语/专业英语——改错总结【2】

1.固定句式 make it + adj + 句子 例:These features make the electronic systems difficult to intercept this kind of signal. 正确形式:These features make it  difficult for the electronic systems  to intercept

MISAYAONE的博客 1732

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1309

RK-RK3572-Android16- 编译打包优化-OTA整包-差分包打包

这里主要记录一下 RK3572 在Android16 上面进行OTA升级的整包和差分包制作经验的一个分享,整理知识点,方便后续自己和其它同事开发提高工作效率、直接使用。不管哪一个平台,MTK 也好、RK也好 基本上都是不同Android版本各个子系统之间还是有一点点区别的,所以有必要记录整理知识点,方便提高开发效率、生产效率。针对OTA升级问题 ,再一次说明还是要看官方提供的文档,按照文档来。

十年饮冰,难凉热血 196

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

安卓APK下载后安装全流程:从点击下载到第一次启动,每一步的检查点

这套流程听起来繁琐,但真正需要每次都做的只有来源核对和签名校验两步,其他都是出问题时才查。养成习惯之后,能挡掉绝大多数"装了垃圾包""装完闪退"的情况。如果要省事,直接用这类会标注包名、版本号和校验信息的站点,比在搜索结果里挨个试要稳得多。

qq362196705的专栏 161

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android Laya 与 Native Bridge:页面识别、双向通信、协议设计和崩溃定位

Laya 与 Native 通信的难点不在于某个或的写法,而在于边界:页面来源是否可信、协议是否明确、线程是否正确、请求是否幂等、页面是否仍然存在、日志是否能关联一次完整请求。建立这些边界后,才能把“页面白屏”“按钮无响应”“重复消息”和“Native 崩溃”拆成可验证的层次,并沿着真实调用链找到根因。

路在脚下,幸福在手中,莫贪!!!!! 165

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

BUUCTF-菜刀流量-MISC-学习笔记

从 1970-01-01 00:00:00 UTC 起算的秒数,——Wireshark 直接告诉你它回答的是谁;由表可知道,96帧返回了flag.rar。, 代表删除键,先删了4次,又删了1次。所以密码是:SuperMaster。解析128帧的响应,即133帧。所以这是一个标准抓包文件,用。解压压缩包拿到html代码。:选中 128 帧,展开。:128 和 131 的。能把一问一答放在一起看;是八进制(Oct)的数字。(或 TCP 层)看到。对比一下ASCii 码表。

晓梦林的博客 76

悬浮窗挡住 Android:agent 读到 0 个节点

我在做一个跑在 Android 上的 agent,叫 Andee。他没有常规主界面,也不用 Compose——整个应用就是一颗悬浮球挂在你屏幕上,点那颗球说话,他靠无障碍服务读屏幕、点按钮,替你把事办了。悬浮窗权限是他唯一「不给就完全不能用」的一项:球、字幕、设置面板、保险箱,全都是。写这篇,是因为「系统级 agent」这两天开始真往用户手机上推了。荣耀 MagicOS 11 从 11 月 6 日向 Magic V6、Magic8 系列推送,今天轮到 Magic V5、Magic7 系列;

qq_42960812的博客 215

Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解

DSH 官方没出安卓版,火的全是社区第三方移植。本文拆解真实卡点(glibc vs Bionic)、两种「App 内 Linux」的实现(PRoot 与 seccomp 容器),以及「真沙箱」的三层边界与衡量标准。

AI_Gump的博客 342

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 225

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 379

谷歌相机9.2下载(GCam 安卓通用版 安装与使用说明)

谷歌相机9.2版移植自Pixel原生相机,支持Camera2 API的Android 10+设备安装,凭借多帧合成技术在夜景、HDR+与人像模式表现优异。可提升暗光画质、优化动态范围与背景虚化效果,支持视频防抖及配置文件自定义。安装需确认机型兼容性,建议备份原相机,避免冲突。资源可通过kuake链接获取,仅限学习测试使用。

2611_96675819的博客 212

Android 开发入门实践(十):用 Kotlin 协程完成模拟加载、取消与异常处理

本文记录第118—125课对NewsApp的协程改造:从viewModelScope.launch启动协程,逐步加入delay模拟等待、suspend函数封装、withContext(Dispatchers.IO)切换线程并观察上下文恢复机制。通过日志验证withContext完成后恢复原执行上下文(非自动回主线程),纠正了初始理解偏差。引入Job管理任务,实现加载取消与重复点击防护,结合异常处理与状态管理,完成可观察、可中断的异步流程。

Easyhood的博客 411
上一篇: 分享安卓app转fw系统框架开发学习面试经验
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值