Android开发工具

2021-12-27 fishedee 前端

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%
adb shell screencap /sdcard/a.png
adb pull /sdcard/a.png C:/Users/fish/Desktop/android_screen/%date%-%time%.png

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中加入代理配置来试试

在SDK Manager中勾选Force https到http选项

5 蒲公英

蒲公英是一个成熟的应用分发平台,官网在这里,主要的功能有:

  • 提供网址分发一个Android或者iOS的App
  • 提供崩溃收集和查询,应用性能监控
  • 提供自动和强制更新的功能
  • 提供多渠道分发和推广查询

5.1 依赖

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url "https://frontjs-static.pgyer.com/dist/sdk/pgyersdk" }  //主力仓库
        maven { url "https://raw.githubusercontent.com/Pgyer/analytics/master" }  //备用仓库(主力仓库下载不下来使用)

        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

在settings.gradle加入以上的镜像地址

dependencies {

    //蒲公英
    implementation 'com.pgyer:analytics:4.2.0'
}

在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()
        context = applicationContext
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        //蒲公英SDK
        PgyerSDKManager.Init()
            .setContext(this) //设置上下问对象
            .start()
    }
}

在MyApplication的attachBaseContext中加入PgyerSDKManager的初始化功能

home_menu_6.setOnClickListener {
    PgyerSDKManager.checkSoftwareUpdate(this);
}

在需要查询自动更新的地方加入上面的这一句,当有版本更新的时候,顶部的通知栏会有提示。

5.3 展示版本号

fun getVersionName(context: Context):String {
    var versionName = "";
    try {
        versionName = context.getPackageManager().
        getPackageInfo(context.getPackageName(), 0).versionName;
    } catch (e:PackageManager.NameNotFoundException) {
        e.printStackTrace();
    }
    return versionName;
}

我们也需要在App中展示当前的VersionName,以保证看到当前的App是最新的。

android {

    defaultConfig {
        applicationId "com.yyy.xxx"
        minSdk 21
        targetSdk 31
        versionCode 3
        versionName "1.3"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

}

在build.gradle中就是设置versionCode和versionName的地方了

相关文章