Android技巧入门
常用的adb指令
查看连接的设备:
adb devices
无线连接设备:
adb tcpip [port]
adb connect [ip]:[port]
adb disconnect [ip]:[port]
# 当连接失效时,可尝试重启adb服务,或重定向端口(通过指定同一端口号重新激活)
adb kill-server
adb start-server
adb forward tcp:[port] tcp:[port]
安装包:
adb install yourapk.apk
# install可带参数:
# -l:forward lock application
# -r:replace existing application
# -t:allow test packages
# -s:install application on sdcard
# -d:allow version code downgrade
# -p:partial application install
# 放置obb
adb push main.BundleVersionCode.packagename.obb /mnt/sdcard/Android/obb/packagename/main.BundleVersionCode.packagename.obb
# 放置证书
adb push charles-ssl-proxying-certificate.pem sdcard/charles.pem
# 对手机一些配置进行设置
adb shell setprop log.tag.xx VERBOSE
反编译Apk/Jar
方法一:apktool
使用apktool还可以对得到的反编译文件进行编译,重新生成apk
# 解码(d: decode)
## 一般用法
java -jar {apk_tool_path} d -f {apk_path} -o {output_dir}
## 简约用法
apktool d xxx.apk
## 带设定环境变量,控制系统分配资源的解码
java -server -Xms512M -Xmx512M -XX:ReservedCodeCacheSize=512m -jar /Path/to/apktool_2.4.0.jar d -f xxx.apk -o xxx_decode/
# 构建(b:build)
## 一般用法
java -jar {apk_tool_path} b -f {input_path} -o {apk_path}
## 简约用法
apktool b files
## 带设定环境变量,控制系统分配资源的解码
cd xxx_decode
java -server -Xms512M -Xmx512M -XX:ReservedCodeCacheSize=512m -jar /Path/to/apktool_2.4.0.jar b .
# 重签
## 一般用法
java -jar {signer_path} sign --ks {keystore_path} -ks-key-alias {alias_name} --ks-pass pass:{password} --key-pass pass:{password} {apk_path} --v1-signing-enabled true --v2-signing-enabled true --out {signed_apk_path} {apk_path}
## 简约用法
jarsigner [options] jar-file alias
### 常用方式(直接替换原文件)
###-digestalg:SHA256(默认值)、SHA1
###-sigalg:MD5withRSA、SHA1withDSA、SHA256withRSA、SHA256withECDSA。默认值取决于private key的类型。
jarsigner -verbose -digestalg [SHA1] -keystore [/Path/to/app.keystore] -storepass [storepass] -keypass [keypass] [/Path/to/dist/resigned.apk/jar] [alias name]
### 指定输出方式
jarsigner -digestalg [SHA1] -sigalg [MD5withRSA] -tsa -verbose -keystore [/Path/to/app.keystore] -signedjar [/Path/to/resigned.apk] [/Path/to/original.apk] [alias name]
###生成签名(非必须)
keytool -genkey -keystore [/Path/to/app.keystore] -keyalg RSA -validity 10000 -alias [alias name]
ps:如若重签后上传包时,谷歌提示apk没有经过Zipalign,则需要对apk做如下处理(zipalgn工具的路径在Android SDK路径下-可通过AS的SDK Manager查看)
zipalign -v 4 from.apk to.apk
2019.9.23更新 使用apksigner.jar
代替jarsigner
更方便易用,免去了指定alias和摘要算法类型的参数,同时支持v1、v2两种签名方式。
方法二:jadx
jadx是一个将Dex、Apk转Java代码的反编译工具。
有命令行和GUI两种使用方式。GUI上的使用比较简单,这里不做过多使用介绍。
在MacOS下,使用原始办法打开jadx的GUI比较麻烦,有两种方式可以加强便捷性:
- 在Alfred的workflow中添加执行
jadx-gui
的脚本 - 在Automator上使用Applescript添加Service(下面截图介绍一下)
具体Applescript的代码:
tell application "Finder"
try
set filename to POSIX path of (selection as text)
set fileType to (do shell script "sh /Users/milknero/Works/Tools/jadx-1.0.0/bin/jadx-gui " & filename)
end try
end tell
Android Studio 快捷键
功能 | 快捷键 |
---|---|
(操作类)删除光标所在行(选中行) | Cmd + Y / Cmd + X |
(操作类)复制光标所在的行(选中行) | Cmd + D |
(操作类)所在行换行 | Cmd + Alt + Enter |
(操作类)格式化代码(java、xml) | Cmd + Alt + L |
(操作类)上下移动选中的行 | Cmd + Shift + Up / Down |
(操作类)大写/小写切换 | Cmd + Shift + U |
(创建类)快速创建局部变量 | Cmd + Alt + V |
(创建类)局部变量变为成员变量 | Cmd + Alt + F |
(创建类)代码助手,自动补全 | Ctrl [+ Alt] + 空格:属性名、类名或接口名提示 |
(创建类)方法提示 | Ctrl + Shift + 空格 |
(创建类)导入包 | Alt+回车:导入当前包 |
(创建类)导入重载方法 | Cmd + O 输入方法名上下方向键选择后回车 |
(创建类)删除没用到的包 | Ctrl + Alt + O |
(创建类)快速修复 | Alt + Enter |
(创建类)复制类的全局路径(包名加类名) | Cmd + Shift + Alt + C (右击–> Copy Reference) |
(查看类)回到上一次编辑的位置 | Cmd + Shift + Backspace |
(查看类)快速定位到任意的文件 | 按两次shift |
(查看类)快速定位到类或方法的定义 | Cmd+B |
(查看类)快速定位方法在哪里被调用 | Ctrl + Alt + H |
(查看类)搜索或替换 | Cmd + F / Cmd + R (全局+Shift) |
(查看类)快速查看类继承结构 | Ctrl + H |
(查看类)光标所在上一次或下一次的位置 | Cmd + Alt + Left / Right |
(查看类)视窗的显示与隐藏 | Alt + 视窗的数字标识 |
win下(mac下待确认)
功能 | 快捷键 |
---|---|
快速定位到某一个类或文件 | Cmd + N |
查找文件 | Cmd + Shift + N: |
方法参数提示 | Cmd + P |
重命名 | Shift + F6 |
快速定位到类中的方法或属性 | Cmd + F12 |
打印输出 | sout |
快速定位到当前类报错或警告的地方 | fn + F2 或 fn+Shift+F2 |
生成 get/set方法、构造方法、toString() | alt + insert |
设置自动导包 | 勾选:Add unambiguous imports on the fly |
选中变量快速跳转到下一个 | Alt + F3, F3 |
显示JavaDoc(注释文档) | Ctrl + Q |
WebView 调试
给 WebView 设置 Debug 模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.setWebContentsDebuggingEnabled(true);
}
在 PC 的 Chrome 上输入 chrome://inspect
,看见以下界面即表示成功了,点击 inspect
按钮即可调试页面的代码及监听网络请求。
macOS 上修改 aar
# 1.Use unzip or other extracting tool
$ unzip myLib.aar -d tempFolder
# 2.Change whatever you need (注意最后的点)
$ jar cvf myNewLib.aar -C tempFolder/ .
macOS 上修改 jar
# 1.用压缩软件解压缩 jar 包(Keka等)
# 2.选择你要修改的class 或者配置文件进行修改(如移除不想要的 .class 文件,包括 $n.class)
# 3.通过命令将文件重新打成jar(在解压文件夹第一层目录下,可指定输出路径)
cd {class_files_root_dir}
jar cvf {name}.jar *
模拟器上看日志
打开环境变量
touch .bash_profile
open -e .bash_profile
编辑增加保存
export PATH=${PATH}:~/Library/Android/sdk/platform-tools
重新激活生效
source .bash_profile
验证端口
~> sudo lsof -i:22471
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
NemuPlaye 2728 nvr 28u IPv4 0x42432fc932828dc5 0t0 TCP localhost:22471 (LISTEN)
NemuPlaye 2728 nvr 29u IPv6 0x42432fc923d321c5 0t0 TCP localhost:22471 (LISTEN)
连接
sudo adb connect localhost:22471
关闭连接
adb kill-server
adb start-server
adb devices
先清除之前的日志再重新获取
adb logcat -c
导出日志保存路径
adb logcat > /Users/xx/Documents/aaa.txt
或者
adb logcat > ./log.txt
签名文件
创建 keystore
keytool -genkey -v -keystore myKeystore.keystore -alias myAlias -keyalg RSA -validity 10000 -keystore template.keystore
查看原始签名的证书指纹
keytool -v -list -keystore original.keystore
jks转pkcs12
keytool -importkeystore -srckeystore myJks.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore myP12.p12
jks 转 keystore
keytool -v -importkeystore -srckeystore myP12.p12 -srcstoretype PKCS12 -destkeystore myKeystore.keystore -deststoretype JKS
查看签名信息
keytool -v -list -keystore myKeystore.keystore
修改
修改密码:
keytool -storepasswd -keystore myKeystore.keystore
修改别名alias:
keytool -changealias -keystore myKeystore.keystore -alias myAlias -destalias newAlias
修改alias密码的命令:
keytool -keypasswd -keystore my.keystore -alias androiddebugkey
查看 so 库的 cpu 架构信息
readelf -a libxxxx.so
objdump -x libxxxx.so
greadelf -a libxxx.so
gobjdump -x libxxx.so
若不支持命令,则需要安装 binutils
brew update
brew install binutils
合并 aar
问题:在 library module 中使用一般的 implementation (name: ‘xxsdk’, ext: ‘aar’) 引用 aar,最后打出的 aar 并不会包含该 aar 的代码。
方案:使用以下名为fat-aar
的工具
/// 1.3.6
// in root project build.gradle
buildscript {
repositories {
...
mavenCentral()
}
dependencies {
...
classpath 'com.github.kezong:fat-aar:1.3.6'
}
}
#// in app module build.gradle
apply plugin: 'com.kezong.fat-aar'
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
// java dependency
embed project(path: ':lib', configuration: 'default')
// aar dependency
embed project(path: ':lib-aar', configuration: 'default')
embed project(path: ':lib-aar2', configuration: 'default')
// local full aar dependency, just build in flavor1
flavor1Embed project(path: ':lib-aar-local', configuration: 'default')
// local full aar dependency, just build in debug
debugEmbed(name: 'lib-aar-local2', ext: 'aar')
// remote jar dependency
embed 'com.google.guava:guava:20.0'
embed 'com.mob:MobGUI:2019.0306.1850@jar'
// remote aar dependency
embed 'com.facebook.fresco:fresco:1.12.0'
embed 'com.mob:MobConnect:3.3.1@aar'
// don't want to embed in
implementation('androidx.appcompat:appcompat:1.2.0')
// exclude some dependencies
embed('com.mob:MobApm:1.3.2@aar') {
// if transitive = true, can exclude any group or module like
exclude(group:'com.facebook.soloader', module:'soloader')
}
}
fataar {
/**
* If transitive is true, local jar module and remote library's dependencies will be embed.
* If transitive is false, just embed first level dependency
* Local aar project does not support transitive, always embed first level
* Default value is false
* @since 1.3.0
*/
transitive = true
}
注意:
- 最好新开一个 module 专门用来整合 aar,导入库和配置其 gradle 和 manifest 即可
transitive
设置为 true 可使嵌入库所依赖的所有库都一并嵌入,如想排除不想嵌入的二级或更下层的依赖库,可在 embed 时 exclude 指定的组和模块,设置时可先使用 gradle 里的 Tasks/help/dependencies 查看一下依赖关系来确认。- 如果不使用 transitive,可能会有异常产生,比如 assets 没有整合,即使是一级库中的 assets。
- >如果整合后的 aar 要再拆给 library 使用,则需要修改 fat-aar module 中 manifest 里的 package 为后续引用的 library 的 pacakge,否则整合后的 aar 里的 R 所在的包路径就会使用 fat-aar 原来的 package 路径,而后续的 library 以自己的 package 索源时就找不到资源而崩溃,因为拆给 lirary 用后,最终打 aar 时是以 library 的 package 去找它下面的所有资源
- 设置完毕后,触发 gradle 里的 Tasks/other/assembleRelease,在 build/output/aar 找到合并后的 aar,各个依赖库中的 classes.jar 都整合到最终生成的 aar 中的 classes.jar 中去,libs 整合到 libs,res 整合到 res,等。
- 若遇到 Duplicate resource 的问题,即依赖的几个第三方库之间资源互相冲突了,可以给资源名加前缀区分,或在
gradle.properties
中添加android.disableResourceValidation=true
可以忽略资源冲突的编译错误,程序会采用第一个找到的同名资源作为实际资源。第二种方法建议两个资源一模一样时才采用,否则使用的地方期望的资源与实际资源不一样会造成不可预期的问题。
参考文章:
Charles https抓包
老方式
(a) 下载Charles证书 下载地址: http://www.charlesproxy.com/assets/legacy-ssl/charles.crt
(b) 安装Charles证书 将下载完成的charles.crt证书push到Android设备(adb push charles.crt /sdcard/),从手机存储卡中找到安装证书charles.crt点击安装,教程说安装上就可以抓包了
首先电脑上装证书
- 去官网下载证书,不然可能会报“无法找到证书”错误(官网注明说该证书在v3.10上会失效),官网地址:https://www.charlesproxy.com/documentation/additional/legacy-ssl-proxying/
- 进入Charles-》Help-》SSL Proxying-》Install Charles Root Certificate
- 在钥匙串的证书上右键 - 显示详情,展开信任,选择始终信任,然后点击左上角的关闭,系统会弹出授权提示框,授权同意修改,回到列表,稍等证书就刷新了
移动设备上安装证书
- 手机将电脑的IP地址设置为代理,端口号为8888。然后打开浏览器,在浏览器中输入http://charlesproxy.com/getssl,会弹出一个框,让输入证书名字,直接输入charle就ok啦,安装成功后会提示证书安装成功,并且成功抓到https的包。
- 小米手机,在浏览器中输入http://charlesproxy.com/getssl后,会提示下载的证书提示非法路径,在Charles->help->SSL Proxying->Save…导出的pem证书放进手机根目录后,通过安全安装提示没有可安装证书。解决办法是(一定不要从手机浏览器里下载证书,要把charles证书导出来,然后传输到手机的某个文件夹里),首先打开Charles的HELP->SSL Proxying -> Export Charles Root Certification and Private Key,随便输入什么记住了的密码,然后导出(p12)后,用微信或者其他传到安卓手机里,在WLAN设置(打开手机设置-wifi-高级-安装证书),安装证书里打开这个文件,输入刚才的密码就搞定了(比如通过微信方式的路径为 WLAN->高级设置->安装证书->Tencent文件夹->MicroMsg文件夹->Download文件夹)
Charles添加SSL Proxying
- 进入Proxy-》SSL Proxying Settings
- 勾选“Enable SSL Proxying”,并点击下方的Add
- 在弹出的“Edit Location”中,输入Host和Port都为“*”(看提示这样配置可以抓到所有https的包),然后进行添加
使用 bundletool(安装 aab)
bundletool.jar包下载地址
模板:
java -jar <bundletool.jar的路径> build-apks --bundle=<.aab文件的路径> --output=<输出.apks的路径> --ks=<打包.aab文件时的秘钥文件路径,如果.aab文件时没有使用秘钥则可以省去秘钥环节的配置> --ks-pass=pass:<秘钥密码> --ks-key-alias=<秘钥别名> --key-pass=pass:<秘钥别名密码> --device-spec=<要输出的目标sdkVersion的APK的json配置文件路径>
示例:
java -jar bundletool.jar build-apks --bundle=test.aab --output=test.apks --ks=myKey.keystore --ks-pass=pass:myPass --ks-key-alias=myAlias --key-pass=pass:myPass --device-spec=config.json
json 配置文件示例:
{
"supportedAbis": ["arm64-v8a", "armeabi-v7a"],
"supportedLocales": ["en", "fr"],
"screenDensity": 640,
"sdkVersion": 29
}
(可选)仅针对已连接设备的配置生成 APK 示例:
java -jar bundletool.jar build-apks --bundle=test.aab --output=test.apks --ks=myKey.keystore --ks-pass=pass:myPass --ks-key-alias=myAlias --key-pass=pass:myPass --connected-device
安装 apks 示例:
java -jar bundletool.jar install-apks --apks=test.apks
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com
文章标题:Android技巧入门
文章字数:3.4k
本文作者:Mingfung
发布时间:2019-08-14, 00:22:37
最后更新:2022-01-13, 16:47:48
原始链接:http://blog.ifungfay.com/uncategorized/Android技巧入门/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。