回头再看,感觉 android 对所有 app 开放 NDK 是大败笔

2018-07-10 18:57:31 +08:00
 s82kd92l
开放 NDK 初衷应该是为了应对很少场景下的高性能要求,比如直接处理音频 /视频编码。而随着 Java vm 优化越来越好,NDK 作为高性能替代品的作用也越来越小了。最需要性能的游戏其实也可能绕过 NDK,用 java+shader+renderscript/opencl/vulkan 做到不错的效果。

相反,NDK 的大门一开,却使得无数不务正业的黑科技成为可能:各种 hook/hotpatch 修改 Java VM 本身,各种 native 层的进程保活,长连接保活,访问私有 API,甚至利用 linux 内核漏洞 root。现在稍微大一点的项目,不再 native 层做反 hook 加壳都不好意思跟人打招呼,而且 hook 这些本来就是猫捉老鼠的游戏,甚至可以说是军备竞赛,战场是在用户的手机上,武器就是双方程序员的时间和精力,受伤的是 cpu 和电池。Google 这么多年在 android 安全上的投入,包括 selinux,seccomp 也都是主要针对来自第三方 NDK 代码的威胁。

所以我觉得 NDK 应该做成高危权限,没有明确的理由禁止使用,这样 android 的生态会清净得多。
17209 次点击
所在节点    Android
60 条回复
xingda920813
2018-07-10 19:12:57 +08:00
偏激了. 那 iOS 开发怎么讲?
gam2046
2018-07-10 19:26:31 +08:00
其实不能这么说。当初 Android 能火起来,依靠的也是其开放性。现在倒打一耙说过于开放导致现在的境遇就不是很合理了。

比较客观的说法,当初 Android 依靠开放性,吸引了一批奇技淫巧者,弄出了许多新奇的东西。但是随着蛋糕越来越大,自然也开始慢慢有人惦记了,总会有苍蝇臭虫飞回来。这不是开放的原罪。
coderlxm
2018-07-10 19:27:39 +08:00
不太同意,那有没有考虑好的一面呢?
tetora
2018-07-10 19:28:43 +08:00
我觉得挺好的,起码这方面的知识多起来了,都安分守己的话,不就少了很多岗位了吗
lonelinsky
2018-07-10 19:30:19 +08:00
sampeng
2018-07-10 19:32:07 +08:00
安全你没考虑到啊。。不提供 ndk。。私密的逻辑怎么搞? java 真的就是在裸奔啊。。
s82kd92l
2018-07-10 19:45:15 +08:00
@xingda920813 iOS 从一开始就是 native 层,所有的文档都是 native,沙盒安全边界也是 native。Android 文档绝大部分是在 Java 层,所以这些 hook 之类的是 undocumented behaviour,所以才叫“黑科技”。
s82kd92l
2018-07-10 19:49:00 +08:00
@sampeng
@981340936lxm java 字节码一样可以做混淆。就保护代码本身而言不觉得比机器汇编码差哪去。
nicevar
2018-07-10 19:53:11 +08:00
不开放 NDK 的话 android 很难有今天,光游戏这块就发展不起来,你说的那一套有人用才行,别人其他平台有现成的代码光移植就成大问题,另外机顶盒这块也很难发展起来,2.x 版本的时候没有 ndk 很多东西都没法做,连个最简单的获取本地网卡的 mac 地址都不行
s82kd92l
2018-07-10 20:09:13 +08:00
@nicevar 机顶盒里都是厂商自带 app,权限高用 ndk 没问题啊
codehz
2018-07-10 20:47:26 +08:00
@lonelinsky #5 已经有方法 native 层 patch vm 绕过了
hjc4869
2018-07-10 20:50:41 +08:00
WP7 当年就不让第三方 app 用 native code,所有代码全部运行在 CLR 上。结果系统自带 native apps 无比流畅,第三方 app 却都卡的没法用。
SonicY
2018-07-10 20:53:27 +08:00
WP7 那是仅限于首页滑动流畅……
s82kd92l
2018-07-10 21:20:41 +08:00
@hjc4869 现在的纯 java app 在 android 上也可以无比流畅的
yhzwy
2018-07-10 21:41:17 +08:00
身为程序员当然是能玩的东西越多越好。
不然都限制死了还玩什么
jdgui
2018-07-10 21:41:51 +08:00
@s82kd92l 混淆没啥用吧。我们都是看 smail 看程序逻辑的
s82kd92l
2018-07-10 23:03:35 +08:00
@jdgui 真要用心混淆的话看 smail 看不出的。随便想想就有很多种方法让 smail 逻辑隐藏,当然会需要一个整体性的混淆框架:
1. 自动把代码逻辑分成很多小的 class。复杂的逻辑可能被分成成百上千的 class。人肉看这种 smail 代码会疯掉的。
2. 实现一个 userspace coroutine/thread 之类的框架,然后就可以做 non-deterministic execution.可能执行 10 个 smail 指令就跳到另一个 thread 上了,下次跳回来也不知道是什么时候。这种逻辑必须执行时才能确定路径,无法静态分析。
pual
2018-07-10 23:27:30 +08:00
Java 虚拟机堆内存太少,有时需要加载动画 webp 之类的需要 ndk 分配进程的堆内存
pual
2018-07-10 23:30:54 +08:00
另利用 jni 与 java 层调用很多优秀的开源库,ss 的 Android 版本就是一个很不错的栗子
tempdban
2018-07-11 01:20:43 +08:00
我 c 语言写的框架到你安卓里还必须要 Java 重写一遍?我现成的加密库到你安卓再移植一年?移植的万一有 bug 谁维护?
初期安卓软件少的时候怎么上量?
不弄的方便一点谁给你写?
你把 app 耍流氓的锅扔给 ndk 谁能服?
源码就在那给你看,还是不是该耍的流氓还要耍 就算没有 ndk 没有 jni,是不是套路层出不穷?
WP 那个 API 给的少的可怜 逼死多少 app。
谷歌是没撕破脸皮,直接搞一 cgroup 限制死你,管你是啥语言都没用。
因噎废食

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX