zoukankan      html  css  js  c++  java
  • 使用Ant打包Android应用具体解释

      计划写个完整的使用Ant打包Android应用的系列文章。三篇文章。首篇具体介绍採用Ant打包Android应用的流程。列出部分定制问题及其解决方法,第二篇介绍我理解的Ant打包的思路与主要的概念和使用,最后一篇描写叙述apk包的生成过程。
        实现的环境:
        操作系统:ubuntu 64bit 14.04
        Android SDK Build Tools:22.0.1
        Android SDK Tools:24.3.3
        Ant:1.9.4
        ProGuard:5.2.1
        JDK:1.7
    一、简单应用出包流程
      这里的出包流程包含编译、代码混淆、apk签名。

    对于简单的Android应用。简单的几步操作就能完毕:

    1.生成Ant编译须要的build.xml
        在SDK文件夹的tools下,调用android update project生成,详细命令的使用方法能够查看參考1。比如:切换到你的工程文件夹
        android update project --name 自己起的工程名 -p .
        -p參数后面的点是表示当前文件夹
        在project文件夹下就会生成Ant编译须要的build.xml,直接执行ant debug。就可以完毕编译,并在bin文件夹下生成debug版本号的apk包。须要注意的几个问题是:
    (1)自己主动生成的build.xml生成了几个跟Android相关的target呢:能够通过直接输入ant来查看help说明
    (2)遇到BUILD FAILED怎样解决:能够查看BUILD FAILED上面的log看运行到什么地方,还有看提示在build.xml的哪一行出现故障。这里的build.xml是指在sdk/tools/ant下的,比如:
    [aapt] invalid resource directory name: project文件夹/bin/res crunch
    
    BUILD FAILED
    sdk/tools/ant/build.xml:649: The following error occurred while executing this line:
    build.xml:694:null returned: 1
    一般看到res crunch,应该就是你在eclipse中project自己主动编译的文件与ant生成文件冲突。仅仅要关掉eclipse的自己主动编译。clean下project又一次跑ant就可以。

      (3)能够留心看下project.properties和local.properties
    2.加入代码混淆
    在工程的project.properties文件里有凝视说明怎样打开代码混淆
    #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
    去除#号就可以,同一时候能够在proguard-project.txt添加你须要特殊处理的配置

    改动后,再运行ant release,你会在输出中看到
    -obfuscate:
    [mkdir] Created dir:project文件夹/bin/proguard
    [jar] Building jar: project文件夹/bin/proguard/original.jar
    [proguard] ProGuard, version 5.2.1
    ...

    能够看到我用的proguard版本号。可是用ant debug是没有proguard,由于仅仅有release版本号才须要混淆,具体原因兴许文章会具体讲述。混淆后的mapping文件在bin文件夹下。
        注意的问题:project的AndroidManifest.xml中假设配置了android:debuggable=true,那么即使ant release也不会混淆代码
    3.签名
        首先给apk签名须要keystore。详细的生成此处不细讲,简单的说在eclipse中选则project,右键android tools -> export android application 中有生成选项
        其次是在project文件夹下新建ant.properties文件,里面配置你的签名信息
    比如:
    key.store=kestore文件的路径
    key.store.password=密码
    key.alias.password=密码
    key.alias=别名
    此时再运行ant release,在bin文件夹下可生成“project名-release.apk”。你终于要的release版本号的apk

    到此,简单androidproject的的ant编译打包完毕,很方便。


    二、加入定制化
        1.增加so库
        Android应用的Ant编译默认是不会编译jniproject的,它仅仅会处理libs中的库文件。

    假设你的libs中刚好有编译好的so,那打包好的apk似乎能正常执行。在配置好的jniproject,仅仅要执行ndk的ndk-build就可以完毕so的编译。因此,仅仅要在build.xml同文件夹中加入custom_rules.xml文件,内容例如以下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="工程名" default="help">
    <target name="-pre-compile">
        <echo >ndk build.............................</echo>
        <exec executable="${ndk.dir}/ndk-build" >
        </exec>
    </target>
    
    </project>
    在同文件夹下的local.properties中添加一行。指定你的ndk文件夹
    ndk.dir=ndk路径
    再次运行ant release,查看你的so库是否已生成

        假设你的jniproject是作为库project存在,方法是一样的。

    主project依赖你的库project,在库project中也生成build.xml,然后依照上面的方法操作就可以。

        2.调用隐藏api,增加android.jar
        不少project是基于Android原生代码改动而来。或者就是想调用系统隐藏的部分api,就会用到别人编译好的android.jar,或者framework.jar等其他什么名字的库文件,并且会要求载入的顺序在你选择的android编译版本号之前。

    在eclipse的Java Build Path->Libraries中调整其载入顺序,那么ant编译怎么改动呢?还是利用前面编写的custom_rules.xml,内容例如以下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="hooktest" default="help">
    <property name="project.target.android.jar" value="${sdk.dir}/platforms/${target}/android.jar" />
    <target name="-pre-compile">
    
        <echo >set project target class path.............................</echo>
    
        <path id="project.target.class.path">
        <pathelement location="framework.jar"/>
        <pathelement location="${project.target.android.jar}"/>
        </path>
    
        <property name="my.project.target.class.path" refid="project.target.class.path" />
        <echo message="project.target.class.path:${my.project.target.class.path}" />
    
    </target>
    </project>
    3.一个project中多源代码文件夹
        假设一个project中设置了多个源代码文件夹,不太合适的方法就是先拷贝其他的源代码文件夹到默认的src下,在编译完毕后再删除。事实上顺便看看文件拷贝和删除,在多源代码文件夹的project中也建立custom_rules.xml,主要内容例如以下:
    <target name="-pre-build">
        <echo >copy file.............................</echo>
        <copy todir="${source.absolute.dir}">
    
         <fileset dir="其他源代码文件夹">
            <include name="**/*.java" />
            <include name="**/*.aidl" />
        </fileset>
        </copy>
    </target>
    
    <target name="src-clean" >
        <echo >delete file.............................</echo>
        <delete dir="${source.absolute.dir}/拷贝的源代码文件夹" />
    </target>
    
    <target name="-post-build" depends="src-clean">
    </target>
    <target name="-pre-clean" depends="src-clean">
    </target>
    上述代码在运行ant clean时也会运行删除拷贝的源代码操作。而在编译前先拷贝源代码。包含aidl文件。之后在打包完毕后删除拷贝的源代码文件夹。


       一个project中的源代码尽量就弄在一个文件夹里吧。

    其他问题还有如库project间的资源引用,假设直接使用默认的R文件是没有问题的,可是要是在eclipse中利用build Java Build Path->project加入了子project,而且还用了当中的R文件来应用资源,那么ant打包就还得再继续折腾


    结尾:
        这里仅给出了使用Ant打包Android应用的基本过程和可能问题的解决方法,至于ant的使用和打包原理既能够看參考文章。也能够看兴许的补充文章。


    參考:
    1.android命令具体说明http://developer.android.com/tools/help/android.html
    3.ant打包apk具体的过程可阅读sdk/tools/ant/build.xml文件

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6995111.html
Copyright © 2011-2022 走看看