【问题标题】:Repackage APK file to contain custom assets - what build tool to use?重新打包 APK 文件以包含自定义资产 - 使用什么构建工具?
【发布时间】:2011-01-25 11:59:26
【问题描述】:

更新:这是一篇旧帖子,下面对损坏的aapt 版本的引用将过时。


根据之前的反馈,我将自定义文本字段存储在我的应用的资产目录中。

我将使用资产文件中的默认用户详细信息编写应用程序,并且客户端希望为每个用户重新构建应用程序,包括资产文件中该用户的详细信息。

(我知道这种方法有一些严重的缺点,但客户仍然热衷于这样做 - 见Embed login details in APK file, different for each user (or other options?)

这个问题与我在解压并更新自定义资产文件后重建 APK 文件时遇到的问题有关。我非常确信我遗漏了一些小东西,但是,我找到的关于这些方法的文档和帖子对新手来说并没有足够的帮助。

  1. aapt - Android sdk 工具:不幸的是,android 文档 [下面的链接 2] 上关于“使用 aapt”的 android 文档非常有限。控制台命令 -help 显示更多信息。当尝试使用它仅将文件添加到 test.apk 时,它最终会删除原始文件,并创建一个仅包含我尝试添加的文件的新文件 test.apk.zip。我无法找到正确的命令行组合来获取解压缩的 apk 并重新打包它——这将是我的第一个奖励。

  2. apkbuilder - Android sdk 工具:首先,该工具已被弃用,这对其不利。我也无法让它与我在该解压缩文件夹中的内容一起使用。我想我缺少一个 pre-apkbuilder 步骤,因为 apkbuilder 要求提供资源 zip 存档,并且我有一个资源文件夹。

  3. ant - 构建工具:其他类似的帖子说用 ant 构建,而不是使用 android 工具。我无法让蚂蚁工作。一个让 Ant 与 Android 一起工作的特定链接 [下面的链接 3] 看起来很有希望,但看起来它适用于不同的 android sdk(我的由 android 生成的 build.xml 看起来与他的不同)。不幸的是,我对 ant 知之甚少,并且无法成为足以解决我当前问题的专家。
    除了下面 NickT 的解决方案 - 运行 ant 脚本给了我错误
    taskdef class com.android.ant.SetupTask cannot be found using the classloader AntClassLoader[]
    我在网上找到了一些关于这个错误的引用,已经确认 local.properties 有一个 sdk.dir 设置指向我的 android sdk 安装文件夹 (sdk.dir=/Applications/android-sdk-mac_86)。

  4. ?????:可能还有一些我没有列出/发现的其他选项,我很想听听。

我意识到深入研究通常被我的想法掩盖的齿轮可能会导致困难。但我知道很多 SO 用户可以做很多这样的事情,我希望我能引起他们中的一些人的兴趣。感谢您的帮助。

(Mac Snow Leopard 10.6 64 位上的 Eclipse 3.6)

PS,我还不能发布超过 1 个超链接,所以我提供了这些地址以显示我的问题的更多信息。

(1):stackoverflow.com/questions/4783160/embed-login-details-in-apk-file-different-for-each-user-or-other-options

(2):developer.android.com/guide/developing/tools/aapt.html

(3):www.disgruntledrats.com/?p=27

【问题讨论】:

标签: android ant apk aapt


【解决方案1】:

用我们最终选择的方法回答我自己的问题,并“记录在案”:

我无法让 Ant 为我正常工作(我缺乏理解)。

我最终使用了 aapt 工具。它按照 Android sdk 文档工作,使用起来非常简单:

aapt add -v Test.apk "assets/readme.txt"

这将添加一个 readme.txt 文件(我们将它存储在当前运行文件夹的子文件夹中,称为 assets。如果您想将新文件存储在其他位置,aapt 确实提供了一个命令行开关来指定)

但是,有一些注意事项:

  1. 我无法让它处理签名的 APK 文件。
  2. 某些版本的 aapt 无法正常工作!他们无法识别子文件夹...

解决1:

  1. 从 Eclipse 中将 APK 导出为未签名的 APK。
  2. 使用 keytool 生成密钥(请参阅 Android 开发文档)。
  3. 使用 aapt。
  4. 使用 jarsigner 为 APK 签名。

解决2:

我真的无能为力。我尝试下载的每个版本的 SDK(在 Mac 上)都包含一个无法识别子文件夹的 aapt 工具。一位同事下载了一个有效的版本,但我们仍然无法确定他下载的是哪个版本,所以我们保留了这个“神奇”副本并对其进行了重命名,并将一直使用它,直到我们找到一个有效的新版本。

【讨论】:

  • 您能解释一下第一个解决方案中的第 2 阶段和第 4 阶段吗?
  • 非常感谢您的回答。正是我想要的。 1 或 2 还没有问题,因为我还没有签署我的 apk,但想动态更改数据,这很好。
  • 感谢您的帖子。它引导我找到我的解决方案。对于自动化,请参阅my post
  • 您可以调用“unzip app.apk -d ./app”,然后调用“rm -rf ./app/META-INF”。然后将文件压缩备份并将其重命名为 .apk,这将为您提供同一 apk 文件的未签名版本。
【解决方案2】:

最简单的解决方案是使用脚本将应用的模板源提供给您的客户,该脚本可以从头开始重建应用。

这样您的客户只需更改文件夹中的资产,双击批处理文件并在大约一分钟内获取 apk。

您无需了解任何关于 ANT 的知识即可在没有 IDE 的情况下进行编译和打包,只需按照此处的步骤操作即可:

http://developer.android.com/guide/developing/other-ide.html

ANT 脚本由“android create”“android update”命令生成。然后你只需要运行“ant release”就可以了。

【讨论】:

  • 谢谢,Yahel,不幸的是我已经阅读了该链接,但蚂蚁仍然没有构建。 Nick T 的解决方案在下面有更多详细信息。
【解决方案3】:

可能有点晚了,但是这篇文章出现在很多搜索中,所以我认为这可能很有趣。

我刚刚使用标准 Zip 工具通过删除 META-INF 文件夹来“取消签名”APK,更新了所有资产文件,然后使用 jarsigner 退出了 APK。 (如果我能找到一种不使用 jarsigner 来签署 JAR 的方法,那么我们就不需要到处安装 Java SDK,这将非常有用 - 任何人都有想法?)

【讨论】:

    【解决方案4】:

    为了扩展 Yahel 的答案,是的,我认为 Ant 是要走的路。这可能有点吓人,但令人惊讶的是它“开箱即用”的效果如何,没有太多的麻烦。自定义它需要一些阅读,但我做到了,所以我会从我的经验中给你一些好处。

    首先按照建议创建一个示例应用程序。假设您希望在 c:\junk. 中创建它 然后从 Android SDK\tools 目录中的命令提示符输入:

    android create project -t 5 -n AndSampleApp -p c:\junk\AndSampleApp -a AndSampleApp -k com.yourpackage.andsample.
    

    (-t 5 为您提供 API 级别 7,键入 'android list targets' 以查看其他选项)

    假设您一直在 Eclipse 工作区(我机器上的 /dev/projects/EclipseHelios/AndroidWorkspace)中构建项目。将示例应用的 build.xml 和 build.properties 复制到 Eclipse 中的项目文件夹中

    并编辑新创建的 build.xml 并删除该行

    <project name="AndSampleApp" default="help">
    

    并将其替换为:

    <project>
    

    现在编辑新创建的 build.properties,除了 cmets 和 add(在必要时自定义)之外将为空:

    # The password will be asked during the build when you use the 'release' target.
    # OH NO IT WON'T! IF YOU PUT THE KEYS & PWDS IN AS BELOW - It'S AUTOMATIC
    
    # Customised (hard coded) section ---------------------
    
    projectname=YourActualProjectName
    
    # Line below is the parent folder of where the sources are
    workspace.dir=/dev/projects/EclipseHelios/AndroidWorkspace
    
    # Line below is where you want the binaries to go
    outbasebase.dir=/dev/projects/AntBuilds
    
    key.store=c:/users/you/your-release-key.keystore
    key.alias=your_release_alias
    key.store.password=YourSecretPassword
    key.alias.password=YourSecretPassword
    #------------------------------------------------------
    
    ant.project.name=${projectname}
    base.dir=${workspace.dir}/${projectname}
    source.dir=${base.dir}/src
    outbase.dir=${outbasebase.dir}/${projectname}
    out.dir=${outbase.dir}/bin
    layout.dir=${base.dir}/res/layout
    

    如果您随后在 /dev/projects/EclipseHelios/AndroidWorkspace/YourActualProjectName 中获得命令行提示符

    然后输入“ant release”,您最终应该会在 /dev/projects/AntBuilds/YourActualProjectName 中得到一个构建并签名的 apk

    您应该能够通过在 build.properties 中添加 assets.dir 条目来自定义资产位置

    【讨论】:

    • 谢谢,尼克,我仍然收到错误消息:“taskdef class com.android.ant.SetupTask cannot be found using the classloader AntClassLoader[]” - 已使用此信息更新了原始帖子。跨度>
    • 看这里,属性似乎不接受非 ascii 字符:blog.klacansky.com/matter-code/…
    • 谢谢,Yahel,我找到了那个链接——我认为我没有用“/Applications/android-sdk-mac_86”破坏任何非 ascii 规则。今天晚些时候,我将在这些答案中添加有关我如何开始工作的信息。
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2018-03-08
    • 1970-01-01
    • 2012-09-18
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多