apktool工具在centos环境中-解包 修改 打包 签名

为了在服务端实现 程序控制分包 而配置起来到 环境

第一步:查看Linux自带的JDK是否已安装

打开命令终端输入命令:java -version

若已经安装了jdk会显示类似下面的信息

java version "1.6.0"
OpenJDK Runtime Environment (build 1.6.0-b09)
OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)

最好还是先卸载掉openjdk,在安装sun公司的jdk.

先查看 rpm -qa | grep java

显示如下信息:

java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

卸载:

rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

还有一些其他的命令

rpm -qa | grep gcj

rpm -qa | grep jdk

如果出现找不到openjdk source的话,那么还可以这样卸载

yum -y remove java java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
yum -y remove java java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

 <1># rpm -qa|grep jdk ← 查看jdk的信息或直接执行 

或 
# rpm -q jdk 
或 
# java -version 
<2># rpm -qa | grep gcj ← 确认gcj的版本号 
<3># yum -y remove java-1.4.2-gcj-compat ← 卸载gcj 

第二步:安装JDK
从SUN的官网上下载 jdk到压缩包

http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.tar.gz
tar xvf jdk-8u5-linux-x64.tar.gz
mv jdk1.8*  /usr/local/java


第三步:配置环境变量

<1># vi /etc/profile 
<2>在最后加入以下几行:
JAVA_HOME=/usr/local/java
JRE_HOME=/usr/local/java/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/jt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

<3>保存好上面到配置后  使配置立即生效在终端输入命令 source /etc/profile

第四步:安装apktool工具

wget https://android-apktool.googlecode.com/files/apktool1.5.2.tar.bz2
wget https://android-apktool.googlecode.com/files/apktool-install-linux-r05-ibot.tar.bz2

上面链接下载不了的话可以在这里下载http://ibotpeaches.github.io/Apktool/install/

tar xvf apktool1.5.2.tar.bz2
tar xvf apktool-install-linux-r05-ibot.tar.bz2

mv apktool1.5.2 /usr/local/apktool
mv apktool-install-linux-r05-ibot /usr/local/aapt

vim /etc/profile
export PATH=$PATH:/usr/local/aapt:/usr/local/apktool

cp /usr/local/aapt/* /usr/local/bin/
cp /usr/local/apktool/* /usr/local/bin/
反编译命令
apktool d -f com.paipai.apk android

打包命令
apktool b -f android android.apk

第五步:给打包出来到apk签名

如果有修改里面的文件内容需要使用签名工具给apk包重新签名,否则不能在手机上成功安装

签名需要使用到两个工具keytooljarsigner,只要成功安装了jdk就可以使用这两个工具

签名的时候需要使用.keystore 文件来 加入签名中


第1步:生成keystore

keytool -genkey -v -keystore android.keystore -alias android.keystore -keyalg RSA -validity 20000


这里得到一个名为android.keystore文件 其密码在命令里面设置了在下面到 签名步骤中要用到 该密码


第2步:jarsigner签名apk

jarsigner -verbose -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore


到这一步会得到一个已经签过名的android_signed.apk到apk文件,这个文件可以拿去手机上面安装了


问题概括及解决到方法

1 签名后到文件不能正常安装

造成无法签名错误的原因,初步估计是JDK版本的问题。JDK 1.6签名没事,但是1.7会出这个问题

在签名时,要加上2个参数: -digestalg SHA1 -sigalg MD5withRSA

jarsigner -verbose -storepass 123456 -digestalg SHA1 -sigalg MD5withRSA -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore

注 :-storepass 123456 这是android.keystore文件到密码


2 使用apktool打包到时候报错

原因在于:64位系统中安装了32位程序。 apktool是32位
 
那么为了解决以上问题,我们需要安装:glibc.i686,zlib.i686,libstdc++.i686
 
如果你是云主机,那么很可能执行以下明步骤的时候会提示你:
 
No package glibc.i686 available
 
No package zlib.i686 available.
 
No package libstdc.i686 available.
 
原因是云主机一般配置的都是纯净64位系统
 
到这个步骤的时候,我们就要去修改yum 配置文件了,如下:
 
在/etc/yum.conf里面有
exclude选项,把这行删掉就可以了
 
现在去执行以下三步操作,那么appt命令就可以正常执行了
 
1.yum install glibc.i686
之后发现如下错误error while loading shared libraries: libz.so.1,ok继续安装libz
2.sudo yum install zlib.i686
之后发现error while loading shared libraries: libstdc++.so.6,执行
3.sudo yum install libstdc++.i686
 
安装 libstdc++.i686 报错:
Error: Protected multilib versions: libstdc++-4.4.7-11.el6.i686 != libstdc++-4.4.6-4.el6.x86_64
解决方法:
更新: yum update  libstdc++-4.4.6-4.el6.x86_64
然后在安装: sudo yum install  libstdc++-4.4.7-11.el6.i686

注:只要注意执行时到报错信息,注意版本到安装就可以解决该问题


附上keytool参数以及jarsigner参数:

  keytool用法

-certreq     [-v] [-protected]

             [-alias <别名>] [-sigalg <sigalg>]

             [-file <csr_file>] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-changealias [-v] [-protected] -alias <别名> -destalias <目标别名>

             [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-delete      [-v] [-protected] -alias <别名>

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-exportcert  [-v] [-rfc] [-protected]

             [-alias <别名>] [-file <认证文件>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-genkeypair  [-v] [-protected]

             [-alias <别名>]

             [-keyalg <keyalg>] [-keysize <密钥大小>]

             [-sigalg <sigalg>] [-dname <dname>]

             [-validity <valDays>] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-genseckey   [-v] [-protected]

             [-alias <别名>] [-keypass <密钥库口令>]

             [-keyalg <keyalg>] [-keysize <密钥大小>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-help

-importcert  [-v] [-noprompt] [-trustcacerts] [-protected]

             [-alias <别名>]

             [-file <认证文件>] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-importkeystore [-v]

             [-srckeystore <源密钥库>] [-destkeystore <目标密钥库>]

             [-srcstoretype <源存储类型>] [-deststoretype <目标存储类型>]

             [-srcstorepass <源存储库口令>] [-deststorepass <目标存储库口令>]

             [-srcprotected] [-destprotected]

             [-srcprovidername <源提供方名称>]

             [-destprovidername <目标提供方名称>]

             [-srcalias <源别名> [-destalias <目标别名>]

               [-srckeypass <源密钥库口令>] [-destkeypass <目标密钥库口令>]]

             [-noprompt]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-keypasswd   [-v] [-alias <别名>]

             [-keypass <旧密钥库口令>] [-new <新密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-list        [-v | -rfc] [-protected]

             [-alias <别名>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

-printcert   [-v] [-file <认证文件>]

-storepasswd [-v] [-new <新存储库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

jarsigner用法 [选项] jar 文件别名

       jarsigner -verify [选项] jar 文件

[-keystore <url>]           密钥库位置

[-storepass <口令>]         用于密钥库完整性的口令

[-storetype <类型>]         密钥库类型

[-keypass <口令>]           专用密钥的口令(如果不同)

[-sigfile <文件>]           .SF/.DSA 文件的名称

[-signedjar <文件>]         已签名的 JAR 文件的名称

[-digestalg <算法>]    摘要算法的名称

[-sigalg <算法>]       签名算法的名称

[-verify]                   验证已签名的 JAR 文件

[-verbose]                  签名/验证时输出详细信息

[-certs]                    输出详细信息和验证时显示证书

[-tsa <url>]                时间戳机构的位置

[-tsacert <别名>]           时间戳机构的公共密钥证书

[-altsigner <>]           替代的签名机制的类名

[-altsignerpath <路径列表>] 替代的签名机制的位置

[-internalsf]               在签名块内包含 .SF 文件

[-sectionsonly]             不计算整个清单的散列

[-protected]                密钥库已保护验证路径

[-providerName <名称>]      提供者名称

[-providerClass <>        加密服务提供者的名称

[-providerArg <参数>]] ... 主类文件和构造函数参数




展开阅读全文

没有更多推荐了,返回首页