【问题标题】:Repackage APK with Adobe AIR使用 Adob​​e AIR 重新打包 APK
【发布时间】:2021-02-02 01:15:17
【问题描述】:

有一个使用 Adob​​e AIR 打包的 Flash 制作的 Android 游戏,但它不再适用于 7 以上的 Android 版本。我想知道是否可以使用 HARMAN's Adobe AIR 重新打包这个游戏?

我已下载HARMAN's Adobe AIR 并尝试使用ADT package command 重新打包应用程序。我使用了 APK 的 assets/META-INF/AIR/ 文件夹中的 application.xml 文件。但是,这个应用程序使用了扩展,并且似乎 ADT 需要 ANE(AIR Native Extension)文件,还是有其他方法?

我无法在线找到 ANE 文件。但是一些中国黑客能够重新打包该应用程序,在Android 10中运行,并且文件夹assets/META-INF/AIR/extensions文件夹与原始apk相比没有任何变化。但是,lib/armeabi-v7a 文件夹中的文件已更新,并包含一个名为 libX86Bridge.so 的新文件。

原始应用使用的扩展是:

  • com.adobe.ane.social
  • com.milkmangames.extensions.AndroidIAB
  • com.chartboost.plugin.air
  • com.milkmangames.extensions.CoreMobile
  • com.jirbo.airadc.AirAdColony
  • com.milkmangames.extensions.GoViral

【问题讨论】:

  • 如果原始应用程序包含外部 ANE 文件,则重新打包将需要相同(或最新版本)的相同文件。除非您更改应用程序,否则不需要 ANE 文件。
  • @crooksy88 在我的问题中添加了更多信息以回答您的问题。

标签: android flash air ane


【解决方案1】:

所以我终于能够重新打包 APK,它适用于最新的 Android 版本!

首先,我用归档管理器打开了 APK 文件(APK 是一个 ZIP 文件),然后使用dex2jar 工具将 APK 内的classes.dex 文件转换为 JAR 文件。 JAR 文件(也是一个 ZIP 文件)内部是应用程序使用的 AIR 本机扩展中已编译的 Java 类。

然后,在Adobe AIR by HARMANbin 目录中,我为每个扩展创建了一个目录:

AIRSDK_Windows\bin
├── com.adobe.ane.social
├── com.milkmangames.extensions.AndroidIAB
├── com.chartboost.plugin.air
├── com.milkmangames.extensions.CoreMobile
├── com.jirbo.airadc.AirAdColony
├── com.milkmangames.extensions.GoViral

解压后的扩展 ANE 可以在 APK 中找到,路径为 /assets/META-INF/AIR/extensions/

对于每个扩展,将 catalog.xmllibrary.swf 添加到 ZIP 文件中,并将 ZIP 扩展重命名为 SWC(例如:com.adobe.ane.social.swc)。然后,将 SWC 文件放在相应扩展的目录中。

在 APK 的每个扩展目录中,都有一个路径 META-INF/ANE/,其中可以找到文件 extension.xml 和其他文件(例如:/assets/META-INF/AIR/extensions/com.adobe.ane.social/META-INF/ANE/)。我将这些目录中的所有文件放在我在bin 目录中创建的各个扩展的目录中。例如,对于com.chartboost.plugin.air 扩展,目录结构如下所示:

AIRSDK_Windows\bin
├── com.adobe.ane.social
├── com.milkmangames.extensions.AndroidIAB
├── com.chartboost.plugin.air
│   ├── com.chartboost.plugin.air.swc
│   ├── extension.xml
│   ├── Android-ARM
├── com.milkmangames.extensions.CoreMobile
├── com.jirbo.airadc.AirAdColony
├── com.milkmangames.extensions.GoViral

我打开了extension.xml 文件,其中的内容如下:

<extension xmlns="http://ns.adobe.com/air/extension/16.0">
    <id>com.chartboost.plugin.air</id>
    <versionNumber>5.5.0</versionNumber>
    <platforms>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>libChartboostAir.jar</nativeLibrary>
                <initializer>com.chartboost.plugin.air.ChartboostExtension</initializer>
                <finalizer>com.chartboost.plugin.air.ChartboostExtension</finalizer>
            </applicationDeployment>
        </platform>
        
        <platform name="iPhone-ARM">
            <applicationDeployment>
                <nativeLibrary>libChartboostAir.a</nativeLibrary>
                <initializer>ChartboostExtInitializer</initializer>
                <finalizer>ChartboostExtFinalizer</finalizer>
            </applicationDeployment>
        </platform>
        
        <platform name="default">
            <applicationDeployment/>
        </platform>
        
    </platforms>
</extension>

由于我没有为iPhone-ARM 打包游戏,也没有libChartboostAir.a 文件,因此我使用XML cmets &lt;!-- --&gt; 评论了platform 块。

我们可以看到有一个default 平台(我注意到所有扩展都有一个)。因此,我为default 平台创建了一个目录,并将library.swfAndroid-ARM 目录复制到它。然后将两个目录放在platform 目录中。目录结构现在如下所示:

AIRSDK_Windows\bin
├── com.adobe.ane.social
├── com.milkmangames.extensions.AndroidIAB
├── com.chartboost.plugin.air
│   ├── com.chartboost.plugin.air.swc
│   ├── extension.xml
│   ├── platform
│   │   ├── Android-ARM
│   │   │   ├── library.swf
│   │   │   ├── <other bunch of files>
│   │   ├── default
│   │   │   ├── library.swf
├── com.milkmangames.extensions.CoreMobile
├── com.jirbo.airadc.AirAdColony
├── com.milkmangames.extensions.GoViral

然后,从我们一开始得到的 JAR 文件(从 classes.dex 转换而来),我得到了与 com.chartboost.plugin.air 相关的所有类,并将它们放在一个名为 libChartboostAir.jar 的 ZIP 存档中。然后我将libChartboostAir.jar 放在Android-ARM 目录中。

最后,对于这个扩展,我运行了以下命令来生成 ANE 文件:

..\adt.bat -package -target ane com.chartboost.plugin.air.ane extension.xml -swc com.chartboost.plugin.air.swc -platform Android-ARM -C platform/Android-ARM . -platform default -C platform/default library.swf

我按照上述步骤为其他扩展生成了 ANE 文件。最后,JAR 文件中有一些类(从 classes.dex 生成)我没有从任何扩展名放入 JAR 文件中,因为我不知道它们属于哪里。所以,我只是将它们放在一个随机扩展的 JAR 文件中。这不是问题,因为重要的是所有类最终都放置在新的 classes.dex 文件中,使用与原始文件相同的目录结构。

编译完所有 ANE 文件后,我在 bin 目录中为我要重新打包的应用程序创建了一个目录。

在原始 APK 的 assets 目录中,有应用的 SWF 文件和带有应用图标的 _Pic_Gen 目录。我将它们都放在我刚刚创建的目录中。在原始 APK 的 /assets/META-INF/AIR/ 目录中,有一个 application.xml 文件和一个 extensions 目录(带有未打包的 ANE)。我将application.xml 文件放在了我为应用程序创建的目录中的bin 目录中。在这个目录中,我还创建了一个extensions 目录,并将编译好的ANE文件放在里面。所以,这个应用程序的目录结构现在看起来像这样:

AIRSDK_Windows\bin
├── MyApp
│   ├── application.xml
│   ├── _Pic_Gen
│   ├── MyApp.swf
│   ├── extensions
│   │   ├── com.adobe.ane.social.ane
│   │   ├── com.milkmangames.extensions.AndroidIAB.ane
│   │   ├── com.chartboost.plugin.air.ane
│   │   ├── com.milkmangames.extensions.CoreMobile.ane
│   │   ├── com.jirbo.airadc.AirAdColony.ane
│   │   └── com.milkmangames.extensions.GoViral.ane

我把application.xml里面的manifest里面的targetSdkVersion改成了30,为了支持Android 11(目前是最新的)。 Android版本和SDK相关:https://developer.android.com/studio/releases/platforms

我还将&lt;application xmlns="http://ns.adobe.com/air/application/17.0"&gt; 更改为&lt;application xmlns="http://ns.adobe.com/air/application/33.1"&gt;,以便它使用最新的Flash Player 版本(33.1 来自HARMAN)。

然后,我使用 OpenSSL 创建了一个自签名证书(为此我使用了 Linux):

openssl req -newkey rsa:2048 -x509 -keyout cakey.pem -out cacert.pem -days 10000
# entered my password
openssl pkcs12 -export -in cacert.pem -inkey cakey.pem -out myapp.p12

最后,我可以打包新的 APK,使用:

..\adt.bat -package -target apk -storetype pkcs12 -keystore myapp.p12 MyApp.apk application.xml -extdir extensions MyApp.swf _Pic_Gen
# entered certificate's password

编辑 2021-05-19编辑 2022-02-19:哈曼最新的 Adob​​e AIR 不再需要此步骤。)

但是,对于 Android 11 及更高版本,APK 现在必须使用 APK 签名方案 v2 或更高版本进行签名(请参阅:https://stackoverflow.com/a/66041713/3049315)。使用apksigner(Android SDK 提供),您可以这样做:

C:\Users\<user>\AppData\Local\Android\Sdk\build-tools\<version>\apksigner.bat sign -v --out MyApp_v2signed.apk --ks myapp.p12 MyApp.apk

然后生成了 APK,我可以在最新的 Android 版本上玩游戏。

编辑 2021-06-25

显然,在某些设备上,打开 APK 时会出现错误提示“解析此包时出现问题”。

我在使用 Android Studio 分析 APK 时遇到的错误是:INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED

然后我在 AIR SDK 中遇到了this issue。打开AIRSDK_Windows\lib\adt.cfg 向我展示了注释行: #UncompressedExtensions=emd,tfl,tflite,pb 我取消了它的注释并添加了arsc 扩展名,这是Android Studio 抱怨的文件resources.arsc 的扩展名。这解决了使用新配置重新打包 APK 后的问题。

编辑 2022-02-11

对于最新的 Adob​​e AIR,如果不想使用 Android SDK 进行构建,则应在 application.xml 文件的 &lt;android&gt; 部分下添加以下行。见:https://github.com/airsdk/Adobe-Runtime-Support/issues/1527#issuecomment-1007293682

<BuildLegacyAPK>true</BuildLegacyAPK>

另一种选择是使用 Android SDK 进行构建,在这种情况下,应在文件 AIRSDK_Windows\lib\adt.cfg 中添加以下行(替换为正确的路径):

AndroidPlatformSDK=C:/Users/<user>/AppData/Local/Android/Sdk
JAVA_HOME=C:/Program Files/Java/jdk-11.0.14

请注意,必须使用 Java 11 或更高版本。

此外,Android 12 现在要求具有意图过滤器的接收器具有属性android:exported。示例:

<receiver android:name="com.milkmangames.extensions.android.CMBootReceiver" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2012-04-29
    • 2018-12-17
    • 1970-01-01
    • 2013-02-24
    • 2023-03-15
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多