Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Android知识集锦

3
Jul
2011

Android知识集锦

By Alex
/ in Android
/ tags FAQ
0 Comments
零散知识
基本概念
术语 说明
smali

可以指:

  1. dalvik虚拟机(安卓的JVM实现)的汇编器(编译为dex格式),对应的baksmali则是反汇编器 —— 把dex字节码转换为smali格式
  2. 一种文件格式,dex反汇编后的一种语言

dex字节码无法阅读,smali为其提供了较好的可读性

dpi与像素密度

APK包的res目录下,会有一些drawable开头的子目录,用来存放针对不同像素密度屏幕的资源文件:

目录后缀 像素密度范围 机型举例
mdpi 120dpi~160dpi  
hdpi 160dpi~240dpi  
xhdpi 240dpi~320dpi  
xxhdpi 320dpi~480dpi Sony Xperia Z5
xxxhdpi 480dpi~640dpi  
常见问题
签名后的APK安装报错:INSTALL_PARSE_FAILED_NO_CERTIFICATES

可能原因是,APK被重复签名多次。删除掉META-INF目录下的签名文件、签名块文件后,重新签名即可。

常用开发命令
apktool

APK包反向工程工具。

子命令说明
子命令 说明
if

命令格式: apktool if|install-framework [options] <framework.apk> 

安装框架文件到目录中,选项:
-p,--frame-path <dir>  安装到的目标目录
-t,--tag <tag>  使用tag来标记框架

d

命令格式: apktool [-q OR -v] d[ecode] [options] <file_apk>

解码file_apk,生成以下目录或者文件:
apktool.yml  工具私有元数据
AndroidManifest.xml  解码后的清单文件
original  原始数据,二进制的清单文件、数据签名文件等
res  资源文件,包括图片和解码后的XML
smali  dex反汇编后的代码,类似于汇编语言/JVM Opcodes

可用选项:
--api <API> 生成的文件使用的API级别,数字
-b,--no-debug-info 不解码调试用信息,例如行号
-f,--force  如果目标目录存在,先删除之
-k,--keep-broken-res 如果出现错误而某些资源被drop时可以使用,但是构建前你需要手工处理
-o,--output <dir>  输出目录,默认 apk.out
-p,--frame-path <dir> 使用dir中的框架文件
-r,--no-res 不解码资源文件
-s,--no-src 不解码源文件
-t,--frame-tag <tag> 使用被标记未tag的框架

b

命令格式: apktool [-q|--quiet OR -v|--verbose] b[uild] [options] <app_path>

对解码后的目录进行重新打包,可用选项:
-a,--aapt <loc> 使用位于loc的资产打包工具
-c,--copy-original 复制原始的AndroidManifest.xml 和 META-INF目录
-d,--debug 设置android:debuggable为true
-f,--force-all 跳过变更检测并构建所有文件
-o,--output <dir> 输出apk的未知,默认dist/name.apk
-p,--frame-path <dir> 使用位于dir的框架文件

dex2jar

进行.dex格式、.smali格式、.class格式之间的转换。

子命令说明
子命令 说明
d2j-dex2jar

转换.dex为.jar文件

选项:
-d,--debug-info 转译调试信息
-e,--exception-file <file> 转换过程中异常信息的保存位置$current_dir/[file-name]-error.zip
-f,--force 强制覆盖目标jar文件
-n,--not-handle-exception 不处理dex2jar抛出的任何异常
-o,--output <out-jar-file> 输出jar文件名称,默认 $current_dir/[file-name]-dex2jar.jar
-os,--optmize-synchronized optmize-synchronized

用法示例
Shell
1
2
# 转换apk中的.dex为Java的class文件,这些class文件打包在apk_to_decompile-dex2jar.jar中
d2j-dex2jar -f ~/path/to/apk_to_decompile.apk 
adb(Android Debug Bridge)

命令格式: 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命令,示例:
Shell
1
2
3
4
5
6
# 列出已安装的包
adb shell pm list packages
# 得到指定包的APK路径
adb shell pm path com.huawei.mw
# 拷贝出APK包
adb pull /data/app/com.huawei.mw-1/base.apk
adb shell <command> 运行Linux命令
adb emu <command> 运行模拟器控制台命令
adb logcat [ <filter-spec> ] 显示设备日志
adb install [-lrtsdg] <file>

安装APK到设备,-r替换已经存在的应用

报错:
INSTALL_FAILED_ALREADY_EXISTS  已经存在,使用-r
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE  删掉重装

adb uninstall [-k] <package> 从设备上移除软件包,-k表示保留应用的数据和缓存
keytool

JRE自带密钥数据库管理工具。用于加密密钥对、X.509证书链、受信任证书的管理。该工具支持基于DES算法的密码管理。

一个密钥数据库(keystore)可以包含多个密钥条目,以别名(alias)进行唯一区分。

命令格式: keytool [commands]

子命令说明
子命令 说明
-gencert

可用选项:

Shell
1
2
3
4
5
6
{-rfc} {-infile infile} {-outfile outfile} {-alias alias} {-sigalg sigalg}
{-dname dname} {-startdate startdate {-ext ext}* {-validity valDays}
[-keypass keypass] {-keystore keystore} [-storepass storepass]
{-storetype storetype} {-providername provider_name}
{-providerClass provider_class_name {-providerArg provider_arg}}
{-v} {-protected} {-Jjavaoption} 

生成一个证书,作为证书请求的响应。该命令从infile(不指定该选项则使用stdin)读取证书请求,使用alias这个私钥进行签名并输出X.509格式的证书到outfile(不指定则使用stdout)

当指定-rfc选项时,输出格式是基于Base64的PEM,否则使用二进制的DER

当指定dname选项时,该选项作为输出证书的subject字段,不指定则使用请求中该字段的值

 

-genkeypair

可用选项:

Shell
1
2
3
4
5
6
{-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg}
[-dname dname] [-keypass keypass] {-startdate value} {-ext ext}*
{-validity valDays} {-storetype storetype} {-keystore keystore}
[-storepass storepass]
{-providerClass provider_class_name {-providerArg provider_arg}}
{-v} {-protected} {-Jjavaoption}

别名-genkey,用于生成密钥对(公钥/私钥),并包装公钥为X.509 v3自签名格式的证书,该证书作为单元素证书链存储。这个自签名证书 +  私钥作为keystore中的一个条目保存,以alias唯一识别

-keyalg 指定生成密钥对的算法,默认DSA,可选RSA
-keysize 指定密钥长度,使用RSA算法时默认2048;使用1024算法时默认1024 
-sigalg  指定签名自签名证书时使用的算法,该算法必须和keyalg算法兼容
-dname  关联到alias值的X509可识别名称(Distinguished Name),并且用作自签名证书的issuer、subject这两个字段
-keypass  用于保护私钥的密码
-startdate  自签名证书有效期开始点

某些选项如果不提供,会交互式的提示

-genseckey 生存密钥并存储到keystore中
-importcert

可用选项:

Shell
1
2
3
4
5
{-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts}
{-storetype storetype} {-keystore keystore} [-storepass storepass]
{-providerName provider_name}
{-providerClass provider_class_name {-providerArg provider_arg}}
{-v} {-protected} {-Jjavaoption}

从cert_file文件中读取证书或者证书链,并且存储到keystore中,以alias进行识别

支持导入X509 v1 v2 v3格式的证书,以及这些证书形成的PKCS#7格式的证书链。数据必须是二进制的或者是BASE64编码的。对于BASE64格式,证书必须以-----BEGIN开头-----END结束

之所以需要导入证书,可能出于以下目的:

  1. 添加被导入证书到受信任证书列表
  2. 添加受信任CA签发的证书
-importpassword 导入一个密码
-importkeystore 从其它keystore导入内容
-certreq 制作证书请求
-exportcert 导出证书
-list 列出alias对应条目的信息,打印到标准输出
-printcert

从文件、SSL服务器、被签名JAR等地方读取证书信息

-printcertreq 打印证书请求
-printcrl 读取证书吊销列表 
-storepasswd 修改keystore的密码
-keypasswd 修改某个条目的密码
-delete 从keystore中删除某个条目
-changealias  修改alias
用法示例
Shell
1
2
3
# 生成一个密钥对,并添加到数据库中
keytool -genkeypair -v -keystore ~/Android/Keystores/alexwong.keystore
    -alias development -keyalg RSA -keysize 2048 -validity 36500
jarsigner

对JAR文件进行签名,或者执行签名校验 —— 签名是否有效、签名后的JAR是否完整。

被签名后的JAR文件,仅仅是在META-INF目录中多了两个额外的文件:

  1. 以.SF为扩展名的签名文件
  2. 以.DSA、.RSA或者.EC为扩展名的签名块文件

命令格式:

Shell
1
2
3
4
# 进行签名
jarsigner [ options ] jar-file alias
# 校验签名
jarsigner -verify [ options ] jar-file [alias ...]
命令示例
Shell
1
2
3
# 签名一个APK(JAR)文件
jarsigner -keystore ~/Android/Keystores/alexwong.keystore -storepass simple
    -keypass simple -signedjar android-signed.apk android.apk  development
← MinGW知识集锦
Servlet知识集锦 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Maven知识集锦
  • Java知识集锦
  • Framework7知识集锦
  • SpringMVC知识集锦
  • HTML知识集锦

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2