编程杂记 —— Git、ADB、Android Studio 的疑难杂症汇总

文章目录

简介

工作、学习中总会遇到各种各样的问题,本篇文章笔者将亲历的一些问题记录下来,以便日后查阅。

不定期更新。

一、Git篇

1.廖雪峰的 Git 教程

廖雪峰的 Git 教程应该是 Git 最好的入门教程:https://www.liaoxuefeng.com/wiki/896043488029600

2.git 每次都需要输入账号密码

git config --global credential.helper store

如果每次 push 的时候都需要指定分支名,则使用:

git push -u origin master

将 origin 和 master 分支关联上,以后主分支上的推送就可以直接使用 git push了。

-uupsteam 的缩写,也可以用全称:

git push origin master --set-upsteam

如果每次 pull 的时候都需要指定分支名,则使用:

git branch -u origin/master

merge 远程分支的同时,也更新对应 branch:

git pull origin master:master

3.git 查看 stash 中的内容

git stash show

4.git 添加别名

例如用 st 表示 status:

git config --global alias.st status

5.修改最近一次提交的描述

git commit --amend

然后会进入文本编辑界面,点击 i 开始插入文字,编辑完成后,点击 Esc 退出编辑模式,输入 :wq 将修改保存并退出。

6.本地分支重命名

git branch -m 旧的分支名 新的分支名

7.删除远程分支

git push --delete origin 分支名

8.拉取远程分支

git checkout -b 分支名 origin/分支名

此命令会在本地新建一个分支,并将远程的分支拉取到此新建的分支中。

9.强制合并不相关的 git 仓库

两个不相关的 git 仓库想要 pull 时,会提示 fatal: refusing to merge unrelated histories,这时可以使用以下命令强制 merge

git pull origin master --allow-unrelated-histories

10.生成 ssh

ssh-keygen -t rsa -C "你的电子邮箱地址"

然后命令行窗口会显示:Enter file in which to save the key:
输入保存 ssh 文件的地址即可,如:D:key

然后命令行窗口会显示:Enter passphrase (empty for no passphrase):
可以为 ssh 设置一个密码,不需要密码的话直接回车即可。

然后命令行窗口会显示:Enter same passphrase again:
再次输入密码。

这样就可以在之前设置的保存路径中找到两个 ssh 密钥,带 pub 后缀的是公钥,另一个是私钥。

11.git账号密码变动后,重置账户

git config --system --unset credential.helper

下次拉取时就会重新输入账号密码了。

12.git 配置邮箱和用户名

git config --global user.name "你的名字"
git config --global user.email 你的邮箱地址

查看 git 邮箱和用户名:

git config user.name
git config user.email

13.git 删除 stash 中的内容

例如,删除第一个:

git stash drop stash@{0} 

删除所有:

git stash clear

14.git 每个 log 只显示一行

git 查看 log 时,为了方便查找以前的 log,可以让每个 log 只显示一行:

git log --oneline

16.git 合并 commit

git rebase -i commit的id

或者

git rebase -i HEAD~2

这里的 HEAD~2 表示前两个版本,也可以修改为任意数字。
输入命令后会看到如下界面:

pick aa6f553 improve PermissionUtil again
pick 37e7290 improve PermissionUtil
pick 2390238 add negative number logic in ChineseNumFormat

# Rebase 222340a..ebaf38b onto 222340a (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit

点击 i 插入内容,然后将需要合并的 commit 前的 pick 改成 squash 即可。需要注意的是这样会将此 commit 的提交信息也合并(提交信息就是 git commit -m “这里的信息”),如果想要将丢弃不需要的 commit 的提交信息,将 pick 改成 fixup 即可。
修改完成后,点击 Esc 退出编辑,输入 :wq 将修改写入即可。

17.git 删除缓存中的文件 / 文件夹

在我们修改了 .gitignore 文件后,如果新增了需要忽略的文件,会发现修改没有生效, git 仍然会跟踪此文件,这是因为 git 的缓存中仍然存在此文件,所以 git 还会去跟踪它的修改。
这时,需要将此文件从缓存中删除,命令是:

git rm --cached 文件或文件夹路径

在某些情况,需要添加 -r,意思是递归移除选择的文件夹及其子文件夹:

git rm --cached -r 文件或文件夹路径

18.git 本地分支和远程分支改名

1.将本地分支进行改名

git branch -m old_branch new_branch

2.将远程分支的老分支删除

git push origin :old_branch

3.将改名后的分支push到远程

git push origin new_branch

19.git 查找 tag 对应的 commit

git show tag的名称

20.git 生成 ssh 公钥

生成 ED25519 公钥:

ssh-keygen -t ed25519 -C "你的邮箱地址,如:email@example.com"

生成 RSA 公钥:

ssh-keygen -t rsa -b 4096 -C "你的邮箱地址,如:email@example.com"

21.git 清除所有untracked file

git clean -f

连带清除所有 untracked 文件夹:

git clean -fd

22.解决 MAC 从 Github git clone 很慢

先 ping 出 github 的 ip 地址

ping github.global.ssl.fastly.net
ping github.com

将获取到的 IP 地址记录下来。例如:

PING github.global.ssl.fastly.net (67.228.102.32): 56 data bytes
PING github.com (13.250.177.223): 56 data bytes

编辑 hosts:

sudo vi /private/etc/hosts

在 hosts 文件底部增加刚刚保存的 IP 地址映射:

67.228.102.32 github.global.ssl.fastly.net 
13.250.177.223 github.com

23. git 关联远程库与取消关联

关联:

git remote add origin 地址

取消关联:

git remote remove origin

git 关联分支:

git branch --set-upstream-to=origin/远程分支名 本地分支名

关联之后直接使用 git pull,git push,默认操作这两个分支,无需指定分支名

24. git 恢复删除的文件

git reset HEAD 文件路径

或者恢复全部删除的文件

git reset HEAD .

25. git 删除除当前分支外的所有分支

git branch | xargs git branch -D

其中用到的 xargs 是指将前一个命令的输出作为第二个命令的输入。所以这里的逻辑是先用 git branch 列出所有分支,然后将分支名依次传入 git branch -D 中,就达到了将所有分支删除的目的。由于当前分支前会有一个 * 号,所以运行这行命令会输出;

error: branch '*' not found.

并且当前分支不能被删除,所以运行这行命令还会输出:

error: Cannot delete branch '当前分支名' checked out at '项目地址'

这两个错误提示不会导致删除其他分支失败,所以不用管他们。

26. 抓取字符串

例如:抓取包含 test 的分支

git branch | grep "test"

抓取不含 test 的分支

git branch | grep -v "test"

注:这个技巧是 grep 命令,和 git 关系不是特别大,但顺手记到这里。

27. git stash pop 冲突后撤销 pop 操作

冲突后,先用

git add .

将冲突文件都放至暂存区;

再用

git reset .

将其从暂存区恢复到工作区;

再用:

git checkout .

将工作区修改撤销。此时就回到了 git stash pop 之前的状态。

注:git stash pop 一般情况下会将 stash 中的修改内容弹出并将这次的修改内容从 stash 中删除。但如果 pop 时出现冲突,则这次的修改内容不会被删除。

28. git 打 diff,应用 diff

git diff > test.diff

应用:

git apply test.diff

相当于将此次的修改备份,然后就可以放心的 checkout 丢弃修改,需要时再将此次的修改加载出来。

29.pull 或者 push 时出现 fatal: refusing to merge unrelated histories

push 和 pull 时都可能出现这个错误,是因为远程 git 库和本地 git 库没有关联。最好是先检查一下当前远程库地址是否正确:

git config -l

查看 remote.origin.url 的值是否正确。如果确认地址是正确的,在操作命令后加上--allow-unrelated-histories强制合并即可。例如:

git pull --allow-unrelated-histories
git push --allow-unrelated-histories

30.提示 hint: Please, commit your changes before merging.

有时候,明明没有内容需要 merge ,但 git 提示 commit your changes before merging。这是因为之前的操作导致当前正在 merge 过程中,所以无法进行其他操作,只要将之前的 merge 中止了就可以了。

git merge --abort

31.Git 提示 error setting certificate verify locations

这个问题是因为证书文件路径变了,将其修改为正确路径即可。
方案 1:

git config http.sslcainfo “C:\Program Files (x86)\git\bin\curl-ca-bundle.crt”

后面的路径就是当前的证书路径。

方案 2:

git config http.sslverify false

将证书先重置,再重新设置证书。

32.Git 切换 tag

git checkout tag的名称

33. Unlink of file Failed. Should I try again?

当操作 git 时,如果某个文件正在被其他程序占用,就会报这个错。
查看哪个程序在用这个文件,然后关掉那个程序就可以了。
查看哪个程序在用这个文件的步骤:

  • (Windows + R) 打开 Run 窗口
  • 输入 resmon 回车,打开 Resource Monitor
  • 在 Associated Handles 右边的输入框输入文件名
  • 找到正在用这个文件的程序之后,可以直接右键 End Process 关掉这个程序。

在这里插入图片描述
参考链接:https://stackoverflow.com/questions/4389833/unlink-of-file-failed-should-i-try-again

在 Android Studio 中,报这个错的原因一般是 GradleDaemon 在使用这个文件,可以先用 jps 命令查看 GradleDaemon 进程的 ID,然后用 taskkill /PID 进程ID 杀掉 GradleDaemon 进程。

注:后来发现这是由于 gradle 打开了这个文件,但没有 close inputStream 导致的泄露问题。关闭 inputStream 之后就再没出现过这个问题了。

34. git push 时输入账号密码后提示 Authentication failed

控制台还会有这样的提示信息:

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/xxx'

这是 github 为了安全起见,不再支持账号密码 push 了。需要在 github 账号中,点击 Settings → Developer settings → Personal access tokens &arr; 创建一个新的 token。

创建完成后将这个 token 字符串保存下来,在 push 时,输入账号和 token 就能正常 push 了。(也就是在以前输入密码的位置,输入 token)

笔者建了一个永久有效、支持所有功能的 token,这是 github 不推荐的,因为这样不安全,但这样使用的时候很方便,况且我也没有什么机密代码。
在这里插入图片描述

35. git reset --hard 之后,如何撤销

当我们使用 git reset --hard 回退版本之后,有时会发现回退错了,不应该回退,想要撤销这次 reset 操作,重新回到 HEAD。这时,我们可以使用 reflog 命令,这个命令会输出 HEAD 的历史,当执行 reset,checkout 等操作时,这些操作会被记录在 reflog 中。

git reflog

然后从 HEAD 历史中找到需要回到的 HEAD 的 commit id,再次调用 git reset --hard 即可:

git reset --hard 需要回到的HEAD的commitID

二、gradle篇

1.将 library 打包成 aar 导入另一个项目

1.1.打包 aar

点击 Android Studio 侧边栏 Gradle → 点击需要打包的 library → 点击 Tasks → 点击assembleRelease

切换到 Project 视图 → 在"对应的library\build\outputs\aar"目录下,可以看到打包出来的 aar 文件

1.2.将 aar 导入另一个项目

方法一

将 aar 文件放入项目的 app\libs 文件夹下
在 app 模块的 build.gradle 中添加:

...

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    ...
    implementation(name: 'aar的文件名称,不带后缀,如library-release', ext: 'aar')
}
方法二

直接导入 libs 文件夹下的所有 aar

implementation fileTree(include: ['*.aar'], dir: 'libs')

一般 gradle 中已经有一行类似的导入所有 jar 包的代码:

implementation fileTree(include: ['*.jar'], dir: 'libs')

我们也可以直接在这一行代码中添加 aar :

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

2.配置jks

在 app 模块的 build.gradle 文件中,添加:

android {
    ...

    signingConfigs {
        // 这里的 key 指签名配置的名字,可以任意取,只要后面与其保持一致
        key {
            storeFile file('密钥库路径,也就是jks文件路径,其中文件路径分隔符 \ 需要使用转义字符 \\ ,如 D:\\keys\\xxx.jks')
            storePassword '密钥库密码'
            keyAlias = '密钥名'
            keyPassword '密钥密码'
        }
    }
    buildTypes {
        debug {
            ...
            // 表示 debug 版本使用签名,这里的 key 需要和上面的 signingConfigs 中保持一致
            signingConfig signingConfigs.key
        }
        release {
            // 表示 release 版本使用签名,这里的 key 需要和上面的 signingConfigs 中保持一致
            signingConfig signingConfigs.key
        }
    }
}

Android app签名的作用:

  • app中对签名进行校验,可以防止代码被盗后被别人重新打包
  • 系统要求被系统的签名文件签名后的应用才能正确获取系统级权限

3.查看 gradle 依赖树

gradlew :app:dependencies

查看 gradle 依赖树并导出到文件中:

gradlew :app:dependencies >dependencies.txt

4.添加Java8支持

app模块下的 build.gradle 中,添加

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ...
}

5. gradle 缓存的 library 保存在哪里?

有时候 gradle 下载 library 会失败,这时候我们可以去手动下载 aar 或 jar,下载后存到哪里呢?

存到这个位置:

C:\Users\你的用户名\.gradle\caches\modules-2\files-2.1

或者直接用这个路径:

C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1

%USERNAME% 表示名为 USERNAME 的环境变量,Windows 系统自带这个环境变量。

这个文件夹中有许多的包名,点击对应包名的文件夹就能看到这个 aar 或 jar 了,这些文件都放在一个名字很奇怪的文件夹中,比如 7b823157de0b185ceab43e948e3088adb928532d 之类的。这个文件夹名其实是这个文件的 SHA1 值。

计算文件 SHA1 值的命令:

certutil -hashfile 需要计算的文件 SHA1

查看这个命令的帮助文档:

certutil -hashfile -?

6. 使用阿里云镜像下载依赖库

有时候网络不好,下载 library 时频频报 Read Timeout,这时候可以通过阿里云镜像提升下载速度。

maven { url "https://dl.google.com/dl/android/maven2/" }
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/jcenter" }

有的 gradle 可能是用 kotlin 写的,所以顺便贴上 kotlin 版:

maven("https://dl.google.com/dl/android/maven2/")
maven("https://maven.aliyun.com/repository/google")
maven("https://maven.aliyun.com/repository/gradle-plugin")
maven("https://maven.aliyun.com/repository/public")
maven("https://maven.aliyun.com/repository/central")
maven("https://maven.aliyun.com/repository/jcenter")

其中,第一个地址 https://dl.google.com/dl/android/maven2/ 不是阿里
感谢阿里!

三、adb篇

1.adb 安装apk

adb install apk路径

2.adb 卸载app

adb uninstall app包名

3.adb 强制安装apk

adb install -r -g apk路径

其中,-r 指 reinstall (覆盖安装),-g 指保留之前的权限

4.adb远程联调

(1)连接 USB 数据线,命令行中输入:

adb tcpip 5037

这里的5037是指端口号,其他数字也可以。
(2)命令行中输入:

adb connect 设备ip:5037

设备 ip 指的是连接的 Android 设备的 ip 地址,如192.168.xx.xx,5037仍然是指端口号,需要和第一步中保持一致。
(3)拔掉 USB 数据线即可。

5.adb 查看已连接的设备

adb devices

如果远程联调设备显示offline,重连解决。也就是先:

adb disconnect 设备ip:端口

再:

adb connect 设备ip:端口

如果 adb 连接了多个设备,指定对其中的某个设备使用 adb 命令的方式为:

adb -s 设备名称 命令

5.Android Studio 模拟器无法上网

(1)Mac Android Studio模拟器无法上网,网络偏好设置中添加DNS: 8.8.8.8

(2)Windows Android Studio模拟器无法上网:Tools → SDK Manager→ Http Proxy → 勾选 Auto-detect proxy settings.

6.adb 抓取 log

(1)先清除之前的log

adb logcat -c

(2)设置最多抓取20M

adb logcat -G 20m

(3)输出到指定位置

adb logcat -v threadtime > 输出路径,如D:\log.txt

7.adb 终端输出 log

Mac:

adb logcat -v threadtime | grep "需要筛选的字符串"

Windows 系统:

adb logcat -v threadtime | findstr "需要筛选的字符串"

其中的字符串表示筛选包含指定字符串的 log,直接在终端输出。

8.adb 查看 ip 地址

adb shell ifconfig

9. adb 启动 app

启动 Settings:

adb shell am start com.android.settings/com.android.settings.Settings

10. 打印当前屏幕正在运行的 app 的包名

adb shell dumpsys window | findstr mCurrentFocus

11.打印 app 版本号

adb shell dumpsys package 包名| findstr versionName

12.Logcat 频繁 “Unexpected EOF!”

这是由于 Logcat 的缓存区写满了导致的
查看 Logcat 缓存区大小:

adb logcat -g

修改 Logcat 缓存区大小:

adb logcat -G 4M

这里我将其指定为 4M,这个值可根据自己的需要设置。

参考:分析解决logcat报read: Unexpected EOF!异常

13. Warning: debug info can be unavailable. Please close other application using ADB: Monitor, DDMS, Eclipse

有时候想要 Debug 却 Attach 不上,报这个错误。这时候可以通过在平板的开发者选项中,关闭/再打开 USB 调试解决。

14. adb 打开网页

adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com

四、Windows篇

1.环境变量

1.1.设置环境变量

在文件夹的 This PC上点击右键,点击Properties

点击 Change settings → 在弹出的窗口中切换到 Advanced 标签 → 点击Environment Variables → 在 System variables中设置环境变量。

1.1.Path 变量

Windows 环境变量中 Path 变量的作用:敲命令行时,除了会寻找当前路径下的 exe 程序外,还会去 Path 包含的路径中寻找对应的 exe 程序,(或写作PATH,path,Windows不区分大小写)

1.2.其他变量

点击New...,可以自定义环境变量,引用自定义变量时,语法是%变量名%

如安装JDK时,Java要求我们自定义JAVA_HOME环境变量,值为Java安装路径。然后在Path中使用%JAVA_HOME%来表示此变量。

1.3.过时的CLASSPATH变量

CLASSPATH 的作用是指定类搜索的路径, JVM 是通过 CLASSPATH 来寻找 Java 类的。然而,JDK1.5 以上的版本会自动搜寻 Java 类,不再需要设置 CLASSPATH 了。

如果设置了此环境变量,则JRE将只按照此路径来搜索Java类,所以如果设置了一定要设置正确。

推荐不设置,笔者已经在环境变量中将CLASSPATH删除了

1.4.环境变量设置后不生效

重启命令行窗口,不行的话就重启电脑,缓存导致的。

2.命令行

2.1.命令行删除文件夹及其里面的内容

rmdir /s /q 文件夹路径

/s 表示删除文件夹里面的内容, /q 表示quite,安静删除,也就是删除时不要每次询问Yes/No。

文件夹路径分隔符用\,如:D:\test,下同。

2.2.命令行不删除文件夹,只清空里面的内容

del /q 文件夹路径

/q同样表示表示quite,安静删除,也就是删除时不要每次询问Yes/No

删除文件同样是使用此命令:

del 文件路径

2.3.从命令行打开文件夹

explorer 文件夹路径

易知,打开当前文件夹:

explorer .

打开上级文件夹:

explorer ..

2.4.查看电脑信息

dxdiag

查看注册表信息:

regedit

2.5. 添加账户

control userpasswords2

2.6. 连接 ftp 服务器

文件夹连接 ftp:

文件夹中输入 ftp://地址/ ,输入账号密码即可。

命令行连接 sftp:

sftp 用户名@服务器地址

然后输入 密码即可。

将远程的文件下载到本地,使用 get 命令:

get 文件名

默认下载目录就是连接 sftp 时,所在的文件夹。

将本地的文件上传到 sftp 服务器,使用 pull 命令:

put 文件名

3.Office已阻止访问以下对象,以便保护你的安全

在“我的电脑”中输入%temp%,然后回车,按时间排序,最近的文件就是被拦截的文件,点击运行即可。

4.Win10 卡在锁屏页面,不显示密码输入框

同时按下Ctrl + Alt + Delete就可以显示密码输入框,然后输入密码即可。(智障 Windows,毁我青春)

5. 窗口在屏幕外拉不回来

先确保窗口显示到前台

然后按 alt + space 键,激活控制菜单。

之后按 M 键,开启窗口移动控制,再用键盘上的上下左右按键,将窗口移到中央位置。

6. 网络可以用,但图标显示无 Internet

这个问题可能因设备而异,我的原因是使用了 Clash,所以需要在 Clash 的规则中添加这两个地址:

DOMAIN-SUFFIX,msftconnecttest.com,🚀 节点选择
DOMAIN-SUFFIX,msftncsi.com,🚀 节点选择

参考链接:https://github.com/vernesong/OpenClash/issues/2239

7.查看剪贴板历史

Win + V

五、Android Studio 篇

1.Android Studio给连接的设备截图

在 Logcat 左侧点击照相机图标即可。

2.Live Templates

Android Studio支持设置代码快捷输入模板,在 Setting → Live Templates 中:
(1)点击右上角的 +号,新建 Live Template
(2)在 Abbreviation 中输入快捷键
(3)Description 指输入快捷键后显示的描述
(4)Template text 指快捷键入的内容。
(5)Define 表示此快捷键在哪些文件类型中生效,如 xml、java、kotlin

如上图定义的是一个输入ld,生成以下代码:

Log.d("~~~","")

的快捷方式。$变量名$用来定义变量,这里定义了一个data变量,作用是:在代码模板输入后,光标会自动移动到变量的位置。
(6)定义变量值
点击 Edit variables 可以定义变量值,如笔者定义了一个输入 head 便生成头注释的模板:

并且将date变量的默认值设为date("yyyy-MM-dd"),表示当前日期。并且勾选右侧的Skip if defined,作用是:由于这个值已被定义,在代码模板输入后,光标就不会自动移到这个变量这里。

3.Logcat 栏的过滤栏不见了

尝试移动 logcat 框到上下左右即可。

4. Logcat 过滤 Log

在过滤栏填入此正则表达式,勾选右侧 Regex 框:

^(?!.*不需要的内容)(?!.*另一个不需要的内容)(.*需要的内容|.*另一个需要的内容)

其中不需要的内容需要的内容自行替换即可,可以无限连缀。

5. Android Studio 报红但是可以运行

尝试一:clean project 、rebuild project
尝试二:File → Invalidate caches / Restart
尝试三:关闭 Android Studio,删除项目文件夹下的 .gradle、.idea 文件夹,重新打开 Android Studio,在设备上运行项目,安装一次 app。

6.Debug 变得很卡,并提示 method breakpoints may dramatically slow down debugging

查看所有断点:
查看所有断点
取消勾选 Java Method Breakpoints
取消勾选 Java Method Breakpoints

7. 在 Marketplace 中搜索插件时,不显示搜索结果。

点击 File -> Settings -> Plugins,点击 Installed 右边的齿轮,在下拉框中选择 Manage Plugin Repositories:
Manage Plugin Repositories

然后添加上这个 URL: https://plugins.jetbrains.com/

Custom Plugin Repositories

参考:Plugins inside Android Studio Marketplace not showing when browsing

8.中文乱码

点击 Help -> Edit Custom VM Options,如果没有这个文件的话,会提示让你创建这个文件。

编辑这个文件,在文件底部添加一行:

-Dfile.encoding=UTF-8

解决 Android 中文乱码

参考文章:
Android Studio 3.6.3 Logcat 状态栏输出出现中文乱码的问题——完全解决

注:有的文章中说修改 Android Studio 安装目录下 bin/ 文件夹中的 studio64.exe.vmoptions,的确也能用,但 Android Studio 更新时会提示这个文件被篡改了,然后让你替换掉这个文件,所以不是长久之计。而本文记录的这个方法看起来是 IDEA 给我们提供的自定义 VM Options 的渠道,在 Android Studio 更新时应该会保留,不过笔者暂未测试过。

9.修改 Logcat 输出日志的颜色

  • 在 Setting 中搜索 Logcat
  • 取消右侧 Inherit values from 的选择,即可在上方的 Foreground 中设置自己想要的颜色
  • 最后点击 Apply → OK

Logcat 设置颜色
附上图中各个级别的日志颜色值:

VERBOSE:#BBBBBB
DEBUG:#54CEE3
INFO:#55E350
WARN:#F8DA3F
ERROR:#FF5370
ASSERT:#FF9492

参考文章:Android Studio修改Log信息颜色

10. 工具栏不见了

有时候,Android Studi
调出工具栏

11. “Launch succeeded” but not installed

在 StackOverflow 上有人说降级 gradle,笔者测的时候,戳一下 “Sync Project with Gradle Files” 就好了。不一定适合所有情况,但可以试试。
Sync Project with Gradle Files

参考文章:“Operation Succeeded” in Android Studio 4.1, with no action

12. 设置达到指定字符长度时自动换行

在格式化的时候,代码过长会自动换行。但有时一行并不是很长,也触发了换行。这个问题可以通过修改自动换行的长度解决:
设置达到指定字符长度时自动换行

13. Android Studio 底部 行号:列号 不见了

在 Android Studio 底部有个行号:列号,点击可以输入行号自动跳转至某行。这个功能还挺好用的。
在这里插入图片描述

View -> Status Bar Widgets -> Line: Column Number 中开启,如果不喜欢这个功能也是在这里关闭。需要注意的是,如果要开启这个功能,还需要保证 Status Bar Widgets 上方的 Status Bar 也是勾选上的。Status Bar 表示底部整个状态栏。
在这里插入图片描述

14. SourceSet with name ‘main’ not found

运行 Java 的 main() 方法时,有时 Android Studio 会报 SourceSet with name ‘main’ not found。

修复方案是在 .idea 文件夹下的 gradle.xml 文件中添加 <option name="delegatedBuild" value="false" />

15. Android Studio 全局 proxy 配置

单个项目中配置 proxy 的位置在项目的 gradle.properties 中。如果要清除代理设置,还需要检查全局是否设置了代理。全局 proxy 配置路径是:C:\Users\%USERNAME%\.gradle\gradle.properties

16. Incompatible Gradle JVM 问题,Android Studio 设置 Gradle JDK

Sync Project 时,有时候会遇到报 Incompatible Gradle JVM 错,例如:

Your build is currently configured to use incompatible Java 21.0.5 and Gradle 7.2. Cannot sync the project.

We recommend upgrading to Gradle version 8.10.

The minimum compatible Gradle version is 8.5.

The maximum compatible Gradle JVM version is 17.

Possible solutions:

  • Upgrade to Gradle 8.10 and re-sync
  • Upgrade to Gradle 8.5 and re-sync

在这里插入图片描述

这时候需要修改 Gradle JDK 版本或者 Gradle 版本。

File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle -> Gradle JDK

在这里插入图片描述

查看 Gradle 版本:

File -> Project Structure
在这里插入图片描述

六、Kotlin 篇

1.判断 lateinit 的变量是否已被初始化

private lateinit var dog: Dog
if (::dog.isInitialized) {
    ....
}

七、Android 篇

1. java.net.UnknownServiceException: CLEARTEXT communication to not permitted by network security policy

Android 9.0适配的问题,将 targetSdkVersion 降低到 27 或以下可以解决,也可以选择适配 Android 9.0

适配方式有两种:
在 AndroidManifest 中设置允许明文传输:

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

这是最简单的方式。

或者新建一个 res/xml/network_security_config.xml 文件,注意替换需要明文传输的域名:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

在 AndroidManifest 中声明使用此文件作为网络安全配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>

2.忽略警告 “Access can be private” 或者 “Access can be package-only”

在方法前添加注解

@SuppressWarnings({"WeakerAccess"})

3. 打印 Activity 堆栈信息

adb shell dumpsys activity activities

这个命令打印所有存活的 Activity及其堆栈信息

adb shell dumpsys activity activities >文件名

这个命令输出所有存活的 Activity及其堆栈信息到文件

4.values 资源文件夹匹配规则

以 strings 为例,比如匹配英国资源:

  • 先寻找 values-en-rGB 中的 string 中是否有此资源
  • 如果没有找到,则再找 values-en 文件夹下是否有此资源
  • 如果还是没有找到,则在 values-en-XX(XX指任意国家,如 values-en-rFRvalues-en-rDE)这一系列中,寻找此资源
  • 如果还是没有找到,则在 values 文件夹中寻找默认的资源。
  • 如果 values 文件夹中再找不到就会 crash 了。

八、命令行篇

1. 命令行网络请求

GET 请求:

curl -X GET 请求地址

如:

curl -X GET https://www.baidu.com/

POST 请求:

curl -X POST --data "{\"body\":\"This is a Message.\"}" 请求地址

Head 信息:

curl -X POST --data "{\"body\":\"This is a Message.\"}" -H "Content-Type: application/json" 请求地址

携带用户名密码:

curl -D- -u 用户名:密码 -X POST --data "{\"body\":\"This is a Message.\"}" -H "Content-Type: application/json" 请求地址

2.cmder 设置默认打开目录

Cmder,命令行神器。
在设置中,修改 Startup → Task → {cmd::Cmder}

cmd /k "%ConEmuDir%\..\init.bat"  -new_console:d:D:\

其中,D:\就代表默认打开目录。

3.Cmder 设置别名

编辑 安装目录\cmder_mini\config\user_aliases.cmd 文件,将别名添加到里面。如:

adbd=adb disconnect

传参:

commit=git commit -m "$*"

此时就可以使用:

commit message

效果等同于:

git commit -m "message"

多个参数:

printTest=echo $1 $2

此时,使用

printTest Hello World

就会在控制台输出

Hello World

组合命令,使用 && 连接多个命令,每个命令会依次执行,后面的命令会等待前面的命令完全执行完毕后才执行。
例如:

sync=git add . && git commit -m "sync"

4. Windows 刷新 dns 缓存

ipconfig /flushdns

5. Windows 命令行打开网页

cmd /c start 网址

6. Cmd 输出到文件时乱码

在cmd中输入"chcp"命令,查看当前系统的默认编码格式,例如:

chcp // 输出结果为:当前代码页: 936

在cmd中输入以下命令,将系统的默认编码格式设置为UTF-8:

chcp 65001

九、Java 篇

9.1 String 存储位置

new 出来的 String 存储在堆区:

String a = new String("abc");

直接双引号写的 String 存储在元数据区:

String b = "abc";

两者的地址是不同的:

// 输出 false
System.out.println(a == b);

但 equal 方法是相等的:

// 输出 true
System.out.println(a.equals(b));

调用 intern 方法,可以将堆区的 String 转换为元数据区的引用:

String c = a.intern();

这时,c 和 b 就是指向的同一个地址:

// 输出 true
System.out.println(c == b);

十、开发篇

1. 打印 Log 与开发同样重要

在功能开发完成后,一定要专门抽出时间打印相关日志,日志务必做到详尽,包含正确流程的每一步,错误流程的每一步以及出错的原因,否则上线后如果出现问题,将很难追踪。

十一、Mac 篇

1. Mac 设置环境变量

mac 环境变量加载顺序:

/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 

一般设置到 ~/.bash_profile 中。

mac 设置环境变量的命令:

echo 'export 环境变量名=环境变量值' >> ~/.bash_profile && source ~/.bash_profile

例如:

echo 'export ANDROID_HOME=/Users/$USER/Library/Android/sdk' >> ~/.bash_profile && source ~/.bash_profile

这个命令包含两个指令,设置环境变量并使其生效。

查看环境变量:

echo $PATH

十二、Chrome 篇

1. 开启 Chrome 多线程下载

进入Chrome 实验功能的网址 chrome://flags/

搜索 Parallel downloading,将其设置为 enabled,再重启 Chrome 就能生效了。

或者直接输入这个网址:chrome://flags/#enable-parallel-downloading

2. 快速到达页面顶部、底部快捷键

快速到达页面底部:end 键
快速到达页面顶部:home 键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值