【问题标题】:Call an Android build-tool from an Eclipse "builder"?从 Eclipse“构建器”调用 Android 构建工具?
【发布时间】:2014-07-11 02:54:49
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android eclipse-plugin android-build


    【解决方案1】:

    一位同事指出,${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 插件。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多