android关于R.java及利用ant解决工程依赖的一些问题

一、关于R.java

转自

https://www.aliyun.com/jiaocheng/102966.html

http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html

https://blog.csdn.net/zyh9018/article/details/26254797

总结下来就是
<exec executable="${tools.aapt}" failonerror="true">
    <arg value="package" />
    <arg value="-m" />
    <arg value="-J" />
    <arg path="gen" />
    <arg value="-M" />
    <arg path="AndroidManifest.xml" />
    <arg value="-S" />
    <arg path="res" />
    <arg value="-S" />
    <arg path="libProject/res" />
    <arg value="-I" />
    <arg path="android.jar" />
    <arg value="--auto-add-overlay" />
</exec>
<exec executable="${tools.aapt}" failonerror="true">
    <arg value="package" />
    <arg value="-m" />
    <arg value="--non-constant-id" />
    <arg value="--auto-add-overlay" />
    <arg value="-J" />
    <arg path="gen" />
    <arg value="-M" />
    <arg path="libProject/AndroidManifest.xml" />
    <arg value="-S" />
    <arg path="res" />
    <arg value="-S" />
    <arg path="libProject/res" />
    <arg value="-I" />
    <arg path="android.jar" />
</exec>
注意
1:两次使用的-S顺序不能颠倒,因为以主工程的为准;
2:两次使用的AndroidManifest.xml不同
3:库工程使用了--non-constant-id来使其R.java中的内容不为final

最后会在gen下生成两个包名不同的R.java,内容基本一致(但涉及到包名的不同,而且库工程的R.java不是final的)

二、关于利用ant解决工程依赖

需要注意上面生成R.java时的问题

生成资源时使用

<exec executable="${tools.aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${in.manifest.file}" />
<arg value="-S" />
<arg value="${in.resource.absolute.dir}" />
<arg value="-S" />
<arg path="${basedir}/appcompat-v7-25.3.1/res" />
<arg value="-A" />
<arg value="${in.asset.absolute.dir}" />
<arg value="-I" />
<arg value="${jar.android}" />
<arg value="-F" />
<arg value="${out.resource.package.absolute.file}" />
<arg value="--auto-add-overlay" />

</exec>

javac编译的时候使用

<javac encoding="utf-8"
                    source="1.5" target="1.5"
                    debug="false" extdirs="" includeantruntime="false"
                    destdir="${out.classes.absolute.dir}" 
                    srcdir="." 
                    bootclasspath="${jar.android}"
                    verbose="${verbose}"
                    excludes="channel/**/*.java"
                    >
                <src path="${basedir}/libProject/src" />
                <classpath>
<fileset dir="${in.external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${in.external.libs.absolute.dir}" includes="*.zip" />
</classpath>

            </javac>

即包含库工程的src

另外需注意主工程的targetSdkVersion应不小于库工程的targetSdkVersion

还需注意库工程的

project.properties中有android.library=true

 主工程的

project.properties中有android.library.reference.1=./libProject

如果依赖有多个库工程则还有

android.library.reference.2=./libProject2

android.library.reference.3=./libProject3

猜你喜欢

转载自blog.csdn.net/ahaitongxue/article/details/80536049