记一次高版本Android上对于远古Adobe AIR应用闪退的修复

发布于 2023-01-16  281 次阅读


前言

对象安利的《Dr. Stanley's House》系列游戏,前两作是Flash的,可以在各种远古小游戏网站上找到,第三作是Adobe AIR的,所以能找到的只有AndroidiOS两个平台,那自然是找前者咯。

不过由于打包游戏距离现在快十年了,兼容性自然已经相当于没有了,毕竟Android可不像Windows那样搞屎山兼容。

所以自然的,安装之后就报错了:

file

Generated by AppErrorsTracking
Project Url: https://github.com/KitsunePie/AppErrorsTracking
===============
[Device Brand]: Xiaomi
[Device Model]: Redmi K20
[Display]: SKQ1.220303.001 test-keys
[Android Version]: 12
[API Version]: 31
[System Locale]: zh_CN
[Package Name]: air.com.jamesli.stanley3
[Error Type]: Jvm
[Crash Time]: 2023-01-16T18:34:57.251
[Stack Trace]:
java.lang.UnsatisfiedLinkError: No implementation found for void com.adobe.air.AIRWindowSurfaceView.nativeSurfaceCreated() (tried Java_com_adobe_air_AIRWindowSurfaceView_nativeSurfaceCreated and Java_com_adobe_air_AIRWindowSurfaceView_nativeSurfaceCreated__)
    at com.adobe.air.AIRWindowSurfaceView.nativeSurfaceCreated(Native Method)
    at com.adobe.air.AIRWindowSurfaceView.surfaceCreated(AIRWindowSurfaceView.java:721)
    at android.view.SurfaceView.updateSurface(SurfaceView.java:1316)
    at android.view.SurfaceView.lambda$new$0$SurfaceView(SurfaceView.java:182)
    at android.view.SurfaceView$$ExternalSyntheticLambda2.onPreDraw(Unknown Source:2)
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1093)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3535)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2333)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9111)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1200)
    at android.view.Choreographer.doCallbacks(Choreographer.java:983)
    at android.view.Choreographer.doFrame(Choreographer.java:909)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1182)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:211)
    at android.os.Looper.loop(Looper.java:300)
    at android.app.ActivityThread.main(ActivityThread.java:8236)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1046)

那么就想办法修修呗。

移植?

先是看了下安装包内的文件,按理来说这种跨平台打包的东西,应该能手动移植到其他平台?

file

里面的adobeair.vch感觉是Adobe AIR的项目索引之类的,然后assets是素材,.swf是逻辑代码。

但是很可惜,网上没找到太多的相关资料,只找到一个有类似想法的人提的问题,但没有人给出可行的方案:How to run an android Adobe AIR app on PC (without using emulators)? - user2375809

拆东补西

但是在搜索这个报错的时候,发现了一篇看起来几乎和我当前状况一样的文章:让ps touch兼容9.0 - 琴梨梨OvO,于是照着博主的方法一步步尝试修复。

  1. 找到一个高版本Android可运行的、基于Adobe AIR的应用。

    这里我选择了找PS CC(PS Touch)的修复版本,因为网上资源比较多,挨个尝试即可。最终找到了这么个奇怪的版本:

    C0C1E3D178647C7D7AB99700CED628EF.jpg

  2. 尝试替换libCore.so,为了保险起见,其实其他几个libso我也对比了一下,不过确实就只有这个文件需要替换。

    469E912E60B9211AB5F084CB554CD59A.jpg

  3. 重新安装检查报错情况。

    file

    Generated by AppErrorsTracking
    Project Url: https://github.com/KitsunePie/AppErrorsTracking
    ===============
    [Device Model]: Redmi K20
    [Display]: SKQ1.220303.001 test-keys
    [Stack Trace]:
    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    Build fingerprint: 'Xiaomi/cupid/cupid:12/SKQ1.211006.001/V13.0.30.0.SLCCNXM:user/release-keys'
    Revision: '0'
    ABI: 'arm'
    Timestamp: 2023-01-16 20:26:47.320312440+0800
    Process uptime: 0s
    Cmdline: air.com.jamesli.stanley3
    pid: 25306, tid: 25306, name: amesli.stanley3  >>> air.com.jamesli.stanley3 <<<
    uid: 10210
    signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
    Abort message: 'No pending exception expected: java.lang.NoSuchMethodError: no static or non-static method "Lcom/adobe/air/AIRWindowSurfaceView;.nativeGetSoftKeyboardType()I"
     at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.Class) (Runtime.java:-2)
     at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1121)
     at void java.lang.Runtime.load0(java.lang.Class, java.lang.String) (Runtime.java:927)
     at void java.lang.System.load(java.lang.String) (System.java:1620)
     at void com.adobe.air.AndroidActivityWrapper.LoadRuntimeLibraries() (AndroidActivityWrapper.java:1413)
     at void com.adobe.air.AndroidActivityWrapper.(android.app.Activity) (AndroidActivityWrapper.java:240)
     at com.adobe.air.AndroidActivityWrapper com.adobe.air.AndroidActivityWrapper.CreateAndroidActivityWrapper(android.app.Activity, java.lang.Boolean) (AndroidActivityWrapper.java:222)
     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
     at void air.com.jamesli.stanley3.AppEntry.createActivityWrapper(boolean) (AppEntry.java:627)
     at void air.com.jamesli.stanley3.AppEntry.onCreate(android.os.Bundle) (AppEntry.java:246)
     at void android.app.Activity.performCreate(android.os.Bundle, android.os.PersistableBundle) (Activity.java:8281)
     at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:8245)
     at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1341)
     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:3751)
     at android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) (ActivityThread.java:3945)
     at void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) (LaunchActivityItem.java:106)
     at void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:135)
     at void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) (TransactionExecutor.java:95)
     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:2282)
     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
     at boolean android.os.Looper.loopOnce(android.os.Looper, long, int) (Looper.java:211)
     at void android.os.Looper.loop() (Looper.java:300)
     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:8236)
     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:556)
     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1046)
    '
  4. 修补dex,这一步其实在PS CC里面已经有前辈替我们完成了,所以咱们只需要将classes.dex改为classes2.dex然后把PS CC里面的classes.dex复制过来就行。

    file

  5. 再次安装查看修复情况,发现成功打开。

    file

修复成果

其实这次还是多亏了有前人栽树,我作为后人才能乘凉,不然的话,想要修复还是挺困难的。


The End