1.Android Adb 源码分析(一)
2.安利一个看 Android 源代码的源码阅读网站
3.Mobx源码阅读笔记——3. proxy 还是defineProperty,劫持对象行为的源码阅读两个方案
Android Adb 源码分析(一)
面对Android项目的调试困境,我们的源码阅读团队在项目临近量产阶段,将userdebug版本切换为了user版本,源码阅读并对selinux权限进行了调整。源码阅读然而,源码阅读问卷源码网这一转变却带来了大量的源码阅读bug,日志文件在/data/logs/目录下,源码阅读因为权限问题无法正常pull出来,源码阅读导致问题定位变得异常困难。源码阅读面对这一挑战,源码阅读我们尝试了两种解决方案。源码阅读
首先,源码阅读我们尝试修改data目录的源码阅读权限,使之成为system用户,源码阅读以期绕过权限限制,然而数据目录下的帝国视频源码logs文件仍保留了root权限,因此获取日志依然需要root权限,这并未解决问题。随后,我们找到了一个相对安全的解决办法——通过adb命令的后门机制,将获取root权限的命令修改为adb aaa.bbb.ccc.root。这一做法在一定程度上增加了后门的隐蔽性,避免了被窃取,同时对日常开发的影响也降至最低。
在解决这一问题的过程中,我们对Android ADB的相关知识有了更深入的理解。ADB是Android系统中用于调试的工具,它主要由三部分构成:adb client、adb service和adb daemon。其中,adb client运行于主机端,提供了命令接口;adb service作为一个后台进程,屏幕键盘源码位于主机端;adb daemon则是运行于设备端(实际机器或模拟器)的守护进程。这三个组件共同构成了ADB工具的完整框架,且它们的代码主要来源于system/core/adb目录,用户可以在此目录下找到adb及adbd的源代码。
为了实现解决方案二,我们对adb的代码进行了修改,并通过Android SDK进行编译。具体步骤包括在Windows环境下编译生成adb.exe,以及在设备端编译adbd服务。需要注意的是,在进行编译前,需要先建立Android的编译环境。经过对ADB各部分关系及源代码结构的梳理,我们对ADB有了更深入的理解。
在后续的开发过程中,我们将继续深入研究ADB代码,nginx源码包尤其是关于如何实现root权限的功能。如果大家觉得我们的分享有价值,欢迎关注我们的微信公众号“嵌入式Linux”,一起探索更多关于Android调试的技巧与知识。
安利一个看 Android 源代码的网站
在线浏览Android源代码的便利性对于开发者来说至关重要。过去,我们有两个主要选择:grepcode.com和androidxref.com。然而,随着Android系统的更新,grepcode.com已无法访问,而androidxref.com虽然提供了一定的便利,但在性能和稳定性方面存在局限。
在寻找替代方案时,我发现了两个新的网站:androidos.net.cn/和aosp.opersys.com/。它们提供了在线浏览源码的功能,但各有不足。linux cp源码androidos.net.cn/并未提供交叉索引,对我用处不大;而aosp.opersys.com/虽然提供了交叉索引和变化日志,但经常宕机,访问速度也不理想。
面对工作需求和效率问题,我决定自己开发一个网站——aospxref.com。这个网站不仅具备与androidxref.com相同的源码浏览和交叉索引功能,还有额外的优点。它为开发者提供了一个更加稳定、快速的在线浏览源代码的平台。访问网站,体验革新,提升您的工作效率。
如果您对加入与Android相关的项目感兴趣,可以发送邮件至twsxtd@gmail.com,欢迎您的加入!让aospxref.com成为您工作中不可或缺的工具。我们致力于提供最好的服务,期待与您共同成长。
Mobx源码阅读笔记——3. proxy 还是defineProperty,劫持对象行为的两个方案
这篇文章将深入分析 MobX 的 observableObject 数据类型的源码,同时探讨使用 Proxy 和 Object.defineProperty 这两种实现方案来劫持对象行为的策略。通过分析,我们能够理解 MobX 在创建 observableObject 时是如何同时采用这两种方案,并在创建时决定使用哪一种。
首先,回顾 observableArray 的实现方式,通过 Proxy 代理数组的行为,转发给 ObservableArrayAdministration 来实现响应式修改的逻辑。同样,我们已经讨论过 observableValue 的实现,通过一个特殊的类 ObservableValue 直接使用其方法,无需代理。
对于 observableObject 的实现机制,其特点在于同时采用了上述两种方案,并且在创建时决定使用哪一种。让我们回到文章中提到的工厂方法,其中根据 options.proxy 的值来决定使用哪一种方案。
在 options.proxy 为 false 的情况下,使用第一条路径来实现 observableObject。这通过直接返回 extendObservable 的结果,其中 extendObservable 是一个工具函数,用于向已存在的目标对象添加 observable 属性。属性映射中的所有键值对都会导致目标上生成新的 observable 属性,并且属性映射中的任意 getters 会被转化为计算属性。
这里首先根据 options 参数选择特定的 decorator,这个过程与之前在第一篇文章中通过 options 参数选择特定的 enhancer 类似。实际上,这里的 decorator 起到了类似的作用,甚至在创建 decorator 这个过程本身也需要通过 enhancer 参数。
至于 decorator 和 enhancer 之间的耦合机制,文章中详细解释了 createDecoratorForEnhancer 和 createPropDecorator 函数,通过这些函数我们能够了解到它们是如何将 decorator 和 enhancer 联系起来的。
接下来,文章深入分析了 decorator 的作用机制,包括它如何决定是否立即执行,以及在不立即执行时如何将创建 prop 的相关信息保存下来。通过 initializeInstance 函数,我们了解了如何解决 # 问题,这涉及到如何正确处理那些在创建时未被立即执行的 prop。
最终,通过为 target 对象创建 ObservableObjectAdministration 管理对象,并通过 $mobx 和 target 属性将它们关联起来,我们完成了 observableObject 的创建。如果传入的 properties 不为空,则使用 extendObservableObjectWithProperties 来初始化。这里的代码逻辑相对简单,主要遍历 properties 中的所有键并调用对应的 decorator。
文章还指出,虽然在第一条路径中,使用 Object.defineProperty 重写了 prop 的 getter 和 setter,但在 MobX 4 及以下版本中,使用 Proxy 来实现 observableObject 的逻辑更为常见。Proxy 特性在 ES6 引入后,提供了更强大的能力来劫持对象的行为,不仅限于 getter 和 setter,还包括对象的其他行为。
最后,文章总结了使用 Proxy 方案的优点,包括能够更全面地劫持对象的行为,而不仅仅是属性的 getter 和 setter。Proxy 方案在实现双向绑定时,能够提供更灵活和强大的功能。同时,文章也提到了两种方案的局限性,尤其是在处理对象属性的可观察性方面,Proxy 方案在某些情况下可能更具优势。
2024-11-30 07:09
2024-11-30 06:45
2024-11-30 06:30
2024-11-30 06:08
2024-11-30 05:19
2024-11-30 05:14