lazyzoon 2015-08-04 03:01 采纳率: 0%
浏览 2749

android ant 打包,包含第三方jar库且有资源文件的工程

<?xml version="1.0" encoding="UTF-8"?>
name="MainProject"
basedir="."
default="main" >

<!--
     The local.properties file is created and updated by the 'android' tool.
     It contains the path to the SDK. It should *NOT* be checked into
     Version Control Systems.
-->

<property file="local.properties" />

<property
    name="apk-name"
    value="product" />

<property
    name="apk-version"
    value="latest" />

<property
    name="apk-market"
    value="dev" />

<!-- android.jar路径 -->

<property
    name="android-jar"
    value="/opt/adt/sdk/platforms/android-19/android.jar" />

<!-- android.tools路径 -->

<property
    name="android.tools"
    value="/opt/adt/sdk/tools" />


<!-- 初始化 目录文件 -->
<target name="init" >

    <echo>
            start initing ... 
    </echo>

    <mkdir dir="out" />

    <delete>

        <fileset dir="out" >
        </fileset>
    </delete>

    <mkdir dir="gen" />

    <delete>

        <fileset dir="gen" >
        </fileset>
    </delete>

    <mkdir dir="assets" />

    <delete>

        <fileset dir="assets" >
        </fileset>
    </delete>

    <mkdir dir="bin/classes" />

    <delete>

        <fileset dir="bin/classes" >
        </fileset>
    </delete>


    <!-- ${apk-version}表示版本,后面会详细讲到 -->

    <mkdir dir="build/${apk-version}" />

    <echo>
            finish initing. 
    </echo>
</target>

<target
    name="main"
    depends="init" >

    <echo>
            generating R.java for project to dir gen (using aapt) ... 
    </echo>

    <exec executable="aapt" failonerror="true" >

        <arg value="package" /> <!-- package表示打包 -->
        <arg value="-m" /> <!-- m,J,gen表示创建包名的目录和R.java到gen目录下 -->

        <arg value="-J" />

        <arg value="gen" />

        <arg value="-M" /> <!-- M指定AndroidManifest.xml文件 -->

        <arg value="AndroidManifest.xml" />

        <arg value="-S" /> <!-- S指定res目录,生成对应的ID,可多个 -->

        <arg value="res" />

        <arg value="-S" />

        <arg value="../SlideMenu/res" />

        <arg value="-I" /> <!-- I指定android包的位置 -->

        <arg value="${android-jar}" />

        <arg value="--auto-add-overlay" /> <!-- 这个重要,覆盖资源,不然报错 -->
    </exec>

generating R.java for library to dir gen (using aapt)

    <exec executable="aapt" failonerror="true">
        <arg value="package" />
        <arg value="-m" />
        <arg value="--non-constant-id" />
        <arg value="--auto-add-overlay" />
        <arg value="-J" />
        <arg value="gen" />
        <arg value="-M" />
        <arg value="../SlideMenu/AndroidManifest.xml" />
        <arg value="-S" />
        <arg value="res" />
        <arg value="-S" />
        <arg value="../SlideMenu/res" />
        <arg value="-I" />
        <arg value="${android-jar}" />
    </exec>



    <!-- 第三方jar包需要引用,用于辅助编译 -->

    <path id="project.libs" >

        <fileset dir="libs" >

            <include name="*.jar" />
        </fileset>
    </path>

    <echo>
            compiling java files to class files (include R.java, library and the third-party jars) ... 
    </echo>

    <!-- 生成的class文件全部保存到bin/classes目录下 -->

    <javac
        bootclasspath="${android-jar}"
        destdir="bin/classes" >

        <src path="../RemoteHelpe/src" />

         <src path="../SlideMenu/src" />

        <src path="src" />

        <src path="gen" />

        <classpath refid="project.libs" />
    </javac>

    <echo>
            packaging class files (include the third-party jars) to calsses.dex ... 
    </echo>

    <exec executable="dx" >

        <arg value="--dex" />

        <arg value="--output=out/classes.dex" /> <!-- 输出 -->

        <arg value="bin/classes" /> <!-- classes文件位置 -->

        <arg value="libs" /> <!-- 把libs下所有jar打包 -->
    </exec>

    <echo>
            packaging resource (include res, assets, AndroidManifest.xml, etc.) to res.zip ... 
    </echo>

<!-- 打包资源文件 -->
    <exec executable="aapt" >

        <arg value="package" />

        <arg value="-f" /> <!-- 资源覆盖重写 -->

        <arg value="-M" />

        <arg value="AndroidManifest.xml" />

        <arg value="-S" />

        <arg value="res" />

         <arg value="-S" /> <!-- lib资源文件的res -->

        <arg value="../SlideMenu/res" />



        <arg value="-A" /> <!-- 与R.java不同,需要asset目录也打包 -->

        <arg value="assets" />

        <arg value="-I" />

        <arg value="${android-jar}" />

        <arg value="-F" /> <!-- 输出资源压缩包 -->

        <arg value="out/res.zip" />

        <arg value="--auto-add-overlay" />
    </exec>

    <echo>
            building unsigned.apk ... 
    </echo>

    <java
        classname="com.android.sdklib.build.ApkBuilderMain"
        classpath="${android.tools}/lib/sdklib.jar" >

        <arg value="out/unsigned.apk" />

        <arg value="-u" />

        <arg value="-z" />

        <arg value="out/res.zip" />

        <arg value="-f" />

        <arg value="out/classes.dex" />

        <arg value="-nf" />  

        <arg value="./libs" />  

    </java>

    <!-- 生成apk文件到build目录下 -->
    <!-- 其中${apk-version/name/market}用户多渠道打包,后面会讲到 -->

    <echo>
                signing the unsigned apk to final product apk ... 
    </echo>

    <exec executable="java" >

        <arg value="-jar" />

        <arg value="../sign/signapk.jar" />

        <arg value="../sign/testkey.x509.pem" />

        <arg value="../sign/testkey.pk8" />

        <arg value="out/unsigned.apk" />

        <arg value="hello.apk" />
    </exec>

    <echo>
            done.
    </echo>
</target>

其实我现在的主要问题是:在打包jar库资源文件的时候,由于我的主程序中的一个layout文件引用了xmlns:wison="http://schemas.android.com/apk/res/com.main.project" 的说明;导致了 res/layout/audio.xml:260: error: No resource identifier found for attribute 'switchMinHeight' in package 'com.main.project' 的问题;

appt库资源文件的时候出的这个错。

请问大侠们怎么解决这个问题呢?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 03:42
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于你的应用程序试图在没有正确配置的情况下使用第三方库(在这里是 Aapt)来解析 XML。在这种情况下,你需要确保在你的应用中正确地设置了 app:name 属性,并且你的库能够正常工作。

    首先,检查你的应用是否正确设置了 app:name 属性。如果你的应用是一个完整的 Android 应用,它应该有一个名为 "application" 的类,该类具有正确的 app:name 属性。

    然后,尝试使用 Aapt 解析库的 XML 文件。你可以在 Aapt 中直接调用 <res>...</res> 结束标签来解析库的 XML。但是请注意,这可能会引发一些错误,因为 Aapt 需要了解库的结构和预期的行为。

    例如:

    import com.example.mylibrary.R;
    
    public void main() {
        // 获取库的 XML
        String xml = "<my-library xmlns:my=\"http://schemas.android.com/apk/res/mylibrary\"/>";
    
        // 使用 Aapt 解析库的 XML
        XmlResourceParser parser = new XmlResourceParser(new ByteArrayInputStream(xml.getBytes()));
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if ("my".equals(parser.getName())) {
                        // 处理 my 区域的元素
                    }
                    break;
                case XmlPullParser.END_TAG:
                    // 处理 end 区域的元素
                    break;
                case XmlPullParser.TEXT:
                    // 处理文本
                    break;
            }
            eventType = parser.next();
        }
    
        // 关闭 XML 解析器
        parser.close();
    }
    

    注意:这只是一个基本示例,实际操作时可能需要根据具体的库进行调整。此外,如果库使用了不同的命名空间,你可能需要为每个命名空间添加相应的 xmlns: 属性。

    最后,确保在库的 build.gradle 文件中正确设置了 <androidx.annotation.MainClass><androidx.annotation.VisibleForTesting> 等注解,以便你的库可以被 Aapt 解析。

    评论

报告相同问题?