当前位置: 代码迷 >> Android >> <转>使用maven构建android 的apk包并自动签字
  详细解决方案

<转>使用maven构建android 的apk包并自动签字

热度:105   发布时间:2016-04-28 07:31:47.0
<转>使用maven构建android 的apk包并自动签名
最近使用maven自动构建android的签名apk包(配合hudson),遇到几个问题跟大家分享下:

1、使用maven-android-plugin可以很容易实现自动构建,但基于命令行的方式有别与eclipse的打包方式

2、编译时出现非法字符的错误

1
*.java:[1,0] 非法字符: \65279
说明某些文件采用UTF-8的时候写入了BOM的头信息,eclipse采用jdt会自动处理这些头信息但maven直接调用javac没有那么智能了,首先找找那些文件

1
#查找BOM
2
find -type f -name "*.java"|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
使用vim自动去除bom

1
去掉utf-8 BOM
2
:set nobomb
3、打包是出现无法签名的情况
              <plugin>              <groupId>org.apache.maven.plugins</groupId>              <artifactId>maven-jarsigner-plugin</artifactId>              <version>1.2</version>              <executions>                  <execution>                      <id>signing</id>                      <goals>                          <goal>sign</goal>                      </goals>                      <phase>package</phase>                      <inherited>true</inherited>                      <configuration>                          <archiveDirectory></archiveDirectory>                          <includes>                              <include>target/${artifactId}.apk</include>                          </includes>                          <keystore>${keyFilePath}</keystore>                          <storepass>${storePassword}</storepass>                          <keypass>${keyPassword}</keypass>                          <alias>${keyAlias}</alias>                      </configuration>                  </execution>              </executions>            </plugin>

alias必须与生成签名文件时的条目一致

4、签名之前必须保证apk生成的时候没有使用debug签名,不然会提示


jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 15331 but got 15809 bytes)
必须定义maven的android插件信息
                       <configuration>                  <sdk>                      <path>${env.ANDROID_HOME}</path>                      <platform>7</platform>                  </sdk>                  <sign>                      <debug>false</debug>                  </sign>                  <deleteConflictingFiles>true</deleteConflictingFiles>                </configuration> 5、至此使用一条命令 mvn clean package就可以自动编译打包了下面是完整的配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxxx.gcl</groupId> <artifactId>xxxx</artifactId> <version>2.1.2</version> <packaging>apk</packaging> <name>xxxxxx</name> <dependencies>     <dependency>         <groupId>com.google.android</groupId>         <artifactId>android</artifactId>         <version>2.1.2</version>         <scope>provided</scope>     </dependency>     <dependency>         <groupId>com.thoughtworks.xstream</groupId>         <artifactId>xstream</artifactId>         <version>1.3.1</version>     </dependency>     <dependency>         <groupId>com.dom4j</groupId>         <artifactId>dom4j</artifactId>         <version>1.6.1</version>     </dependency>     <dependency>         <groupId>commons-httpclient</groupId>         <artifactId>commons-httpclient</artifactId>         <version>3.1</version>     </dependency>     <dependency>         <groupId>com.autonavi</groupId>         <artifactId>mapapi</artifactId>         <version>1.0</version>     </dependency> </dependencies> <build>     <finalName>${artifactId}</finalName>     <sourceDirectory>src</sourceDirectory>     <plugins>         <plugin>             <groupId>                 com.jayway.maven.plugins.android.generation2               </groupId>             <artifactId>android-maven-plugin</artifactId>             <version>3.1.1</version>             <configuration>                 <sdk>                     <path>${env.ANDROID_HOME}</path>                     <platform>7</platform>                 </sdk>                 <sign>                     <debug>false</debug>                 </sign>                 <deleteConflictingFiles>true</deleteConflictingFiles>             </configuration>             <extensions>true</extensions>             <inherited>true</inherited>         </plugin>         <plugin>             <artifactId>maven-compiler-plugin</artifactId>             <configuration>                 <source>1.6</source>                 <target>1.6</target>                 <encoding>UTF-8</encoding>             </configuration>         </plugin>         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-jarsigner-plugin</artifactId>             <version>1.2</version>             <executions>                 <execution>                     <id>signing</id>                     <goals>                         <goal>sign</goal>                     </goals>                     <phase>package</phase>                     <inherited>true</inherited>                     <configuration>                         <archiveDirectory></archiveDirectory>                         <includes>                             <include>target/${artifactId}.apk</include>                         </includes>                         <keystore>${keyFilePath}</keystore>                         <storepass>${storePassword}</storepass>                         <keypass>${keyPassword}</keypass>                         <alias>${keyAlias}</alias>                     </configuration>                 </execution>             </executions>         </plugin>     </plugins> </build> <profiles>     <profile>         <id>local</id>         <activation>             <activeByDefault>true</activeByDefault>         </activation>         <properties>             <keyFilePath>xxxxxxx</keyFilePath>             <storePassword>xxxx</storePassword>             <keyPassword>xxxx</keyPassword>             <keyAlias>xxxxx</keyAlias>         </properties>     </profile>     <profile>         <id>dev</id>         <properties>             <keyFilePath>xxxxx</keyFilePath>             <storePassword>xxxxx</storePassword>             <keyPassword>xxxx</keyPassword>             <keyAlias>xxxxxx</keyAlias>         </properties>     </profile> </profiles></project> 
  相关解决方案