我想自定义构建过程,同时仍然使用 Android Eclipse ADT 插件

发布于 2024-10-19 09:18:07 字数 1222 浏览 4 评论 0原文

安装 ADT 插件后,以下构建器对于 Android 项目是活动的:

  • Android 资源管理器
  • Android 预编译器
  • Java 构建器
  • Android 包构建器

查看输出目录,将创建以下工件:

  • resources.ap_ (只是一个 APK/ZIP有资源且无代码)
  • gen/R.java (自动生成的资源列表)
  • .class 文件,带有 java 字节码
  • classes.dex
  • ${project-name}.apk

对于我的项目,我自动生成了几个代码工件,并且通常需要更严格的控制构建过程。起初,我认为资源管理器负责创建resources.ap_,预编译器创建R.java,java builder做了显而易见的事情,然后Android Package Builder创建了classes.dex,然后将classes.dex和resources.ap_组合起来创建 APK 文件。

我禁用了前两个步骤,并创建了一个自定义预构建器,该预构建器放置了 resources.ap_ 的副本,认为这将是等效的。没有这样的运气。

不幸的是,最终的 Android Package Builder 似乎直接从 res/ 获取资源并忽略了我的 resources.ap_。事实上,前两个构建步骤除了生成 R.java 之外似乎没有做太多事情。

这才是真正有问题的地方。如果我禁用最后的构建步骤并放置我自己的 APK 文件(具有完全相同相同的名称),我会收到以下错误:

[2011-02-27 20:25:28 - android-premium] ------------------------------
[2011-02-27 20:25:28 - android-premium] Android Launch!
[2011-02-27 20:25:28 - android-premium] adb is running normally.
[2011-02-27 20:25:28 - android-premium] Could not find android-premium.apk!

所以我陷入困境:使用 Android Package Builder(它没有可辨别的配置),我必须提供单独的 ./res/ 文件。没有它,我无法在设备上启动项目(不是从 Eclipse)。

有人在这个领域有更好的想法/经验吗?

With the ADT plug-in installed, the following builders are active for an Android project:

  • Android Resource Manager
  • Android Pre Compiler
  • Java Builder
  • Android Package Builder

Looking at the output directory, the following artifacts are created:

  • resources.ap_ (just an APK/ZIP with resources and no code)
  • gen/R.java (autogenerated list of resources)
  • .class files with java bytecode
  • classes.dex
  • ${project-name}.apk

For my project, I autogenerate several code artifacts and in general need tighter control of the build process. At first, I figured that the Resource Manager was responsible for creating resources.ap_, the precompiler created R.java, java builder did the obvious, and then the Android Package Builder created classes.dex, then combined classes.dex and resources.ap_ to create the APK file.

I disabled the first two steps and created a custom pre-builder that laid down a copy of resources.ap_, figuring this would be equivalent. No such luck.

Unfortunately, the final Android Package Builder seems to slurp the resources directly from res/ and ignores my resources.ap_. In fact, the first two build steps don't seem to do much other than generate R.java.

This is where it gets really problematic. If I disable the final build step and lay down my own APK file (with the exact same name), I get the following error:

[2011-02-27 20:25:28 - android-premium] ------------------------------
[2011-02-27 20:25:28 - android-premium] Android Launch!
[2011-02-27 20:25:28 - android-premium] adb is running normally.
[2011-02-27 20:25:28 - android-premium] Could not find android-premium.apk!

So I'm stuck: with the Android Package Builder (which has no discernable configuration), I have to supply individual ./res/ files. Without it, I can't get the project to launch on the device (not from Eclipse).

Anyone have any better ideas / experience in this space?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

神经暖 2024-10-26 09:18:07

关于 Ant 脚本,以下是我构建 Android 应用程序的 Ant 步骤的一体化模板(这对于尝试将 Eclipse 构建转换为 Ant 的其他人可能有用,因为它比不透明版本更简单、更透明使用 android 工具自动生成):

<property name="workspace.dir" value="/workspace" />
<property name="project.dir" location="." />
<property name="android-platform.name" value="android-1.5" />


<!-- Framework Paths -->
<property name="android-sdk.dir" value="${workspace.dir}/EpicFramework/android-sdk"/>
<property name="android-tools.dir" value="${android-sdk.dir}/tools" />
<property name="android-platform.dir" value="${android-sdk.dir}/platforms/${android-platform.name}" />
<property name="android-platform-tools.dir" value="${android-platform.dir}/tools"/>
<property name="android-platform-jar" value="${android-platform.dir}/android.jar"/>
<property name="android-framework-src.dir" value="${workspace.dir}/EpicFramework/EpicAndroid"/>

<!-- Tool Binaries -->
<property name="adb" value="${android-tools.dir}/adb"/>
<property name="apkbuilder" value="${android-tools.dir}/apkbuilder"/>
<property name="aapt" value="${android-platform-tools.dir}/aapt"/>
<property name="dx" value="${android-platform-tools.dir}/dx"/>

<!-- Project Paths -->
<property name="src.dir"   value="${project.dir}/src" />
<property name="gen.dir"   value="${project.dir}/gen" />
<property name="res.dir"   value="${project.dir}/res" />
<property name="lib.dir"   value="${project.dir}/lib" />
<property name="build.dir" value="${project.dir}/bin" />
<property name="build.classes.dir" value="${build.dir}/classes" />

<property name="resources.file" value="${build.dir}/resources.ap_"/>
<property name="dex.file" value="${build.dir}/classes.dex" />
<property name="debug-apk.file" value="${build.dir}/${ant.project.name}-debug.apk"/>


<target name="dirs">
    <echo>Creating output directories if needed...</echo>
    <mkdir dir="${res.dir}" />
    <mkdir dir="${gen.dir}" />
    <mkdir dir="${lib.dir}" />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes.dir}" />
</target>

<target name="android-resource-src" depends="dirs">
    <echo>Generating R.java from the resources...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="${res.dir}" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-m" />
        <arg value="-J" />
        <arg path="${gen.dir}" />
    </exec>
</target>

<target name="android-compile" depends="android-resource-src">
   <echo>Compiling java files into class files...</echo>
    <javac 
      encoding="ascii"
      target="1.5"
      debug="true"
      extdirs=""
      destdir="${build.classes.dir}"
      includeAntRuntime="false"
      bootclasspath="${android-platform-jar}">
        <src path="${android-framework-src.dir}" />
        <src path="${src.dir}" />
        <src path="${gen.dir}" />
        <classpath>
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </classpath>
     </javac>
</target>

<target name="android-dex" depends="android-compile">
    <echo>Converting compiled files and 3rd party libraries into ${dex.file} ...</echo>
    <apply executable="${dx}" failonerror="true" parallel="true">
        <arg value="--dex" />
        <arg value="--output=${dex.file}" />
        <arg path="${build.classes.dir}" />
        <fileset dir="${lib.dir}" includes="*.jar"/>
    </apply>
</target>

<target name="android-package-resources">
    <echo>Packaging Android resources into ${resources.file} ...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="./res" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-f" />
        <arg value="-F" />
        <arg value="${resources.file}" />
    </exec>
</target>

<target name="android-debug" depends="android-dex, android-package-resources">
    <echo>Packaging app and signing it with the debug key</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${debug-apk.file}" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
</target>

<target name="android-release" depends="android-dex, android-package-resources">
    <echo>Packaging App without signing, so that it can be signed with the official publishing key ...</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${release-apk.file}" />
        <arg value="-u" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
    <echo>All generated packages need to be signed with jarsigner before they are published.</echo>
</target>

<target name="android-install" depends="android-debug">
    <echo>Removing all com.epicapplications APK files from default emulator ...</echo>
    <exec executable="${adb}" inputstring="echo hi; rm -f /data/app/com.epicapplications.*; exit;
    ">
        <arg value="shell"/>
    </exec>
    <echo>Installing ${debug-apk.file} onto default emulator...</echo>
    <exec executable="${adb}" failonerror="true">
        <arg value="install" />
        <arg value="-r" />
        <arg path="${debug-apk.file}" />
    </exec>
</target>

我正在寻找的是能够使用此 Ant 构建脚本的全部或片段,但仍然具有用于启动和调试应用程序的 Eclipse 集成。

Regarding Ant scripts, the following is my all-in-one template of the Ant steps for building an Android app (this might be useful to others trying to translate the Eclipse build to Ant as it is much simpler and more transparent than the opaque version autogenerated with the android tools):

<property name="workspace.dir" value="/workspace" />
<property name="project.dir" location="." />
<property name="android-platform.name" value="android-1.5" />


<!-- Framework Paths -->
<property name="android-sdk.dir" value="${workspace.dir}/EpicFramework/android-sdk"/>
<property name="android-tools.dir" value="${android-sdk.dir}/tools" />
<property name="android-platform.dir" value="${android-sdk.dir}/platforms/${android-platform.name}" />
<property name="android-platform-tools.dir" value="${android-platform.dir}/tools"/>
<property name="android-platform-jar" value="${android-platform.dir}/android.jar"/>
<property name="android-framework-src.dir" value="${workspace.dir}/EpicFramework/EpicAndroid"/>

<!-- Tool Binaries -->
<property name="adb" value="${android-tools.dir}/adb"/>
<property name="apkbuilder" value="${android-tools.dir}/apkbuilder"/>
<property name="aapt" value="${android-platform-tools.dir}/aapt"/>
<property name="dx" value="${android-platform-tools.dir}/dx"/>

<!-- Project Paths -->
<property name="src.dir"   value="${project.dir}/src" />
<property name="gen.dir"   value="${project.dir}/gen" />
<property name="res.dir"   value="${project.dir}/res" />
<property name="lib.dir"   value="${project.dir}/lib" />
<property name="build.dir" value="${project.dir}/bin" />
<property name="build.classes.dir" value="${build.dir}/classes" />

<property name="resources.file" value="${build.dir}/resources.ap_"/>
<property name="dex.file" value="${build.dir}/classes.dex" />
<property name="debug-apk.file" value="${build.dir}/${ant.project.name}-debug.apk"/>


<target name="dirs">
    <echo>Creating output directories if needed...</echo>
    <mkdir dir="${res.dir}" />
    <mkdir dir="${gen.dir}" />
    <mkdir dir="${lib.dir}" />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes.dir}" />
</target>

<target name="android-resource-src" depends="dirs">
    <echo>Generating R.java from the resources...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="${res.dir}" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-m" />
        <arg value="-J" />
        <arg path="${gen.dir}" />
    </exec>
</target>

<target name="android-compile" depends="android-resource-src">
   <echo>Compiling java files into class files...</echo>
    <javac 
      encoding="ascii"
      target="1.5"
      debug="true"
      extdirs=""
      destdir="${build.classes.dir}"
      includeAntRuntime="false"
      bootclasspath="${android-platform-jar}">
        <src path="${android-framework-src.dir}" />
        <src path="${src.dir}" />
        <src path="${gen.dir}" />
        <classpath>
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </classpath>
     </javac>
</target>

<target name="android-dex" depends="android-compile">
    <echo>Converting compiled files and 3rd party libraries into ${dex.file} ...</echo>
    <apply executable="${dx}" failonerror="true" parallel="true">
        <arg value="--dex" />
        <arg value="--output=${dex.file}" />
        <arg path="${build.classes.dir}" />
        <fileset dir="${lib.dir}" includes="*.jar"/>
    </apply>
</target>

<target name="android-package-resources">
    <echo>Packaging Android resources into ${resources.file} ...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="./res" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-f" />
        <arg value="-F" />
        <arg value="${resources.file}" />
    </exec>
</target>

<target name="android-debug" depends="android-dex, android-package-resources">
    <echo>Packaging app and signing it with the debug key</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${debug-apk.file}" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
</target>

<target name="android-release" depends="android-dex, android-package-resources">
    <echo>Packaging App without signing, so that it can be signed with the official publishing key ...</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${release-apk.file}" />
        <arg value="-u" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
    <echo>All generated packages need to be signed with jarsigner before they are published.</echo>
</target>

<target name="android-install" depends="android-debug">
    <echo>Removing all com.epicapplications APK files from default emulator ...</echo>
    <exec executable="${adb}" inputstring="echo hi; rm -f /data/app/com.epicapplications.*; exit;
    ">
        <arg value="shell"/>
    </exec>
    <echo>Installing ${debug-apk.file} onto default emulator...</echo>
    <exec executable="${adb}" failonerror="true">
        <arg value="install" />
        <arg value="-r" />
        <arg path="${debug-apk.file}" />
    </exec>
</target>

What I am looking for is to be able to use all or fragments of this Ant build script, but still have the Eclipse integration for launching and debugging the app.

星星的轨迹 2024-10-26 09:18:07

我们使用 Ant 脚本来完成 android 项目的构建过程,其他人也使用 Maven。这些很有帮助,因为您可以将它们编写为每天运行的脚本,作为夜间构建的一部分,作为 CI 构建系统的一部分。在高级级别,您可以编写脚本来完成发布构建,包括发布标签、预编译和后编译 AndroidManifest.xml 修改和签名。

We have used Ant scripts to do the build process for android projects, others have also used Maven. These help as then you can script them to run every day as part of nightly builds, as a part of your CI build system. At an advanced level you can script this to do release builds complete with release tags, pre-compilation and post-compilation AndroidManifest.xml modifications and signing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文