adb常用命令(转)

时间:2021-08-21 14:28:08

1.Android Debug Bridge -adb常用命令

1.1简介

Android Debug Bridge,我们一般简称为adb,主要存放在sdk安装目录下的platform-tools文件夹中,它是一个非常强大的命令行工具,通过这个工具你能够与你的android设备进行交互。同时这是一个包含了以下三部分的cs模式的程序:

  1. adb client

      从图中,我们知道client是运行在PC端的,每当我们发起一个adb命令的时候,就会开启一个client程序。当然,当我们开启DDMS或者ADT的时候,也会自动创建client。

  当我们开启一个client的时候,它首先会去检测后台是否已经有一个server程序在运行着,否则会开启一个adb-server进程。

  所有的client都是通过5037端口与adb-server进行通信的。

2)adb daemon(adbd)

  从图中,我们知道daemon是作为一个后台进程运行在模拟器/真实Android设备中的。

  daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:

    Emulator 1, console: 5554

    Emulator 1, adb: 5555

  也正因为每个设备都分一组两个端口,也已adb连接手机的最大数量为16。

  说回端口的作用,在这两个端口中,其中偶数端口是用于server 与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。

  1. adb server

      从图中,我们同样可以知道,server也是作为一个后台的程序运行在PC端的,他负责管理client进程以及adb daemon之间的通信。

  当一个server开启的时候,他会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。

1.2 常用的adb命令

首先我们先来介绍一下,adb命令的使用格式吧:

adb [-d|-e|-s ]

adb是必须的,接下来方括号[]里面的内容不是必须的,最后才是我们需要执行的命令操作,例如 adb -s emulator-5554 install UCBrowser.apk (这是安装UC浏览器的意思)

下面先介绍下,前面几个参数的含义吧:

  -d: 让唯一连接到该PC端的真实安卓设备执行命令,如果发现USB中连接有多部设备,将会报错

  -e: 让唯一连接到该PC端的模拟器执行命令,如果发现开启了多个模拟器,将会报错

  -s:通过设备的序列号进行指定设备执行命令

如果设备只连接有一个设备或者一个模拟器的时候,可以不用声明这三个参数,adb默认会让这部唯一连接到的设备进行命令执行。

ok,下面开始讲解常用的命令吧:

  1. 查看当前PC端连接有多少设备:

    adb devices

    终端中的执行结果为:

从上图中,我们看到了设备有的两种状态,其实执行该命令,可能返回的状态有三种:

  I. device 设备已经成功连接到了adb-server

II. offline 设备并没有连接到adb或者没有响应

  III. no device 并没有设备/模拟器连接

  1. 查看adb的版本

    adb version

    终端中的执行结果为:

  2. 给设备进行软件的安装

    adb -s install

    eg:

    adb -s 99eb07a9 install D://Test.apk

    终端中的执行结果为:

除了上面这种方法,我们还有另外一个命令:

adb -s shell pm install [options]

其中[options]中最常用的选项是-r,代表着本次安装是重新安装,会保留用户数据。

  1. 卸载设备中已经安装的软件

    adb -s uninstall <pkg_name>

    eg:

    adb -s 99eb07a9 uninstall cn.uc.test

    终端中的执行结果为:

除了上面这种方法,我们还有另外一个命令:

adb -s uninstall [options]

这里的options是-k,加上该参数表明卸载软件后依旧保留用户数据

  1. 将数据从设备复制到PC中

    adb -s pull

    eg:

    adb -s 99eb07a9 pull /sdcard/stericson-ls D://

    终端的执行结果:

在D://盘中我们也可以发现stericson-ls文件

  1. 讲数据从PC端复制到设备中

    adb -s push

    eg:

    adb -s 99eb07a9 push d://stericson-ls /sdcard/

    终端的执行结果:

  2. 获取连接到的手机的序列号

    adb get-serialno

    终端的执行结果:

8)获取设备的连接状态

adb -s get-state

eg:

adb -s 99eb07a9 get-stat

终端的执行结果:

  1. 等待设备连接成功

    adb wait-for-device

    该命令将会阻塞一直到默认连接的那部机器状态变为device,也就是连接成功。

  2. adb-server 的开启与关闭

    adb kill-server

    adb start-server

    终端的执行结果:

有时候我们开启server会失败,这是因为我们装了的手机助手,豌豆荚或者其他软件自带有自己的adb,导致端口冲突开启失败。主要关掉那些软件并且杀掉那些软件自带的adb进程重来即可。

1.2 手机执行Shell命令

众所周知,Android的内核本身就是Linux,所以Android本身也支持Linux命令,但是因为是手机系统,所以进行了一定的删减,部分命令不支持,而不支持的部分,我们可以通过安装busybox这个软件进行

填补。

下面我们讲解下如何在手机中执行Shell命令:

  1. 每次都加上adb shell来进行命令的发送与执行

adb shell

2) 先通过adb shell进入手机Shell执行状态,然后直接输入Linux命令,如图:

  

1.3 Activity Manager 常用命令与参数说明

一般情况下,我们最常用它来进行app的开启,并且传递一定的参数过去,比如:

adb shell am start -a android.intent.action.VIEW -n cn.uc.test/.MainActivity -d http://www.baidu.com

详情的可以参考:http://developer.android.com/tools/help/adb.html#IntentSpec

在这里就不做太过详细和重复的说明了

1.4 Package Manager 常用命令与参数说明

  1. 使一个apk处于禁用状态,相当于卸载了:

    disable <PACKAGE_OR_COMPONENT>

    其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile

    eg:

    adb shell su disable com.UCMobile/.main.UCMobile

    终端执行结果:

同时我们在手机上发现,UC浏览器的图标不见了

  1. 让一个apk从禁用状态恢复过来

    enable <PACKAGE_OR_COMPONENT>

    其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile

    eg:

    adb shell su enable com.UCMobile/.main.UCMobile

    终端执行结果:

同时我们从手机上发现,UC浏览器的图标又回来啦。

  1. 查看一个apk所在的路径

    pm path

    eg:

    adb shell pm path com.UCMobile

    终端执行结果:

  2. 查看手机中装的所有的包

    pm list packages

    具体更多的详情,可以参考:http://developer.android.com/tools/help/adb.html#IntentSpec

再次不做过多的说明

1.5其他常用的adb命令

  1. 屏幕录像

    例如,屏幕开始录像并且储存到/sdcard中,同时名字为demo.mp4

adb shell screenrecord /sdcard/demo.mp4

2) 关闭设备请求,开启设备

adb shell stop

adb shell start

3)设备关机以及重启

adb reboot

adb shutdown

2 android -

android常用命令

2.1 查看机器上所有已经安装的Android版本和AVD设备

2.1.1查看机器上已经安装的AVD(Android Virtual Device)设备

通过下面的命令我们可以查看机器上安装了的所有的AVD:

android list avd

终端执行结果:

从图中我们可以看到,在我的机器上总共建立了两个avd,其中一个是2.3.3版本的 ,另一个是4.0版本的

2.1.2 查看机器上所有已经安装的Android版本

通过下面这个命令,我们可以查看到机器上已经安装了的Android版本:

android list target

终端执行结果:

上图中显示的只是其中的 一部分。

2.2 AVD设备管理

2.2.1创建AVD设备

首先,通过上面的命令我们可以查询到我们机器上所安装又的android版本,接下来,我们就可以根据我们的需求以及已安装的版本进行avd设备的创建。具体命令格式如下:

android create avd -n <avd名称> -t <Android 版本> -b <CPU架构> -p <AVD 设备保存位置> -s <选择AVD皮肤>

举个例子:

android create avd -n test_avd -t 4

这样子我们就可以创建一个最简单的avd了,通过android list avd我们可以查看到这个avd:

2.2.2 升级AVD设备使之符合新的SDK环境

android update avd -n <AVD 名称>

举个例子:

android update avd -n test_avd

2.2.3 重命名AVD设备或者修改路径

复制代码

android move avd

Options:

-p --path : Path to the AVD's new directory.

-n --name : Name of the AVD to move or rename. [required]

-r --rename : New name of the AVD.

复制代码

2.2.4 删除AVD设备

android delete avd -n <AVD 名称>

2.3 Android项目管理

2.3.1创建一个新的Android项目

复制代码

复制代码

android create project

Options:

-n --name : 项目名字,当你去build该项目的时候,这个选项将会用来做你的apk的文件名<即是:name.apk>

-t --target : 项目针对的Android版本,同时在编译的时候也会使用该Android版本.这个可以使用android list target查询到. [required]

-p --path : 项目将要建立的路径. [required]

-k --package : 项目应用的包名. [required]

-a --activity: 默认的Activity的名字. [required]

复制代码

复制代码

举个例子,我要在当前路径下的xiaoxuetu文件夹中创建一个名字为xiaoxuetu,包名是com.xiaoxuetu,activity名字为MainActivity的项目:

android create project -n xiaoxuetu -t 4 -p ./xiaoxuetu -k com.xiaoxuetu -a MainActivity

终端的执行结果为:

从结果中,我们就可以看到,执行命令后他为我们生成了一系列的文件,关于一个项目的具体架构,我们后面讲到。

2.3.2 更新一个Android项目

所谓的更新是什么呢?意思就是可以为一个已经存在的Android项目,添加库,修该项目名字,设置项目的针对的Android版本,同时还可以更新他的子项目,如测试项目。

复制代码

复制代码

android update project

Options:

-l --library : Directory of an Android library to add, relative to this project's directory.

-p --path : The project's directory. [required]

-n --name : Project name.

-t --target : Target ID to set for the project.

-s --subprojects: Also updates any projects in sub-folders, such as test projects.

复制代码

复制代码

我们先来给个简单的使用例子,后来再来介绍 -l 和 -s参数吧:

android update project -p ./xiaoxuetu -n xiaoxuetu -t 4

终端的执行结果:

2.3.3 创建库项目(lib project)

上面的属性 -l 其实指的就是库项目,而库项目(lib project)本身也是一个标准的android 项目。我们可以像之前那样创建一个库项目,也可以直接利用android工具本身自带的工具进行创建:

复制代码

复制代码

android create lib-project

Options:

-n --name : Project name.

-t --target : Target ID of the new project. [required]

-k --package : Android package name for the library. [required]

-p --path : The new project's directory. [required]

复制代码

复制代码

下面我们来举一个例子吧:

android create lib-project -n xiaoxuetu_lib -t 4 -k com.xiaoxuetu.lib -p ./xiaoxuetu_lib

终端的执行结果为:

看起来,他本身和标准的Android 项目没有什么区别,差别主要在于project.properties文件中多了这么一个属性:

android.library=true

如果你想吧其他已经存在的项目更改成库项目,只要在它的project.properties文件中加入上面那一句即可。

2.3.4 更新库项目

更新库项目,比如说更新库项目针对的Android版本:

复制代码

android update lib-project

Options:

-p --path : The project's directory. [required]

-t --target : Target ID to set for the project.

复制代码

具体使用方法,跟前面 2.3.2 更新一个Android项目 一样,在此不做过多的说明

2.3.5 库项目的引入

其实这个在前面 Android项目创建和更新 的时候已经讲解过,使用的就是 -l (或者--library)这个参数:

android update project

--target <target_ID>

--path path/to/your/project

--library path/to/library_projectA

当引入成功后,我们就会发现在project.properties文件中多了这么一行:

android.library.reference.1=path/to/library_projectA

如果你引入的是多个库项目,那么将会使用.n来决定各个库项目的优先权:

android.library.reference.1=path/to/library_projectA

android.library.reference.2=path/to/library_projectB

android.library.reference.3=path/to/library_projectC

当然我们也可以给library_projectC较高的优先权:

android.library.reference.2=path/to/library_projectA

android.library.reference.3=path/to/library_projectB

android.library.reference.1=path/to/library_projectC

注意:.n一定是从1开始的

2.3.6 创建测试项目(test-project)

创建一个测试用的项目,可以用来测试安卓应用的Activity,Service等等,具体后面的博客会讲,在此不做详细的讲解,如果现在就想了解的话,可以先参考:http://developer.android.com/tools/testing/testing_android.html

复制代码

android create test-project

Options:

-p --path : The new project's directory. [required]

-n --name : Project name.

-m --main : Path to directory of the app under test, relative to the test project directory. [required]

复制代码

下面主要讲解下-m这个参数,如果有这么一个项目/source/projectA,我们要建立一个测试项目/source/projectATest用于测试/source/projectA,那么,我们的m必须是../projectA,下面给出一个简单的例子,测试的是同一目录下之前创建的xiaoxuetu项目:

android create test-project -p ./xiaoxuetu_test -n xiaoxuetu_test -m ../xiaoxuetu

终端中的执行结果是:

2.3.7 更新测试项目(test-project)

更新该测试项目要测试的Android项目:

复制代码

android update test-project

Options:

-m --main : Directory of the app under test, relative to the test project directory. [required]

-p --path : The project's directory. [required]

复制代码

具体注意事项和执行结果跟前面的差不多,在此就不做多说明了。

  1. emulator -

    打包常用命令

    一般情况下,我们使用这个命令进行模拟器的开启比较多

模拟器的开启方式如下:

emulator -avd <avd_name> []

或者

emulator @<avd_name>

一般情况下我们都是直接打开即可,具体的options可以参考http://developer.android.com/tools/help/emulator.html,在此不做重复说明

  1. Android Asset Packaging Tool

    Android Asset Packaging Tool,简称aapt,通过aapt,我们可以对打包的资源进行管理,包括查看,增加,删除。

4.1 查看资源包内的内容

aapt l[ist] [] <path_to_apk>

eg:

aapt l xiaoxuetu-debug.apk

终端的执行结果是:

4.2 查看APK内的指定内容

复制代码

复制代码

Usage:

aapt l[ist] [-v] [-a] file.{zip,jar,apk}

List contents of Zip-compatible archive.

aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]

badging Print the label and icon for the app declared in APK.

permissions Print the permissions from the APK.

resources Print the resource table from the APK.

configurations Print the configurations in the APK.

xmltree Print the compiled xmls in the given assets.

xmlstrings Print the strings of the given compiled xml assets.

复制代码

复制代码

例如,我要查看这个包所使用到的权限:

aapt dump permissions xiaoxuetu-debug.apk

终端的执行结果:

因为该项目并没有使用到权限,所以也就显示为空了。

4.3 打包生成资源压缩包

复制代码

复制代码

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml]

[-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile]

[--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL]

[--app-version VAL] [--app-version-name TEXT] [--custom-package VAL]

[--rename-manifest-package PACKAGE]

[--rename-instrumentation-target-package PACKAGE]

[--utf16] [--auto-add-overlay]

[--max-res-version VAL]

[-I base-package [-I base-package ...]]

[-A asset-source-dir] [-G class-list-file] [-P public-definitions-file]

[-S resource-sources [-S resource-sources ...]]

[-F apk-file] [-J R-file-dir]

[--product product1,product2,...]

[-c CONFIGS] [--preferred-configurations CONFIGS]

[raw-files-dir [raw-files-dir] ...]

[--output-text-symbols DIR]

复制代码

复制代码

上面的参数有点多,下面给出一些常用参数的简单说明吧:

  -f 如果编译出来的文件已经存在,强制覆盖

  -m 使生成的包的目录存放在-J参数指定的目录

  -J 指定生成的R.Java 的输出目录

  -S res文件夹路径

  -A assert文件夹路径

  -I 某个版本平台的android.jar的路径

  -F 具体指定APK文件的输出

  -J R.java文件的生成目录

在AAPT中常用的命令格式是:

aapt p -M <Android应用清单的路径> -I <额外添加的包> -F <目标文件的路径>

-I 额外添加的包必须包含android.jar这个jar包

下面举一个例子:

aapt p -S res -M AndroidManifest.xml -I D:\Java\adt-bundle-windows\sdk\platforms\android-10\android.jar -F ./xiaoxuetu.apk

终端执行结果:

当然,这里打出来的apk并不是完整可用的,真正的apk打包还需要经过dex的编译等流程。

4.4 从压缩包中删除指定文件

aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]

Delete specified files from Zip-compatible archive.

首先,我们查看下前面打包的xiaoxuetu.apk里面的内容

下面如果我们要删除里面的AnroidManifest.xml文件,执行下面命令:

aapt r xiaoxuetu.apk AndroidManifest.xml

终端的执行结果:

什么都没有输出表示已经删除成功了,我们再来查看下该apk中的AnroidManifest.xml是不是真的已经被删除了:

是的,我们再也看不到AndroidManifest.xml。说明已经删除成功了。

4.5 往压缩包中添加指定文件

aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]

Add specified files to Zip-compatible archive.

假设我们要往xiaoxuetu.apk中加回AndroidManifest.xml文件,我们继续执行:

aapt a xiaoxuetu.apk AndroidManifest.xml

终端的执行结果是:

我们再来查看xiaoxuetu.apk中的内容发现AndroidManifest.xml又回来啦:

4.6查看aapt的版本号

aapt v

终端的执行结果:

  1. javac编译java文件

    首先我们来讲解下javac的用法:

复制代码

复制代码

用法: javac

其中, 可能的选项包括:

-g 生成所有调试信息

-g:none 不生成任何调试信息

-g:{lines,vars,source} 只生成某些调试信息

-nowarn 不生成任何警告

-verbose 输出有关编译器正在执行的操作的消息

-deprecation 输出使用已过时的 API 的源位置

-classpath <路径> 指定查找用户类文件和注释处理程序的位置

-cp <路径> 指定查找用户类文件和注释处理程序的位置

-sourcepath <路径> 指定查找输入源文件的位置

-bootclasspath <路径> 覆盖引导类文件的位置

-extdirs <目录> 覆盖所安装扩展的位置

-endorseddirs <目录> 覆盖签名的标准路径的位置

-proc:{none,only} 控制是否执行注释处理和/或编译。

-processor [,,...] 要运行的注释处理程序的名称; 绕过默认的搜索进程

-processorpath <路径> 指定查找注释处理程序的位置

-d <目录> 指定放置生成的类文件的位置

-s <目录> 指定放置生成的源文件的位置

-implicit:{none,class} 指定是否为隐式引用文件生成类文件

-encoding <编码> 指定源文件使用的字符编码

-source <发行版> 提供与指定发行版的源兼容性

-target <发行版> 生成特定 VM 版本的类文件

-version 版本信息

-help 输出标准选项的提要

-A关键字[=值] 传递给注释处理程序的选项

-X 输出非标准选项的提要

-J<标记> 直接将 <标记> 传递给运行时系统

-Werror 出现警告时终止编译

@<文件名> 从文件读取选项和文件名

复制代码

复制代码

通过上面的选项可以知道在编译过程中:

  1. 由于我们的Android编码使用的是UTF-8,所以需要指定 -encoding UTF-8

  2. 由于我们还需要指定生成特定VM版本的类文件,所以我们需要制定 -target 为1.7

  3. 由于我们编译的是Android项目,所以需要另外Android的jar包,才能在编译过程中,避免引入错误,因此需要用到 -bootclasspath选项,引入响应android版本的jar包。

  4. 由于我们需要制定编译后的class文件的输出位置,所以我们还需要用到 -d这个选项

因此,一般情况下我们编译一个安卓项目中的class文件的命令格式为:

javac -encoding <源文件使用的编码格式> -target <VM版本> -bootclasspath <覆盖引导类文件的位置> -d <指定放置生成的类文件的位置> <需要编译的java文件, 格式是: file1, file2>

下面举一个例子,直接编译xiaoxuetu这个Android项目的java文件:

javac -encoding UTF-8 -source 1.6 -target 1.6 -bootclasspath D:\Java\adt-bundle-windows\sdk\platforms\android-10\android.jar -d E:\Workspaces\android\xiaoxuetu\xbin E:\Workspaces\android\xiaoxuetu\src\com\xiaoxuetu*.java E:\Workspaces\android\xiaoxuetu\gen\com\xiaoxu

etu*.java

终端的执行结果是:

我们在来看看xbin目录下,编译好的class文件都存在了:

6.使用dex编译Android应用

6.1 使用方法

相信大家都知道,在Android平台中,使用的是并没有遵循JVM规范的Dalvik虚拟机,他并不直接运行java二进制文件,而是运行它特有的.dex文件,因此我们需要通过DX工具将Android应用的.class文件转换为*.dexwenjian .

dex工具的常用命令格式如下

dx --dex --dump-to <需要编译到的路径> --core-library <需要编译的java文件所在的路径>

注意:<需要编译到的路径> 和 <需要编译的java文件所在的路径> 必须是全路径,否则他是以dx.bat所在的路径为相对路径进行查找和编译的

下面举一个例子,假设我要把前面编译的class文件转换成*.dex文件,需要执行命令:

dx --dex --dump-to E:\Workspaces\android\xiaoxuetu\xbin\classes.dex --core-library E:\Workspaces\android\xiaoxuetu\xbin

终端的执行结果:

再到E:\Workspaces\android\xiaoxuetu\xbin目录下我们就会找到classes.dex这个文件出来了。

6.2 常见的问题

问题1 : 在编译过程中,总是出现以下问题:

原因:这是因为我们写了相对路径,假设dx.bat所在的路径是D:\android_dev_tools/platform_tools下,那么在编译的时候,它将会到 D:\android_dev_tools/platform_tools 目录去寻找xbin文件夹,所以找不到xbin文件夹

解决方法:像示例中那样使用绝对路径

问题2:在编译过程中,总是出现以下问题:

原因:经过谷歌,在Stackflow的解释为:

Your classes need to be compiled with jdk 5 or 6. You are probably using 7. If that doesn't work, you might also need to make sure that every single class is compiled right, even if in different projects. Solved my problem here.

解决方法:在javac编译的时候,通过source和target指定版本为1.6,详情见示例。

7.apkbuilder

这个工具用于将各种资源打包成一个Android应用。它的使用方法是:

复制代码

复制代码

Usage: apkbuilder [-v][-u][-storetype STORE_TYPE] [-z inputzip]

[-f inputfile] [-rf input-folder] [-rj -input-path]

-v      Verbose.
-d Debug Mode: Includes debug files in the APK file.
-u Creates an unsigned package.
-storetype Forces the KeyStore type. If ommited the default is used. -z Followed by the path to a zip archive.
Adds the content of the application package. -f Followed by the path to a file.
Adds the file to the application package. -rf Followed by the path to a source folder.
Adds the java resources found in that folder to the application
package, while keeping their path relative to the source folder. -rj Followed by the path to a jar file or a folder containing
jar files.
Adds the java resources found in the jar file(s) to the application
package. -nf Followed by the root folder containing native libraries to
include in the application package.

复制代码

复制代码

下面讲解下常用的命令吧:

  -rf 参照源文件的目录的结构

  -u 创建一个没有签名的包

  -z 将某个压缩文件添加到包中

  -f 将某个文件添加到保重

那么常用的apkbuilder命令格式就是:

apkbuilder <APK输出路径> -u -z <需要添加的压缩资源包> -f <需要添加的文件> -rf <源文件所在的目录>

注意:<需要编译到的路径> 和 <需要编译的java文件所在的路径> 必须是全路径

下面举个例子吧:

apkbuilder E:\Workspaces\android\xiaoxuetu\xbin\xiaoxuetu.apk -u -z E:\Workspaces\android\xiaoxuetu\xbin\xiaoxuetu.ap_ -f E:\Workspaces\android\xiaoxuetu\xbin\classes.dex -rf E:\Workspaces\android\xiaoxuetu\src

终端的执行结果是:

同时在E:\Workspaces\android\xiaoxuetu\xbin\我们可以打包好的apk文件了。

8.keytool -

签名常用命令

这是我们JDK自带的密钥和证书管理工具

复制代码

复制代码

命令:

-certreq 生成证书请求

-changealias 更改条目的别名

-delete 删除条目

-exportcert 导出证书

-genkeypair 生成密钥对

-genseckey 生成对称密钥

-gencert 根据证书请求生成证书

-importcert 导入证书或证书链

-importkeystore 从其他密钥库导入一个或所有条目

-keypasswd 更改条目的密钥口令

-list 列出密钥库中的条目

-printcert 打印证书内容

-printcertreq 打印证书请求的内容

-printcrl 打印 CRL 文件的内容

-storepasswd 更改密钥库的存储口令

复制代码

复制代码

一般情况下,我们都是直接通过以下格式的命令进行证书生成:

keytool -genkeypair -alias <整数的别名>-keyalg RSA -validity <有效天数> -keystore <keystore文件的路径+文件名>.keystore

比如生成一个别名为 tbb 证书名字为tbb.keystore的证书:

keytool -genkeypair -alias tbb -keyalg RSA -validity 180 -keystore d:\tbb.keystore

执行该命令后,按照提示进行密码等情况的输入即可。

9.jarsigner

使用这个工具我们可以给apk进行签名:

复制代码

复制代码

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

jarsigner -verify [选项] jar文件 [别名...]

[-keystore ] 密钥库位置

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

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

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

[-certchain <文件>] 替代证书链文件的名称

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

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

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

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

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

[-verbose[:子选项]] 签名/验证时输出详细信息。

子选项可以是 all, grouped 或 summary

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

[-tsa ] 时间戳颁发机构的位置

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

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

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

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

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

[-protected] 密钥库具有受保护验证路径

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

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

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

[-strict] 将警告视为错误

复制代码

复制代码

一般情况下,对apk文件进行签名的命令格式为:

jarsigner -verbose -keystore <证书所在的路径> -signedjar <签名后apk的名字> <需要签名的apk> <证书别名>

-verbose : 指定生成详细输出

下面举一个例子,为我们前面博文中建立的xiaoxuetu.apk进行签名:

E:\Workspaces\android\xiaoxuetu>jarsigner -verbose -keystore tbb.keystore -signedjar xiaoxuetu_sign.apk xiaoxuetu.apk tbb

终端的执行结果为:

10 zipalign

zipalign是Android自带的一个档案整理工具,可用于优化APK安装包,从而提升Android应用与系统之间的交互效率,提升应用程序的运行速度。

复制代码

复制代码

Usage: zipalign [-f] [-v] infile.zip outfile.zip

zipalign -c [-v] infile.zip

: alignment in bytes, e.g. '4' provides 32-bit alignment

-c: check alignment only (does not modify file)

-f: overwrite existing outfile.zip, 即是强制覆盖已有的文件

-v: verbose output, 指定生成详细输出

复制代码

复制代码

一般情况下,我们直接使用该命令的基本格式为:

zipalign -f -v <档案整理所基于的字节数> <需要优化的文件> <经过优化后的文件>

下面就针对我们的xiaoxuetu.apk进行一次优化做为例子:

zipalign -f -v 4 xiaoxuetu.apk xiaoxuetu_zip.apk