替换系统库

3
通常情况下,是否可能编译自定义版本的系统库(例如 libsurfaceflinger.so),将其复制到Android设备上,在重新启动后期望它能够正常工作?我正在构思创建这样一个应用程序。显而易见的问题是二进制不兼容性,即如果我针对AOSP 4.4编译库,则它可能无法在AOSP 2.3设备上运行。除此之外,是否存在其他障碍呢?编辑:假设的应用程序当然需要root权限。

1
系统库往往大量使用私有API,而这些API在不同版本之间经常发生变化。有时,OEM会为特定设备修改库。您真的不能在不同设备之间混合使用像libsurfaceflinger这样的东西。 - fadden
一切不都是私有API吗?比如说libsurfaceflinger。我一开始考虑针对特定设备(例如Moto G)进行开发,然后再评估是否可以推广到更多设备。 - fhucho
基本集合,例如Vector,可以添加/删除/更新方法,因此您的libsurfaceflinger需要与libutils完全匹配。surfaceflinger的行为随时间而演变,系统的其他部分依赖于它以某种方式运作。有时常见的代码从一个库移动到另一个库,因此如果您只替换了一个库,可能会出现两个副本或零个副本的情况。因此,插入新的libsurfaceflinger会中断的原因有多种,并且它并不总是在日志文件中显示一个好的“这是你做错了什么”的错误信息。 :-) - fadden
2个回答

1
另一个非常重要的问题是,除非您已经root了您的设备,否则您将无法替换系统库。
这个问题的一个可能解决方法(取决于库的类型,例如被System.loadLibrary使用的libcore库不适用)是更改库的名称,并直接从您的应用程序加载此库(通过使用System.loadLibrary或本地源代码中的dlopen)。但是,正如我所说,我不确定它是否会起作用。

谢谢,在这种情况下,我想改变系统的行为,而不仅仅是一个应用程序,所以重命名无法解决问题。 - fhucho

1

是的,这是可能的。我在一台设备(带有自定义ROM)上尝试了类似的事情,并且按预期工作。但并非每次都有效。我的成功率为2:3。(它成功了2次)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接