在APK中更改包名

8
我已经创建了一个目前正在市场上销售的AIR应用程序。为了更新此应用程序,显然我必须保持相同的软件包名称。我的第一个版本是使用带有ADT插件的Eclipse打包的。
现在,为了使用AIR 3.0 Native Extensions(ANE)(当我首次开发应用程序时不可用),我目前必须使用AIR的命令行工具创建我的APK。不幸的是,这些命令行工具强制你拥有以单词“air”开头的软件包名称。例如,我需要包名称“com.example”。AIR将包名称创建为“air.com.example”。
因此,现在我无法在市场上更新应用程序,因为软件包名称已更改。Adobe发布了这篇可怕的文章来帮助您重命名并删除软件包中的“air”。我不是一个优秀的程序员,因此这真的使我感到困惑。 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文件。它显然存在并且位于正确的位置。我尝试使用从其他项目中获取的其他resources.arsc文件使用apkbuilder。我仍然收到相同的错误消息。

这有可能会起作用吗?如果有人对此感兴趣,我有一个带有示例AIR apk的zip文件,用于所有命令行工作的Windows批处理文件以及所有必需的实用程序,因此它们无需下载。要开始,您只需要更改我的path.bat以适合您的系统。而且您需要notepad++(或等效物)批量自动重命名几个文件中的软件包名称。 bradwallacedesign.com/dktimer/renameApkProject.zip

非常感谢!


1
为了补充brad51的回答,对于那些没有密钥库但只有.p12文件(在Flash中工作)的人,这里有一篇有用的文章可以进行转换:http://aleksmaus.blogspot.com/2012/01/android-application-signing-with-pkcs12.html 另外,我没有关于文件未被移动的错误。 - user1618264
1
此外,这个链接在创建密钥库方面非常有帮助:http://www.mobilefish.com/tutorials/java/java_quickguide_keytool.html - Howard
4个回答

9

这是在PC上完成的。我不知道如何在Mac上完成此操作。

我不建议使用此方法来删除"air.",因为这样会导致用户无法在设备上下载Air。相反,用户将收到一个错误消息,而没有任何关于问题的线索。当然,您可以使用Air Captive Runtime来解决此问题。

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

下载并解压我的文件(renameAPK.zip)到C:\ renameAPK中。

所需文件:

  1. 我的文件(renameAPK.zip),其中包含apkTool
  2. Java JDK / JRE
  3. Android SDK
  4. Notepad++(或能够重命名多个文件的等效文本编辑器)

由于我不确定如何将它们合并成一个文件,所以我制作了许多bat文件。您需要编辑每个文件以更改路径名和文件名,以使其与您的计算机和apk文件配合使用。

我对所有的bat进行了编号,以我使用它们的顺序为准。一旦打开了命令行,我就键入我想要的bat文件的编号,然后按Tab键自动完成bat文件的名称,最后按Enter运行该bat文件。

说明:

双击 `openCmd.bat 打开一个指向所有文件的目录的命令行。

0. 运行 0path.bat 设置路径。(我现在记不起来Adobe Air SDK是否需要了,但我已将它添加到我的路径中。显然,需要JDK和Android SDK来使用jarsigner和zipalign。)

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

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

编辑AndroidManifest.xml:

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

b. edit other needed entries:

c. rename folder system inside "smali" folder so that it works with your new package name for example: if the old package name was: air/oldName then change the folders to match the new package name: air/newName

use notepad++ (or any editor that can find and replace text over many files)


d. ctrl+shift+f --- "Find in files"

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

(i think there were over 200 replacements)

3. run 3buildDistFolder.bat to have apkTool build the new apk in the UNZIPPEDapk\Dist folder

4. follow the instructions in 4getMissingFiles - instructions.txt to reinstate the 2 missing files in the new build:

a. Two files were not built during 3buildDistFolder:

3buildDistFolder.bat built the new apk in the \UNZIPPEDapk\dist folder but it failed to copy 2 files:

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

\AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.classpath') (skipping hidden file 'C:\Users\computer\apkTool\UNZIPPEDapk\assets\META-INF \AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.project')

grab these 2 files from your original apk and drop them into your new apk in the correct folder

b. copy yourApp.apk from DKTimer/Dist/ to root directory where your bat files are.

5. run 5signAPK.bat to sign the apk.

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

6. run 6verifySigned.bat to verify the signing worked properly

7. run 7zipAlign.bat to align the apk file.

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


You are finished at this point. Continue on if you want to test it on a device.

8. run 8installAPK.bat to install the apk on a usb connected device.

9. run 9remoteDebugger.bat if you want to use remote debugging.


i hope this helps someone. let me know if i forgot to include something. also, if you know a better way to do this, please comment (such as how to combine this into 1 long pausing bat file...)


6

有一个简单的环境变量,可以轻松地禁用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 这不应该会引起问题。

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


嘿,杰夫,我基本上明白你在做什么。但是我不确定去哪里实际输入“export AIR_NOANDROIDFLAIR=true”。我已经疯狂地谷歌了这个问题,但我还是不明白如何进行这种方法。我开始觉得也许我需要创建一个.plist文件?但是在哪里呢?我在文件中唯一要输入的是“export AIR_NOANDROIDFLAIR=true”吗?能否解释一下我应该在哪里设置这个?抱歉,因为我正在从一个使用原生安卓开发的旧应用切换到AIR,所以我被困在修复这个问题上。我讨厌Adobe因为这个。 - brybam
@brybam - 实际上,我对OSX的了解不够深入,无法设置从GUI中起作用的永久环境变量。但是肯定有相关信息可以找到。抱歉! - Jeff Ward
哇,如果这么简单,为什么Adobe在他们的网站上解释了一个复杂的多步骤过程,需要编辑和重新打包APK呢?(我想它有12个或更多步骤!) - OMA

5

尝试过几个apk重命名工具后,我发现它们都不能成功地为某些应用程序进行重命名,例如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+应该可以,但尚未测试)


1
我其实尝试了Brad的方法,但无法想象每次编译发布都必须经历这个过程。因此我做了其他事情...我修改了ADT,使其不会在开头插入"air.",而是用更有用的扩展名替换它,例如"com."。
以下是这种方法的摘要:
使用以下命令: jar xf adt.jar 将adt.jar文件提取到桌面上的目录中。您可以在{adobe SDK}/lib/中找到它。
查找APKOutputStream.class文件。

com/adobe/air/apk/APKOutputStream.class

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

不要删除该条目。我试过了,你不能删除,它会损坏类并且无法运行。然而,你可以用"com."替换"air.",因为它具有相同数量的字符并且不会影响文件长度。对于我们大多数人来说,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

好的解决方案,我已经跟随它了。 - Riskhan
@jim - 聪明的解决方案!我不确定你是否已经看到我的答案,但是ADT内置了一个环境变量设置,因此您可以轻松禁用air.前缀。 - Jeff Ward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接