Android中用ANT打包如何将内容复制到AndroidManifest文件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中用ANT打包如何将内容复制到AndroidManifest文件中相关的知识,希望对你有一定的参考价值。

现公司有一需求,需要在不同的渠道下面有一个单独的XML文件,里面是渠道商代码中需要添加到AndroidManifest.xml文件中,求问用ANT打包时如何将这些内容替换AndroidManifest.xml中的空节点或者复制到AndroidManifest.xml指定位置。
需要添加的内容如下(这是渠道商单独的xml文件):
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_SMS" />

<meta-data
android:name="QHOPENSDK_APPID"
android:value="200793576" >
</meta-data>
<meta-data
android:name="QHOPENSDK_APPKEY"
android:value="2288993e4041b44971f5219d0b9cbd90" >
</meta-data>
<meta-data
android:name="QHOPENSDK_PRIVATEKEY"
android:value="b6185a24078cb8b04d92c5e918f79f37" >
</meta-data>
<meta-data
android:name="QHOPENSDK_CHANNEL"
android:value="default" >
</meta-data>
<activity
android:name="cn.paypalm.jar.game360.InitialAct"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@style/FloatingWindowStyle"
android:windowSoftInputMode="stateAlwaysHidden" >
</activity>

只有十分了,各位如若知道,还忘不吝赐教。
感谢两位的答复,我已经用一个java程序搞定了,在ANT中调用JAVA程序中的main方法,然后签到想要的效果。贴上代码:
<target name="run_java_main" description="generator structure pictures">
<java classpath="E:/workspace/PackageAnt/bin" classname="com.mas.test.TestAntA" fork="true">
<!--main函数中传入的参数-->
<arg value="$out.root.resource.path.resource"/>
<arg value="$app.source.path"/>
<arg value="$sdkName"/>
</java>
</target>
其中main方法中的数组保存的数据就是这里传入的参数。直接在main方法中取用即可,这里也可以不传参数。

看这么的行不行。分析下
首先。android是支持自动构建的对吧。也就有一套逻辑自持把你的工程目录下的那些所有文件打包成apk文件。就是sdk\tools\ant目录下那个build.xml的作用。他有一个主文件是公共的一般只是引入即可。还有作为辅助的ant.properties 保存本地信息内容的
其中这个主文件他是通过路径的方法找到项目的AndroidManifest文件的
名字的引用(build.xml中的一段)
<property name="manifest.file" value="AndroidManifest.xml" />
目标的指向
<!-- get the project manifest package -->
<xpath input="$manifest.abs.file"
expression="/manifest/@package" output="project.app.package" />
这样就能知道ant的工作原理和步骤。

-》定位项目跟目录。-》找到AndroidManifest文件等等。-》根据自己的逻辑去组织编译代码还有打包混淆等等操作。

其中可以从“找到AndroidManifest文件”这一步出手。想办法控制这个引用是你能分配的。以任务的形式来管理。

其中一个方法是,准备n个版本的AndroidManifest文件 然后通过target任务来决定某次编译具体使用你做的N个中的哪一个。这是简洁算是取巧方法

另外一个方法是。你把所有的ant编译过程通过调试(xml代码也可以调试,断点跟踪)来弄明白每个任务的具体含义。然后通过改写的手段来diy你自己的build 这是最彻底最有知识量的方法。也就不用那么多n版本的AndroidManifest,通过replace某个字段值即可
参考技术A 抱歉,我也不会从 ant 里面去修改,给你个目前我在用的变通的方法。
用 sh 脚本(linux/cygwin)或者 批处理(Windows),先修改想要修改的东西,再调用 ant build

想要对文件做什么修改,就直接在脚本中完成了本回答被提问者采纳
参考技术B 这能做到么。。
坐等高手

使用Ant打包Android应用具体解释——Ant使用解析

  上篇《使用Ant打包Android应用具体解释》描写叙述了使用Ant打包的流程,但非常多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明。

  APK包的生成是一系列操作的结果,而Ant则是将这一系列操作流程化。提供出定制化的接口,以及可配置的參数供改动,而这些都是通过指定的构建文件来实现。

我们就从Ant的打包流程来理解Ant的一些基本使用方法。

当在命令行中运行ant。默认会去解析当前文件夹的build.xml作为构建文件。以下是个删除部分注视的版本号:

<project name="工程名" default="help">

 <!-- 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 file="ant.properties" />

 <!--
 Import per project custom build rules if present at the root of the project.
 This is the place to put custom intermediary targets such as:
 -pre-build
 -pre-compile
 -post-compile (This is typically used for code obfuscation.
 Compiled code location: ${out.classes.absolute.dir}
 If this is not done in place, override ${out.dex.input.absolute.dir})
 -post-package
 -post-build
 -pre-clean
 -->
 <import file="custom_rules.xml" optional="true" />

 <!-- Import the actual build file.
 <import file="${sdk.dir}/tools/ant/build.xml" />
再跟进到你的SDK文件夹的tools/ant/build.xml,查看Ant打包的完整过程。
    1.首先理解几个概念,project、target、task。简单来说,你的一个构建工程(project),划分了非常多阶段或者子目标(target)。而每一个阶段目标的实现。你要提供详细的操作,比方文件复制,源代码编译,这些封装好的操作就是task(能够理解为为你提供的库函数)。详细看,每一个构建文件都有顶层为project的标签。作为标识。而target就是你所要运行的操作序列。target里面能够有非常多的task。那么怎么确定操作序列运行的顺序呢?当中project的default指的是默认运行的target,也就是当你在命令行仅仅输入ant不带不论什么參数时,运行的target。

而当你指定了target后,如在命令行中输入ant help。会从你的构建文件里找到target help运行。当我们输入ant release时,相应的target例如以下:

<target name="release" depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build" description="Builds the application in release mode.">
 </target>
target的name和description顾名思义,而depends则是该target运行前,须要运行或者说依赖的target,并且是根据从左到右的顺序依次运行。继续跟进-package它的定义:<target name="-package" depends="-dex, -package-resources">,各自是dex文件的生成和资源打包,里面又定义了非常多详细的target。

整个过程中就有或者说预留了一些空的target,比方-pre-build -pre-compile -post-package -post-build,是每一个打包编译步骤之前后结束,通过在custom_rules.xml中重写这些target。达到定制化的要求
  2.攻克了运行序列的问题。那么怎样进行參数配置呢?
(1)首先在project下的build.xml中property,能够理解为定义了部分变量或者引入了property 文件。看其部分属性:
name:property的名称,在target或者其他地方能够通过${name}的形式引用
value:详细的值或路径
file:须要载入的property文件,文件里的内容以key=value中出现,如local.properties中定义的sdk.dir=android的sdk路径
refid:引用已经定义的path信息
自己工程的build.xml中property定义的local.properties引入了android sdk/ndk,ant.properties引入了签名时须要的信息;这里有个关键的特性是。一旦定义了property,其值是不能改变的,并且会保留最先定义的值;也就是这个特性。方便了在编译过程中的一些定制化操作。如上篇中调用隐藏api,将自己的framework.jar增加到project.target.class.path中
(2)import标签,属性file:要引入的构建文件,optional:值为true时,即使import的文件不存在,也不停止编译。那么custom_rules.xml是可有可无。而${sdk.dir}/tools/ant/build.xml是定义了真正的编译步骤的文件必须存在
   3.一些用到的其他标签
(1)定义文件文件夹path,从ant手冊中的样例看:

<path id="base.path">
      <pathelement path="${classpath}"/>
      <fileset dir="lib">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement location="classes"/>
 </path>
一个能够在其他地方通过refid引用的path,里面包含了详细path路径pathelement和通过include或exclude来筛选文件的fileset
(2)copy task

<copy todir="${source.absolute.dir}">

     <fileset dir="其他源代码文件夹">
        <include name="**/*.java" />
        <include name="**/*.aidl" />
    </fileset>
 </copy>
odir:目标文件夹,源文件夹在fileset上定义,规则是包含全部.java文件和全部aidl文件。简单的如拷贝单个文件
<copy file="myfile.txt" tofile="mycopy.txt"/>
拷贝一个文件到某个文件夹
<copy file="myfile.txt" todir="../some/other/dir"/>
这些信息都能够通过查询ant參考手冊https://ant.apache.org/manual/来了解。不一一叙述


通过上述描写叙述应该能够理解并跟进整个ant打包android应用的流程,依据自己的须要进行定制化操作




























以上是关于Android中用ANT打包如何将内容复制到AndroidManifest文件中的主要内容,如果未能解决你的问题,请参考以下文章

ANT自动打包U3D安卓项目研究笔记

使用Ant打包Android应用具体解释——Ant使用解析

用Ant手动打包android程序

Android自动化构建之Ant多渠道打包实践(上)

SpringBoot整合Ant Design Pro进行部署

Android采用Ant批量打包