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

详细参考地址-ADB Shell

反编译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]

详细参考地址-APKTOOL
参考地址-jarsigner

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上的使用比较简单,这里不做过多使用介绍。

参考地址-jadx

在MacOS下,使用原始办法打开jadx的GUI比较麻烦,有两种方式可以加强便捷性:

  • 在Alfred的workflow中添加执行jadx-gui的脚本
  • 在Automator上使用Applescript添加Service(下面截图介绍一下)

android_skill_automator

android_skill_applescript

android_skill_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的工具

GitHub - kezong/fat-aar-android: A gradle plugin that merge dependencies into the final aar file works with AGP 3.+

/// 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
  • 在钥匙串的证书上右键 - 显示详情,展开信任,选择始终信任,然后点击左上角的关闭,系统会弹出授权提示框,授权同意修改,回到列表,稍等证书就刷新了

移动设备上安装证书

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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

宝贝回家