首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Adobe重新包装APK

用Adobe重新包装APK
EN

Stack Overflow用户
提问于 2021-02-02 01:15:17
回答 1查看 493关注 0票数 1

有一个用Flash制作的安卓游戏,它是用Adobe打包的,但是它不再适用于7以上的安卓版本。

我下载了哈曼的Adobe AIR并尝试使用ADT包命令重新打包应用程序。我使用了存在于APK的application.xml文件夹中的assets/META-INF/AIR/文件。但是,这个应用程序使用扩展名,看起来ADT需要ANE ()文件,或者有其他方式吗?

我在网上找不到ANE文件。但一些中国黑客能够重新打包这款应用,在安卓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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-06 18:13:55

因此,我终于能够重新打包APK,它可以在最近的Android版本上工作!

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

然后,在bin目录的哈曼的Adobe中,我为每个扩展创建了一个目录:

代码语言:javascript
运行
复制
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

在APK内部,在路径/assets/META-INF/AIR/extensions/中可以找到未打包的扩展ANEs。

对于每个扩展名,将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扩展,目录结构如下所示:

代码语言:javascript
运行
复制
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文件,这些是它的内容:

代码语言:javascript
运行
复制
<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 <!-- -->评论了platform块。

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

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
..\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目录(带有未打包的an )。我将application.xml文件放在我为应用程序创建的目录中,放在bin目录中。在这个目录中,我还创建了一个extensions目录,并将编译后的ANE文件放入其中。因此,这个应用程序的目录结构现在如下所示:

代码语言:javascript
运行
复制
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

为了支持Android11(目前是最新的),我将清单中的targetSdkVersion更改为30。Android与SDK相关性:https://developer.android.com/studio/releases/platforms

我还将<application xmlns="http://ns.adobe.com/air/application/17.0">更改为<application xmlns="http://ns.adobe.com/air/application/33.1">,以便它使用最新的Flash版本(33.1来自哈曼)。

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

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
..\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:对于HARMAN最新的Adobe,不再需要此步骤)。

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

代码语言:javascript
运行
复制
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分析APK时遇到的错误是:INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED

然后,我在AIR中遇到了本期。打开AIRSDK_Windows\lib\adt.cfg向我展示了注释行:#UncompressedExtensions=emd,tfl,tflite,pb,我取消了注释,并在其中添加了arsc扩展名,这是Android抱怨的文件resources.arsc的扩展名。这修复了用新配置重新打包APK后出现的问题。

编辑2022-02-11

使用最新的Adobe,如果不希望使用Android构建,则应将以下行添加到application.xml文件中的<android>部分。请参阅:https://github.com/airsdk/Adobe-Runtime-Support/issues/1527#issuecomment-1007293682

代码语言:javascript
运行
复制
<BuildLegacyAPK>true</BuildLegacyAPK>

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

代码语言:javascript
运行
复制
AndroidPlatformSDK=C:/Users/<user>/AppData/Local/Android/Sdk
JAVA_HOME=C:/Program Files/Java/jdk-11.0.14

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

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

代码语言:javascript
运行
复制
<receiver android:name="com.milkmangames.extensions.android.CMBootReceiver" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66002388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档