简世博客

一个简单的世界——博客空间,写了一些Android相关的技术文章,和一些点滴的想法

0%

    android开发中经常用JobService来做定时操作,但是这个定时任务又收到系统影响,系统为了耗电和网络等因素会将JobService的触发时间做一下优化。

    但是这就苦了android开发者,写了一个JobService想看一下效果往往等半天也等不来一次触发,给代码调试带来很大困难。研究了好久,才发现adb里有命令可以强制触发JobService。

命令如下:

run [-f | --force] [-u | --user USER_ID] PACKAGE JOB_ID

例如包名是 com.test.pkg  ,JobID是 1000

命令就是 :

adb shell cmd jobscheduler run -f com.test.pkg 1000

完整help如下:

xc@xc-OptiPlex-7040:~/sagit-o$ adb shell cmd jobscheduler
Job scheduler (jobscheduler) commands:
  help
    Print this help text.
  run [-f | --force] [-u | --user USER_ID] PACKAGE JOB_ID
    Trigger immediate execution of a specific scheduled job.
    Options:
      -f or --force: run the job even if technical constraints such as
         connectivity are not currently met
      -u or --user: specify which user's job is to be run; the default is
         the primary or system user
  timeout [-u | --user USER_ID] [PACKAGE] [JOB_ID]
    Trigger immediate timeout of currently executing jobs, as if their.
    execution timeout had expired.
    Options:
      -u or --user: specify which user's job is to be run; the default is
         all users
  monitor-battery [on|off]
    Control monitoring of all battery changes.  Off by default.  Turning
    on makes get-battery-seq useful.
  get-battery-seq
    Return the last battery update sequence number that was received.
  get-battery-charging
    Return whether the battery is currently considered to be charging.
  get-battery-not-low
    Return whether the battery is currently considered to not be low.
  get-storage-seq
    Return the last storage update sequence number that was received.
  get-storage-not-low
    Return whether storage is currently considered to not be low.
  get-job-state [-u | --user USER_ID] PACKAGE JOB_ID
    Return the current state of a job, may be any combination of:
      pending: currently on the pending list, waiting to be active
      active: job is actively running
      user-stopped: job can't run because its user is stopped
      backing-up: job can't run because app is currently backing up its data
      no-component: job can't run because its component is not available
      ready: job is ready to run (all constraints satisfied or bypassed)
      waiting: if nothing else above is printed, job not ready to run
    Options:
      -u or --user: specify which user's job is to be run; the default is
         the primary or system user

Material Theme on sublime text 3

之前用Sublime看log总是会看的头晕眼花,在github上找到一个很好的Sublime主题,记录一下。原文地址

日前在facebook跟laracasts上面看到很多人使用這個theme,感覺看起來很不錯,就順手安裝了一下,整體感覺很棒,也自己客製化了一些設定,以下是設定與步驟。

阅读全文 »

android自从把最近任务改为一个activity后,最近任务的内部逻辑的复杂程度就在不停地快速增长着。android是支持多用户的,最近任务在每个用户空间都有一个单独运行的进程。而只有主用户空间的SystemUI进程才能收到PhoneWindowManager发过来的事件,比如showRecents,hideRecents等,所以副用户空间的systemui进程就需要主用户空间的systemui来通知副用户的systemui来做显示最近任务和隐藏最近任务等操作。这就需要有一些调度逻辑了,到android 7.0后,google将原本通过的broadcast来调度的逻辑改为了用service调用,更加难以理清,在这篇博客里,我来单独分析一下最近任务对于多用户多进程的调度逻辑。

阅读全文 »

用linux也有两年了,但是仍然有很多命令记不住。在这篇博客里记录一些不好记的linux命令,方便查阅,本文会长期更新

xdg-open 和在文件管理器里双击一样的作用,非常方便的命令,记住这一个命令,可以少记无数命令。

nautilus 文件管理器

scp 和远程主机间传输文件
scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/ 下载
scp /opt/soft/demo.tar root@10.6.159.147:/opt/soft/scptest 上传

xsel 控制剪贴板的工具

加-b才能控制系统剪贴板 不加-b只是控制xsel内置剪贴板
cat Makefile | xsel -b 把终端内容输出到xsel
xsel -b < Makefile 把文本输出到xsel
xsel -b 显示xsel内的内容

expect 通过expect可以写脚本来调用某些需要交互的命令
最常见的用于ssh上

1
2
3
4
5
6
#!/usr/bin/expect
spawn ssh [email protected]
expect "*password:"
send "mypassword\r"
expect "*#"
interact

Screen 允许程序在后台运行,和nohup不同的是,它还可以交互
screen sudo openvpn myopenvpn.ovpn 在一个单独终端运行openvpn,可交互
按Ctrl+a+d 三个键,可以把当前命令放到后台,保持运行状态,空出当前终端
screen -ls 查看当前所有放到后台的命令
$ screen -ls
There is a screen on:
19425.pts-1.xc-Z370-HD3 (2018年06月12日 19时10分21秒) (Detached)
1 Socket in /run/screen/S-xc.
screen -r pid 来恢复放到后台的命令
screen -r 19425

最近对安全比较感兴趣,在此记录一些安全相关的网站。

一个xss平台:http://xsspt.com/

纳威安全导航: https://navisec.it/

t00ls上的工具库: https://www.t00ls.net/pytools.html

seebug 洞悉漏洞 : https://www.seebug.org/vuldb/vulnerabilities?has_poc=true

burpsuite中文教程: https://www.gitbook.com/book/t0data/burpsuite/details

钟馗之眼: https://www.zoomeye.org/

安全脉搏(老司机工具集) : https://www.secpulse.com/archives/54670.html

404安全网 : https://www.404sec.com/

看雪 :https://www.kanxue.com/

每一个Android开发者,基本都能把Handler、Looper、Message的原理说上一通,最基本的面试题答案“每个线程里可以创建一个Looper,Looper里维护一个消息队列,handler可以往这个消息队列发消息,Looper又不停的从消息队列里取出消息分发给对应的handler”。然而实际上很多开发者对这段话只是一知半解,在这篇博客里,我来用最简洁的语言,梳理一遍Handler、Looper、Message相关的源码。(以下代码都是经过简化或修改的,只包含关键代码逻辑,与实际android源码有所不同

先看一下创建一个新线程,并且创建一个handler的基本代码。

new Thread() {
    @Override
    public void run() {
        Looper.prepare();
        mHandler = new Handler();
        Looper.loop();
    }
}.start();

一共就三句,Looper.prepare(); mHandler = new Handler(); Looper.loop(); 一句句来分析。

public static void prepare() {
    sThreadLocal.set(new Looper());
}

prepare方法非常简单,只是new了一个Looper,放到ThreadLocal里。(再次注明,本篇列出的代码都是经过简化修改的,只列出了关键代码逻辑,真实android源码有所不同

private Looper() {
    mQueue = new MessageQueue();
}

Looper的构造方法同样简单,只是new了一个MessageQueue。 MessageQueue就是一个队列,用链表实现,内部有很多特殊逻辑,本篇不详细分析,在这里只要知道它是一个队列就行了。
到这里,第一句Looper.prepare()已经分析完了,是不是非常简单?再来看第二句mHandler = new Handler()。

public Handler() {
    mLooper = Looper.myLooper();
    mQueue = mLooper.mQueue;
}
public static @Nullable Looper myLooper() {
    return sThreadLocal.get();
}

直接从ThreadLocal里面拿出来之前放进去的Looper,然后把这个Looper和Looper里的MessageQueue都保存在成员变量里,以便后续使用。
现在第二句也分析完了,再看第三句。 Looper.loop();

public static void loop() {
    final MessageQueue queue = sThreadLocal.get().mQueue;
    for (; ; ) {
        Message msg = queue.next(); // might block
        msg.target.dispatchMessage(msg);
    }
}

这个loop方法里有个死循环,不停的从MessageQueue里取next message,然后调用这个message的target的dispatchMessage方法。
这个target又是什么呢?看下面的代码。

public final boolean sendMessage(Message msg) {
    return sendMessageAtTime(msg, 0);
}

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
    return enqueueMessage(mQueue, msg, uptimeMillis);
}

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
    msg.target = this;
    return queue.enqueueMessage(msg, uptimeMillis);
}

这是用handler发一个消息的简要流程,调用hanler的sendMessage时,会进过几次调用,调到enqueueMessage方法,里面有一句msg.target = this;可以看出,message的target就是发送这个message的handler,所以上面loop方法里面的 msg.target.dispatchMessage(msg);就是让发送这个message的handler再去调用dispatchMessage方法,这个dispatchMessage方法看名字就知道是处理message的逻辑了。

public void dispatchMessage(Message msg) {
    handleMessage(msg);
}

实际上这个dispatchMessage里面就调到了大家熟悉的handleMessage方法。

到这里,消息是怎么发给handler已经知道了,但是handler是怎么发送消息的呢?继续往下看之前的enqueueMessage方法。

boolean enqueueMessage(Message msg, long when) {
    synchronized (this) {
        msg.when = when;
        Message p = mMessages;
        Message prev;
        for (; ; ) {
            prev = p;
            p = p.next;
            if (p == null || when < p.when) {
                break;
            }
        }
        msg.next = p;
        prev.next = msg;
        nativeWake(mPtr);
    }
    return true;
}

这里把新加入的消息插入到队列中对应的位置。然后调用nativeWake来通知native层有新消息进来了。

以上,就是整个Handler、Looper、Message的分析,handler往MessageQueue里面发消息,然后looper又一直从MessageQueue里取消息让handler执行,这样就构成了整个消息收发的流程,本文所有代码都是经过简化过的,部分特殊逻辑没有提及,仅供大家初步了解。


一些实用的命令


发送广播关闭USB

$ adb shell am broadcast -a android.hardware.usb.action.USB_STATE --ez connected "false"

关闭gyroscope(陀螺仪)

硬件相关,可能有变动

$ adb shell echo 0 > /sys/class/sensors/bmg160/enable

无线adb连接手机

How to connect devices via Wireless ADB

Connect the device to the computer with a USB cable → The computer recognize the device

$ adb devices

Make sure device’s Wifi is ON, and set device’s tcpip port → To change the adb port

$ adb tcpip 12443

Write down the device IP (Connect to wifi):
   Go to settings → about phone → Status → IP address
Example: 192.168.8.81

$ adb connect 192.168.8.81:12443

Disconnect the cable

$ adb disconnect 192.168.8.81:12443

查看系统时间

$ adb shell date

开机跳过setupWizard正常使用

a. disable SetupWizard:

$ adb shell pm list packages | grep setup
$ adb shell pm disable

→ Example: com.google.android.setupwizard
b. build Provision and push into handset:

~$ mmm packages/apps/Provision/
~$ adb push out/target/product/flash3/system/app/Provision/Provision.apk /system/app/Provision/

c. reboot

$ adb reboot

Provision就是无界面版的SetupWizard,快速设置并初始化手机,是SetupWizard的替代版。

可断开USB还执行adb命令

  • 例如通过如下命令记录event log到sdcard
$ adb shell "getevent -ltr > sdcard/getevent.log&"  (linux common function)

在执行此命令之后可拔掉USB进行测试

查看Notification:“找出状态栏广告的主人”

adb shell dumpsys statusbar

debug相关的命令


过滤log篇

  • 只查看某个TAG的某个priority的log:
$ adb logcat ActivityManager:I MyApp:D *:S

*:S: sets the priority level for all tags to “silent”, thus ensuring only log messages with “ActivityManager” and “MyApp” are displayed.

  • 只显示Error级别的log:
$ adb logcat *:E
  • 直接看Exception的命令:
$ adb logcat -s */E
  • logcat时可以查看某个tag的所有log:
$ adb logcat -v threadtime -s [TAG]
  • 打开某个class的log:
$ adb shell setprop log.tag.MyAppTag VERBOSE
or:
  Creating a local.prop file as described in the original question:
  log.tag.MY_TAG=VERBOSE

And then pushing it onto the device as follows seems to do the trick:
adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot

You can double check to make sure that the values in local.prop were read by executing:
adb shell getprop | grep log.tag

  • 抓取kernel log:
$ adb shell cat /proc/kmsg > kernel.log

强制让进程gc

$ adb shell kill -10 PIDXXX

强制生成trace

/data/anr/traces.txt

$ adb shell kill -3 PIDxxx

强制生成进程的内存镜像

分析OOM

$ adb shell am dumpheap PIDxxx /data/xxx.hprof

打印调用顺序

在java代码中加入,可知道该函数被谁调用

Debug.getCallers(4)

top命令

每隔1秒执行top命令显示10行数据,能够实时查看后台哪些进程或者线程在执 行,消耗cpu

$ adb shell top -d 1 -m 10 -t

软重新:

$ adb shell stop; adb shell start

monkey test的命令:

$ adb shell monkey -v -p [package name] [times]
$ adb shell monkey -v -p com.jrdcom.lockscreen 1000000

查看cpu频率:

$ adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
$ adb shell cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq
$ adb shell cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq
$ adb shell cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_cur_freq

打开CPU loading log:

分析ANR(MTK)

$ adb shell setprop events.cpu true

在events log中实时打印cpu信息。

$ adb logcat -b events | grep cpu
   I/cpu     (  743): [16,4,12,0,0,0]
   I/cpu     (  743): [15,2,13,0,0,0]
   I/cpu     (  743): [16,2,14,0,0,0]

数字都是百分比,分别为:[total, user, system, iouat, irq, softlrq]``

终端输入play pause事件模拟按键:

$ adb shell media
  usage: media [subcommand] [options]
  media dispatch KEY
  media remote-display

media dispatch:    dispatch a media key to the current media client.
KEY may be:        play, pause, play-pause, mute, headsethook, stop, next, previous, rewind, recordm fast-forword.
media remote-display: 	 monitor remote display updates.

系列核心命令


模拟输入事件:

$ adb shell input text <string>   input a string to device
$ adb shell input keyevent <event_code>   send a Key Event to device

如: adb shell input keyevent 26 (PowerKey)

模拟启动activity:

$ adb shell am start  <INTENT> : start an Activity

如:am start -n com.android.calculator/com.android.calculator2.Calculator

$ adb shell am broadcast <INTENT>

得到/设置settings数据库键值

usage: settings [–user NUM] get namespace key

    settings [–user NUM] put namespace key value

    settings [–user NUM] delete namespace key

 

‘namespace’ is one of {system, secure, global}, case-insensitive

If ‘–user NUM’ is not given, the operations are performed on the owner user.

$ adb shell settings get/set Global airplane_mode_on
  • 修改数据库的键值:
$ adb shell settings put system/global [key] [value]
$ adb shell settings put system navigation_bar_key_mode 1
  • 得到数据库的键值:
$ adb shell settings get system/global [key]

查看Service信息

  • 查看Service列表:
$ adb shell service list
     Found 1 services:
0 phone: [com.android.internal.telephony.ITelephony]
  • 检查Service是否存在:
$ adb shell service check phone
Service phone: found
  • 使用Service:
$ adb shell service call phone 2 s16 "10086"

手机屏幕相关设置-wm命令

$ adb shell wm

usage: wm [subcommand] [options]

    wm size [reset | WxH]

    wm density [reset | DENSITY]

    wm overscan [reset | LEFT,TOP,RIGHT,BOTTOM]

  • wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]
    wm overscan: set overscan area for display.
    重新设置屏幕大小、尺寸:

    让界面显示在靠左200,靠上300,靠右400,靠下500的显示区域
      width = displaywidth - left - right
      height = displayheight - top - bottom
$ adb shell wm overscan 200,300,400,500
                     left,top,right,bottom
  • wm size: return or override display size.
    查看屏幕分辨率
$ adb shell wm size
    Physical size: 720x1280
  • wm density: override display density.
$ adb shell wm density
    Physical density: 480

      强制设置手机dpi为320

$ adb shell wm density 320

$ adb shell wm density reset

svc命令

Turn on/off Wi-Fi

$ svc wifi [enable|disable]

Turn on/off mobile data

$ svc data [enable|disable]

手机重启

$ svc power reboot [reason]
  Perform a runtime shutdown and reboot device with specified reason.

手机关机

$ svc power shutdown
  Perform a runtime shutdown and power off the device.

pm 命令大全

pm命令用于分析手机中apk和包名

查看当前安装的所有apk

$ adb shell pm list packages
  package:com.android.defcontainer
  package:com.tencent.mm

查看包名和文件名对应表

$ adb shell pm list packages -f
  package:/system/priv-app/DefaultContainerService.apk=com.android.defcontainer
  package:/data/app/com.tencent.mm-1.apk=com.tencent.mm
  package:/system/app/JrdGallery.apk=com.jrdcom.gallery3d

查看disable packagename

$ adb shell pm list packages -d

查看enable packagename

$ adb shell pm list packages -e

查看system app packagename

$ adb shell pm list packages -s

查看第三方app packagename

$ adb shell pm list packages -3

其他

$ adb shell pm list features

# Enable/Disable package
$ adb shell pm enable [packagename]
$ adb shell pm disable [packagename]

am 命令大全

强制dump某个进程的内存镜像

# 1044是Launcher的pid
$ adb shell am dumpheap 1044 /data/aa.hprof

Dalvik’s sampling profiler 定时抓取java call stack

$ adb shell am profile start [--user <USER_ID> current] [--sampling INTERVAL] <PROCESS> <FILE>
$ adb shell am profile stop [--user <USER_ID> current] [<PROCESS>]

$ persist.sys.profiler_ms 时间频率 默认0
$ persist.sys.profiler_depth call stack depth 默认4

抓取的文件保存于/data/snapshots/<pid>-<time>.snapshot

List all of the activity stacks and their sizes

$ adb shell am stack list

**Display the information about activity stack **

$ adb shell am stack info <STACK_ID>

dumpsys相关命令


  • 查看activity的provider信息

查看activity每个数据库的调用信息查询 打印所有provider信息 可以查看数据库某个时间点的增删改查的次数, 监测应用的IO操作:

$ adb shell dumpsys activity provider all

PROVIDER ContentProviderRecord{19861e6e u0 com.android.providers.media/.MediaProvider} pid=31295
Client:
internal.db: version 700, 68 rows, 0 inserts, 0 updates, 0 deletes, 120 queries,
1970-02-07 10:49:01.893 : Database upgraded from version 63 to 700 in 0 seconds
插入62次,0次更新,0次删除,105次查询
1970-02-07 10:49:03.852 : internal.db: version 700, 54 rows, 62 inserts, 0 updates, 0 deletes, 105 queries, scan started Feb 7, 10:49 AM (00:02)
1970-02-07 10:54:06.555 : internal.db: version 700, 54 rows, 0 inserts, 0 updates, 0 deletes, 55 queries, scan started 2月7日 下午6:54 (00:00)
2013-12-26 05:41:19.318 : internal.db: version 700, 54 rows, 0 inserts, 4 updates, 0 deletes, 58 queries, scan started Dec 26, 1:41 PM (00:00)
2013-12-27 07:45:37.775 : internal.db: version 700, 59 rows, 0 inserts, 0 updates, 0 deletes, 55 queries, scan started Dec 27, 3:45 PM (00:00)

  • 查看provider的Connections,谁在连接数据库
$ dumpsys activity providers
  • 查看手机disk状态
$ adb shell dumpsys diskstats
    >> Latency: 5ms [512B Data Write]
    >> Data-Free: 362888K / 1161104K total = 31% free
    >> Cache-Free: 116756K / 120900K total = 96% free
    >> System-Free: 133036K / 806284K total = 16% free
  • Get the list of services available:
$ adb shell service list
  • 查看可用的SERVICE列表
$ adb shell dumpsys | grep 'DUMP OF SERVICE' | awk '{print $4}' | tr -d ':'

ACTIVITY MANAGER PENDING INTENTS (adb shell dumpsys activity intents)
ACTIVITY MANAGER BROADCAST STATE (adb shell dumpsys activity broadcasts)
ACTIVITY MANAGER CONTENT PROVIDERS (adb shell dumpsys activity providers)
ACTIVITY MANAGER SERVICES (adb shell dumpsys activity services)
ACTIVITY MANAGER ACTIVITIES (adb shell dumpsys activity activities)
ACTIVITY MANAGER RUNNING PROCESSES (adb shell dumpsys activity processes)
INPUT MANAGER (adb shell dumpsys input)
WINDOW MANAGER LAST ANR (adb shell dumpsys window lastanr)
WINDOW MANAGER POLICY STATE (adb shell dumpsys window policy)
WINDOW MANAGER SESSIONS (adb shell dumpsys window sessions)
WINDOW MANAGER TOKENS (adb shell dumpsys window tokens)
WINDOW MANAGER WINDOWS (adb shell dumpsys window windows)

  • 查看某个应用的内存使用信息

getting memory usage informations

$ adb shell dumpsys meminfo 'your apps package name'
$ adb shell dumpsys meminfo com.google.android.apps.maps
  • 查看TaskStack
$ adb shell dumpsys activity activities
  • 查看Alarm列表
$ adb shell dumpsys alarm
  • 查看surface flinger:
$ adb shell dumpsys SurfaceFlinger
  • dumpsys其他一些信息:
adb shell dumpsys SurfaceFlinger | grep "Layer\|z="
adb shell dumpsys activity log a on
adb shell dumpsys window -d enable 26
adb shell dumpsys alarm log on
adb shell dumpsys alarm log off
adb shell dumpsys window policy
adb shell dumpsys activity log anr 2   可以打开anr的messagequeue
adb shell dumpsys activity a           查看activity详细信息,如显示大小,布局等等
adb shell dumpsys activity processes   进程信息 trimmemory
adb shell dumpsys activity recents
adb shell dumpsys activity broadcasts  可以查看前台和后台broadcast详细信息(发送时间,
                                       所有应用处理时间,监听广播的所有列表)
adb shell dumpsys activity intents
adb shell dumpsys activity oom
adb shell dumpsys input | grep Focus   查看焦点窗口



官方定义:

Invoke “. build/envsetup.sh” from your shell to add the following functions to your environment:

– croot: Changes directory to the top of the tree.
– m: Makes from the top of the tree.
– mm: Builds all of the modules in the current directory.
– mmm: Builds all of the modules in the supplied directories.
– cgrep: Greps on all local C/C++ files.
– jgrep: Greps on all local Java files.
– resgrep: Greps on all local res/*.xml files.

– godir: Go to the directory containing a file.


即在已经下载好Android源码android目录下面执行:. build/envsetup.sh 或source build/envsetup.sh,即可开始使用上面命令

之前我都是通过ddms里面的可视化工具抓systrace,但是最近发现同事提供的信息我这里看不到,

向同事请教后发现,同样是抓systrace,使用命令来抓比ddms里面抓要稳定靠谱的多,之前经常ddms抓systrace经常出现的半天没有反应的情况也没有了。


记录一下抓systrace的命令:

python ~/scorpio/external/chromium-trace/systrace.py -t 5 gfx input wm view am app res dalvik sched freq binder_driver binder_lock


很显然,执行了~/scorpio/external/chromium-trace/systrace.py 这个python,设置抓systrace时间为5s,

gfx input wm view am app res dalvik sched freq binder_driver binder_lock是常用的信息,

其中binder_driver binder_lock是binder Call信息,加上之后更容易分析卡顿,但是各种线太多了,比较影响视线。

用了这么久的linux,仍然记不住各种压缩解压指令,勉强能记住的也只有sEx,在此整理一下。


解压:sEx x FileName.*
压缩:sEx a FileName.* FileName


.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
———————————————
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
———————————————
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2        或tar --bzip xvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
———————————————
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
———————————————
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
———————————————
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
压缩一个目录使用 -r 参数,-r 递归。例: $ zip -r FileName.zip DirName
———————————————
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
———————————————
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName

lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
———————————————
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
———————————————
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -
———————————————
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到: http://sourceforge.net/projects/sex下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp sEx /usr/bin/

 

 

 


*************************************************************************************************************

Linux下常见文件解压方法及命令
系统·System

1.以.a为扩展名的文件:
#tar xv file.a
2.以.z为扩展名的文件:
#uncompress file.Z
3.以.gz为扩展名的文件:
#gunzip file.gz
4.以.bz2为扩展名的文件:
#bunzip2 file.bz2
5.以.tar.Z为扩展名的文件:
#tar xvZf file.tar.Z
或 #compress -dc file.tar.Z | tar xvf
6.以.tar.gz/.tgz为扩展名的文件:
#tar xvzf file.tar.gz
或 gzip -dc file.tar.gz | tar xvf -
7.以.tar.bz2为扩展名的文件:
#tar xvIf file.tar.bz2
或 bzip2 -dc file.tar.bz2 | xvf -
8.以.cpio.gz/.cgz为扩展名的文件:
#gzip -dc file.cgz | cpio -div
9.以.cpio/cpio为扩展名的文件:
#cpio -div file.cpio
或cpio -divc file.cpio
10.以.rpm为扩展名的文件安装:
#rpm -i file.rpm
11.以.rpm为扩展名的文件解压缩:
#rpm2cpio file.rpm | cpio -div
12.以.deb为扩展名的文件安装:
#dpkg -i file.deb
13.以.deb为扩展名的文件解压缩:
#dpkg-deb -fsys-tarfile file.deb | tar xvf - ar p
file.deb data.tar.gz | tar xvzf -
14.以.zip为扩展名的文件:
#unzip file.zip
在linux下解压Winzip格式的文件
  要是装了jdk的话,可以用jar命令;还可以使用unzip命令。
直接解压.tar.gz文件
  xxxx.tar.gz文件使用tar带zxvf参数,可以一次解压开。XXXX为文件名。 例如:
$tar zxvf xxxx.tar.gz 各种压缩文件的解压(安装方法)


文件扩展名 解压(安装方法)


.a ar xv file.a
.Z uncompress file.Z
.gz gunzip file.gz
.bz2 bunzip2 file.bz2
.tar.Z tar xvZf file.tar.Z
compress -dc file.tar.Z | tar xvf -
.tar.gz/.tgz tar xvzf file.tar.gz
gzip -dc file.tar.gz | tar xvf -
.tar.bz2 tar xvIf file.tar.bz2
bzip2 -dc file.tar.bz2 | xvf -
.cpio.gz/.cgz gzip -dc file.cgz | cpio -div
.cpio/cpio cpio -div file.cpio
cpio -divc file.cpio
.rpm/install rpm -i file.rpm
.rpm/extract rpm2cpio file.rpm | cpio -div
.deb/install dpkg -i file.deb
.deb/exrtact dpkg-deb -fsys-tarfile file.deb | tar xvf -
ar p file.deb data.tar.gz | tar xvzf -
.zip unzip file.zip


bzip2 -d myfile.tar.bz2 | tar xvf


tar xvfz myfile.tar.bz2


x 是解压
v 是复杂输出
f 是指定文件
z gz格式


gzip
gzip[选项]要压缩(或解压缩)的文件名
-c将输出写到标准输出上,并保留原有文件。
-d将压缩文件压缩。
-l对每个压缩文件,显示下列字段:压缩文件的大小,未压缩文件的大小、压缩比、未压缩文件的名字
-r递归式地查找指定目录并压缩或压缩其中的所有文件。
-t测试压缩文件是正完整。
-v对每一个压缩和解压缩的文件,显示其文件名和压缩比。
-num-用指定的数字调整压缩的速度。
举例:
把/usr目录并包括它的子目录在内的全部文件做一备份,备份文件名为usr.tar
tar cvf usr.tar /home
把/usr 目录并包括它的子目录在内的全部文件做一备份并进行压缩,备份文件名是usr.tar.gz
tar czvf usr.tar.gz /usr
压缩一组文件,文件的后缀为tar.gz
#tar cvf back.tar /back/
#gzip -q back.tar
or
#tar cvfz back.tar.gz /back/
释放一个后缀为tar.gz的文件。
#tar zxvf back.tar.gz
#gzip back.tar.gz
#tar xvf back.tar