重新包装APK文件以包含自定义资产 - 使用什么构建工具?

时间:2011-01-25 11:59:26

标签: android ant apk aapt

更新:这是一篇旧帖子,以下对损坏的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工具:首先,这个工具已被弃用,这是一个负面因素。我也无法使用它在解压缩文件夹中的工作。我想我错过了一个apkbuilder之前的步骤,因为apkbuilder请求资源zip存档,我有一个资源文件夹。

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

  4. ?????:可能还有其他一些我未列出/发现的选项,我有兴趣听到。

  5. 我意识到钻研通常被我的想法掩盖的齿轮会导致困难。但我知道很多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 个答案:

答案 0 :(得分:9)

用我们最终选择的方法和“记录”来回答我自己的问题:

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

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

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

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

但是,有一些警告:

  1. 我无法使用已签名的APK文件。
  2. 某些版本的aapt 无法正常工作!他们无法识别子文件夹......
  3. 解决1:

    1. 从eclipse导出APK作为未签名的APK。
    2. 使用keytool生成密钥(请参阅Android dev文档)。
    3. 使用aapt。
    4. 使用jarsigner签名APK。
    5. 要解决2:

      我无法真正帮助解决这个问题。我尝试下载的每个版本的SDK(在Mac上)都包含一个无法识别子文件夹的aapt工具。一位同事下载了一个有效的版本,但我们仍然无法弄清楚他下载了哪个版本,所以我们保留了这个“魔术”副本并重命名,并将使用它直到我们找到一个有效的新版本。

答案 1 :(得分:3)

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

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

如果没有IDE,您无需了解任何有关ANT的编译和打包,只需按照此处的步骤操作:

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

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

答案 2 :(得分:2)

可能有点迟了,但这篇文章出现在很多搜索中,所以我认为这可能会引起人们的兴趣。

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

答案 3 :(得分: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 条目来自定义资源位置