全面认识Android手机(MIUI ROM适配之旅第四天——移植MIUI Framework)

Android系统移植:驱动篇 【导语】在Android系统移植中,有很重要的一个部分工作,就是为新平台上的硬件设备移植驱动程序。因为Android系统是基于Linux kernel内核构建,所以这里说的移植驱动程序,其实就是基于Android系统平台开发适应移动设备的Linux内核驱动程序。 一. Android系统中Linux内核与设备驱动Android系统中使用了Linux内核作为自己的操作系统,除了linux的通用代码之外 阅读详情
1. 为什么使用代码插桩

    首先我们来回顾第一章中的Android软件架构图,这个图中框架层的代码完全是由Java语言编写的,对于这两层的代码,在没有源代码的情况下我们可以采取代码插桩的方式来注入我们的代码。但是对于下面几层的代码几乎都是以机器码的形式存在,机器码也是可以修改的,但是修改难度和修改smali代码的难度不可同日而语。我们这个系列的文章不介绍如何修改这些机器码,大家有兴趣的可以参考网上的相关资料。MIUI是基于源码开发的,为了提升整个效率,我们会修改下面几层的代码,比如说我们修改了dalvik虚拟机,skia绘图库等。幸好这些修改不多而且有些是为了提升性能的,不影响MIUI的整体功能。MIUI的绝大部分修改都是对框架层和核心应用层,这样保证了我们在原厂ROM的基础上修改这两个层的代码达到移植MIUI的目的。
   
    大家看到这里可能有一个疑问,我们直接替换原厂ROM框架层和核心应用层这两层的代码不就得了。不行,因为各个层次之间是有管理的,框架层和下层代码的一些调用接口是各个厂家自己扩展的,简单的整个替换MIUI框架层和核心应用层的代码无法工作。

2. 方法概述

    这一章介绍MIUI框架层的移植,其实主要是修改system/framework目录下的三个文件:framework.jar, android.policy.jar和services.jar。这3个文件是Android系统的核心:framework.jar提供了应用层调用的各种API的实现,android.policy.jar提供了锁屏的实现以及手机窗口管理策略的实现。services.jar是一些核心服务Java层的实现,比如ActivityManagerService, PackageManagerService等,这些服务大都运行在system_server进程中。
   
    我们目前2.3的代码是基于google发布的android 2.3.7源代码开发的,大家下载附件中的压缩包打开后的目录结构为:
    porting-miui/
        |-----------------android
                       |------------framework.jar
                       |------------services.jar
                       |------------android.policy.jar
        |------------------miui
                      |----------framework.jar
                      |----------services.jar
                      |----------android.policy.jar
                      |-----------framework-res/
                      |-----------framework-miui-res.apk
    其中android目录中的这三个文件是从google发布的android2.3.7源代码编译而来的,
而miui目录中的这三个文件则是我们在android2.3.7源代码基础上修改后的代码编译而来的。这样我们可以先反编译这些文件,找出反编译后的差别之处,然后将这些差别之处应用到原厂ROM的这三个文件中。听起来是不是和Linux下的patch过程很相似,是的,确实相似,只不过通常的patch是基于源代码的,然后解决一些冲突。而我们是基于smali代码,然后解决一些冲突。(解决冲突现在可能不太明白,没关系,下面会有例子)。

3. 移植资源

    在上一节中miui目录下的framework-res目录和framework-miui-res.apk这两个是和移植资源相关的。framework-res目录下是我们对系统资源所做的修改即/system/framework/framework-res.apk的修改,大家可以反编译framework-res.apk,将这些修改合到framework-res中,然后再编译回去,这个比较简单,不多做介绍。

    framework-miui-res.apk是miui的资源包,所有的miui app都会用到它。这个资源包也需要放在/system/framework/目录中,在原厂ROM中,大家一般在/system/framework目录下除了framework-res.apk,也会发现一些其它的xxx-res.apk。为了针对这种情况,miui的资源ID都是以0x03开头的,一般的原厂ROM是2个资源包,framework-res.apk的资源ID是以0x01开头的,另外一个资源包以0x02开头。但是我们发现国行的defy比较变态,这个目录下有3个资源包,因此针对defy我们得特殊处理。所以如果你所移植的机型这个目录下不止两个资源包的话,需要和我们联系。未来我们会考虑MIUI的资源ID都以0x06开头,我们相信应该没有哪个原厂ROM变态到有5个资源包。

4. 修改smali

    这一章我们重点介绍如何修改原厂ROM的smali将MIUI的修改应用到上面去。我们不会将所有的修改都会在文中列出,挑选几个有代表性的讲解,剩下的大家可以自己去做。我们以i9100为例讲述如何修改。在第二篇准备工作中,我们给出了i9100国行ROM的下载链接,并且讨论了如何在这个ROM的基础上做deodex。为了方便起见,我们把i9100原厂ROM做个deodex后的framework.jar,services.jar和android.policy.jar也放在了附件中。

4.1 比较差异
    这里的比较差异包含两个部分:比较miui和原生android的差异,比较i9100和原生android的差异。
    以framework.jar为例,首先可以建3个目录反汇编这3个jar包:
    apktool d framework.jar
    执行完毕后,会产生framework.jar.out目录。
   
    接下来使用附件中的脚本rmline.sh运行如下命令:
    ./rmline.sh framework.jar.out
    rmline.sh是用以把smali所有以.line开头的行去掉,这样我们容易比较smali代码上的差别。但是对于所移植的机型,请先复制一份为去掉.line的framework.jar.out版本,因为这些对调试很重要,我们能通过adb logcat报告的错误信息中去定位在哪一行。
   
    接下来用大家说熟悉的文件比较工具来比较差异,Linux下推荐meld, Windows下推荐Beyond Compare。
   
    用meld比较miui和原生android的区别,大家可以看到有很多新增的Miui开头的类,和一个新增的miui目录,这些新增的文件和目录我们直接拷到i9100的framework.jar.out中对应的目录中即可(使用有.line的版本)。为什么我们不把这些新增的类组织在一个单独的jar包中呢(请大家思考一下这个问题)。

    不比较那些相同的和新加的,我们只比较修改过的文件,在附件中有一个change-list文件,其中列出了我们修改过的文件,你会发现和这个比较结果有一点不符,如果你比较那些文件,会发现只是一些微小的差异(比如说nop这种空指令),这是由于apktool反编译导致的。我们无需关心,我们只需要比较那些我们修改过的文件。
   
    下面我们就开始修改smali文件了,我将这些修改分成3种情况,选择有代表性的3个文件加以介绍,这3种情况难度依次增加。

4.2 直接替换

    以ActivityThread.smali为例,比较发现miui改了其中一个方法getTopLevelResources,而i9100和原生android的实现完全一样,这种情形是最简单也是最happy的,我们改的地方要适配的机型原厂ROM完全没有修改,直接替换就可以了。

4.3 线性代码

    还是以ActivityThread.smali为例,对于这个文件,miui一共改了两个方法,一个是上面介绍的,另一个是applyConfigurationToResourcesLocked。通过比较得知,miui修改了这个方法,i9100也修改了这个方法。怎么办呢,我们先分析一下miui修改的代码:
     .method final applyConfigurationToResourcesLocked(Landroid/content/res/Configuration;)Z

        invoke-virtual {v5, p1}, Landroid/content/res/Configuration;->updateFrom(Landroid/content/res/Configuration;)I
        move-result v0
       .local v0, changes:I
       invoke-static {v0}, Landroid/app/MiuiThemeHelper;->handleExtraConfigurationChanges(I)V
        invoke-virtual {p0, v7}, Landroid/app/ActivityThread;->getDisplayMetricsLocked(Z)Landroid/util/DisplayMetrics;
        move-result-object v1
        .local v1, dm:Landroid/util/DisplayMetrics;

    在上面将miui增加的代码用红色标出,在讲述之前,先解释一下smali代码的一些规律:
所有的局部变量用v开头,方法的顶部.locals 8表示这个方法使用8个局部变量。所有的参数用p开头,局部变量和参数都是从0开始编号。对于非静态方法来说,p0就是对象本身的引用,即this指针。
   
    这里miui新增了一个静态方法调用,对于这种顺序执行的一段代码,我们称之为线性代码。这个例子比较简单,只新增了一个静态方法调用。线性代码的特点是只有一个入口和一个出口,在编译器的术语这叫做基本块。对于这种新增的代码,我们找出它的上下文,即修改的代码前后的操作。然后在i9100的该方法的smali代码中找到相应的位置,把这个修改应用到i9100中去。这种修改也相对简单,插入代码的相应位置比较好定位。

4.4 条件判断

    这种情况指的是miui插入的代码并不是一个线性代码,而是有条件判断的。我们以Resources.smali为例,miui修改了其中的loadDrawable方法,修改后的结果如下:

    .method loadDrawable(Landroid/util/TypedValue;I)Landroid/graphics/drawable/Drawable;
        .end local v8           #e:Ljava/lang/Exception;
        .end local v13          #rnf:Landroid/content/res/Resources$NotFoundException;
        :cond_6

         invoke-virtual/range {p0 .. p2},
        Landroid/content/res/Resources;->loadOverlayDrawable(Landroid/util/TypedValue;I)Landroid/graphics/drawable/Drawable;
        move-result-object v6
        if-nez v6, :cond_1

       :try_start_1
       move-object/from16 v0, p0

    红色代码是miui插入的代码,我们再看一下i9100相对于原生android对这个方法的改动,发现改动非常大。这种情况怎么办呢,这种情况下的关键是找到所插入代码的入口点和出口点(即这段代码是从哪执行而来的,执行完毕后又往哪去开始执行代码)。
   
    首先,我们发现插入代码的前面是一个标号:cond_6,这说明程序中应该有一个跳转语句跳转到这个标号:cond_6。而且这种程序应该也可以从:cond_6上面的语句顺序执行而来(即它可能有两个入口点),我们分别去找这两个入口点的代码。首先我们去找哪个语句使用了:cond_6,找到如下代码:
    const-string v15, ".xml"
    invoke-virtual {v9, v15}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
    move-result v15
    if-eqz v15, :cond_6

    可以发现这段代码是在判断v9这个字符串是否以".xml"结尾,如果不是的话,跳转到:cond_6。好,我们去i9100中找到对应的代码逻辑。对于这个例子,我们完全可以以".xml"作为一个关键字去i9100的loadDrawable方法中搜索一下,定位到如下代码:
    const-string v17, ".xml"
    move-object v0, v10
    move-object/from16 v1, v17
    invoke-virtual {v0, v1}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
    move-result v17
    if-eqz v17, :cond_b
这段代码的逻辑和我们在miui中找到的代码一样,看来,我们应该把miui插入的代码插入到:cond_b之后。找到i9100代码中的:cond_b之后,我们看看这条代码后面的代码,发现和我们插入的代码后面的代码基本类似,这下可以确定miui新插入的代码应该放在:cond_b之后了。

    再来看看出口点,miui插入的代码有两个出口点(是一个条件判断),
    if-nez v6, :cond_1
如果v6为空往下执行,如果不为空,则跳转到:cond_1,好,我们来看看:cond_1的代码是在干嘛?:cond_1的代码如下:
   :cond_1
   :goto_1
   if-eqz v6, :cond_2
   move-object/from16 v0, p1
   iget v0, v0, Landroid/util/TypedValue;->changingConfigurations:I

    我们在i9100中发现了一段类似的代码:
    :cond_1
    :goto_1
    if-eqz v7, :cond_2
    move-object/from16 v0, p1
    iget v0, v0, Landroid/util/TypedValue;->changingConfigurations:I

只不过是v6变成了v7,说明这段代码检测v7的值,因此我们需要将我们插入的代码改为:
    invoke-virtual/range {p0 .. p2},
    Landroid/content/res/Resources;->loadOverlayDrawable(Landroid/util/TypedValue;I)Landroid/graphics/drawable/Drawable;
    move-result-object v7
    if-nez v7, :cond_1

4.5 内部类

    在这一节的最后我们来介绍一下内部类。对于Java文件中的每一个内部类,都会产生一个单独的smali文件,比如ActivityThread$1.smali,这些文件的命名规范是如果是匿名类,外部类+$+数字。否则的话是外部类+$+内部类的名字。
   
    当在内部类中调用外部类的私有方法时,编译器会自动合成一个静态函数。比如下面这个类:
public class Hello {
    public class A {
        void func() {
            setup();
        }
    }
    private void setup() {
    }
}
我们在内部类A的func方法中调用了外部类的setup方法,最终编译的smali代码为:
Hello$A.smali文件代码片段:
# virtual methods
.method func()V
    .locals 1

    .prologue
    .line 5
    iget-object v0, p0, LHello$A;->this$0:LHello;

    #calls: LHello;->setup()V
    invoke-static {v0}, LHello;->access$000(LHello;)V

    .line 6
    return-void
.end method

Hello.smali代码片段:
.method static synthetic access$000(LHello;)V
    .locals 0
    .parameter

    .prologue
    .line 1
    invoke-direct {p0}, LHello;->setup()V

    return-void
.end method
可以看到,编译器自动合成了一个access$000方法,假如当我们在一个较复杂的内部类中加入了一个对外部类私有方法的调用,虽然只是导致新合成了一个方法,但是这些合成的方法名可能都会有变化,这样的结果就是smali文件差异较大,这个时候需要仔细分析,找到调用的私有方法。然后给合成的方法选取一个未被使用的名字。

5. 建议
    最后想对修改smali代码给出一些建议:
    (1) 细心,仔细的定位插入代码在相应机型代码中的插入位置。
    (2) 要注意局部变量序号的改变。
    (3) 不要一次修改完所有的文件再用apktool重新编译,如果插入代码有错误,会无法编译。但是apktool的编译出错信息是天书,你无从知道是哪个文件改错了。
    (4) 出现错误不要紧,检查adb logcat的错误信息,找出错误发生的原因。

修改smali代码没那么难,多实践一定会掌握相应的技巧。

hook_smail.apk


全面认识Android手机(MIUI ROM适配之旅第四天——移植MIUI Framework 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。 阅读详情

相关推荐

全面认识Android手机(MIUI ROM适配之旅第四天——移植MIUI Framework)(1)

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套,我把技术点整理成了(实际上比预期多花了不少精力),包。还有帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2401_84558498的博客 1316

Smali语法详解

smali文件格式 每个smali文件都由若干条语句组成,所有的语句都遵循着一套语法规则。在smali 文件的头3 行描述了当前类的一些信息,格式如下: [java] view plaincopy .class  [ 修饰关键字]   .super   .source    打开MainActivity.smali 文件,头3 行代码如下: [java]

lostinai的专栏 3万+

全面认识Android手机(MIUI ROM适配之旅第四天——移植MIUI Framework)(2)

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84558498的博客 767

静态分析android程序之阅读smali代码

0x01 前言 静态分析是探索 Android 程序内幕的一种最常见方法,与动态调试一起,能帮助分析人员解决分析时遇到的各类问题 0x02 简介 静态分析(Static Analysis):在不运行代码的情况下,用词法分析、语法分析等技术手段对程序文件扫描,生成反汇编代码,通过阅读反汇编代码掌握程序功能的一种技术。 然而在实际分析上,想要完全不运行程序是不太可能,通常是要先运行目标程序,从中寻找程序的突破口 生成反汇编代码的工具称反汇编工具或反编译工具,工具越强大,反汇编效果越好,能

HongYu012的博客 4863

ROM定制与开发-ROM系统结构和分区解析

系统结构 META-INF 这里面主要是卡刷包的签名文名和刷机时执行的脚本(updater-script),移植时,我们主要要更改的就是刷机的脚本。 system 这里面就是android的系统部分 app这里存放的是系统的app,每个app都有两个文件,一个*.apk,一个*.odex,我们在移植时,要将这个文件合并到对应的*.apk里面去,apk文件其实就是一个zi...

X神之怒的博客 881

Android ROM解包打包工程化实践:从AVB签名到super分区

ROM解包与打包是Android固件开发的核心基础能力,其本质是遵循AOSP规范对sparse、br、ext4等二进制镜像格式的精准解析与重构。原理层面涉及AVB2.0签名验证、dynamic partition布局解析、Brotli/LZ4压缩解码及SELinux策略兼容性控制;技术价值在于实现可重复、可审计、零人工干预的定制ROM量产流程;典型应用场景包括旧机续命、ODM批量出货和LineageOS适配——尤其在Android 12+系统中,super分区与vbmeta签名链成为绕不开的硬性门槛。本文聚

weixin_34199405的博客 445

[ROM] 【技术帖】MIUI移植的简单方法 [转载]

[ROM] 【技术帖】MIUI移植的简单方法 [转载] 此教程仅介绍如何移植MIUI,原理方面的东西不会涉及太多,主要是因为我对原理方面的东西也不是很懂,怕误导了大家。 我以移植MIUI到Incredible为例子: 接下来我们正式讲如何移植MIUI。Android的ROM都是一个经过签名的zip包,我们看一下这个zip包的格式: 目录结构应该在很多地方都有介绍过,为了完整性,我还是简单地...

天马行空 2万+

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

简单教教大家如何移植MIUI。(仅供参考)!!!

此教程仅介绍如何移植MIUI,原理方面的东西不会涉及太多,主要是因为我对原理方面的东西也不是很懂,怕误导了大家。 我以移植MIUI到Incredible为例子: 接下来我们正式讲如何移植MIUI。Android的ROM都是一个经过签名的zip包,我们看一下这个zip包的格式: 目录结构应该在很多地方都有介绍过,为了完整性,我还是简单地介绍一下: META-I

7074

远程桌面报‘数据加密错误‘?可能是网卡设置惹的祸(附TCP校验关闭教程)

本文深入分析远程桌面连接中出现的'数据加密错误'问题,指出网卡设置可能是根本原因,并提供详细的TCP校验关闭教程。通过禁用网卡高级属性中的'TCP校验和IPv4'与'IPv4承载卸载'功能,可有效解决RDP协议与硬件加速的兼容性问题,适用于Windows和Linux系统。

view3的博客 276

图形引擎实战:镭射效果制作分享

该方案的优势1.遵循物理的2.可以使用少量的参数去调控镭射的效果。计算相对简单,缺点仍是颜色不能够自定义,还有一种常见的方案是采样一张镭射贴图来模拟,好处是颜色可以自定义同时性能上还很高效没有复杂的公式计算。我查阅了网上普遍的方案,常见的做法是制作一个Ramp图生成工具,然后将生成好的ramp图赋给材质。这两个方案的好处是美术同学可以手动的去控制镭射的颜色。最后就是Shader中对Ramp图的采样的部分,Ramp图的UV坐标是使用fresnel作为Ramp的U轴坐标,0.5作为V轴坐标。

qq_41166022的博客 1350

MIUI ROM适配之旅第四天——移植MIUI Framework

为什么使用代码插桩首先我们来回顾第一章中的Android软件架构图,这个图中框架层的代码完全是由Java语言编写的,对于这两层的代码,在没有源代码的情况下我们可以采取代码插桩的方式来注入我们的代码。但是对于下面几层的代码几乎都是以机器码的形式存在,机器码也是可以修改的,但是修改难度和修改smali代码的难度不可同日而语。我们这个系列的文章不介绍如何修改这些机器码,大家有兴趣的可以参考网上的相关资料。

Andisier的博客 1819

写一个b站爬虫(思路)

part 0 安装 scrapy, requests part 1 信息获取 打开番剧索引链接(https://www.bilibili.com/anime/index/) F12控制台,选中NETWORK,来到xhr文件,我们可以找到了存放番剧json的地方

kou的博客 484

Android ROM定制 入门到精通(含改机、移植、破解网络层、root原理、植入hook框架,反安全监测等)

最近在定制一款ROM,拉取谷歌源码,解包、精简、修改、打包。想要实现MIUI一样的效果和国人常用的功能设置和手势。 在这个过程中遇到了很多疑难问题,也发现公司刚招来的这些小孩基础太差,而且他们根本不知道去哪学习,怎么学习,学点啥才能编译ROM。我查了一下相关资料确实太少。系统点的书也是2011出版的,太古老了,这些年真正深入到系统层,framework层开发的人太少,但是随着市场淘汰了大批的技术...

hao_qi 1万+

Linux系统安装AutoDockTools、AutoGrid和AutoDock并实现分子对接(详细讲解)

linux系统为centos7.0 按照下面操作安装AutoDockTools(MGLTools) 1. 下载安装包,链接(https://ccsb.scripps.edu/mgltools/downloads/),我的linux系统是64位,下载红色标记源代码,拷贝入linux目标文件夹下。 2. shell终端进行安装: 1. 终端进入安装包所在文件夹,并获取root权限;赋予代码安装权限; cd /home/... #目标文件夹,根据目标程序文件位置进行更改 su #获

carlos_zhao的博客 1万+

42页Claude 3技术报告解读(Opus, Sonnet, Haiku)

在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。

具身机器人和通用AI 2432

MIUI ROM适配之旅第一天——认识Android手机2

3. system分区     在讲system分区之前,我们先来看下面这张Android的软件系统架构图。       从上到下依次为:     核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。     框架层:这一层是Android系统的核心,它提供了整个Android系统运作的机制,像窗口管理,

Amao_come_on 的专栏 958

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈

小哥谈 2496

(转)认识Android手机--来自MIUI[

MIUI今天开始发布MIUI ROM的适配教程,这是第一篇,概述Android的分区与架构,个人认为对理解Android有帮助,故转帖。 原帖地址 :http://www.miui.com/thread-402322-1-1.html http://www.miui.com/thread-402302-1-1.html 大家好,欢迎来到MIUI ROM适配之旅。在开始我们的旅程之前,先介

J.Li 的专栏 1036

某手短视频用户主页视频列表爬虫实战:从原理到完整实现

随着短视频平台的迅猛发展,某手(为保护平台隐私,本文以“某手”代指实际目标)已经成为国内最大的短视频社交平台之一,拥有数亿日活用户。对于数据分析师、内容创作者和市场营销人员而言,获取某个用户主页的视频列表具有重要的研究价值——无论是分析头部创作者的内容策略,还是监测竞品的发布频率与互动数据,爬虫技术都成为不可或缺的工具。然而,在2024-2025年的技术环境下,某手已经构建了多层次的反爬机制:包括接口签名加密、请求参数动态混淆、设备指纹检测、IP行为分析以及Web端无限滚动加载的异步数据获取方式。

2201_76125261的博客 539

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓系统从底层架构到开发适配全面解析

安卓系统基于Linux内核与Binder通信机制构建,通过HAL层屏蔽硬件差异,形成从内核到应用的五层体系。随着版本演进,分区存储、动态权限、前台服务类型等限制不断收紧,开发者需要理解系统行为变化才能避免适配陷阱。同时,国产ROM的深度定制带来了后台调度、推送通道等方面的额外差异。掌握版本演进规律、架构分层逻辑和本地化兼容策略,是移动开发者和系统工程师高效完成多版本适配、提升应用稳定性的关键出发点。本文围绕这些核心机制与工程实践展开,提供系统性的认知框架和可落地的排查方法。

weixin_33843947的博客 1577

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 全面认识Android手机(MIUI ROM适配之旅第三天——反编译)
下一篇: 在android C/C++ native编程(ndk)中使用logCat
andy_android
博客等级 码龄15年 278粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值