Android知识集锦
| 术语 | 说明 | 
| smali | 
 可以指: 
 dex字节码无法阅读,smali为其提供了较好的可读性  | 
APK包的res目录下,会有一些drawable开头的子目录,用来存放针对不同像素密度屏幕的资源文件:
| 目录后缀 | 像素密度范围 | 机型举例 | 
| mdpi | 120dpi~160dpi | |
| hdpi | 160dpi~240dpi | |
| xhdpi | 240dpi~320dpi | |
| xxhdpi | 320dpi~480dpi | Sony Xperia Z5 | 
| xxxhdpi | 480dpi~640dpi | 
可能原因是,APK被重复签名多次。删除掉META-INF目录下的签名文件、签名块文件后,重新签名即可。
APK包反向工程工具。
| 子命令 | 说明 | 
| if | 
 命令格式: apktool if|install-framework [options] <framework.apk> 安装框架文件到目录中,选项:  | 
| d | 
 命令格式: apktool [-q OR -v] d[ecode] [options] <file_apk> 解码file_apk,生成以下目录或者文件: 可用选项:  | 
| b | 
 命令格式: apktool [-q|--quiet OR -v|--verbose] b[uild] [options] <app_path> 对解码后的目录进行重新打包,可用选项:  | 
进行.dex格式、.smali格式、.class格式之间的转换。
| 子命令 | 说明 | 
| d2j-dex2jar | 
 转换.dex为.jar文件 选项:  | 
| 
					 1 2  | 
						# 转换apk中的.dex为Java的class文件,这些class文件打包在apk_to_decompile-dex2jar.jar中 d2j-dex2jar -f ~/path/to/apk_to_decompile.apk   | 
					
命令格式: adb [子命令] [选项]
| 选项 | 说明 | 
| -a | 使adb在所有网络接口上监听连接 | 
| -d | 使命令仅针对USB连接的设备有效 | 
| -e | 使命令仅针对运行中的模拟器有效 | 
| -s <specific device> | 使命令仅针对与特定设备或模拟器,通过serial number或 qualifier指定设备 | 
| -H | adb服务器的主机名,默认localhost | 
| -P | adb服务器的监听端口,默认5037 | 
列出设备、连接/断开设备:
| 子命令 | 说明 | 
| devices [-l] | 列出所有连接的设备,-l会显示设备的qualifier | 
| connect <host>[:<port>] | 通过TCP/IP连接到某个设备,默认5555端口 | 
| disconnect [<host>[:<port>]] | 断开TCP/IP连接,不指定主机和端口,则端口所有通过TCP/IP连接的设备 | 
针对设备的子命令:
| 子命令 | 说明 | ||
| adb push [-p] <localpath> <remotepath> | 拷贝目录或者文件到设备,-p显示进度 | ||
| adb pull [-p] [-a] <remote> [<local>] | 拷贝目录或者文件到本地,-a拷贝时间戳和UNIX文件mode | ||
| adb sync [ <directory> ] | 当本地文件变化时,拷贝目录到设备 | ||
| adb shell | 交互式的运行Linux命令,示例:
  | 
||
| adb shell <command> | 运行Linux命令 | ||
| adb emu <command> | 运行模拟器控制台命令 | ||
| adb logcat [ <filter-spec> ] | 显示设备日志 | ||
| adb install [-lrtsdg] <file> | 
 安装APK到设备,-r替换已经存在的应用 报错:  | 
||
| adb uninstall [-k] <package> | 从设备上移除软件包,-k表示保留应用的数据和缓存 | 
JRE自带密钥数据库管理工具。用于加密密钥对、X.509证书链、受信任证书的管理。该工具支持基于DES算法的密码管理。
一个密钥数据库(keystore)可以包含多个密钥条目,以别名(alias)进行唯一区分。
命令格式: keytool [commands]
| 子命令 | 说明 | ||
| -gencert | 
 可用选项: 
 生成一个证书,作为证书请求的响应。该命令从infile(不指定该选项则使用stdin)读取证书请求,使用alias这个私钥进行签名并输出X.509格式的证书到outfile(不指定则使用stdout) 当指定-rfc选项时,输出格式是基于Base64的PEM,否则使用二进制的DER 当指定dname选项时,该选项作为输出证书的subject字段,不指定则使用请求中该字段的值 
  | 
||
| -genkeypair | 
 可用选项: 
 别名-genkey,用于生成密钥对(公钥/私钥),并包装公钥为X.509 v3自签名格式的证书,该证书作为单元素证书链存储。这个自签名证书 + 私钥作为keystore中的一个条目保存,以alias唯一识别 -keyalg 指定生成密钥对的算法,默认DSA,可选RSA 某些选项如果不提供,会交互式的提示  | 
||
| -genseckey | 生存密钥并存储到keystore中 | ||
| -importcert | 
 可用选项: 
 从cert_file文件中读取证书或者证书链,并且存储到keystore中,以alias进行识别 支持导入X509 v1 v2 v3格式的证书,以及这些证书形成的PKCS#7格式的证书链。数据必须是二进制的或者是BASE64编码的。对于BASE64格式,证书必须以-----BEGIN开头-----END结束 之所以需要导入证书,可能出于以下目的: 
  | 
||
| -importpassword | 导入一个密码 | ||
| -importkeystore | 从其它keystore导入内容 | ||
| -certreq | 制作证书请求 | ||
| -exportcert | 导出证书 | ||
| -list | 列出alias对应条目的信息,打印到标准输出 | ||
| -printcert | 
 从文件、SSL服务器、被签名JAR等地方读取证书信息  | 
||
| -printcertreq | 打印证书请求 | ||
| -printcrl | 读取证书吊销列表 | ||
| -storepasswd | 修改keystore的密码 | ||
| -keypasswd | 修改某个条目的密码 | ||
| -delete | 从keystore中删除某个条目 | ||
| -changealias | 修改alias | 
| 
					 1 2 3  | 
						# 生成一个密钥对,并添加到数据库中 keytool -genkeypair -v -keystore ~/Android/Keystores/alexwong.keystore      -alias development -keyalg RSA -keysize 2048 -validity 36500  | 
					
对JAR文件进行签名,或者执行签名校验 —— 签名是否有效、签名后的JAR是否完整。
被签名后的JAR文件,仅仅是在META-INF目录中多了两个额外的文件:
- 以.SF为扩展名的签名文件
 - 以.DSA、.RSA或者.EC为扩展名的签名块文件
 
命令格式:
| 
					 1 2 3 4  | 
						# 进行签名 jarsigner [ options ] jar-file alias # 校验签名 jarsigner -verify [ options ] jar-file [alias ...]  | 
					
| 
					 1 2 3  | 
						# 签名一个APK(JAR)文件 jarsigner -keystore ~/Android/Keystores/alexwong.keystore -storepass simple     -keypass simple -signedjar android-signed.apk android.apk  development  | 
					
            
Leave a Reply