2、Java Compiler:java編譯器,R.java、Application source code和java InterFaces是通過java編譯器編譯成.class文件的
打包一個簽名的apk需要兩步操作
1.生成簽名文件
2.根據簽名文件進行打包的apk
操作步驟:
1.生成簽名文件
①指令工具路徑:Java -> jdk -> bin -> keytool.exe
②使用指令進入到工程的根目錄下
③使用指令
keytool -genkeypair -alias zdc -keyalg RSA -validity 3650 -keypass 123456 -storepass 123456 -keystore zdc.keystore
2.根據簽名文件進行打包的apk
①指令工具路徑:Java -> jdk -> bin -> jarsigner.exe
②使用指令
jarsigner -keystore zdc.keystore -keypass 123456 -storepass 123456 -signedjar bin\mobliesafe_signed.apk bin\mobliesafe.apk zdc
#ant介紹
1.環境變量配置
ANT_HOME ....\apache-ant-1.9.6-bin
Path %ANT_HOME%\bin
2.校驗
ant -help 或者 ant -version
#ant基本操作
1.腳本必須寫在build.xml中
2.常用標籤
project根標籤
name: 項目名稱。必填
baseDir: 指定當前目錄。(選填)
default: 默認執行的任務。 (選填)
echo輸出打印標籤
message:指定打印的內容
示例:
<?xml version="1.0" encoding="utf-8"?>
<project name="test01">
<target name="helloworld">
<echo message="Hello World"></echo>
</target>
</project>
3.執行ant
①cmd -> ant : 查看build.xml文件是否構建成功
②cmd -> ant helloworld : 執行相應的任務
4.如果不想通過ant helloworld執行任務,也可以設置project的default標籤設置默認執行任務
示例:
<project name="test01" default="helloworld">
<target name="helloworld">
<echo message="Hello World"></echo>
</target>
</project>
4.也可以輸出引用
示例:
<project name="test01" default="helloworld">
<target name="helloworld">
<echo message="Hello World"></echo>
<echo message="${basedir}"></echo>
</target>
</project>
${名稱}:引用;${basedir} : 本地路徑引用
5.執行多個任務
5.1.兩個任務
示例:
<project name="test01" default="helloworld">
<target name="helloworld">
<echo message="Hello World"></echo>
</target>
<target name="printdir" depends="helloworld">
<echo message="${basedir}"></echo>
</target>
</project>
depends:和哪個任務關聯,運行先執行depends中的任務,再執行當前任務
運行Cmd -> ant printdir,這時候就會先打印第一個任務,在打印第二個任務
5.2.三個任務
示例:
<project name="test01" default="helloworld">
<target name="helloworld">
<echo message="Hello World"></echo>
</target>
<target name="printdir" depends="helloworld">
<echo message="${basedir}"></echo>
</target>
<target name="helloAndroid" depends="helloworld,printdir">
<echo message="helloAndroid"></echo>
</target>
</project>
多個任務depends中使用“,”分隔
#ant的文件操作
1.添加文件
示例:
<project name="test02">
<target name="mkdir">
<mkdir dir="hehe"></mkdir>
</target>
</project>
mkdir:表示創建目錄,dir:是目錄的名稱
2.刪除目錄
示例:
<project name="test02">
<target name="deldir">
<delete dir="hehe"></delete>
</target>
</project>
delete:刪除目錄,dir:目錄的名稱
3.創建文件
因爲創建出來文件還需要編輯,ant沒有這麼強大,所以不能創建文件
4.刪除文件
創建文件test.txt
示例:
<project name="test02">
<target name="delfile">
<delete file="test.txt"></delete>
</target>
</project>
file:文件的名稱
#ant執行javac指令
1.創建java文件
2.使用ant執行編譯指令
原先:編譯:javac Test.java執行java Test
示例:
<project name="test03">
<target name="javac">
<javac>
<src path="."/>
<exclude name="Test.java"/>
<exclude name="Test1.java"/>
</javac>
</target>
</project>
javac:標示javac指令,src:根目錄,exclude:表示不編譯哪個文件
#ant打包手機衛士
在eclipse的手機衛士的項目根目錄中新建文件build.xml,發現無法進行快捷提示,這是因爲缺少ant.dtd系統文件,將ant.dtd導入到工程的根目錄下在,在重新創建build.xml,創建的時候點擊下一步,不要直接點擊完成,在跳轉的下一個界面中選擇導入自己的dtd文件,完成即可
1.生成R文件
1.1.創建存放R文件的目錄,工程 -> build
1.2.創建gen目錄
示例:
<!-- 創建R文件存放的目錄 -->
<target name="init">
<!-- 當下次調用的時候,要將文件目錄刪除,重新創建 -->
<delete dir="${builddir}"></delete>
<!-- 創建build\gen -->
<mkdir dir="${gendir}"/>
</target>
路徑下面還會用,抽取路徑
<property name="builddir" location="${basedir}/build"/>
<property name="gendir" location="${builddir}/gen" />
property : 設置屬性
2.運行
window -> show view -> ant -> 點擊加號將build.xml添加到ant中,如果出現錯誤將build.xml中的<!DOCTYPE pro ject SYSTEM "ant.dtd" >註釋調用,點擊運行即可
3.生成R文件
3.1.生成R文件需要aapt,但是aapt是在sdk目錄下的,如何去獲取呢?可以通過環境變量獲取
示例:
<property environment="env"/>
<property name="sdkhome" location="${env.SDK_HOME}"/>
<property name="aapt" location="${sdkhome}/build-tools/19.1.0/aapt.exe"/>
environment : 表示設置環境變量的標示
3.2.生成R文件
示例:
<!-- 創建R文件思路:
1.找到aapt
2.運行aapt指令:aapt package -f -m -J gen -S res -I d:\...\sdk\platforms\android-14\android.jar -M AndroidManifest.xml-->
<target name="genR" depends="init">
<exec executable="${aapt}">
<arg value="package"></arg>
<arg value="-f"></arg>
<arg value="-m"></arg>
<arg value="-J"></arg>
<arg value="${gendir}"></arg>
<arg value="-S"></arg>
<arg value="${resdir}"></arg>
<arg value="-I"></arg>
<arg value="${androidjar}"></arg>
<arg value="-M"></arg>
<arg value="${manifest}"></arg>
</exec>
</target>
exec : 執行指令 executable:執行什麼指令,ant無法通過快捷提示出來的。
3.3.在執行的時候還需要創建保存目錄
示例:
<!-- 創建R文件2:設置各種目錄 -->
<!-- res -->
<property name="resdir" location="${basedir}/res"></property>
<!-- android.jar -->
<property name="androidjar" location="${sdkhome}/platforms/android-14/android.jar"></property>
<!-- AndroidManifest.xml -->
<property name="manifest" location="${basedir}/AndroidManifest.xml"></property>
4.aidl轉化java文件操作:
4.1.設置屬性獲取aidl工具
示例:
<property name="aidl" location="${sdkhome}/build-tools/19.1.0/aidl.exe"></property>
4.2.執行指令
因爲有多個aidl文件所以需要執行多個aidl指令,在ant中exec標籤是執行一條指令,apply標籤執行多條指令
示例:
<target name="aidltojava" depends="mkR">
<apply executable="${aidl}">
<arg value="-I${srcdir}"/>
<arg value="-p${frameworkaidl}"/>
<arg value="-o${gendir}"/>
<fileset dir="${srcdir}" includes="**/*.aidl"/>
</apply>
</target>
fileset : 執行的文件的組,dir:文件存放的根目錄 includes:文件的位置
**/*.aidl : **/:表示:aidl文件的上級目錄 *.aidl:任何aidl文件
4.3.將相應的目錄生成一下
示例:
<property name="srcdir" location="${basedir}/src"></property>
<!-- framwork.aidl -->
<property name="frameworkaidl" location="${sdkhome}/platforms/android-14/framework.aidl"></property>
5.java轉class操作
5.1.創建classes目錄,修改init任務
示例:
<target name="init">
<delete dir="${builddir}"></delete>
<mkdir dir="${gendir}"/>
<mkdir dir="${classesdir}"></mkdir>
</target>
5.2.設置轉化操作
示例:
<target name="javattoclass" depends="aidltojava">
<javac encoding="utf-8" bootclasspath="${androidjar}" destdir="${classesdir}">
<classpath>
<fileset dir="${lisbsdir}" includes="**/*.jar"></fileset>
</classpath>
<src path="${srcdir}"></src>
<src path="${gendir}"></src>
</javac>
</target>
classpath : 表示設置路徑組,fileset:標示多個文件
5.3.設置路徑屬性
示例:
<property name="lisbsdir" location="${basedir}/libs"></property>
<property name="classesdir" location="${builddir}/classes"></property>
6.解壓jar包
示例:
<target name="unjar" depends="javattoclass">
<unjar dest="${classesdir}">
<fileset dir="${lisbsdir}" includes="**/*.jar"></fileset>
</unjar>
</target>
7.class文件轉dex文件
7.1.獲取dx工具
示例:
<property name="dx" location="${sdkhome}/platform-tools/dx.bat"></property>
7.2.設置執行任務
示例:
<target name="classtodex" depends="unjar">
<exec executable="${dx}">
<arg value="--dex"></arg>
<arg value="--output=${classesdex}"></arg>
<arg value="${classesdir}"></arg>
</exec>
</target>
7.3.設置路徑
示例:
<property name="classesdex" location="${builddir}/classes.dex"></property>
8.打包資源文件
8.1.設置執行任務
示例:
<target name="restoresources" depends="classtodex">
<exec executable="${aapt}">
<arg value="package"></arg>
<arg value="-f"></arg>
<arg value="-M"></arg>
<arg value="${manifest}"></arg>
<arg value="-S"></arg>
<arg value="${resdir}"></arg>
<arg value="-A"></arg>
<arg value="${assetsdir}"></arg>
<arg value="-I"></arg>
<arg value="${androidjar}"></arg>
<arg value="-F"></arg>
<arg value="${resourcesap}"></arg>
</exec>
</target>
8.2.設置路徑
示例:
<property name="assetsdir" location="${basedir}/assets"></property>
<property name="resourcesap" location="${builddir}/resources.ap_"></property>
9.生成未簽名的apk
9.1.獲取打包指令
示例:
<property name="apkbuilder" location="${sdkhome}/tools/apkbuilder.bat"></property>
9.2.設置執行任務
示例:
<target name="unsignedapk" depends="restoresources">
<exec executable="${apkbuilder}">
<arg value="${unsingedapk}"></arg>
<arg value="-u"></arg>
<arg value="-z"></arg>
<arg value="${resourcesap}"></arg>
<arg value="-f"></arg>
<arg value="${classesdex}"></arg>
<arg value="-rf"></arg>
<arg value="${srcdir}"></arg>
<arg value="-rj"></arg>
<arg value="lisbsdir"></arg>
</exec>
</target>
9.3.設置路徑
示例:
<property name="unsingedapk" location="${builddir}/mobliesafe_unsigned.apk"></property>
10.生成簽名的apk
將之前用命令寫的key文件拷貝到工程的根目錄下
10.1.獲取執行指令工具
示例:
<property name="javahome" location="${env.JAVA_HOME}"></property>
<property name="jarsigner" location="${javahome}/bin/jarsigner.exe"></property>
10.2.設置執行任務
<target name="signedapk" depends="unsignedapk">
<exec executable="${jarsigner}">
<arg value="-keystore"></arg>
<arg value="${keystore}"></arg>
<arg value="-keypass"></arg>
<arg value="123456"></arg>
<arg value="-storepass"></arg>
<arg value="123456"></arg>
<arg value="-signedjar"></arg>
<arg value="${signedpakdir}"></arg>
<arg value="${unsingedapk}"></arg>
<arg value="zdc85"></arg>
</exec>
</target>
10.3.設置路徑
示例:
<property name="keystore" location="${basedir}/zdc85.keystore"></property>
<property name="signedpakdir" location="${builddir}/mobliesafe_signed.apk"></property>
11.資源混淆
11.1.解壓AndResGuard-master.zip,在其中的tool_output找到AndResGuard-cli-1.1.4.jar
11.2.將AndResGuard-cli-1.1.4.jar拷貝到工程的tools目錄下
11.3.將config.xml文件拷貝到工程的tools目錄下
11.4.修改config.xml文件
示例:
<resproguard>
<issue id="sign" isactive="true">
<!--the signature file path, in window use \, in linux use /, and the default path is the running location-->
<path value="zdc85.keystore"/>
<!--storepass-->
<storepass value="123456"/>
<!--keypass-->
<keypass value="123456"/>
<!--alias-->
<alias value="zdc85"/>
</issue>
</resproguard>
11.5.使用指令測試,必須使用JDK1.7,並且路徑不能有空格
D:\java\jdk7\bin\java.exe -jar AndResGuard-cli-1.1.4.jar ..\build\mobliesafe_unsigned.apk
11.6.解決7za的錯誤
將SevenZip\executable目錄下找到7za-windows_x86_64.exe拷貝到工程的tools目錄下
11.7.將key文件也放到目錄下重新執行命令
D:\java\jdk7\bin\java.exe -jar AndResGuard-cli-1.1.4.jar ..\build\mobliesafe_unsigned.apk -7zip 7za-windows_x86_64.exe
11.8.設置ant執行任務
設置JDK1.7路徑
示例:
<property name="java7" location="D://java/jdk7/bin/java.exe" />
設置執行任務
示例:
<target name="proguardResourceApk" depends="unsignedapk">
<exec executable="${java7}">
<arg value="-jar" />
<arg value="tools/AndResGuard-cli-1.1.4.jar" />
<arg value="${unsingedapk}" />
<arg value="-7zip" />
<arg value="tools/7za-windows_x86_64.exe" />
</exec>
</target>
注意:這時候需要將config.xml拷貝到根目錄下