方舟编译器业余探讨

Zealot
操作系统
2019-08-10

华为EMUI9.0升到9.1后系统UI的响应有一定的提升, 但没官方说的那么快,方舟编译器重新编译过的是系统应用, 结合新的文件系统EROFS, 硬把虚拟机跑的UI优化成这样,不简单了。顺路吐槽下月亮模式,这样搞拍摄都没乐趣了。

t_b42f2ea0b5bf401787c8c7d90c9d70a5.png
华为的修炼了深厚的内功,但营销也是炸天。鸿蒙昨天发布,方舟还不见踪影,有点吊人胃口的造势。

今天先谈下方舟,百度了下,JIT, AOT之类,说是跳过虚拟机,直接转成机器码,具体是怎样,没个定论。既然EMUI9.1都有方舟编译过的系统应用,去反编译去看下就好了。

网上有说华为市场的微博极速版是方舟编译的,我用jadx轻松反编译过, dex也在是正常不过的android apk。顺路扯下, 微博为了快可能没加壳, 就混淆了下, 通信串行化可能用的thrift, 应该蛮快。推送标准的集成了各大厂商的推送服务,统一推送联盟的推必达看来也是雷声大雨点小。

t_6281fee183e34294bcadae1a38c91035.png

那就尝试找找官方的应用, 到华为应用华为下载时钟, 华为市场的apk, 能顺路反编译的多数都不是了。
最后只能尝试从手机去找系统级的应用,设置或者相机可能是。USB连接, 开发者模式, 打开debug, 用adb通过包名去找应该可以。百度现学现卖。

找到手机所有的应用

D:\Project>adb shell pm list packages
package:com.huawei.scenepack
package:com.android.cts.priv.ctsshim
package:com.huawei.camera
package:com.hpbr.bosszhipin
package:com.huawei.android.tips
package:com.google.android.ext.services
package:com.huawei.synergy
package:com.huawei.android.launcher
package:com.android.gallery3d.overlay
package:com.android.mediacenter
package:com.android.providers.telephony
package:com.unionpay.tsmservice
package:com.huawei.androidx
......

com.huawei开头的包可能是系统应用, 以相机为例,
查找包的安装路径

D:\Project>adb shell pm path com.huawei.camera
package:/product/app/HwCamera2/HwCamera2.apk

拷贝apk

D:\Project>adb pull /product/app/HwCamera2/HwCamera2.apk
/product/app/HwCamera2/HwCamera2.apk: 1 file pulled. 30.2 MB/s (49544076 bytes in 1.565s)

反编译一看, 悲催了, 相机app为撒不用方舟build下。40多MB蛮大的apk, okhttp和glide看来是主流了。至于为什么叫camera2, 或者用的是android camera2接口?

t_440d18798068454ebf804009b842b5e4.png
依葫芦画瓢,继续找啊,终于找到两个特殊点的。这些应用的路径在/system/app下, 应该都是系统级的应用。

package:com.huawei.synergy
package:com.huawei.android.launcher

jadx反编译为空, 估计是了。 用解压工具看下apk结构.

t_cec90866a5bc4510b6ea96d33b4f8eb3.png
这下干净了, dex找不到了, 出去assets,res这些资源类的东西,最大的都集中在了resources.arsc里面。我们找最新的apktool 2.4.0看能不能解压出来。

E:\>apktool.bat d HwLauncher6.apk
I: Using Apktool 2.4.0 on HwLauncher6.apk
I: Loading resource table...
I: Decoding Shared Library (androidhwext), pkgId: 2
W: Unknown data detected. Skipping: 1920 byte(s)
......
I: Decoding values */* XMLs...
Exception in thread "main" java.lang.NullPointerException
        at brut.androlib.res.data.value.ResEnumAttr.serializeBody(ResEnumAttr.java:56)
        at brut.androlib.res.data.value.ResAttr.serializeToResValuesXml(ResAttr.java:64)
        at brut.androlib.res.AndrolibResources.generateValuesFile(AndrolibResources.java:704)
        at brut.androlib.res.AndrolibResources.decode(AndrolibResources.java:263)
        at brut.androlib.Androlib.decodeResourcesFull(Androlib.java:131)
        at brut.androlib.ApkDecoder.decode(ApkDecoder.java:124)
        at brut.apktool.Main.cmdDecode(Main.java:167)
        at brut.apktool.Main.main(Main.java:76)

一堆报警和错误。

感觉resources.arsc不是符合android标准的格式了。 至于是不是AOT的规范, 笔者只是业余玩下android不确定, 方舟编译出来的东西估计需要厂商的ROM去做支撑吧。 所以这个生态,兼容性, 硬件厂商,手机厂商,app厂商的利益,不烧钱怎么摆得平, 技术再好也只是个工具,没有资本的支撑也是假的。

所谓的技术和开源现在慢慢是有国界的,华为我们必须是要支持的,尽量不大喜欢华为的营销风格。师夷长技以制夷, 闭关是没出路的。

后面有空我们再聊聊鸿蒙, Fuchsia, Flutter, 宏内核/微内核, LiteOS, Little Kernel。

点赞 0
0条评论
其他心得