【问题标题】:Renaming the Package Name inside an APK在 APK 中重命名包名称
【发布时间】:2012-03-02 09:11:17
【问题描述】:

我创建了一个目前在市场上销售的 AIR 应用程序。要更新应用程序,显然我必须保持相同的包名。我的第一个版本是使用带有 ADT 插件的 Eclipse 打包的。

现在要使用我第一次开发应用程序时不可用的 AIR 3.0 Native Extensions (ANE),我目前必须使用 AIR 的命令行工具创建我的 APK。不幸的是,这些命令行工具强制你使用以“air”开头的包名。例如,我需要包名“com.example”。 AIR 创建包名称为“air.com.example”。

所以现在,由于软件包名称已更改,我无法在市场上更新我的应用程序。 Adobe 有这篇可怕的文章可以帮助您重命名和删除包中的“空气”。我不是一个伟大的程序员,所以这真的难倒我。 http://kb2.adobe.com/cps/875/cpsid_87562.html

显然,此信息在某些方面已过时或不正确。 我在使用 apkbuilder 的第 12 步完全跌跌撞撞:

 apkbuilder final.apk -u -z resources.arsc -f classes.dex

我收到此错误消息:

此工具已弃用。有关详细信息,请参阅 --help。 java.io.FileNotFoundException: resources.arsc 不存在

我已使用第 10 步来创建新的 resources.arsc 文件。它显然确实存在并且在正确的位置。我尝试将 apkbuilder 与来自其他项目的其他 resources.arsc 文件一起使用。我仍然收到相同的错误消息。

这个工作有机会吗?如果有人对此感兴趣,我有一个带有示例 AIR apk 的 zip 文件、用于所有命令行工作的 windows bat 文件以及所有需要的实用程序,因此不需要下载它们。要开始使用,您只需更改我的 path.bat 以适应您的系统。并且您需要 notepad++(或等效软件)来批量自动重命名多个文件中的包名称。 bradwallacedesign.com/dktimer/renameApkProject.zip

非常感谢!

【问题讨论】:

标签: android package apk rename


【解决方案1】:

这是在电脑上完成的。我不知道如何在 mac 上执行此操作。

我不建议使用它来去除“空气”。从一个空气包名称。如果您这样做,将不会提示用户在其设备上下载空气。用户将收到一条错误消息,而对问题没有任何线索。当然你可以使用 air captive runtime 来解决这个问题。

http://bradwallacedesign.com/share/renameAPK.zip

下载我的文件 (renameAPK.zip) 并将其解压缩到 c:\renameAPK。

所需文件:

  1. 我的文件 (renameAPK.zip) 包含 apkTool
  2. java jdk/jre
  3. 安卓 SDK
  4. notepad++(或可跨多个文件重命名的等效文本编辑器)

我制作了许多 bat 文件,因为我不知道如何将它们组合成一个文件。你需要编辑每一个来改变你的路径名和文件名,以便与你的计算机和你的 apk 文件一起工作。

我按照我使用它们的顺序对所有蝙蝠进行了编号。打开命令行后,输入我想要的 bat 文件的编号,然后按 tab 键自动完成 bat 文件的名称,然后按 enter 运行该 bat 文件。

说明:

双击 `openCmd.bat 以打开命令行,指向包含所有文件的目录。

0. 运行 0path.bat 来设置您的路径。 (我现在不记得是否需要 adobe air sdk,但我有它在我的路径中。显然,需要 JDK 并且我认为 jarsigner 和 zip align 的 android sdk。)

1. 运行 1decompileAPK.bat 让 apkTool 将您的应用反编译到名为 UNZIPPEDapk 的文件夹中

2.按照 2editManifest & PackageName - Instructions (not a bat).txt 中的说明在 UNZIPPEDapk 中使用 Notepad++ 编辑清单和包名称:

编辑AndroidManifest.xml:

a. 将包名从 air.oldPackageName 更改为 newPackageName

b. 编辑其他需要的条目:

c. 重命名“smali”文件夹中的文件夹系统,以便它与您的新软件包名称一起使用 例如: 如果旧包名称为:air/oldName,则更改文件夹以匹配新包名称:air/newName

使用 notepad++(或任何可以在多个文件中查找和替换文本的编辑器)


d. ctrl+shift+f --- "在文件中查找"

  find:
air/oldPackageName
  replace with:
newPackageName
  where:
all files in UNZIPPEDapk/smali

(我认为有超过 200 个替代品)

3. 运行 3buildDistFolder.bat 让 apkTool 在 UNZIPPEDapk\Dist 文件夹中构建新的 apk

4. 按照 4getMissingFiles - instructions.txt 中的说明在新版本中恢复 2 个丢失的文件:

a. 在 3buildDistFolder 期间没有构建两个文件:

3buildDistFolder.bat 在 \UNZIPPEDapk\dist 文件夹中构建了新的 apk,但未能复制 2 个文件:

(skipping hidden file 'C:\Users\computer\apkTool\UNZIPPEDapk\assets\META-INF

\AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.classpath') (跳过隐藏文件 'C:\Users\computer\apkTool\UNZIPPEDapk\assets\META-INF \AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.project')

从您的原始 apk 中获取这 2 个文件并将它们放入正确文件夹中的新 apk 中

b. 将 yourApp.apk 从 DKTimer/Dist/ 复制到 bat 文件所在的根目录。

5. 运行 5signAPK.bat 对 apk 进行签名。

developer.android.com/guide/publishing/app-signing.html

6. 运行 6verifySigned.bat 以验证签名是否正常

7.运行7zipAlign.bat来对齐apk文件。

developer.android.com/guide/developing/tools/zipalign.html


此时您已完成。如果您想在设备上进行测试,请继续。

8. 运行 8installAPK.bat 在 USB 连接设备上安装 apk。

9.如果要使用远程调试,请运行 9remoteDebugger.bat


我希望这对某人有所帮助。如果我忘记包含某些内容,请告诉我。 另外,如果您知道更好的方法,请发表评论(例如如何将其组合成 1 个长时间暂停的 bat 文件...)

【讨论】:

    【解决方案2】:

    您可以设置一个简单的环境变量来轻松禁用air. 前缀。 Adobe AIR 打包器中存在以下代码:

    String optOut = System.getenv("AIR_NOANDROIDFLAIR");
    if ((optOut == null) || (optOut.indexOf("true") == -1)) {
      packageName = "air." + packageName;
    }
    

    因此,只需将AIR_NOANDROIDFLAIR 环境变量设置为true,重新打包您的应用程序,它就不会有air. 前缀。 Google 如何在windowsmac 中为您的特定操作系统版本设置环境变量。

    例如,我在 Mac/Linux 上使用命令行编译器,所以我运行:

    > export AIR_NOANDROIDFLAIR=true
    > java -jar $AIR_HOME/lib/adt.jar -package -target apk-captive-runtime -storetype pkcs12 -keystore cert.p12 -storepass *** Main.apk Main-app.xml Main.swf
    

    警告:我不知道这有什么影响。根据上面某人的说明,这可能只是使用强制运行时的一个好主意(但这是从 AIR 3.8 开始的默认设置)。

    更新: Renaun Erickson said 应该不会造成问题。

    交叉发布here(略有不同的问题,相同的答案)。

    【讨论】:

    • 嘿,杰夫,我很清楚你在做什么。但不确定我去哪里实际输入'export AIR_NOANDROIDFLAIR = true' 我一直在疯狂地搜索这个,但我仍然不明白如何采用这种方法。我开始想也许我需要创建一些 .plist 文件?但是哪里?我在文件“export AIR_NOANDROIDFLAIR=true”中输入的唯一内容是什么?介意解释我在哪里设置的吗?抱歉,我只是坚持修复这个问题,因为我正在从使用原生 android 开发的旧应用程序切换到 AIR。我讨厌 Adob​​e。
    • @brybam - 事实上,我对 OSX 的了解还不够好,无法设置可从 GUI 运行的永久环境变量。但肯定信息就在那里。对不起!
    • 哇,如果这么简单,为什么 Adob​​e 在他们的网站上解释了这个过于复杂的多步骤过程,其中包括编辑和重新打包 APK? (我认为是 12 步或更多!)
    【解决方案3】:

    尝试了几个 apkRename 工具后,我发现它们对于某些应用程序都失败了,例如 HTC 设备上的 com.android.browser。

    原因在于 apktool 有时无法正确解压 apk 文件。


    所以,我创建了自己的工具:https://github.com/sjitech/ApkRename 不需要 apktool,不需要 aapt,只需要 java 和 jar 实用程序。 此实用程序直接修改 AndroidManifest.xml,因此无需通过 apktool 重新编译整个资源, 所以很干净。

    测试设备:11种(都是android 4+,但2.2+应该不行) 测试过的操作系统:Mac OS X 10.9 和 CentOS 6。(Cygwin 和 bash 4+ 应该没问题,但还没有测试过)

    【讨论】:

      【解决方案4】:

      我实际上尝试了布拉德的方法,无法想象每次我编译一个版本时都必须经历这个过程。所以我做了其他事情......我修改了 ADT,所以它不会插入“空气”。在开头并用更有用的扩展名替换它,例如“com”。

      以下是该方法的摘要:

      使用: jar xf adt.jar

      将 adt.jar 文件提取到桌面上的目录中。您可以在 {adobe SDK}/lib/ 中找到它

      查找文件 APKOutputStream.class

      com/adobe/air/apk/APKOutputStream.class

      在十六进制编辑器中打开它(例如,我使用的是 HxD)。搜索“空气”。 (不带引号,但包括点)。

      不要删除条目。我试过了,你不能,它破坏了课堂,它不会运行。但是,您可以做的是替换“空气”。用“com”。因为它具有相同数量的字符并且不会弄乱文件的长度。 com 前缀对我们大多数人来说更有用。

      保存修改后的 APKOutputStream.class 文件并用 JAR 重新打包。像这样:

      jar cfm ..\patchedadt.jar ..\MANIFEST.MF *

      您需要从名为 META-INF 的包的子目录中复制该 MANIFEST.MF 文件

      将您的 patchedadt.jar 重命名为 adt.jar 并将其放回 lib 目录。与 Flash Builder 和所有这些外衣配合使用。

      不用说,当您在那里时,您会想要制作没有“com”的包裹。前缀,这样您就不会以 com.com.your.package.name 结尾。

      也许有一种更简单的方法,但我不知道有什么更好的方法,除了反编译 apk、修改它并重新编译之外,没有其他人有答案,这甚至都行不通。所以我想我会分享我所做的事情,以防其他人以后偶然发现它:)

      吉姆

      【讨论】:

      • 不错的解决方案,我遵循了。
      • @jim - 聪明的解决方案!我不确定您是否已经看到我的答案,但是 ADT 中内置了一个环境变量设置,因此您可以轻松禁用 air. 前缀。
      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 2018-12-11
      • 2016-09-02
      • 1970-01-01
      • 2015-12-03
      • 2017-03-08
      • 2022-12-21
      • 2018-12-24
      相关资源
      最近更新 更多