10

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


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

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

(我知道这种方法有一些严重的缺点,但客户仍然热衷于以这种方式进行 - 请参阅在 APK 文件中嵌入登录详细信息,每个用户都不同(或其他选项?)

这个问题与我在解压缩并更新自定义资产文件后重建 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

4

4 回答 4

10

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

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

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

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

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

但是,有一些警告:

  1. 我无法让它在签名的 APK 文件上工作。
  2. 某些版本的 aapt不能正常工作!他们不认识子文件夹...

解决1:

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

解决2:

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

于 2011-02-09T12:16:19.020 回答
3

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

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

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

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

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

于 2011-01-25T12:34:57.277 回答
2

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

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

于 2011-05-19T03:34:47.290 回答
1

为了扩展 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,除了注释和添加(必要时自定义)外,它将为空:

# 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条目来自定义资产位置

于 2011-01-25T14:15:20.673 回答