0 概述
Android开发工具
1 adb
adb 是最强的官方调试工具了,必须要掌握的。
先用Android Studio找出SDK的位置
打开SDK的位置,打开platform-tools就看到adb了,一般我们会将这个位置加入到PATH目录
1.1 端口转发
adb reverse --list
adb reverse --remove-all
adb reverse local:port remote:port
adb reverse tcp:9111 tcp:9111
adb reverse做反向代理工具,将远程的端口映射到虚拟机上,这样虚拟机就能用localhost访问本地服务器的端口了
adb forward —list
adb forward --remove-all
adb forward local:port remote:port
adb forward tcp:6100 tcp:7100
adb forward与adb reverse刚好是反过来的,将虚拟机的端口映射到本地服务器上
1.2 devices
adb devices -l
查看设备列表
List of devices attached
4761a844 device usb:336592896X product:i6310 model:i6310 device:msm8937_64 transport_id:2
emulator-5554 device product:sdk_google_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86 transport_id:1
类似输出
1.3 install
adb -s [deviceId] install xx.apk
安装apk到xxx设备上
1.4 push
adb -s [deviceId] push xxxx /sdcard/
将文件xxx推送到手机的/sdcard目录上
1.5 pull
adb -s [deviceId] pull /sdcard/xxx xxx
将手机的/scard目录下的xxx文件,拉到本地去
1.6 screenshot
adb shell screencap xxx
截图到手机的xxx文件上
#!/bin/sh
echo "开始截图"
DATE=$(date "+%Y%m%d-%H-%M-%S")
workDir=$(cd $(dirname $0);pwd)
echo $DATE
adb shell screencap /sdcard/screen_$DATE.png
adb pull /sdcard/screen_$DATE.png $workDir
exit
一个简单的截图脚本,没啥好说的
set date=%date:~0,4%-%date:~5,2%-%date:~8,2%
set time=%time:~0,2%-%time:~3,2%-%time:~6,2%
/sdcard/a.png
adb shell screencap /sdcard/a.png C:/Users/fish/Desktop/android_screen/%date%-%time%.png adb pull
Windows脚本,没啥好说的
1.7 shell
adb shell
执行手机的命令行
adb shell xxx
远程执行手机的命令
2 Charles
Charles是代理工具,可以用来看一下往来的数据包。
2.1 配置代理
在AVD中,选择…,选择Settings,选择Proxy,最后填入Proxy地址,选择Apply就可以了
另外,对于Http的抓包,需要Stop SSL Proxying,否则会IOException的错误
2.2 使用
Charles的使用就不啰嗦了,看这里
2.3 经验
我们在安卓中的域名和地址都是写死的。通过Charles的mapRemote来映射到实际的服务器,有以下好处:
- 避免反复修改代码,灵活切换本地或者远程服务器
- 开启https抓包功能,对网络的往来信息能及时诊断
3 systrace
systrace是安卓的性能分析工具了,注意要用脚本收集,不要用GUI收集
3.1 收集
查看SDK Manager,知道自己的SDK位置
cd ${ANDROID_SDK}/platform-tools/systrace
打开SDK位置的platform-tools/systrace目录
python systrace.py -b 32768 -t 10 -o mytrace.html gfx input view webview wm am sm audio video camera hal app res dalvik rs bionic power sched irq freq idle disk mmc load sync workq memreclaim regulators
使用python启动trace操作,如果报错的话,尝试去掉sched。
3.2 展示
在chrome中打开chrome://tracing即可。使用键盘操作,w,s,a和d。
你可以用perfetto来展示分析结果
4 Android Studio
Android Studio是大部分操作和IDEA是一样的,我们来说说一些特点的地方
4.1 刷新gradle
打开File的Sync Project即可
4.2 安装HAXM
HAXM的安装比较麻烦
官方指引在这里
4.2.1 找到HAXM的位置
首先,打开Tools的SDK Manager
然后找到SDK的位置
然后打开SDK位置的extras里面的HAXM文件夹
4.2.2 关闭Hyper-V
双击尝试安装,如果不成功的话,就需要关闭Hyper-V再进行安装
在控制面板,卸载程序,关闭Windows功能中,剔除Hyper-V和Linux子系统,两个。
bcdedit /set hypervisorlaunchtype off
在PowerShell以管理员执行以上语句
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V
在PowerShell以管理员执行以上命令
4.2.3 安装
这次双击安装就可以了
sc query intelhaxm
安装成功的话,输入以上命令无报错即为成功
4.3 Gradle构建错误
Gradle构建错误,一直报错为SSL peer shut down incorrectly。有多个解决方法,依次尝试以下的方法即可。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
//版阿里云仓库
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/repository/central'}
maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.3"
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
在顶级目录的build.gradle中加入镜像,或者不加入镜像来试试。
systemProp.http.proxyHost=127.0.0.1
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=7890
systemProp.http.proxyPort=7890
在gradle.properties中加入代理配置来试试
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip
将gradle/wrapper/gradle-wrapper.properties的distributionUrl改为腾讯地址
在SDK Manager中勾选Force https到http选项
5 蒲公英
蒲公英是一个成熟的应用分发平台,官网在这里,主要的功能有:
- 提供网址分发一个Android或者iOS的App
- 提供崩溃收集和查询,应用性能监控
- 提供自动和强制更新的功能
- 提供多渠道分发和推广查询
5.1 依赖
{
dependencyResolutionManagement .set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositoriesMode{
repositories { url "https://frontjs-static.pgyer.com/dist/sdk/pgyersdk" } //主力仓库
maven { url "https://raw.githubusercontent.com/Pgyer/analytics/master" } //备用仓库(主力仓库下载不下来使用)
maven
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
在settings.gradle加入以上的镜像地址
{
dependencies
//蒲公英
'com.pgyer:analytics:4.2.0'
implementation }
在build.gradle加入以上的依赖,然后sync即可
5.2 代码
<?xml version="1.0" encoding="utf-8"?>
manifest xmlns:android="http://schemas.android.com/apk/res/android"
< xmlns:tools="http://schemas.android.com/tools"
package="com.xx.xxx">
<!-- 必选-->
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
<uses-permission
< android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 获取设备信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取网络信息权限-->
<
<!-- 用户手机设置中允许未知来源安装包安装状态为关;-->
<!-- Android8.0 以后,如果要安装 apk 需要额外添加权限:-->
uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<
application
< android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
meta-data
< android:name="PGYER_API_KEY"
android:value="API_KEY"/>
meta-data
< android:name="PGYER_FRONTJS_KEY"
android:value="TOKEN"/>
<!--添加新版本检测-->
meta-data
< android:name="PGYER_FEATURE_CHECK_UNPDATE"
android:value="true"/>
application>
</
manifest> </
在AndroidManifest.xml文件中加入用户权限申请,以及在Application中配置好KEY
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import com.pgyer.pgyersdk.PgyerSDKManager
class MyApplication:Application(){
companion object{
@SuppressLint("StaticFieldLeak")
lateinit var context:Context
}
override fun onCreate() {
super.onCreate()
= applicationContext
context }
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
//蒲公英SDK
.Init()
PgyerSDKManager.setContext(this) //设置上下问对象
.start()
}
}
在MyApplication的attachBaseContext中加入PgyerSDKManager的初始化功能
.setOnClickListener {
home_menu_6.checkSoftwareUpdate(this);
PgyerSDKManager}
在需要查询自动更新的地方加入上面的这一句,当有版本更新的时候,顶部的通知栏会有提示。
5.3 展示版本号
fun getVersionName(context: Context):String {
var versionName = "";
try {
= context.getPackageManager().
versionName (context.getPackageName(), 0).versionName;
getPackageInfo} catch (e:PackageManager.NameNotFoundException) {
.printStackTrace();
e}
return versionName;
}
我们也需要在App中展示当前的VersionName,以保证看到当前的App是最新的。
{
android
{
defaultConfig "com.yyy.xxx"
applicationId 21
minSdk 31
targetSdk 3
versionCode "1.3"
versionName
"androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunner }
}
在build.gradle中就是设置versionCode和versionName的地方了
6 JadxGUI
查看包的神器,看这里
在这里下载
比较简单,直接打开就可以了
7 apkanalyzer
分析apk文件和大小,不过我们更常直接用Android Studio来操作,参考资料在这里
直接将apk文件拖入Android Studio就能分析apk文件大小的来源了
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!