Long Luo's Life Notes

每一天都是奇迹

By Long Luo

ADB(Android Debug Bridge) 工具是Android开发中使用很频繁也是非常重要的一个工具,用于手机与电脑的通信。

安装 ADB 工具:

在计算机上安装 Android SDK 或者仅安装 ADB 工具。从 Android 官方网站或者其他可信赖的来源获取它们。

  • 如果你使用 macOS 或 Linux,你可以通过终端使用系统包管理器或 Homebrew 安装 ADB。
  • 如果你使用 Windows,你可以下载 Android Studio ,它包含了 ADB 工具。

连接 Android 设备:

使用 USB 线将 Android 设备连接到计算机上。

在 Android 设备上打开开发者选项。这通常需要在设备设置中多次点击“关于手机” -> “版本号”或者类似的选项。一旦开启,返回设置菜单并找到“开发者选项”。

在“开发者选项”中,启用“USB 调试”。

查看当前设备

1
adb devices

显示已连接设备的列表。

1
2
List of devices attached
192.168.20.198:5555 device

连接设备

通过TCP端口连接

1
adb connect 192.168.20.168:5555

断开连接

1
adb disconnect 

查看设备连接IP地址

1
adb shell ifconfig wlan0

wlan0 Link encap:Ethernet HWaddr 40:80:e1:18:07:79 Driver rtl8852bu inet addr:192.168.20.210 Bcast:192.168.23.255 Mask:255.255.252.0 inet6 addr: fe80::f1f2:d9b0:957f:fbc6/64 Scope: Link inet6 addr: 240e:3b3:30b0:be81:2dd0:f286:b5b9:9462/64 Scope: Global inet6 addr: 240e:3b3:30b0:be81:6594:53f2:16ad:26f8/64 Scope: Global UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:87307 errors:0 dropped:28 overruns:0 frame:0 TX packets:149859 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32578487 TX bytes:60666878

adb shell netcfg

/system/bin/sh: netcfg: inaccessible or not found

设备 ID

ANDROID_ID

1
adb shell settings get secure android_id

查看系统信息

读取系统的各种文件配置信息,比如 /data/anr/traces.txt

1
adb shell cat /system/build.prop
1
adb shell getprop

比如:

1
2
3
4
adb shell getprop ro.product.model //获取设备型号
adb shell getprop ro.build.version.release //系统版本
adb shell getprop ro.product.board //CPU型号
adb shell getprop ro.serialno //序列号

查看设备信息

屏幕

屏幕信息

1
adb shell dumpsys display
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DISPLAY MANAGER (dumpsys display)
mOnlyCode=false
mSafeMode=false
mPendingTraversal=false
mViewports=[DisplayViewport{type=INTERNAL, valid=true, isActive=true, displayId=0, uniqueId='local:0', physicalPort=0, orientation=0, logicalFrame=Rect(0, 0 - 3840, 2160), physicalFrame=Rect(0, 0 - 3840, 2160), deviceWidth=3840, deviceHeight=2160}]
mDefaultDisplayDefaultColorMode=0
mWifiDisplayScanRequestCount=0
mStableDisplaySize=Point(3840, 2160)
mMinimumBrightnessCurve=[(0.0, 0.0), (2000.0, 50.0), (4000.0, 90.0)]


Display States: size=1
Display Id=0
Display State=ON
Display Brightness=0.7992125
Display SdrBrightness=0.7992125

分辨率

1
adb shell wm size
1
Physical size: 3840x2160

屏幕密度 density

1
adb shell wm density

Physical density: 320

CPU 信息

1
adb shell cat /proc/cpuinfo

processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x2 CPU part : 0xd05 CPU revision : 0

processor : 1 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x2 CPU part : 0xd05 CPU revision : 0

内存信息

1
adb shell cat /proc/meminfo

MemTotal: 7996532 kB MemFree: 2505308 kB MemAvailable: 4238664 kB

查看已安装应用

列出已经安装的应用程序

1
adb shell pm list packages

如果你想筛选出包含特定关键词的应用程序,可以使用以下命令:

1
adb shell pm list packages | grep keyword

adb shell pm list packages adb shell pm list packages -s //系统应用 adb shell pm list packages -3 //第三方应用 adb shell pm list packages | grep qq //过滤查找qq应用

查看应用信息

adb shell pm dump

查看应用版本信息

adb shell pm dump | grep “version”

卸载普通应用程序

卸载应用程序:

1
adb uninstall package_name

将 package_name 替换为你想要卸载的应用程序的包名。你可以通过之前提到的 adb shell pm list packages 命令来获取应用程序的包名列表。

示例:

假设你想卸载名为 “com.example.app” 的应用程序,命令将如下所示:

1
adb uninstall com.example.app

确认卸载:

执行命令后,ADB 会尝试卸载该应用程序。等待一段时间,命令提示符/终端会显示成功或失败的信息。 这个指令卸载系统自带应用可以能会遇到 Failure [DELETE_FAILED_INTERNAL_ERROR] 错误提示

卸载系统自带应用程序

清除应用程序数据:

在卸载应用之前,尝试先清除该应用的数据。使用以下命令:

1
adb shell pm clear package_name

将 package_name 替换为应用程序的包名。

强制停止应用程序:

如果应用程序正在运行,尝试通过 ADB 强制停止应用程序再进行卸载:

1
adb shell am force-stop package_name

将 package_name 替换为应用程序的包名。

确保设备有足够的存储空间来完成卸载操作。有时设备存储空间不足可能会导致卸载失败。

使用 ADB shell 运行命令:

adb shell

pm uninstall -k –user 0 package_name

安装 APK 文件

将要安装的 APK 文件复制到计算机上,并记住它的路径,使用以下命令安装 APK 文件到设备:

1
adb install /path/to/your/app.apk

将 /path/to/your/app.apk 替换为实际 APK 文件的路径。

查看appInfo

1
adb shell dumpsys package packageName

Activity

查看当前界面的Activity

1
adb shell "dumpsys activity top | grep ACTIVITY | tail -n 1"

打印顶层Activity信息

查看栈顶的activity

1
2
adb shell dumpsys activity top
adb shell dumpsys activity top | findstr ACTIVITY

查看当前活动窗口

1
adb shell dumpsys window | findstr mCurrentFocus

Service

查看所有的系统service

1
adb shell service list

根据上一行查询出的package,查找该App的launcher Activity

1
adb shell "dumpsys package <packageName> | grep -A 4 'MAIN'"
1
adb shell "dumpsys package org.videolan.vlc | grep -A 4 'MAIN'"
  android.intent.action.MAIN:
    6aeb5fb org.videolan.vlc/.StartActivity filter ef82618
      Action: "android.intent.action.MAIN"
      Category: "android.intent.category.LAUNCHER"
      Category: "android.intent.category.LEANBACK_LAUNCHER"
    443aa2e org.videolan.vlc/.gui.SendCrashActivity filter c3da9cf
      Action: "android.intent.action.MAIN"
      Category: "android.intent.category.LAUNCHER"
    1643b3a org.videolan.vlc/.widget.MiniPlayerConfigureActivity filter a9513eb
      Action: "android.intent.action.MAIN"
      Action: "android.appwidget.action.APPWIDGET_CONFIGURE"
  com.google.android.gms.actions.SEARCH_ACTION:
    6aeb5fb org.videolan.vlc/.StartActivity filter f01a030
      Action: "com.google.android.gms.actions.SEARCH_ACTION"

– Action: “android.intent.action.MAIN” Action: “android.appwidget.action.APPWIDGET_CONFIGURE” android.media.action.MEDIA_PLAY_FROM_SEARCH: 6aeb5fb org.videolan.vlc/.StartActivity filter 7a004a9

查看当前界面的Fragment

1
adb shell "dumpsys activity top | grep '#[0-9]: ' | tail -n 1"

查看所有在运行的任务栈

1
adb shell dumpsys activity activities

查看Activity任务栈(仅适用android11以及以上)

1
adb shell "dumpsys activity activities | grep '* ActivityRecord{'"

查看正在运行的 Services

1
adb shell dumpsys activity -p <packageName>

指定 package 的所有state

1
adb shell dumpsys activity package <packageName>
1
2
adb shell dumpsys activity -p com.xx.xxx s[ervices]
adb shell dumpsys activity b[roadcasts] <packageName>

service state

1
adb shell dumpsys activity s[ervices] [COMP_SPEC ...]

service client-side state

1
adb shell dumpsys activity service [COMP_SPEC]

获取通知信息

1
adb shell dumpsys notification

获得手机里面某个apk的应用信息、版本信息

1
adb shell dumpsys package <packagename>
1
adb shell dumpsys package "org.videolan.vlc" 

Activity Resolver Table: Full MIME Types: application/3gpp: 6aeb5fb org.videolan.vlc/.StartActivity filter 4558bc4 Action: “android.intent.action.VIEW” Category: “android.intent.category.DEFAULT” Category: “android.intent.category.BROWSABLE” Scheme: “” Scheme: “file” Scheme: “ftp” Scheme: “ftps” Scheme: “sftp” Scheme: “content” Scheme: “http” Scheme: “https” Scheme: “smb” StaticType: “video” StaticType: “audio” StaticType: “/rmvb” StaticType: ”/avi” StaticType: “/mkv” StaticType: ”application/3gpp” StaticType: “application/mp4” StaticType: “application/mpeg” StaticType: ”application/ogg” StaticType: ”application/sdp” StaticType: ”application/vnd.3gp” StaticType: “application/vnd.apple.mpegurl” StaticType: “application/vnd.dvd” StaticType: ”application/vnd.dolby” StaticType: “application/vnd.rn-realmedia” StaticType: “application/x-iso9660-image” StaticType: “application/x-extension-mp4” StaticType: “application/x-flac” StaticType: “application/x-matroska” StaticType: “application/x-mpegURL” StaticType: “application/x-ogg” StaticType: “application/x-quicktimeplayer” StaticType: “application/x-shockwave-flash” StaticType: “application/xspf+xml” StaticType: “misc/ultravox” mPriority=0, mOrder=0, mHasStaticPartialTypes=true, mHasDynamicPartialTypes=false

1
adb shell dumpsys deviceidle whitelist

查看wifi密码,root权限

adb shell cat /data/misc/wifi/*.conf

读取系统的各种文件配置信息,比如/data/anr/traces.txt

adb shell cat /system/build.prop

adb shell getprop

比如:

adb shell getprop ro.product.model //获取设备型号 adb shell getprop ro.build.version.release //系统版本 adb shell getprop ro.product.board //CPU型号 adb shell getprop ro.serialno //序列号

列出所有安装的APP

adb shell pm list packages adb shell pm list packages -s //系统应用 adb shell pm list packages -3 //第三方应用 adb shell pm list packages | grep qq //过滤查找qq应用

查看设备连接IP地址

adb shell ifconfig wlan0 adb shell netcfg

关闭USB debug模式

1
adb shell settings put global adb_enabled 0

打开的话 [设置」-「开发者选项」-「Android 调试」

ANDROID_ID adb shell settings get secure android_id IMEI Android 4.4 : adb shell dumpsys iphonesubinfo Android 5.0+: adb shell service call iphonesubinfo 1 windows执行 adb shell “service call iphonesubinfo 1 | grep -o ‘[0-9a-f]{8}’ | tail -n+3 | while read a; do echo -n \u\({a:4:4}\\u\){a:0:4}; done”

linux执行

adb shell ‘service call iphonesubinfo 1 | grep -o “[0-9a-f]{8}” | tail -n+3 | while read a; do echo -n “\({a:4:4}\u\){a:0:4}”; done’

模拟按键和输入 adb shell input –help

电源键: adb shell input keyevent 26 HOME 键: adb shell input keyevent 3 返回键: adb shell input keyevent 4 点亮屏幕: adb shell input keyevent 224 熄灭屏幕: adb shell input keyevent 223 输入文本: adb shell input text xxxxx

keycode 含义 3 HOME 键 4 返回键 5 打开拨号应用 6 挂断电话 24 增加音量 25 降低音量 26 电源键 27 拍照(需要在相机应用里) 64 打开浏览器 82 菜单键 85 播放/暂停 86 停止播放 87 播放下一首 88 播放上一首 122 移动光标到行首或列表顶部 123 移动光标到行末或列表底部 126 恢复播放 127 暂停播放 164 静音 176 打开系统设置 187 切换应用 207 打开联系人 208 打开日历 209 打开音乐 210 打开计算器 220 降低屏幕亮度 221 提高屏幕亮度 223 系统休眠 224 点亮屏幕 231 打开语音助手 276 如果没有 wakelock 则让系统休眠

截屏

1
adb exec-out screencap -p >  C:\Users\Administrator\Desktop\face\aaa.png

adb shell am start

启动 activity component

1
adb shell am start -n com.xx.xxx/com.xx.xxx.xxActivity

启动 系统 <设置>

adb shell am start -a android.settings.SETTINGS

1:打开 开发者选项 0: 关闭开发者选项

adb shell settings put global development_settings_enabled 1

-a action_str -d uri

开发者模式 设置

1
adb shell am start -a android.settings.APPLICATION_DEVELOPMENT_SETTINGS

package为com.xx.xxx的详细设置

1
adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:com.xx.xxx

example:权限管理设置

1
adb shell am start -a android.settings.action.MANAGE_OVERLAY_PERMISSION -d package:com.xx.xxx

电池优化 白名单

1
adb shell am start -a android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS

查看电池优化白名单

1
adb shell dumpsys deviceidle whitelist

##存储空间管理

1
adb shell am start -a android.os.storage.action.MANAGE_STORAGE

启动service

adb shell am startservice -n com.some.package/.someService adb shell am broadcast 模拟广播 adb shell am broadcast

[-a ] [-d ] [-t ] [-c [-c ] …] [-e|–es …] [–ez …] [-e|–ei …] [-n ] [-f ] []

adb shell am broadcast -a android.intent.action.EDIT –es test_string “this is test string” –ei test_int 100 –ez test_boolean true

刷新 媒体库,注意:有时必须指定 {file_name},否则有时无效

adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/Camera/{file_name}

// 递归 刷新 媒体库

adb shell “find /sdcard/Video/ | while read f; do   am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE   -d "file://${f}"; done”

adb shell am kill

/* 关闭package指定的应用程序 */

adb shell am force-stop com.some.package

/* kill与package相关联的所有process */

adb shell am kill com.some.package

/* 杀死所有后台进程process */

adb shell am kill-all

查看APP内存限制

/* 单个APP heap size限制 */

adb shell getprop | findstr dalvik.vm.heapgrowthlimit adb shell cat /system/build.prop | findstr dalvik.vm

Packages.xml应用信息

adb root

/data/system/

1
adb pull /data/system/packages.xml C:\Users\Administrator\Desktop

backup备份

-apk 应用和数据 -noapk 只有数据

adb backup -f “F:*.ab” -apk com.xx.xx

还原

adb restore f:*.ab 查看网络

ping[1] adb shell

查看网络接口 wlan0:无线网络接口 rmnet_data:移动网络接口

ls /sys/class/net/

##查看指定网络接口的配置

ifconfig rmnet_data0

##关闭指定网口

ifconfig rmnet_data0 down

打开指定网口

ifconfig rmnet_data0 up

查看所有网口的IP地址

ip -f inet addr

查看指定网口的IP地址

ip -f inet addr show wlan0

ping 一个地址 4此次

ping -c 4 baidu.com

##查看DNS

getprop | grep dns

修改DNS,使用上面getprop获得的DNS名称,设置方式飞行模式、开关机失效

setprop net.dns1 223. 控制台文件描述符stdout和stderr adb shell stop adb setprop log.redirect-stdio true adb shell start

普通操作

拨打电话

adb shell am start -a android.intent.action.CALL tel:10010

打开网页

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

Settings adb shell settings help

是否自动获取时间

adb shell settings get global auto_time

settings

电源、网络、USB控制 adb shell svc

关机

adb shell svc power shutdown

关闭移动数据

adb shell svc data disable

image.png

获取网口MAC地址

adb shell

cd sys/class/net

根据 networkInterface进入相应的网络接口

cat eth0/address cat wlan0/address

查看进程线程所在的CPU核心

ps的命令参数:-t -x,-P,-p,-c [pid|name]

-t显示进程下的线程列表 -x 显示进程耗费的用户时间和系统时间,单位s -P 显示调度策略,通过是bg or fg ,当获取失败将会un和er比之前打印的内容多出了一列PCY,表示进程的调度等级 +-p 显示进程的优先级和nice等级 -c 显示进程耗费的CPU时间 [PID]过滤指定进程PID,[name]过滤指定进程NAME adb shell ps -P -t -c -x PID MTK:

找出自己APP进程的PID, 关键字模糊匹配app的packageName

adb shell ps | findstr “PID player”

查看help,有哪些fields可以被打印

adb shell ps –help

-T 显示线程名, -o 执行显示哪些fields, 我们要显示CPU

adb shell ps -T -o UID,PID,CPU,%CPU,%MEM,NI,PSR,TIME,CMD -p 2912 CPU : 线程、进程在哪个cpu processor上执行 %CPU: 使用CPU时间的百分比 %MEM: 占用物理内存的百分比 NI: 线程的nice值,对应线程的优先级设置(static 19 to -20) CMD: 线程名称

ps-cpu 修改系统时间 Windows (PowerShell)

Windows (PowerShell)

$currentDate = Get-Date -Format “MMddHHmmyyyy.ss”

adb shell “date $currentDate;am broadcast -a android.intent.action.TIME_SET”

查看Android系统时间

date +“%Y-%m-%d %H:%M:%S”

批处理

set dateYYYY=%date:~0,4% set dateMM=%date:~5,2% set dateDD=%date:~8,2% set timeHH=%time:~0,2% set timeMM=%time:~3,2% set timeSS=%time:~6,2%

adb shell date %dateMM%%dateDD%%timeHH%%timeMM%%dateYYYY%.%timeSS% adb shell am broadcast -a android.intent.action.TIME_SET tasksetCPU绑定

查看pid 4069

taskset -p 4069

把 我们的pid 加入到进程组

echo 347 > /dev/cpuset/foreground/task

修改进程组的background的CPU调度策略

echo 0-3 > /dev/cpuset/background/cpus

taskset

查看指定进程的内存使用

adb shell dumpsys meminfo $package_name or $pid 查看系统内核

uname -a 获取IP地址

adb shell ip route | awk ‘{print $9}’ adb授予权限

adb shell pm grant com.ts.player android.permission.READ_EXTERNAL_STORAGE adb shell pm grant com.ts.player android.permission.WRITE_EXTERNAL_STORAGE 查看媒体提取器

adb shell dumpsys media.extractor 禁止弹出 沉浸式提示窗口 Viewing full screen. To exit, swipe down from the top

查看 secure namespace 下所有的值

adb shell settings list secure

是否已确认过

adb shell settings list secure | findstr immersive

删除此值

adb shell settings delete secure immersive_mode_confirmations

查看此值

adb shell settings secure get immersive_mode_confirmations

修改此值 disable 弹窗

adb shell settings put secure immersive_mode_confirmations confirmed

修改文件访问权限 chmod

修改文件权限

chmod [option] filename

给文件 加 运行 权限

chmod ugo+x

可以用二进制位表示:3个字节,每个字节代表一个用户组,每个字节的后3位由高到低代表 r、w、x,读写权限 rw= 100 | 010 = 110 = 6

chmod 777

[option]表示各种权限选项:

r(或4100):读取权限 w(或2010):写入权限 x(或1001):执行权限

还可以指定权限的获取者,三个部分的左中右:

u:文件所有者 g:文件所有者所在的组的用户 o:其他组的用户

权限的授予可采用操作符“+”,而“-”表示收回权限:

给其他组用户赋予read权限

chmod o+r

此用户无法使用开发者选项

adb shell settings put secure user_setup_complete 1 adb shell settings put global device_provisioned 1

Help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
E:\Tools>adb shell pm help
Error: unknown command 'help'
usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
pm list permission-groups
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm list features
pm list libraries
pm list users
pm path PACKAGE
pm dump PACKAGE
pm install [-lrtsfd] [-i PACKAGE] [--user USER_ID] [PATH]
pm install-create [-lrtsfdp] [-i PACKAGE] [-S BYTES]
[--install-location 0/1/2]
[--force-uuid internal|UUID]
pm install-write [-S BYTES] SESSION_ID SPLIT_NAME [PATH]
pm install-commit SESSION_ID
pm install-abandon SESSION_ID
pm uninstall [-k] [--user USER_ID] PACKAGE
pm set-installer PACKAGE INSTALLER
pm move-package PACKAGE [internal|UUID]
pm move-primary-storage [internal|UUID]
pm clear [--user USER_ID] PACKAGE
pm enable [--user USER_ID] PACKAGE_OR_COMPONENT
pm disable [--user USER_ID] PACKAGE_OR_COMPONENT
pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT
pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT
pm hide [--user USER_ID] PACKAGE_OR_COMPONENT
pm unhide [--user USER_ID] PACKAGE_OR_COMPONENT
pm grant [--user USER_ID] PACKAGE PERMISSION
pm revoke [--user USER_ID] PACKAGE PERMISSION
pm reset-permissions
pm set-app-link [--user USER_ID] PACKAGE {always|ask|never|undefined}
pm get-app-link [--user USER_ID] PACKAGE
pm set-install-location [0/auto] [1/internal] [2/external]
pm get-install-location
pm set-permission-enforced PERMISSION [true|false]
pm trim-caches DESIRED_FREE_SPACE [internal|UUID]
pm create-user [--profileOf USER_ID] [--managed] USER_NAME
pm remove-user USER_ID
pm get-max-users

pm list packages: prints all packages, optionally only
those whose package name contains the text in FILTER. Options:
-f: see their associated file.
-d: filter to only show disbled packages.
-e: filter to only show enabled packages.
-s: filter to only show system packages.
-3: filter to only show third party packages.
-i: see the installer for the packages.
-u: also include uninstalled packages.

pm list permission-groups: prints all known permission groups.

pm list permissions: prints all known permissions, optionally only
those in GROUP. Options:
-g: organize by group.
-f: print all information.
-s: short summary.
-d: only list dangerous permissions.
-u: list only the permissions users will see.

pm list instrumentation: use to list all test packages; optionally
supply <TARGET-PACKAGE> to list the test packages for a particular
application. Options:
-f: list the .apk file for the test package.

pm list features: prints all features of the system.

pm list users: prints all users on the system.

pm path: print the path to the .apk of the given PACKAGE.

pm dump: print system state associated with the given PACKAGE.

pm install: install a single legacy package
pm install-create: create an install session
-l: forward lock application
-r: replace existing application
-t: allow test packages
-i: specify the installer package name
-s: install application on sdcard
-f: install application on internal flash
-d: allow version code downgrade
-p: partial application install
-g: grant all runtime permissions
-S: size in bytes of entire session

pm install-write: write a package into existing session; path may
be '-' to read from stdin
-S: size in bytes of package, required for stdin

pm install-commit: perform install of fully staged session
pm install-abandon: abandon session

pm set-installer: set installer package name

pm uninstall: removes a package from the system. Options:
-k: keep the data and cache directories around after package removal.

pm clear: deletes all data associated with a package.

pm enable, disable, disable-user, disable-until-used: these commands
change the enabled state of a given package or component (written
as "package/class").

pm grant, revoke: these commands either grant or revoke permissions
to apps. The permissions must be declared as used in the app's
manifest, be runtime permissions (protection level dangerous),
and the app targeting SDK greater than Lollipop MR1.

pm reset-permissions: revert all runtime permissions to their default state.

pm get-install-location: returns the current install location.
0 [auto]: Let system decide the best location
1 [internal]: Install on internal device storage
2 [external]: Install on external media

pm set-install-location: changes the default install location.
NOTE: this is only intended for debugging; using this can cause
applications to break and other undersireable behavior.
0 [auto]: Let system decide the best location
1 [internal]: Install on internal device storage
2 [external]: Install on external media

pm trim-caches: trim cache files to reach the given free space.

pm create-user: create a new user with the given USER_NAME,
printing the new user identifier of the user.

pm remove-user: remove the user with the given USER_IDENTIFIER,
deleting all data associated with that user
阅读全文 »

翻译 By Long Luo

Hi, everybody. This Sunday is Father’s Day, and so I wanted to take a moment to talk about the most important job many of us will ever have and that’s being a dad.

大家好。本周日是父亲节,所以我想花点时间谈谈我们很多人一生最重要的一项工作——做一名父亲。

Today we’re blessed to live in a world where technology allows us to connect instantly with just about anyone on the planet. But no matter how advanced we get, there will never be a substitute for the love and support and, most importantly, the presence of a parent in a child’s life. And in many ways, that’s uniquely true for fathers.

如今,我们有幸生活在一个科技随时都能与全球任何人保持联系的世界里。然而,无论科技多么先进,都永远无法代替关爱和支持,特别是无法代替父母陪伴对于孩子生活的意义。就很多方面而言,对于身为人父者尤其如此。

I never really knew my own father. I was raised by a single mom and two wonderful grandparents who made incredible sacrifices for me. And there are single parents all across the country who do a heroic job raising terrific kids. But I still wish I had a dad who was not only around, but involved; another role model to teach me what my mom did her best to instill values like hard work and integrity; responsibility and delayed gratification all the things that give a child the foundation to envision a brighter future for themselves.

我对生身父亲知之甚少,而是由寡母和外祖父母抚养成人,她们为此做出了巨大的牺牲。全国各地也有许多这样的单身父母,他们勇敢面对,养育儿女。然而,我还是情愿父亲在我身边,并参与我的成长。(我希望他)能成为另一个角色,教会我许多(后来不得已)由母亲尽力传授的价值观念。比如,勤奋、正直、责任感和不急于享乐等等,这一切都为他的孩子赢得一个灿烂的未来奠定了基础。

阅读全文 »

相信未来 食指

当蜘蛛网无情地查封了我的炉台, 当灰烬的余烟叹息着贫困的悲哀, 我依然固执地铺平失望的灰烬, 用美丽的雪花写下:相信未来。

当我的紫葡萄化为深秋的露水, 当我的鲜花依偎在别人的情怀, 我依然固执地用凝霜的枯藤, 在凄凉的大地上写下:相信未来。

我要用手指那涌向天边的排浪, 我要用手撑那托起太阳的大海, 摇曳着曙光那支温暖漂亮的笔杆, 用孩子的笔体写下:相信未来。

我之所以坚定地相信未来, 是我相信未来人们的眼睛—— 她有拨开历史风尘的睫毛, 她有看透岁月篇章的瞳孔。

不管人们对于我们腐烂的皮肉, 那些迷途的惆怅,失败的苦痛, 是寄予感动的热泪,深切的同情, 还是给以轻蔑的微笑,辛辣的嘲讽。

我坚信人们对于我们的脊骨, 那无数次地探索、迷途、失败和成功, 一定会给予热情、客观、公正的评定, 是的,我焦急地等待着他们的评定。

朋友,坚定地相信未来吧, 相信不屈不挠的努力, 相信战胜死亡的年轻, 相信未来,热爱生命。

By Long Luo

CONFIGURING GIT

git config –global user.name “[name]” Set the name that will be associated with your commits

git config -global user.email “[email]” Set the email that will be associated with your commits

git config -global alias.[alias] [command] Create a shortcut for a Git command (e.g. alias.glog “log —graph —oneline”)

git config -global core.editor [editor] Set the default text editor to use for commit messages (e.g. vi)

git config -global —edit Open the global config file in a text editor for manual editing

INITIALIZING AND CLONING

git init Initialize an empty Git repository in the current directory

git init [directory] Create an empty Git repo in the specified directory

git clone [url] Clone a remote Git repository from the url into a local directory

git clone [url] [directory] Clone a remote repo into the specified local directory

EXAMINING LOGS

git log Show the commit history for the current branch

git log -p Show the diffs from each commit in the commit history

git log —stat Show stats (files changed, insertions,deletions) for each commit

git log —oneline Show condensed summary of commits in one line each

git log —graph —decorate Draw a text based graph of commits with branch names

git diff Show unstaged file differences compared to current index

git diff -cached Show differences between staged changes and the last commit

git diff [commitl] [commit2] Show changes between two commits

git show [commit] Show changes made in the specified commit

VERSIONING FILES

git add [file] Stage file changes to be committed

git commit -m “[message]” Commit the staged snapshot with commit message

git rm [file] Remove file from staging index and working directory

git mv [file] [newpath] Move or rename file in Git and stage the change

BRANCHING AND MERGING

git branch List all the branches in the current repository

git branch [branch] Create a new branch with name [branch]

git checkout [branch] Switch the current branch to [branch]

git checkout -b [branch] Create a new branch and switch to it

git merge [branch] Merge the history of [branch] into the current branch

git branch -d [branch] Delete the local branch [branch]

RETRIEVING AND UPDATING REPOSITORIES

git fetch [remote] Fetch branches and commits from the remote repository

git pull [remote] Fetch remote changes and directly merge into local repository

git pull —rebase [remote] Fetch remote changes and rebase onto local branch

git push [remote] [branch] Push local branch to remote repository

git push –all [remote] Push all local branches to remote

git push —tags [remote] Push all local tags to remote repository

REWRITING GIT HISTORY

git rebase [branch] Rebase current branch onto [branch]

git rebase -i [commit] Interactively rebase current branch onto [commit]

git reflog Show history of Git commands for current repository

git reset —hard [commit] clear staging area, rewrite working tree from specified commit

REMOTE REPOSITORIES

git remote add [name] [url] Create remote connection with url and alias [name]

git fetch [remote] Fetch all branches from remote repository

git pull [remote] Fetch remote changes and merge into local repository

git push [remote] [branch] Push local branch to remote repository

UNDOING CHANGES

git reset [file] Remove file from staging index but leave unchanged locally

git clean -n Shows which files would be removed from working directory. Use -f option to execute clean.

git revert [commit] Undo changes from specified commit by creating a new commit

$ git add .

$ git add -u .

git reset是指将当前head的内容重置,不会留log信息。

git reset HEAD filename 从暂存区中移除文件

git reset –hard HEAD~3 会将最新的3次提交全部重置,就像没有提交过一样。

git reset –hard commit (38679ed709fd0a3767b79b93d0fba5bb8dd235f8) 回退到 38679ed709fd0a3767b79b93d0fba5bb8dd235f8 版本

根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:

git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

git 放弃本地修改 强制更新

git fetch –all

git reset –hard origin/master

git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本

git新手。本地做了一些修改,我用git rebase说有冲突。我现在想把本地的请求都干掉,可能有的已经commit过了(没有push过),完全同步成远程版本,应该用什么命令?

使用命令:

git reset –hard ORIGIN/BRANCH

比如master分支:

git reset –hard origin/master

Git

Git dojo

https://www.shortcutfoo.com/

Try Git

https://try.github.io/levels/1/challenges/1

LearnGitBranching

http://learngitbranching.js.org/

查看所有远程分支:

git branch -r

拉取远程分支并创建本地分支

git checkout -b 本地分支名x origin/远程分支名x

使用该方式会在本地新建分支x,并自动切换到该本地分支x。

采用此种方法建立的本地分支会和远程分支建立映射关系。

使用如下命令:

git fetch origin 远程分支名x:本地分支名x

使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动 checkout。

采用此种方法建立的本地分支不会和远程分支建立映射关系。

三、本地分支和远程分支建立映射关系的作用

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

切换分支

git checkout 本地分支名

合并分支

git merge 本地分支名称

参考文献

Git

By Long Luo

本站目前采用 Hexo 作为后台系统,托管在Github上。此前我曾在很多地方安过家,最开始新浪和QQ空间上写过博客,后来到网易博客,再后来看到程序员都有自己的个人网站,于是2014年也新建了一个人网站,当时是买了域名和一个VPS,使用的LNMP架构。

在使用了流行的WordPress两年后看到码农的乐土,Jekyll ,一个以纯静态文件的博客系统。但后来我发现Jekyll实在太慢,而且美观度也不够,于是投奔了在Hexo

LNMP (Linux + Nginx + MySQL + PHP)

Ubuntu 20.04

使用Nginx官方源安装Nginx。

Nginx安装前必要环境。

sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring

导入官方nginx签名密钥。

curl https://nginx.org/keys/nginx_signing.key | gpg –dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

设置apt仓库。

echo “deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu lsb_release -cs nginx” | sudo tee /etc/apt/sources.list.d/nginx.list

更新软件包列表并安装nginx。

说明 默认安装最新稳定版本Nginx,如果对版本有要求可以使用sudo apt list -a nginx搜索支持的Nginx版本并将安装命令替换为具体版本(例:安装1.22.1-1~focal版本,修改命令为sudo apt install -y nginx=1.22.1-1~focal)。

sudo apt update -y && sudo apt install -y nginx

安装MySQL数据库并设置密码。

更新软件包列表并安装MySQL服务器。

sudo apt update -y && sudo apt install -y mysql-server

将MySQL的配置文件中监听地址从127.0.0.1(即只监听本地连接)更改为0.0.0.0(即监听所有可用网络接口),从而允许远程连接到MySQL服务器。

sudo sed -i “s/127.0.0.1/0.0.0.0/” /etc/mysql/mysql.conf.d/mysqld.cnf

修改数据库root用户主机部分从localhost更改为%以允许从任何地址连接,同时修改root用户的密码和身份认证插件。您需要将命令中替换为您的密码。

重要 由于本地root用户的默认身份认证插件是auth_socket,如果命令执行后提示输入密码,请直接按回车跳过。

sudo mysql -uroot -p -e “ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH caching_sha2_password BY ‘’;” -e “UPDATE mysql.user SET Host=‘%’ WHERE User=‘root’ AND Host=‘localhost’;” -e “FLUSH PRIVILEGES;”

重启MySQL数据库服务使配置生效。

sudo systemctl restart mysql

安装PHP。

更新软件包,安装software-properties-common包,并添加PPA仓库ppa:ondrej/php。

sudo apt update && sudo apt install -y software-properties-common && sudo add-apt-repository -y ppa:ondrej/php

安装PHP8.4及相关组件,包括FPM和MySQL扩展。

说明 您可以通过sudo apt search php查看所有支持安装的PHP版本,安装其他版本需要修改命令中对应版本号(例:安装PHP8.1需修改命令sudo apt install -y php8.1 php8.1-fpm php8.1-mysql)。

sudo apt install -y php8.4 php8.4-fpm php8.4-mysql

验证LNMP环境。

查询php-fpm配置文件默认监听地址,需要替换为您的PHP版本(例:PHP8.4需要将替换为8.4)。

sudo grep ‘^listen =’ /etc/php//fpm/pool.d/www.conf

sudo grep ‘^listen =’ /etc/php/8.4/fpm/pool.d/www.conf

如果返回sock文件地址说明默认监听sock文件。

如果返回127.0.0.1:9000说明默认监听本地9000端口。

listen = /run/php/php8.4-fpm.sock

编辑 /etc/nginx/conf.d/default.conf 文件,在server内填写PHP转发规则,需要替换为您的监听地址(如果是sock文件需要在地址前方增加unix:)。

重要 如果监听的sock文件,需要sock文件的权限设置为允许读写,您可以使用以下命令来更改权限sudo chmod 666 更改为您的sock文件地址。

location / { index index.php index.html index.htm; } location ~ .php$ { root /usr/share/nginx/html; fastcgi_pass ; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME \(document_root\)fastcgi_script_name; include fastcgi_params; }

location / { index index.php index.html index.htm; } location ~ .php$ { root /usr/share/nginx/html; fastcgi_pass unix:/run/php/php8.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME \(document_root\)fastcgi_script_name; include fastcgi_params; }

重启Nginx服务使修改后的配置文件生效。

sudo systemctl restart nginx

远程访问MySQL数据库

运行以下命令后,输入root用户的密码登录MySQL。

sudo mysql -uroot -p

依次运行以下命令,创建远程登录MySQL的账号,并允许远程主机使用该账号访问MySQL。

本示例账号为dmsTest、密码为Ecs@123****。

实际创建账号时,需将示例密码Ecs@123

更换为符合要求的密码,并妥善保存。密码要求:长度为8至30个字符,必须同时包含大小写英文字母、数字和特殊符号。可以使用以下特殊符号:

()` ~!@#$%^&*-+=|{}[]:;’<>,.?/

创建数据库用户dmsTest,并授予远程连接权限。

create user ‘frank’@‘%’ identified by ‘wp291563pd’;

为dmsTest用户授权数据库所有权限。

grant all privileges on . to ‘frank’@‘%’;

刷新权限。

flush privileges;

运行以下命令,为WordPress网站创建一个名称为wordpress的数据库。

create database wordpress;

create user ‘wpuser’@‘localhost’ identified by ‘25789pwdb’;

cd /usr/share/nginx/html

sudo wget https://cn.wordpress.org/latest-zh_CN.zip

启动nginx服务

sudo systemctl enable nginx sudo systemctl start nginx

enable:设置 Nginx 服务在系统启动时自动启动。 start:立即启动 Nginx 服务。

Nginx服务是否启动成功

sudo systemctl status nginx

status:查看 Nginx 服务的状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2025-01-03 19:25:38 CST; 1h 47min ago
Docs: https://nginx.org/en/docs/
Main PID: 2658 (nginx)
Tasks: 3 (limit: 1930)
Memory: 3.3M
CPU: 14ms
CGroup: /system.slice/nginx.service
├─2658 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
├─2659 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
└─2660 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Jan 03 19:25:38 iZwz9bi9yxqor74jqvhsr1Z systemd[1]: Starting nginx - high performance web server...
Jan 03 19:25:38 iZwz9bi9yxqor74jqvhsr1Z systemd[1]: Started nginx - high performance web server.

3 当修改了配置的时候,需要重启nginx,使配置生效的时候使用一下命令:

sudo systemctl reload nginx

  1. Nginx的配置文件存放的位置?

在Ubuntu环境中,Nginx的存放位置在以下目录中:

mysql -u wpuser -p -h localhost wordpress

Jekyll

$ git –version git version 1.7.1

$ ssh-keygen -t rsa -C “youremail@example.com”

id_rsa.pub

ssh -t git@github.com

$ git config –global user.name “Your Name” $ git config –global user.email “email@example.com”

1
2
3
4
5
6
7
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi longluo! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

修改SSH密码。登录ssh后, 通过passwd命令修改即可,命令格式:

1
passwd {用户名}

出现:(current) UNIX password: 然后输入当前系统登陆用户的密码 回车 出现:New password: 再输入新密码(新的密码必须是字母数字都有,不然的话不成功)

Hexo

参考文献

  1. 手动部署LNMP环境
  2. 在Linux实例中安装MySQL数据库
  3. 手动搭建WordPress(Linux)
0%