2

我被要求自动化构建可以由DexClassLoader. 这个想法是,不是手动导出到 .jar 文件,然后运行dx脚本以添加classes.dex到主项目资产目录中的新 .jar,而是辅助项目的正常编译会自动将动态可加载的 .jar 复制到主项目.

看起来我可以通过将辅助项目标记为 Android 库(以便它编译为 .jar)并添加调用dx脚本的 Eclipse Builder 来做到这一点。我有一个 bash 脚本和一个传递${project_loc}/bin/${resource_name}.jar给脚本的 .launch 包装器;如果我将 bash 脚本放在主项目的根目录中,%0会告诉我在哪里复制可加载的 .jar。

当然,dx不是上路。我想我会做一个`which adb`然后使用find......但adb也不在路径上!

所以,我的问题是:是否有一个包含 Android SDK 位置的 Eclipse 字符串变量?

4

2 回答 2

0

一位同事指出,其中${project_classpath}包含 SDK 目录中的路径annotations.jar。这让我写了这个脚本:

#!/bin/bash

#####
##### 获取运行此脚本的目录。
##### 我们将输出写入 ${client}/assets
#####

客户=${0%/*}

#####
##### 获取输入参数;计算输出
#####

输入=$1
输出=${client}/assets/${input##*/}

#####
##### 使用classpath参数查找最新的dx脚本:
#####

# 把 : 变成 \n
类路径=${2//:/\\n}

# 找到引用 annotations.jar 的行
注释=`echo -e $classpath | grep 注释`

# 去除文件名
路径=${注解%/*}

# 可能有多个副本。我们得到访问时间和路径。
# 我们输出 : 而不是 \n 因为 bash "Word Splitting" 很复杂。
jars=`find $path -name dx.jar -printf "%A@ %p:"`
直到 [ "$jars" ]
做
  路径=${路径}/..
  jars=`find $path -name dx.jar -printf "%A@ %p:"`
完毕

# 把 : 变成 \n
罐子=${罐子//:/\\n}

# 我们想要最后访问的 jar
排序=`echo -e "$jars" | 排序-nrk 1,2`

# 获取jar文件名
last_used=`echo -e "$sorted" | grep -om 1 "/.*$"`

# 去除文件名
last_path=${last_used%/*}

# 找到 dx 脚本
dx=`find $last_path -name dx`
直到 [ "$dx" ]
做
  last_path=${last_path}/..
  dx=`find $last_path -name dx`
完毕

#####
##### 添加classes.dex到输入jar
#####

$dx --dex --keep-classes --output $output $input

这是它的.launch文件,项目名称和路径已编辑:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.debug.core.ATTR_REFRESH_RECURSIVE" value="false"/>
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;resources&gt;&#10;&lt;item path=&quot;/MAIN_PROJECT_NAME/assets&quot; type=&quot;2&quot;/&gt;&#10;&lt;/resources&gt;}"/>
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="true"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${project_loc}/../MAIN_PROJECT_DIRECTORY/secondary-dexxer"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,auto,"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="${project_loc}/bin/${resource_name}.jar&#10;${project_classpath}"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
</launchConfiguration>

不完全是最佳的,而且绝对不是我可以添加到源代码树中的东西(我们有一些人出于某种原因使用 Windows),而是一个开始:尽管一些 bash“分词”问题很痛苦,但它们可能在学习曲线将涉及将其转变为 Java 中的“正确”Eclipse 插件。

于 2013-11-15T22:07:11.893 回答
0

Fwiw,我从未找到“包含 Android SDK 位置的 Eclipse 字符串变量”。相反,我所做的是

  1. 阅读dx脚本并注意它只是将参数传递给dx.jar.
  2. 将最新可用的内容添加dx.jar到我的 Builder 项目中,然后直接从我的 Java 代码中调用它。来源并不难找到。原来 mainmain(String[])只是简单地调度到了几个内部main(String[])方法之一,所以我直接调用了正确的那个。
  3. 将我的 Builder 分成两部分:a)一个“独立的 dexxer”,它只是一个可以从 ant 操作调用的 jar 文件,它调用到dx.jar; b) 一个 Eclipse Builder,它包含构建控制逻辑和一些 Eclipse 控制台代码,并调用独立的 dexxer。

这工作得很好。我们认为如果 Google 发布了一个dx.jar以某种方式提供更好的 dexification 的工具,我们可以用新的 jar 重建 Builder;这还不是问题。

于 2014-07-10T18:54:49.043 回答