duangsuse::Echo
https://zhuanlan.zhihu.com/p/604608272 #plt #js #py 最近在写一个h5和js插件的扒谱工具.. 因为想自动化,接入一些pip上乃至阿里云讯飞云的AI多媒体工具,相当耗时间,恐怕得个把月了 此插件使用h5文件写入、webext、web/原生互通讯等接口。各种接口、多进程缓解ai模型加载慢不是问题, 阿里讯飞等识别结果的不一致倒挺浪费精力的😂 也是无语,难的反而比简单的容易..
以上任务栈应该是1月1日 ,我花1k RMB买到 SynthV+煊宇 开始的,“恍如隔世”。
期间好像也就写了5个能用的脚本
#statement
但其实,我对编程的习惯,并没有发生根本上的变质
硬要说,从minbase64(我的第一个java AIDE应用) 开始,我的编程理念就是“不折腾 只探索”
只要有“偷懒”的可能性,就不会认真持续单个项目。究极目标是以0作1
用0门槛,实现高门槛的技术
https://t.me/dsuse/18091
就像我说的,
复杂只代表不成熟和懒于反省代码
编程语言不是技术, 它是细化「软件说明书」的母语
优雅的代码一定是好用、直观的
期间好像也就写了5个能用的脚本
#statement
但其实,我对编程的习惯,并没有发生根本上的变质
硬要说,从minbase64(我的第一个java AIDE应用) 开始,我的编程理念就是“不折腾 只探索”
只要有“偷懒”的可能性,就不会认真持续单个项目。究极目标是以0作1
用0门槛,实现高门槛的技术
https://t.me/dsuse/18091
就像我说的,
复杂只代表不成熟和懒于反省代码
编程语言不是技术, 它是细化「软件说明书」的母语
优雅的代码一定是好用、直观的
Telegram
duangsuse::Echo
#code https://jsbin.com/yihulozeya/1/edit?js,output
排序算法,但是支持“顺序自定义” 😂 3年前有人说逻辑上无法完成
曾经撕逼的2个设计点,变成编程的动力。
嗯.. 现在的我,能理解 #android 开发者为什么对逆向那么生气 像 https://t.me/dsuse/10855
我是开源主义者,而现在的我更是轻代码重效果的信徒, 所以观念上并不认可 drakeet 封闭拒绝[技术]的态度。
从道德上,逆向工程是不对的,即便一些中国人用逆向来创作/AOP。…
排序算法,但是支持“顺序自定义” 😂 3年前有人说逻辑上无法完成
曾经撕逼的2个设计点,变成编程的动力。
嗯.. 现在的我,能理解 #android 开发者为什么对逆向那么生气 像 https://t.me/dsuse/10855
我是开源主义者,而现在的我更是轻代码重效果的信徒, 所以观念上并不认可 drakeet 封闭拒绝[技术]的态度。
从道德上,逆向工程是不对的,即便一些中国人用逆向来创作/AOP。…
#py https://t.me/NewlearnerChannel/11287
Plumbum CLI - 强大的命令行解析器
import attrs @define class 拥有更好的默认配置
https://huggingface.co/spaces/DragGan/DragGan
https://github.com/threestudio-project/threestudio
rembg 使用U2Net
#android #dalao #tw Eric Li
Plumbum CLI - 强大的命令行解析器
import attrs @define class 拥有更好的默认配置
https://huggingface.co/spaces/DragGan/DragGan
https://github.com/threestudio-project/threestudio
rembg 使用U2Net
#android #dalao #tw Eric Li
import importlib; print(importlib.util.MAGIC_NUMBER)
实际会报错,只因util是“模块”..Telegram
Newlearnerの自留地
#Python潮流周刊 #Newsletter
Python潮流周刊#9:如何在本地部署开源大语言模型?
🦄 文章&教程
本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama (英)
Python Asyncio 协程对象开销成本
如何使用 asyncio.Runner 执行多个协程 (英)
不使用锁的并发实现 (英)
贡献 CPython 日记 (3) CPython 是如何运行的
Python JIT 编译器 - 即时编译 (英)
CPython、Pypy、…
Python潮流周刊#9:如何在本地部署开源大语言模型?
🦄 文章&教程
本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama (英)
Python Asyncio 协程对象开销成本
如何使用 asyncio.Runner 执行多个协程 (英)
不使用锁的并发实现 (英)
贡献 CPython 日记 (3) CPython 是如何运行的
Python JIT 编译器 - 即时编译 (英)
CPython、Pypy、…
duangsuse::Echo
最近几天工作效率为0, 也是因为 #TODO 的项目结构导致 😔: PRR 是递归的正则解析器,用来读写 json,css,lua java 等语法树、class,wav 等二进制,乃至py和自定义运算符 ISON 是类于JSON的标记语言,但它的序列化关于“一个对象”,对其调用或赋值; 用来实验和js的 RPC- FFI jsju 是绝句编程语言的弱类型解释器,可以用“很新”的这一版语法支持写出js的语义,比如 #android 的剪贴板共享 linuxcon 是代码博文的文化节,包括 badapple(包括在tty操控X11)…
#js #zhihu #tiktok Svelte 噗,连个
bitflags 都没用过才会觉得mask 很高深
我真是醉了, 怎么这些前端都喜欢整得好像 CG 或 #algorithm 领域很牛逼,而觉得自己对render的理解比 Chromium 项目实现的 DOM 还深
16ms 检查每个组件是否要重绘?(Monaco) 用translateY实现scroll ? 那要
BooleanArray
转 Int(32 -1符号位)
都能讲一整页,跟个Moshi似的bitflags 都没用过才会觉得mask 很高深
我真是醉了, 怎么这些前端都喜欢整得好像 CG 或 #algorithm 领域很牛逼,而觉得自己对render的理解比 Chromium 项目实现的 DOM 还深
16ms 检查每个组件是否要重绘?(Monaco) 用translateY实现scroll ? 那要
setInterval()
这些浏览器主循环干啥?要Blink干啥? 真希望这些H5框架早日步 #android 的后尘(虽然它们的API没有很复杂)知乎专栏
新兴前端框架 Svelte 从入门到原理
在这篇文章中,我们将会介绍 Svelte 框架的特性、优缺点和底层原理。 本文尽量不会涉及 Svelte 的语法,大家可以放心食用。因为 Svelte 的语法极其简单,而且官方教程学习曲线平缓https://www.sveltejs.cn/,相信…
Forwarded from duangsuse
#android IPC机制
ContentProvider增删改的底层是 Binder(RPC调用) 的参数,
好的,我尝试用列表的形式来条理化这个过程:
app获取 CP
AMS 充当中间人,(拉起进程,若已启动但未缓存则仍 scheduleInstallProvider):
请求 Provider 回调,存到 ContentProviderRecord,让app线程停止sleep并创建 interface Provider (的Proxy)
它用Binder转发call()给
总结:幸好我学的是DOM,py,cFFI 请求模型而不是java,不然世界观都被 android.xx 带崩塌了。没人想把Android当服务端来写,甚至服务端也越来越弱化,js化
心智模型不健康是设计不出易用的功能的,不愧是咕狗
#code 使用 makeRpc<接口InAIDL> 调用其他apk的函数
contentResolver.query(uri, projection, selection/*where*/,selectionArgs, sortOrder)
//C#LINQ的拙劣模仿者.. 不自动反序列化(Parcel-able)吗url=parse("content://demo权限/user"),会进行
resolver.acquireProvider("demo")?,较耗时:
ContentProvider增删改的底层是 Binder(RPC调用) 的参数,
CP.query(Uri(数据库等来源))
是Cursor表格迭代器,它指向共享内存里被塞入的媒体数据 CursorWindow.getInt
只是表格的共享内存实现。Binder使用ptrFD+size 来传递mmap(shared mem, <2MB)CP.call("add",Bundle)可调用对方
好的,我尝试用列表的形式来条理化这个过程:
app获取 CP
AMS 充当中间人,(拉起进程,若已启动但未缓存则仍 scheduleInstallProvider):
请求 Provider 回调,存到 ContentProviderRecord,让app线程停止sleep并创建 interface Provider (的Proxy)
它用Binder转发call()给
CP.Transport(: IContentProvider)
,后者会解包计算并打包回调。同进程的CP不涉及AMS总结:幸好我学的是DOM,py,cFFI 请求模型而不是java,不然世界观都被 android.xx 带崩塌了。没人想把Android当服务端来写,甚至服务端也越来越弱化,js化
心智模型不健康是设计不出易用的功能的,不愧是咕狗
#code 使用 makeRpc<接口InAIDL> 调用其他apk的函数
Telegram
duangsues.is_a? SaltedFish
#code AIDL 服务-客户 示例,包含 int n 的监听、 List<Str> users() 的回调
// src/main/aidl/ISvc.aidl
package my.svc;
import my.svc.ISvcCB;
interface ISvc {
void setListener(in ISvcCB callback);//int n 变化时通知客户端
//没有找到针对 Kotlin 的 AIDL 框架,但创建.aidl时, xml清单会自动更新
int getN();void…
// src/main/aidl/ISvc.aidl
package my.svc;
import my.svc.ISvcCB;
interface ISvc {
void setListener(in ISvcCB callback);//int n 变化时通知客户端
//没有找到针对 Kotlin 的 AIDL 框架,但创建.aidl时, xml清单会自动更新
int getN();void…
duangsuse::Echo
#android IPC机制 contentResolver.query(uri, projection, selection/*where*/,selectionArgs, sortOrder) //C#LINQ的拙劣模仿者.. 不自动反序列化(Parcel-able)吗 url=parse("content://demo权限/user"), 会进行 resolver.acquireProvider("demo")? ,较耗时: ContentProvider增删改的底层是 Binder(RPC调用)…
#learn #android #code 以下kt代码里 (o: 缩进) 等于 o.apply{}
Looper 是按时间点排序的Channel<T>(阻塞add,回调pop)
触发“消息T”为
又如 setTimeout 靠
resolver.增删改查基于 Binder RPC 和 Parcel-able序列化。
跨进程的
它用Binder转发调用给
等同 AIDL:
自定义 View: 重点是布局尺寸、交互动画
子UI=函数
ViewHolder= 一个本不该由开发者负责的React式对象缓存
onTouchEvent 可实现简单拖拽(通过冒泡实现多级Tabs), ViewGroup里可以Intercept(全局手势,.)
写 demo。最初是能来演示和说明、比较解决方案的优缺点,但也要注重扩展性。
MVVM(Model-View-ViewModel)是一种软件架构模式,可以实现视图和数据的双向绑定
data class Model { fun 业务逻辑 }
View 是负责展示用户界面的层
ViewModel 是负责连接 Model 和 View 的缓存层,它可以在视图变化时更新数据,并且能够感知生命周期,避免内存泄漏和不必要的数据请求。
LiveData: 可观察的数据,暴露为 reactive Flow
Room: 提供强类型的 SQLite 语句,以及Flow查询流
WorkManager: 据前提(网络状态,电量状态等)来安排后台任务起停,重启后仍然能够执行。
Navigation: 通过统一的资源文件来定义应用内(单页)导航。
Paging: 与 RecyclerView 结合使用,实现分页加载网络数据的库
Hilt: Dagger 依赖注入库的kt版,支持 Android 生命周期和组件
请求 动词
Head ContentType|UA|SetCookie 等浏览器BOM调用
ObjPath 是静态页,json api,或数据的默认界面(可爬虫)
map, filter, reduce 等列表处理都是高阶函数,只有接受{}参数才可以加 inline fun ,内联 forEach{可含非局部return}
toInt, let{it+1}, apply{xx=1} 是带 context(如Str) 隐式.参数的函数。需要用 "1".let(Str::toInt) 来引用
Kt 最令人称道的是 ?.let{}, 可变性listOf DSL, when{is} 和 if 表达式, try与OOP的改良: runCatching{}, compaion object, sealed-data class , context(T) infix fun, Array<out Str>, 不钦定int和'+'等数据和运算
import kotlinx.coroutines 是对“在函数队列”执行回调的封装,或者说调度“函数级线程”
协程 +隔离调用栈=线程 +隔离内存=进程
任何 suspend (T)->R 都可以
cc,如
Looper 是按时间点排序的Channel<T>(阻塞add,回调pop)
触发“消息T”为
Event(what,a1,a2,obj, when)
时这叫send-handle,为函数时叫post-dispatchHandler(main).post{}
实现 (休眠函数值).withContext{}
切换线程又如 setTimeout 靠
h.postDelayed(ms){}
或监听 sendMessageDelayed(监听器ID, ms)
它占用某线程的调用栈。prepare队列,再靠 new Handler(默认本线程或mainLooper): handleMsg={按it.what 触发click等监听器}
Thread {ContentProvider 是对C#LINQ的拙劣模仿,让SQL执行filter{} 以避免在system等框架(联系人、日历、短信)和app间传输完整的表格
Looper:
prepare()
sub=Handler: //handleMessage
"sub收到: ${it.obj}"
loop()
}.start
main=Handler()
main.sendMessage(Message.obtain: obj="如何让sub收到?"; what=时间点)
//日历=get(name,title,dt0,dt1) Calendar(dt0>=$0&$1<=dt1) minAt0 dt0
fun 日历(date:Range) = CalendarContract.Events.let:
ctx.getContentResolver().query(CONTENT_URI, //Uri()会 acquireProvider
["display_name" TITLE DTSTART DTEND],
"$DTSTART >= ? AND $DTEND <= ?", date.let: [first last],
"$DTSTART Asc"
).let: // 接着,从表格cursor里“反序列化”出数据
while(moveToNext()): 事件(getString(nameIndex), )
最好用 new CursorMapper<>(事件.class).convert(this) 的 @Column
CursorWindow.getInt
,. 是表格的共享内存实现resolver.增删改查基于 Binder RPC 和 Parcel-able序列化。
跨进程的
acquire
由 AMS 充当中间人,(已缓存或)拉起进程请求Provider, 等待后提供 Proxy实现的(interface Provider)它用Binder转发调用给
class CP.Transport: IContentProvider
,后者会解包计算并打包回调。等同 AIDL:
// src/main/aidl/ISvc.aidl
interface ISvc {
int getN();
List<Str> getUsers();// 对象参数要前置 in
}
// src/main/kotlin/ISvc.kt
class ISvc: Service(), ISvc.Stub {
var n=0
onBind(intent)=this
}
class MyActivity : RpcActivity() {
onCreate()=makeRpc<ISvc>()
inline fun<reified T> makeRpc() {
val conn=object : ServiceConnection { //v 创建接口
onServiceConnected(id, :IBinder?) {rpc = T.Stub.asInterface(binder)}
onServiceDisconnected(id) {rpc=null}
}
bindService(Intent.at(T::class.java), conn, BIND_AUTO_CREATE)
onDestroy={unbindService(conn)}
}
fun Intent.Companion.at(T:Class<*>) = Intent(T.name).apply {setPackage(T.`package`.name)}
}
自定义 View: 重点是布局尺寸、交互动画
type UI=({dataVars,.})=>HTMLvar自定义属性=data class
子UI=函数
ViewHolder= 一个本不该由开发者负责的React式对象缓存
onTouchEvent 可实现简单拖拽(通过冒泡实现多级Tabs), ViewGroup里可以Intercept(全局手势,.)
写 demo。最初是能来演示和说明、比较解决方案的优缺点,但也要注重扩展性。
MVVM(Model-View-ViewModel)是一种软件架构模式,可以实现视图和数据的双向绑定
data class Model { fun 业务逻辑 }
View 是负责展示用户界面的层
ViewModel 是负责连接 Model 和 View 的缓存层,它可以在视图变化时更新数据,并且能够感知生命周期,避免内存泄漏和不必要的数据请求。
LiveData: 可观察的数据,暴露为 reactive Flow
Room: 提供强类型的 SQLite 语句,以及Flow查询流
WorkManager: 据前提(网络状态,电量状态等)来安排后台任务起停,重启后仍然能够执行。
Navigation: 通过统一的资源文件来定义应用内(单页)导航。
Paging: 与 RecyclerView 结合使用,实现分页加载网络数据的库
Hilt: Dagger 依赖注入库的kt版,支持 Android 生命周期和组件
请求 动词
http(s)://Host/ObjPath?Param#ID '\n'Head Body
动词 GET|POST/PUT|DELETEHead ContentType|UA|SetCookie 等浏览器BOM调用
ObjPath 是静态页,json api,或数据的默认界面(可爬虫)
map, filter, reduce 等列表处理都是高阶函数,只有接受{}参数才可以加 inline fun ,内联 forEach{可含非局部return}
toInt, let{it+1}, apply{xx=1} 是带 context(如Str) 隐式.参数的函数。需要用 "1".let(Str::toInt) 来引用
Kt 最令人称道的是 ?.let{}, 可变性listOf DSL, when{is} 和 if 表达式, try与OOP的改良: runCatching{}, compaion object, sealed-data class , context(T) infix fun, Array<out Str>, 不钦定int和'+'等数据和运算
import kotlinx.coroutines 是对“在函数队列”执行回调的封装,或者说调度“函数级线程”
协程 +隔离调用栈=线程 +隔离内存=进程
任何 suspend (T)->R 都可以
suspendCoroutine { cc-> cc.resume(异步r) }
,以此实现awaitcc,如
delay(1_000/*, 回调cc*/)
能够被 dispatch(context: CoroutineContext, cont: Runnable)
coroutineScope/runBlocking {} 都会建立新的cancel/join域,二者的区别在调度器是否继承自旧的launch(Dispatchers.Main)
同理
duangsuse::Echo
#learn #android #code 以下kt代码里 (o: 缩进) 等于 o.apply{} Looper 是按时间点排序的Channel<T>(阻塞add,回调pop) 触发“消息T”为Event(what,a1,a2,obj, when)时这叫send-handle,为函数时叫post-dispatch Handler(main).post{} 实现 (休眠函数值).withContext{} 切换线程 又如 setTimeout 靠 h.postDelayed(ms){} 或监听 sen…
#android #dev 面试题。上条则是简化版的答案 🧐
仅供参考,可能我解释的太抽象了,涉及一些淘汰的远古技术, 不符合标准答案。
- Handler 基础,Looper 怎么和 Thread 绑定,怎样提高 MessageQueue 优先级
- 进程间通讯的方法,对 AIDL 的了解,对 ContentProvider 的了解
- (根据项目) 自定义 View 的方法和注意事项、事件分发、View 复用
- 写过 demo 吗,什么时候会写 demo
- 对 MVVM 的了解,对 Jetpack 的认识,除了 data binding 还知道哪些 Jetpack 的东西
- 对 HTTP 的了解,HTTP 协议是什么
- 对 Kotlin 的了解,如何使用协程,什么是高阶函数、内联函数、扩展函数
- 写一个将数组里所有 0 移动到末尾的算法(简单粗暴选排)
仅供参考,可能我解释的太抽象了,涉及一些淘汰的远古技术, 不符合标准答案。
- Handler 基础,Looper 怎么和 Thread 绑定,怎样提高 MessageQueue 优先级
- 进程间通讯的方法,对 AIDL 的了解,对 ContentProvider 的了解
- (根据项目) 自定义 View 的方法和注意事项、事件分发、View 复用
- 写过 demo 吗,什么时候会写 demo
- 对 MVVM 的了解,对 Jetpack 的认识,除了 data binding 还知道哪些 Jetpack 的东西
- 对 HTTP 的了解,HTTP 协议是什么
- 对 Kotlin 的了解,如何使用协程,什么是高阶函数、内联函数、扩展函数
- 写一个将数组里所有 0 移动到末尾的算法(简单粗暴选排)
duangsuse::Echo
#statement #PLT 编程造成问题 vs 解答造成编程 现况带来问题 vs 审美带来现况 软件的价值很有限,思想的复杂很空虚;不以自己的价值观拉黑人,是最大的尊重 我们有时难相理解🧐 “那你的 IDE 做的怎么样了,带类型的补全有么,还是笔记本没高亮?” (“IDE支持? parser写完了当然会自带高亮和变量寻址/空缺提示啊? 什么叫能解析,但没高亮?”) 这是因为我草稿的PRR 里,输入流就是用高亮-区间嵌套来实现增量解析;没有高亮你连 unparse(ast) 都做不到 —诶,就…
#statement #Java 本来就已经和 C 一样了,
更不要说
再比如
tcp 填“文件收发”消息不写文件长度, 却想着 1024byte 一块,全\0或isEnd属性结尾, 黏包 拆包 ……
就像 #android 把
设计模式往往是解决语法的缺失,但我相信许多class就是程序员硬加上去的
这不定义式。但就连 Haskell, React 的设计者他也不是为了「软件功能」服务,都有自己的“宏大叙事” ,100个框架有100个术语和写法,功能却完全一样,唯独没有100%好用的
我想要的代码,是“只用写一遍”,也 ”只能写一遍” 的;无论在任何年代,对接上任何app的需求, 都想不出更普遍的用词和接口,即便需求复杂到“不普遍”的程度。
问题和解法,都只有唯一一种,描述问题就是解法,这才叫程序设计🙏
py或许够规范,但性能和OOP 上的(生态?)缺陷让它受限于脚本和计算,不方便做前后端的模块 ;所以我现在很少操心android这些框架
static 成员是非常落后、非常不OOP的设计, ruby,py,js 里 class 都是“类对象”;虽然 kt 没有用元类实现反射,认识到 companion 和 fun 处于不同的执行周期是很必要的
Rust就把struct成员和静态 ::new 隔离的很好
sendMessage(Message message)
这种该重载为 send(Message msg)
的UserInfo PicInfo
(class Info .User .Pic ) 的,一大堆更不要说
x.a=1; x.b=2
(x.apply{a=1;b=2} ) 和 Builder 了,尤其是 build(): Builder.Immutable ,那种玩意是人手写的吗? (运行期不可变 往往会降低性能)再比如
Adapter(it:T1): T
和 Delegate(it:T) T by it
,如果支持as隐转 fun T.as=object: T1 {}
和subclasshook (继承时生成代码) 就不是“class”和 “by语法”了, ktx.serialization 那些魔法也大可丢掉tcp 填“文件收发”消息不写文件长度, 却想着 1024byte 一块,全\0或isEnd属性结尾, 黏包 拆包 ……
就像 #android 把
body.animate({color:'red'})
或 transition:color 1s; @animation { to { color: red; .. } }
写成 ValueAnimator 😅设计模式往往是解决语法的缺失,但我相信许多class就是程序员硬加上去的
这不定义式。但就连 Haskell, React 的设计者他也不是为了「软件功能」服务,都有自己的“宏大叙事” ,100个框架有100个术语和写法,功能却完全一样,唯独没有100%好用的
我想要的代码,是“只用写一遍”,也 ”只能写一遍” 的;无论在任何年代,对接上任何app的需求, 都想不出更普遍的用词和接口,即便需求复杂到“不普遍”的程度。
问题和解法,都只有唯一一种,描述问题就是解法,这才叫程序设计🙏
py或许够规范,但性能和OOP 上的(生态?)缺陷让它受限于脚本和计算,不方便做前后端的模块 ;所以我现在很少操心android这些框架
static 成员是非常落后、非常不OOP的设计, ruby,py,js 里 class 都是“类对象”;虽然 kt 没有用元类实现反射,认识到 companion 和 fun 处于不同的执行周期是很必要的
Rust就把struct成员和静态 ::new 隔离的很好
duangsuse::Echo
#android #dev 面试题。上条则是简化版的答案 🧐 仅供参考,可能我解释的太抽象了,涉及一些淘汰的远古技术, 不符合标准答案。 - Handler 基础,Looper 怎么和 Thread 绑定,怎样提高 MessageQueue 优先级 - 进程间通讯的方法,对 AIDL 的了解,对 ContentProvider 的了解 - (根据项目) 自定义 View 的方法和注意事项、事件分发、View 复用 - 写过 demo 吗,什么时候会写 demo - 对 MVVM 的了解,对 Jetpack…
#android #hack #aop 继续,加上奇怪.. 的知识
Magisk 是 Android 版的 Docker (overlayfs),能管理root、去广告加皮肤、安装字体、模拟位置、利用权限骗过 SafetyNet DRM
它让 /boot/initrd 挂载(--bind) /sbin/.magisk tmpfs 来遮住 /mirror/system vendor 树,因此需要TWRP刷zip(和root时一样) 或fastboot刷入kitchen过的原机boot.img
新设备可能不区分boot分区(A/B 切换来OTA),修改内核强制使用 initrd(boot.img) 里的 init(PID0) 程序
简单说,#Linux 启动的传统是kernel解压启动 initrd 内存盘(recovery,Magisk)去寻找真'/',然后 chroot /sysroot /init (systemd,各类run-command,.)
Zygisk 和 Xposed 都是AOP框架,分别拦截和修改 Java android.*/JNI 函数的调用,从而实现对系统和应用程序的功能修改。Zygisk 是基于 Riru 的一个模块,使用 Zygote 注入技术来加载自定义代码。Xposed 是通过替换 /system/bin/app_process 程序来控制 Zygote 进程,使其在系统启动时加载 XposedBridge.jar 文件,从而完成对 Zygote 进程和 Dalvik 虚拟机的劫持。
Zygisk 是 Riru(#cpp .so 函数替换,靠魔改某项linker_PRELOAD) 的免安装续作,开启后不能规避检测,但支持文件/JNI重定向、实现了模块黑名单。 LSP和Ed-Xposed分别支持二者(不能共存)
LSP 用 env->RegisterNatives(动态注册版Java_), jni_method_map
PRELOAD=libxposed.so 利用
RegisterNatives 本身就能让JNI函数基于jobject clazz 派发,所以比ART hook 简单
FakeXposed 作者的博文
#kt #code
Magisk 是 Android 版的 Docker (overlayfs),能管理root、去广告加皮肤、安装字体、模拟位置、利用权限骗过 SafetyNet DRM
它让 /boot/initrd 挂载(--bind) /sbin/.magisk tmpfs 来遮住 /mirror/system vendor 树,因此需要TWRP刷zip(和root时一样) 或fastboot刷入kitchen过的原机boot.img
新设备可能不区分boot分区(A/B 切换来OTA),修改内核强制使用 initrd(boot.img) 里的 init(PID0) 程序
简单说,#Linux 启动的传统是kernel解压启动 initrd 内存盘(recovery,Magisk)去寻找真'/',然后 chroot /sysroot /init (systemd,各类run-command,.)
Zygisk 和 Xposed 都是AOP框架,分别拦截和修改 Java android.*/JNI 函数的调用,从而实现对系统和应用程序的功能修改。Zygisk 是基于 Riru 的一个模块,使用 Zygote 注入技术来加载自定义代码。Xposed 是通过替换 /system/bin/app_process 程序来控制 Zygote 进程,使其在系统启动时加载 XposedBridge.jar 文件,从而完成对 Zygote 进程和 Dalvik 虚拟机的劫持。
Zygisk 是 Riru(#cpp .so 函数替换,靠魔改某项linker_PRELOAD) 的免安装续作,开启后不能规避检测,但支持文件/JNI重定向、实现了模块黑名单。 LSP和Ed-Xposed分别支持二者(不能共存)
.internal.os.Zygote
是 app_process 的起点,它负责注册JNI、创建 SystemServer(PM,WM,AMS处理的Intent),之后便执行Xp模块LSP 用 env->RegisterNatives(动态注册版Java_), jni_method_map
[T][id][sig].fnPtr
来JNI替换,Zygisk 提供了 {pre(包名),post}AppSpecialize(args
)PRELOAD=libxposed.so 利用
env->FromReflectedMethod(由java查找).{access_flags|=ACC_NATIVE, (Dalvik|ART inlined jmp)nativeFunc=callHooked}
做函数替换RegisterNatives 本身就能让JNI函数基于jobject clazz 派发,所以比ART hook 简单
FakeXposed 作者的博文
#kt #code
import de.robv.android.xposed.*
import de.robv.android.xposed.XposedHelpers.*
val reg={
val NoPrint={
setStaticObjectField("java.lang.System", "out", PrintStream(OutputStream()) )
}
findAndHookMethod("java.lang.System", cl, "<clinit>", object: XC_MethodHook() {
override fun MethodHookParam.afterHookedMethod() {NoPrint()}
})
}
//assets/xposed_init 写下类名
class My: IXposedHookLoadPackage {
fun LoadPackageParam.handleLoadPackage() {
if(packageName.equals("com.example.app"))reg()
cl=classLoader
}
}
Gist
Zygisk 源码分析 #Magisk #Zygisk
Zygisk 源码分析 #Magisk #Zygisk. GitHub Gist: instantly share code, notes, and snippets.
#android #tool 安卓逆向常见步骤:
使用 APKTool 来反编译 aapt,解出明文xml-资源和dex;重新打包并用 apksigner debug 签名
使用 {JD,jadx}-GUI 来反编译 javac,kotlinc,dx ,观察(混淆函数名的) Java 源代码
尝试 RetDec,Snowman(x86),r2 以反编译 gcc
- #reveng 一般是做不到 dnSpy 那种局部重编译的,只能用来琢磨 frida.re 等函数替换,andbug 等调试断点
- 但手动的 enjarify/dex2jar; smali 能重编译, 就像 hex editors 能修改 C strings 常量
对 UI 了解多少?
UI 的设计需要考虑美观性、易用性、功能性:
- 布局颜色整洁、平衡、一致,图标要易识别。
- 动效流畅、不做作、有趣。
- 指示文字简明、准确、友好等原则。
对 #net TCP 了解多少?
TCP 是传输控制协议,与UDP的乱序丢包不同
- 序列号和确认号来标识和确认数据段。
- 重传机制来处理丢失或者校验失败的数据段。
- 三次握手建立连接,四次挥手断开连接。
- 窗口机制来实现(利他的)流量拥塞控制。
利用 socket 通讯的过程如何?
-
- unix 服务器把它
- 客户端
HTTP/1 在请求响应后就close()掉管道
你还可以用
使用 APKTool 来反编译 aapt,解出明文xml-资源和dex;重新打包并用 apksigner debug 签名
使用 {JD,jadx}-GUI 来反编译 javac,kotlinc,dx ,观察(混淆函数名的) Java 源代码
尝试 RetDec,Snowman(x86),r2 以反编译 gcc
- #reveng 一般是做不到 dnSpy 那种局部重编译的,只能用来琢磨 frida.re 等函数替换,andbug 等调试断点
- 但手动的 enjarify/dex2jar; smali 能重编译, 就像 hex editors 能修改 C strings 常量
对 UI 了解多少?
UI 的设计需要考虑美观性、易用性、功能性:
- 布局颜色整洁、平衡、一致,图标要易识别。
- 动效流畅、不做作、有趣。
- 指示文字简明、准确、友好等原则。
对 #net TCP 了解多少?
TCP 是传输控制协议,与UDP的乱序丢包不同
- 序列号和确认号来标识和确认数据段。
- 重传机制来处理丢失或者校验失败的数据段。
- 三次握手建立连接,四次挥手断开连接。
- 窗口机制来实现(利他的)流量拥塞控制。
利用 socket 通讯的过程如何?
-
socket(AF_INET, SOCK_STRM)
文件 利用了tcp传输层- unix 服务器把它
bind(('0.0.0.0',80)端口)
,开始 s,addr=accept()
新文件- 客户端
connect(dial host,port) 后,用send写入,recv(N)
读取,HTTP/1 在请求响应后就close()掉管道
你还可以用
(AF_BLUETOOTH, , BTPROTO_RFCOMM)
让设备可发现(类似 mDNS); 也可用 bluetooth-agent 1234; 指定配对码GitHub
GitHub - weixinbao/ReverseTool: 逆向工具集合
逆向工具集合. Contribute to weixinbao/ReverseTool development by creating an account on GitHub.
duangsuse::Echo
#py 周刊 - Excel 支持 import pandas, statsmodels, matplotlib / seaborn 了, Guido 亲自推广(可能是云计算,要订阅) - PowerToys添加“可交互”的截图 - Google 等各种大公司的技术blog #list - #apple #design 设计师法则 - #learn 看美军的脏话官话(F-words)学英语 。 - 单靠 #sql 如何保存数据 - APL 里有的 py 基本列表处理式 - FastAPI 最佳实践 list…
#py 周刊
#recommend #tool 带有 "Android 子系统", taskmgr,... 的网页版Win12 demo 🎨
#algorithm Hello Algo 多语言实例
#tool EasySpider +可视化编程
#android 高级包管理器
js: await using fp = openFile()
Flask 深入探索: 请求上文、会话、CORS
fastapi-users:开箱即用的 FastAPI 用户管理库
Django 发送带有验证链接的电子邮件
FastAPI 使用 Tailwind CSS + SQLAlchemy
Streamlit 初学者指南: 类似 Juypter UI
Polars:快如闪电的 #rust DataFrame 库, 优化表达式和上下文、惰性
dara:轻松创建交互式 Web 图表程序 📊
Python Asyncio 之 socket() 网络编程理论详解
可视化+深入学习数据结构与算法:C++、Swift、Python、Java、C#、JavaScript
bisect,heapq 如何保持数组有序
upiano:命令行里的钢琴 FluidSynth
探索国家/文化多样性:Pyetho — 用于列出国家及其语言
深入介绍 Python 3.12 中的永生对象(如 None 关键字和小整数)
下划线的十种用法(REPL, match, i18n)
7、h2ogpt:私人文档+图像的问答 PyMuPDF 识别与提取表格
8、refact:开源编码助手,支持自动补全、代码重构、代码分析
9、dify:创建自己的 AI 应用 +CN
#recommend #tool 带有 "Android 子系统", taskmgr,... 的网页版Win12 demo 🎨
#algorithm Hello Algo 多语言实例
#tool EasySpider +可视化编程
#android 高级包管理器
js: await using fp = openFile()
Flask 深入探索: 请求上文、会话、CORS
fastapi-users:开箱即用的 FastAPI 用户管理库
Django 发送带有验证链接的电子邮件
FastAPI 使用 Tailwind CSS + SQLAlchemy
Streamlit 初学者指南: 类似 Juypter UI
Polars:快如闪电的 #rust DataFrame 库, 优化表达式和上下文、惰性
dara:轻松创建交互式 Web 图表程序 📊
Python Asyncio 之 socket() 网络编程理论详解
可视化+深入学习数据结构与算法:C++、Swift、Python、Java、C#、JavaScript
bisect,heapq 如何保持数组有序
upiano:命令行里的钢琴 FluidSynth
探索国家/文化多样性:Pyetho — 用于列出国家及其语言
深入介绍 Python 3.12 中的永生对象(如 None 关键字和小整数)
下划线的十种用法(REPL, match, i18n)
7、h2ogpt:私人文档+图像的问答 PyMuPDF 识别与提取表格
8、refact:开源编码助手,支持自动补全、代码重构、代码分析
9、dify:创建自己的 AI 应用 +CN
Telegram
Newlearnerの自留地
#Python潮流周刊 #Newsletter
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
🦄文章&教程
1、一份深入探索 Flask 的指南
2、使用 PyMuPDF 识别与提取表格
3、深入介绍 Python 3.12 中的永生对象
4、Python 中下划线的十种用法
5、Python Asyncio 之网络编程方法详解
6、给初学者的 Streamlit 学习指南
7、如何在 FastAPI 应用中使用 Tailwind CSS 和 SQLAlchemy…
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
🦄文章&教程
1、一份深入探索 Flask 的指南
2、使用 PyMuPDF 识别与提取表格
3、深入介绍 Python 3.12 中的永生对象
4、Python 中下划线的十种用法
5、Python Asyncio 之网络编程方法详解
6、给初学者的 Streamlit 学习指南
7、如何在 FastAPI 应用中使用 Tailwind CSS 和 SQLAlchemy…