duangsuse::Echo
715 subscribers
4.25K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from 科技圈🎗在花频道📮 (❤️)
AI 公司承诺将为 AI 生成内容打上水印

拜登政府周五表示,美国主要 AI 公司如 OpenAI、Alphabet、Meta Platform、亚马逊、Anthropic、Inflection 和微软已经向白宫承诺将自愿为 AI 生成内容实现水印等措施,以帮助提高 AI 技术的安全性。主要 AI 公司还承诺在发布新 AI 系统前进行彻底地测试,并分享诸如如何降低风险等信息。随着 OpenAI 的聊天机器人 ChatGPT 风靡世界,世界各国的立法者开始考虑如何缓解这项新兴技术对国家安全和经济的危险。(slashdot)

投稿:@ZaiHuaBot
频道:@TestFlightCN
Forwarded from 科技圈🎗在花频道📮 (在花⭐️投稿📮Bot)
安兔兔官方称“安兔兔车机版”将于下周一上线(7月24日)

来源微博(@安兔兔 )

投稿:@ZaiHuaBot
频道:@TestFlightCN
Forwarded from Solidot
Stability AI 发布 CC-BY-NC 4.0 授权的大模型 Free Willy 1 和 2

2023-07-22 18:18 by 火星战将

AI 创业公司 Stability AI 发布了在 CC-BY-NC 4.0 下授权的大模型 Free Willy 1 和 2,也就是商业使用受限制。FreeWilly1 是基于 LLaMA 65B 模型,FreeWilly2 是基于 LLaMA 2 70B 模型,Stability AI 称两个模型在不同基准测试中展现了出色的推理能力,其中 FreeWilly2 在部分任务中的表现超过了 GPT-3.5。公布这两个模型旨在促进开放研究,因此都是非商业使用授权。Stability AI 此前发布了一种可商业使用的开源大模型 StableLM。

https://stability.ai/blog/freewilly-large-instruction-fine-tuned-models

#人工智能
Forwarded from dnaugsuz
#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调用) 的参数,
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的函数
Forwarded from 科技圈🎗在花频道📮 (在花⭐️投稿📮Bot)
华为Harmony OS 4.0版本将于8月正式发布

来源:新浪微博

投稿人:Arkansas State Police

投稿:@ZaiHuaBot
频道:@TestFlightCN
#algorithm #FP 版的 list 累加法杨辉三角
ps. 也可以用DP和代数式推算
P2:垃圾 itertools

#py #code
from itertools import accumulate,islice,chain

fib=iself(2,lambda x0,x1: chain([1,1], (x+y for x,y in zip(x0,x1)) ))
def 杨辉(): #pascal_triangle
row = [1]
while True:
yield row; row = [1,*(x+y for x,y in zip(row, row[1:])),1] #上行+上左


def iself(n,fn):
a=[]
def _(i):
while True:yield(a[-i])
for x in fn(*[_(i+1) for i in range(n)]): a.append(x);yield x

ctrlM=lambda a: (lambda n:'\n'.join(f'{s}'.center(n)for s in a)) (max(len(str(s))for s in a))
N=20
print(ctrlM([*islice(杨辉(),N)]),'\n\nfib', [*islice(fib,N)])
#sql DFS搜索 像素图填色 in Prolog

btw. fill(_,X) 是 “从任意一点探索区域X , 一共能收集到多少X”
v(P,0) : 查询颜色是0的P=[X,Y]
conn([2,1], P1) : (2,1)=0 四邻里 0值格的座标们

不知为何很慢
看起来好像简短了,实际只是省掉 if 和解构的代码量 😒


有趣的是,conn(四邻) 是基于 |X-x|+|Y-y|=1 的参数方程(GL常用),而非 x+1,y+1 直接迭代,所以 dfs :- C=conn(A),dfs(C) 就必须写成 conn(A,C) 的约束,尽管C只是A的“过滤结果”, 对C的穷举确实不像“返回值”能做到的

https://www.swi-prolog.org/pldoc/doc/_SWI_/library/lists.pl
关系式和SQL一样支持查询结果 distinct(unique)
之前用 findall(X, Func,R) 莫名出问题,也用不了lambda ,累死了
Forwarded from 科技圈🎗在花频道📮 (在花⭐️投稿📮Bot)
微软不再对Chrome 和 Safari 以及其他浏览器中屏蔽 Bing Chat 的使用。

然而,在其他浏览器上使用 Bing Chat 存在一些限制。比如,相比在 Edge 上使用 Bing Chat 的 4000 字上限来说,你只能输入 2000 字。对话在进行5轮后也会重置,而在 Edge 中是30轮。并且你会看到一些烦人的弹出提示,建议你下载 Edge。

https://www.theverge.com/2023/7/24/23805493/bing-ai-chat-google-chrome-safari

投稿:@ZaiHuaBot
频道:@TestFlightCN
dnaugsuz
#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”为Event(what,a1,a2,obj, when)时这叫send-handle,为函数时叫post-dispatch

Handler(main).post{} 实现 (休眠函数值).withContext{} 切换线程
又如 setTimeout 靠 h.postDelayed(ms){} 或监听 sendMessageDelayed(监听器ID, ms)

它占用某线程的调用栈。prepare队列,再靠 new Handler(默认本线程或mainLooper): handleMsg={按it.what 触发click等监听器}

Thread {
Looper:
prepare()
sub=Handler: //handleMessage
"sub收到: ${it.obj}"
loop()
}.start

main=Handler()
main.sendMessage(Message.obtain: obj="如何让sub收到?"; what=时间点)


ContentProvider 是对C#LINQ的拙劣模仿,让SQL执行filter{} 以避免在system等框架(联系人、日历、短信)和app间传输完整的表格

//日历=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|DELETE
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 都可以 suspendCoroutine { cc-> cc.resume(异步r) },以此实现await
cc,如delay(1_000/*, 回调cc*/) 能够被 dispatch(context: CoroutineContext, cont: Runnable)

coroutineScope/runBlocking {} 都会建立新的cancel/join域,二者的区别在调度器是否继承自旧的
launch(Dispatchers.Main) 同理
Forwarded from dnaugsuz
#bing #code
Hackr/2023 列出了 40 多个常见的 Android 面试问题和答案,涵盖了 Android 的构建过程、IDE工具、AIDL、Fragment(单页历史栈PJAX)、Activity
GH 仓库收集了更多,如协程、Flow API、Retrofit、Room
javapoint - 架构、四大组件、通知、WebView、布局、动画、广播接收器、数据存储等主题

Looper是按时间点排序的Channel<T>(任意线程add,回调pop)
触发“消息T”为Event(what,a1,a2,obj, when_ms)时,这叫send-handle,为函数时叫post-dispatch
Thread("httper"):
Looper: prepare(); h=注册Handler(可选); loop()
h.send__AtFront(msg)

IPC 常用方法:Bundle(Map), 文件Intent, Socket, Messenger(Loop); AIDL, ContentProvider(都基于 Binder)
AIDL 的定义-使用侧:
// src/main/{kotlin,aidl}/ISvc.{kt,aidl}
class ISvc: Service(), ISvc.Stub {
fun getN():Int
fun getUsers(): List<Str> //.aidl 只支持interface{},对象参数需前置in
var n=0
onBind(intent)=this
}
XML清单IDE会自动填写, .aidl 请AI生成吧

class MyActivity : RpcActivity() {
onCreate()=makeRpc<ISvc>()

makeRpc() {
val on=object : ServiceConnection { //v 把Binder连接,转化为接口
onServiceConnected {rpc = T.Stub.asInterface(binder)}
onServiceDisconnected(id) {rpc=null}
}
bindService(Intent(T.name).apply {setPackage(T.`package`.name)}, on, BIND_AUTO_CREATE)
onDestroy={unbindService(on)}
}

}//本来1行的事还写样板代码。 你玩不了开发,是 android.xx 开发者们玩你

ContentProvider 是对C#LINQ的拙劣模仿,让system(联系人、日历、短信)等框架的SQL执行filter{} 来避免传输完整的表格给app
Binder 提供了 CursorWindow.getInt 的共享内存的封送
// contacts.filter{str in it.name}.sortBy{it.startDate}
CalendarContract.Events.run:
getContentResolver().query(CONTENT_URI, 相关@Column, "id=?",[id], "$DT_START Asc").mapRows {
new CursorMapper<>(日历事件.class).convert(it)
}

自定义 View: 重点是布局尺寸、交互动画
type UI=({dataVars,.})=>HTMLvar
事件分发和(Object)View 的复用靠MVVM就好了

写 demo。最初是能来演示和说明、比较解决方案的优缺点,但也要注重扩展性和复用。 我说的不是“缓存复用”等样板化的代码

MVVM是一种软件架构模式,可以实现视图和数据的双向绑定
data class Model { fun 业务逻辑 }
View 是负责展示用户界面的层
ViewModel 是负责连接 Model 和 View 的缓存和编辑层
Jetpack 还有 LiveData(reactive Flow), Room(强类型SQL), Navigation(& data Paging)

请求 动词 http(s)://Host/ObjPath?Param#ID '\n'Head Body
动词 GET|POST/PUT|DELETE

Kotlin 最令人称道的是 ?.let{}, 可变性listOf DSL, when{is} , try与OOP的改良

map, filter 等列表处理都是高阶函数, 内联的 forEach{可含非局部return}
toInt, let{it+1}, apply{xx=1} 是带隐式this参数的扩充函数

import kotlinx.coroutines 是对“在函数队列”执行回调的封装,或者说调度“函数级线程”
协程 +隔离调用栈=线程 +隔离内存=进程
delay() 等协程以回调,而非调用栈保存返回地址;因此调用者也以 async { } 内 suspendCoroutine{it.resume} 自动传入delay.then(成功).catch(报错)

Scope{} 能创建 cancel/join(wait)域,而 launch(withContext){} 可切换调度器

//a.partition{it==0}
a=[1,0,0,2,3], b=[]; a.filter(x=>x==0?(b.push(x),0) : 1).concat(b)
代码烂 但单次迭代快(就像单行filterMap只好用map.flat)

用读写指针(朝右读,遇到非0: 交换)更快 ,或者朝左读(遇到0: 交换) ,如果0的占比少
这是qsort() 的步骤。
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 移动到末尾的算法(简单粗暴选排)
duangsuse::Echo
#statement #PLT 编程造成问题 vs 解答造成编程 现况带来问题 vs 审美带来现况 软件的价值很有限,思想的复杂很空虚;不以自己的价值观拉黑人,是最大的尊重 我们有时难相理解🧐 “那你的 IDE 做的怎么样了,带类型的补全有么,还是笔记本没高亮?” (“IDE支持? parser写完了当然会自带高亮和变量寻址/空缺提示啊? 什么叫能解析,但没高亮?”) 这是因为我草稿的PRR 里,输入流就是用高亮-区间嵌套来实现增量解析;没有高亮你连 unparse(ast) 都做不到 —诶,就…
#statement #Java 本来就已经和 C 一样了, 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): TDelegate(it:T) T by it,如果支持as隐转 fun T.as=object: T1 {} 和subclasshook (继承时生成代码) 就不是“class”和 “by语法”了, ktx.serialization 那些魔法也大可丢掉

tcp 填“文件收发”消息不写文件长度, 却想着 1024byte 一块,全\0或isEnd属性结尾, 黏包 拆包 ……

就像 #androidbody.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 隔离的很好
Forwarded from 小熊猫的交易之路
Leveraged + influential, 鉴定为outlier
#py 周刊
python -m nntplib , calendar, asyncio, http.server ,. 命令行工具 'gmane.comp.python.general has 757285 articles,'
dinov2_retrieval -q img.png -d ./all_images/
以图搜图
ShortGPT #bilibili 短视频裁缝, Pixels, Bing Image

https://github.com/gto76/python-cheatsheet#curses
TTS, Mario Brothers, TUI文件浏览器, COVID图表的示例❤️
- 代码命名红黑榜

uvicorn vs #rust单/多线程跑分: 差异 10%
from blacksheep import Application
import asyncio
app = Application()
@app.route("/async")
async def test_async():
await asyncio.sleep(.002)
return "OK"

import logging; 对象支持 Formatter('%(name).%(asctime)s: %(message)s'), RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10) 的参数配置, 默认print WARN以上的记录, logger.exception() 默认 ERROR

pip install pystack pytest-pystack; pystack remote `pidof python` #ffi (仅限 linux, docker)
git clone https://github.com/BiteStreams/fastapi-template PetStore #dev 使用 poetry poly 和 FastAPI session 创建微服务

data diff
#china #news 黑龙江塌方事后,基层官僚的冷漠监视,让我想到小胡在校失踪的评论,记者发言稿都是事先过审,“提高播出质量”。
中国人唯独在「不能说」上语言技术突破
一些聪明人吃着外贸 买着自由,却放着民主法制 议法普选的现代道路不信,一边求神拜佛,盼明主,求洋人盼“通知”给自己做「主」;又去说「日本是美国的狗」这些“普世的真理”

美日的文化“输出”,都能和“肥水不流外人甜”平分秋色。谁才是剥皮吃肉文化里的那群狗狗?

就像 CREAM #recommend short #film 里说的那样,自由和智慧”终结了劳累和痛苦,让权力失去价值“。
蠢的精利者们,就附和坏的食利阶层,宁愿赚大钱,去吃地沟油、喝毒奶,也要把集权导致的灾难,酸在不存在的选票上

“咱们的群众”,很清楚什么「人」应该被轻轻放下,什么人代表伟大光荣;正确的梦话都记住了,唯独忘了物业 本就是拿钱该听业主话的,政教合一、三位一体、我即大国是什么东西

为了恐惧连“说”甚至“看”都做不到的人,未来,总会一起过上 有钱 有官 也看《样板戏》娱乐的红日子的

那些说“悼念汶川”的钢琴家莫须有的原谅侠们。

死了区区11个人嘛,碍国人都知道,女排精神必须“为国”,最后是“为国民” “为个人理想” ,凭什么指责豆腐渣,是想暗戳戳危害矿产大园的安全?
1
Forwarded from 螺莉莉的黑板报
https://item.taobao.com/item.htm?id=727615838798

最近一直动想要自己造一个 MP3 的念头,搜了一下网上的各种板子,发现 ESP 干这事情大概率是不行的,可能 Orange Pi 上面配一个显示器 电池是比较可行的方案,至少它是个 ARM,上面跑一个 Musikcube + 一个 GUI 事情就做完了,3.5mm 耳机接口可以用 USB 外挂一个,你的 MP3 还自带了高端的网口用来传输数据,真的是太神奇啦!
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分别支持二者(不能共存)

.internal.os.Zygoteapp_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
}
}