简世博客

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

0%

1、Introduction

android画图经常用到Path类,所以特此来做个小笔记,记录下moveTo、lineTo、quadTo、cubicTo、arcTo的作用,在自定义view的时候经常用到。

2、moveTo

moveTo 不会进行绘制,只用于移动移动画笔。
结合以下方法进行使用。

3、lineTo

lineTo 用于进行直线绘制。

mPath.lineTo(300, 300);
canvas.drawPath(mPath, mPaint);

默认从坐标(0,0)开始绘制。如图:

刚才我们不说了moveTo是用来移动画笔的吗?

mPath.moveTo(100, 100);
mPath.lineTo(300, 300);
canvas.drawPath(mPath, mPaint);

把画笔移动(100,100)处开始绘制,效果如图:

4、quadTo

quadTo 用于绘制圆滑曲线,即贝塞尔曲线。

mPath.quadTo(x1, y1, x2, y2) (x1,y1) 为控制点,(x2,y2)为结束点。

同样地,我们还是得需要moveTo来协助控制。

mPath.moveTo(100, 500);
mPath.quadTo(300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);

效果如图:

5、cubicTo

cubicTo 同样是用来实现贝塞尔曲线的。

mPath.cubicTo(x1, y1, x2, y2, x3, y3) (x1,y1) 为控制点,(x2,y2)为控制点,(x3,y3) 为结束点。

那么,cubicTo 和 quadTo 有什么不一样呢?

官方是这么说的:

Same as cubicTo, but the coordinates are considered relative to the current point on this contour.

说白了,就是多了一个控制点而已。

然后,我们想绘制和上一个一样的曲线,应该怎么写呢?

mPath.moveTo(100, 500);
mPath.cubicTo(100, 500, 300, 100, 600, 500);

看看效果:

一模一样!

如果我们不加 moveTo 呢?

则以(0,0)为起点,(100,500)和(300,100)为控制点绘制贝塞尔曲线:

6、arcTo

arcTo 用于绘制弧线(实际是截取圆或椭圆的一部分)。

mPath.arcTo(ovalRectF, startAngle, sweepAngle) , ovalRectF为椭圆的矩形,startAngle 为开始角度,sweepAngle为结束角度。

mRectF = new RectF(10, 10, 600, 600);
mPath.arcTo(mRectF, 0, 90);
canvas.drawPath(mPath, mPaint);

由于new RectF(10, 10, 600, 600)为正方形,又截取 0 ~ 90 度 ,则所得曲线为四分之一圆的弧线。

效果如图:


转自:原文链接

android的View类里有一个可以继承的方法hasOverlappingRendering()。


    /**
     * Returns whether this View has content which overlaps.
     *
     * <p>This function, intended to be overridden by specific View types, is an optimization when
     * alpha is set on a view. If rendering overlaps in a view with alpha < 1, that view is drawn to
     * an offscreen buffer and then composited into place, which can be expensive. If the view has
     * no overlapping rendering, the view can draw each primitive with the appropriate alpha value
     * directly. An example of overlapping rendering is a TextView with a background image, such as
     * a Button. An example of non-overlapping rendering is a TextView with no background, or an
     * ImageView with only the foreground image. The default implementation returns true; subclasses
     * should override if they have cases which can be optimized.</p>
     *
     * <p>The current implementation of the saveLayer and saveLayerAlpha methods in {@link Canvas}
     * necessitates that a View return true if it uses the methods internally without passing the
     * {@link Canvas#CLIP_TO_LAYER_SAVE_FLAG}.</p>
     *
     * <p><strong>Note:</strong> The return value of this method is ignored if {@link
     * #forceHasOverlappingRendering(boolean)} has been called on this view.</p>
     *
     * @return true if the content in this view might overlap, false otherwise.
     */
    @ViewDebug.ExportedProperty(category = "drawing")
    public boolean hasOverlappingRendering() {
        return true;
    }

该方法用来标记当前view是否存在过度绘制,存在返回ture,不存在返回false,默认返回为true。

知道了这些就可以用该方法了,在保证该View不存在过度绘制的情况下,继承该方法,直接返回false即可。


但是对于一个有追求的开发者,更应该研究明白继承这个方法来性能优化的原理,只知其然不知其所以然是提高不了自己的水平的。下面就来说说这个方法具体是怎么用来性能优化的。


在android的View里有透明度的属性,当设置透明度setAlpha的时候,android里默认会把当前view绘制到offscreen buffer中,然后再显示出来。 这个offscreen buffer 可以理解为一个临时缓冲区,把当前View放进来并做透明度的转化,然后在显示到屏幕上。这个过程是消耗资源的,所以应该尽量避免这个过程。


避免这个过程可以分很多种情况,常见的比如没有背景的TextView,就可以直接设置文字颜色,而不是设置整体alpha;ImageView设置图片透明度setImageAlpha,自定义View设置绘制时的paint的透明度。


而当继承了hasOverlappingRendering()方法返回false后,android会自动进行合理的优化,避免使用offscreen buffer。


需要注意的是,当调用forceHasOverlappingRendering(boolean b)后这个方法就会被忽略。





传统的反编译工具:apktool+dex2jar+jd-gui,大多人都知道了,但是网上的版本普遍比较老旧,官网网速又差的不行,想下载个新版本的工具难的不行,我电脑里现在的版本反编译常常出问题。

下面是新发现的两个反编译工具:

AndroidDecompiler

github:   https://github.com/dirkvranckaert/AndroidDecompiler


这个看介绍,也是基于上面说的那几个工具来做的,但是反编译出来的工程能够直接导入其他ide编辑,方便不少。

 decompileAPK.sh -p xxx.apk


Jadx

github:   https://github.com/skylot/jadx


可以直接下载编译好的版本,也可以从源码编译


git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist

cd build/jadx/
bin/jadx -d out lib/jadx-core-*.jar
#or
bin/jadx-gui lib/jadx-core-*.jar


 亲测Jadx非常好用。





可惜现有的反编译工具都只能反编译出来class,

smali文件还需要自己去研究,很麻烦。

用第三方加固后的也看不到,还需要研究。





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


发现一个牛人的github:然后意外发现了他收集的反编译工具,特此记录。

https://github.com/YiuChoi/droidReverse

转自:点击打开链接

关于Activity的生命周期网上也有很多文章,最经典的莫过于官方的一张图解了。

这张图列出了Activity生命周期最主要的一些方法,启动后依次执行:

onCreate –> onStart –> onResume –> onPause –> onStop –> onDestroy

相信很多人也都已经知道以上方法与执行顺序,但是Activity还有其他方法,如onContentChanged, onPostCreate, onPostResume, onConfigurationChanged, onSaveInstanceState, onRestoreInstanceState,没有什么比自己做个Demo亲自试验研究下更有说服力了,下面我做了一个Demo来彻底研究下这些生命周期的方法,建议大家也亲自试验下:

public class DemoActivity extends Activity {

<span class="n" style="">static</span> <span class="n" style="">final</span> <span class="no" style="">String</span> <span class="no" style="">TAG</span> <span class="o" style="">=</span> <span class="no" style="">DemoActivity</span><span class="p" style="">.</span><span class="nf" style="">class</span><span class="p" style="">.</span><span class="nf" style="">getSimpleName</span><span class="p" style="">();</span>

<span class="vi" style="">@Override</span>
<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onCreate</span><span class="p" style="">(</span><span class="no" style="">Bundle</span> <span class="n" style="">savedInstanceState</span><span class="p" style="">)</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onCreate</span><span class="p" style="">(</span><span class="n" style="">savedInstanceState</span><span class="p" style="">);</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onCreate&quot;</span><span class="p" style="">);</span>
    <span class="n" style="">setContentView</span><span class="p" style="">(</span><span class="no" style="">R</span><span class="p" style="">.</span><span class="nf" style="">layout</span><span class="p" style="">.</span><span class="nf" style="">activity_demo</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="vi" style="">@Override</span>
<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onContentChanged</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onContentChanged</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onContentChanged&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onStart</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onStart</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onStart&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onRestart</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onRestart</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onRestart&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onPostCreate</span><span class="p" style="">(</span><span class="no" style="">Bundle</span> <span class="n" style="">savedInstanceState</span><span class="p" style="">)</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onPostCreate</span><span class="p" style="">(</span><span class="n" style="">savedInstanceState</span><span class="p" style="">);</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onPostCreate&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="vi" style="">@Override</span>
<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onResume</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onResume</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onResume&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onPostResume</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onPostResume</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onPostResume&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onPause</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onPause</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onPause&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onStop</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onStop</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onStop&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onDestroy</span><span class="p" style="">()</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onDestroy</span><span class="p" style="">();</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onDestroy&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onConfigurationChanged</span><span class="p" style="">(</span><span class="no" style="">Configuration</span> <span class="n" style="">newConfig</span><span class="p" style="">)</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onConfigurationChanged</span><span class="p" style="">(</span><span class="n" style="">newConfig</span><span class="p" style="">);</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onConfigurationChanged&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onSaveInstanceState</span><span class="p" style="">(</span><span class="no" style="">Bundle</span> <span class="n" style="">outState</span><span class="p" style="">)</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onSaveInstanceState</span><span class="p" style="">(</span><span class="n" style="">outState</span><span class="p" style="">);</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onSaveInstanceState&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

<span class="kp" style="">public</span> <span class="n" style="">void</span> <span class="n" style="">onRestoreInstanceState</span><span class="p" style="">(</span><span class="no" style="">Bundle</span> <span class="n" style="">outState</span><span class="p" style="">)</span> <span class="p" style="">{</span>
    <span class="k" style="">super</span><span class="p" style="">.</span><span class="nf" style="">onRestoreInstanceState</span><span class="p" style="">(</span><span class="n" style="">outState</span><span class="p" style="">);</span>
    <span class="no" style="">Log</span><span class="p" style="">.</span><span class="nf" style="">d</span><span class="p" style="">(</span><span class="no" style="">TAG</span><span class="p" style="">,</span> <span class="s2" style="">&quot;onRestoreInstanceState&quot;</span><span class="p" style="">);</span>
<span class="p" style="">}</span>

}

程序启动运行并结束上述生命周期的方法执行顺序是这样的:

onCreate –> onContentChanged –> onStart –> onPostCreate –> onResume –> onPostResume –> onPause –> onStop –> onDestroy

onContentChanged

onContentChanged()是Activity中的一个回调方法 当Activity的布局改动时,即setContentView()或者addContentView()方法执行完毕时就会调用该方法, 例如,Activity中各种View的findViewById()方法都可以放到该方法中。

onPostCreate、onPostResume

onPostCreate方法是指onCreate方法彻底执行完毕的回调,onPostResume类似,这两个方法官方说法是一般不会重写,现在知道的做法也就只有在使用ActionBarDrawerToggle的使用在onPostCreate需要在屏幕旋转时候等同步下状态,Google官方提供的一些实例就是如下做法:

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

<span class="sr" style="">//</span> <span class="no" style="">Sync</span> <span class="n" style="">the</span> <span class="n" style="">toggle</span> <span class="n" style="">state</span> <span class="n" style="">after</span> <span class="n" style="">onRestoreInstanceState</span> <span class="n" style="">has</span> <span class="n" style="">occurred</span><span class="p" style="">.</span>
<span class="nf" style="">mDrawerToggle</span><span class="p" style="">.</span><span class="nf" style="">syncState</span><span class="p" style="">();</span>

}

onPause、 onStop

这里顺便再提一下onPause、 onStop的区别, onPause是在整个窗口被半遮盖或者半透明的时候会执行,而onStop则是在整个窗口被完全遮盖才会触发, 触发onStop的方法之前必定会触发onPause方法。

onCreate、 onStart

onCreate方法会在第一次创建的时候执行,紧接着便会执行onStart方法,之后页面被完全遮挡会执行onStop方法,再返回的时候一般便会执行onRestart –> onStart方法, 但是如果如果这时候App内存不够需要更多的内存的时候,App便会杀死该进程,结束掉该Activity,所以这时候再返回的时候便会重新执行onCreate –> onStart –> onResume方法。


最近把我的惠普笔记本搞坏了,想重新安装个双系统,结果安上了ubuntu却怎么也安装不上windows了,怀疑是引导的问题。

需要配置grub,在这里记录一下,最基本的分区表示方法。

(hd0,X)和sdaX的分区表示方法

(hd0,0)为第一主分区(通常为C盘)
(hd0,1)为第二主分区
(hd0,2)为第三主分区
(hd0,3)为第四主分区
(hd0,4)为第一逻辑分区(通常为D盘)
(hd0,5)为第二逻辑争区(通常为E盘)

/dev/sda1为第一主分区
/dev/sda2为第二主分区
/dev/sda3为第三主分区
/dev/sda4为第四主分区
/dev/sda5为第一逻辑分区
/dev/sda6为第二逻辑分区

另外hd1和sdb表示第二块硬盘.

来源: 网络整理

说明

IntelliJ IDEA 有很多人性化的设置我们必须单独拿出来讲解,也因为这些人性化的设置让我们这些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它。

常用设置

  • IntelliJ IDEA 的代码提示和补充功能有一个特性:区分大小写。如上图标注 1 所示,默认就是 First letter 区分大小写的。
  • 区分大小写的情况是这样的:比如我们在 Java 代码文件中输入 stringBuffer IntelliJ IDEA 是不会帮我们提示或是代码补充的,但是如果我们输入 StringBuffer 就可以进行代码提示和补充。
  • 如果想不区分大小写的话,改为 None 选项即可。

  • 如上图 Gif 所示,该功能用来快速设置代码检查等级。我个人一般在编辑大文件的时候会使用该功能。IntelliJ IDEA 对于编辑大文件并没有太大优势,很卡,原因就是它有各种检查,这样是非常耗内存和 CPU 的,所以为了能加快大文件的读写,我一般会暂时性设置为 None
    • Inspections 为最高等级检查,可以检查单词拼写,语法错误,变量使用,方法之间调用等。
    • Syntax 可以检查单词拼写,简单语法错误。
    • None 不设置检查。

  • 如上图标注 1 和 2 所示,默认 IntelliJ IDEA 是没有开启自动 import 包的功能。
    • 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包。
    • 勾选标注 2 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们导入需要用到的包。但是对于那些同名的包,还是需要手动 Alt + Enter 进行导入的,IntelliJ IDEA 目前还无法智能到替我们做判断。

  • 如上图标注 1 所示,当我们 Java 类中导入的某个包下类超过这里设置的指定个数,就会换成用 * 号来代替。

  • 如上图 Gif 所示,IntelliJ IDEA 默认是会折叠空包的,这样就会出现包名连在一起的情况。但是有些人不喜欢这种结构,喜欢整个结构都是完整树状的,所以我们可以去掉演示中的勾选框即可。

  • 如上图标注 1 所示,IntelliJ IDEA 有一种叫做 省电模式 的状态,开启这种模式之后 IntelliJ IDEA 会关掉代码检查和代码提示等功能。所以一般我也会认为这是一种 阅读模式,如果你在开发过程中遇到突然代码文件不能进行检查和提示可以来看看这里是否有开启该功能。

  • 如上图 Gif 所示,在我们按 Ctrl + Shift + N 进行打开某个文件的时候,我们可以直接定位到改文件的行数上。一般我们在调 CSS,根据控制台找空指针异常的时候,使用该方法速度都会相对高一点。

  • 如上图标注红圈所示,我们可以对指定代码类型进行默认折叠或是展开的设置,勾选上的表示该类型的代码在文件被打开的时候默认是被折叠的,去掉勾选则反之。

  • 如上图 Gif 所示,IntelliJ IDEA 支持对代码进行垂直或是水平分组。一般在对大文件进行修改的时候,有些修改内容在文件上面,有些内容在文件下面,如果来回操作可能效率会很低,用此方法就可以好很多。当然了,前提是自己的浏览器分辨率要足够高。

  • 如上图箭头所示,IntelliJ IDEA 默认是开启单词拼写检查的,有些人可能有强迫症不喜欢看到单词下面有波浪线,就可以去掉该勾选。但是我个人建议这个还是不要关闭,因为拼写检查是一个很好的功能,当大家的命名都是标准话的时候,这可以在不时方便地帮我们找到代码因为拼写错误引起的 Bug。

  • 如上图 Gif 所示,我们可以对组件窗口的子窗口进行拖动移位,有时候设置过头或是效果不满意,那我们需要点击此按钮进行窗口还原。

  • 如上图 Gif 所示,在没有对 Ctrl + D 快捷键进行修改前,此快捷键将是用来复制并黏贴所选的内容的,但是黏贴的位置是补充在原来的位置后,我个人不喜欢这种风格,我喜欢复制所选的行数完整内容,所以进行了修改,修改后的效果如上图 Gif 演示。

  • 如上图 Gif 所示,默认 Ctrl + 空格 快捷键是基础代码提示、补充快捷键,但是由于我们中文系统基本这个快捷键都被输入法占用了,所以我们发现不管怎么按都是没有提示代码效果的,原因就是在此。我个人建议修改此快捷键为 Ctrl + 逗号

  • 如上图 Gif 所示,IntelliJ IDEA 14 版本默认是不显示内存使用情况的,对于大内存的机器来讲不显示也无所谓,但是如果是内存小的机器最好还是显示下。如上图演示,点击后可以进行部分内存的回收。

  • 如上图标注 1 所示,在打开很多文件的时候,IntelliJ IDEA 默认是把所有打开的文件名 Tab 单行显示的。但是我个人现在的习惯是使用多行,多行效率比单行高,因为单行会隐藏超过界面部分 Tab,这样找文件不方便。

  • 如上图 Gif 所示,默认 IntelliJ IDEA 对于 Java 代码的单行注释是把注释的斜杠放在行数的最开头,我个人觉得这样的单行注释非常丑,整个代码风格很难看,所以一般会设置为单行注释的两个斜杠跟随在代码的头部。

  • 如上图 Gif 所示,默认 Java 代码的头个花括号是不换行的,但是有人喜欢对称结构的花括号,可以进行此设置。对于此功能我倒是不排斥,我个人也是颇喜欢这种对称结构的,但是由于这种结构会占行,使得文件行数变多,所以虽然我个人喜欢,但是也不这样设置。

  • 如上图标注 1 所示,如果在 make 或 rebuild 过程中很慢,可以增加此堆内存设置,一般大内存的机器设置 1500 以上都是不要紧的。

  • 如上图标注 1 所示,勾选此选项后,启动 IntelliJ IDEA 的时候,默认会打开上次使用的项目。如果你只有一个项目的话,该功能还是很好用的,但是如果你有多个项目的话,建议还是关闭,这样启动 IntelliJ IDEA 的时候可以选择最近打开的某个项目。
  • 如上图红圈所示,该选项是设置当我们已经打开一个项目窗口的时候,再打开一个项目窗口的时候是选择怎样的打开方式。
    • Open project in new window 每次都使用新窗口打开。
    • Open project in the same window 每次都替换当前已打开的项目,这样桌面上就只有一个项目窗口。
    • Confirm window to open project in 每次都弹出提示窗口,让我们选择用新窗口打开或是替换当前项目窗口。

  • 如上图 Gif 所示,对于横向太长的代码我们可以进行软分行查看。软分行引起的分行效果是 IntelliJ IDEA 设置的,本质代码是没有真的分行的。

  • 如上图箭头所示,该设置可以增加 Ctrl + E 弹出层显示的记录文件个数。

  • 如上图箭头所示,该设置可以增加打开的文件 Tab 个数,当我们打开的文件超过该个数的时候,早打开的文件会被新打开的替换。

  • 如上图标注 1 所示,该区域的后缀类型文件在 IntelliJ IDEA 中将以标注 2 的方式进行打开。
  • 如上图标注 3 所示,我们可以在 IntelliJ IDEA 中忽略某些后缀的文件或是文件夹,比如我一般会把 .idea 这个文件夹忽略。

  • 如上图 Gif 所示,当我们设置了组件窗口的 Pinned Mode 属性之后,在切换到其他组件窗口的时候,已设置该属性的窗口不会自动隐藏。

  • 如上图 Gif 所示,我们可以对某些文件进行添加到收藏夹,然后在收藏夹组件窗口中可以查看到我们收藏的文件。

  • 如上图 Gif 所示,我们可以通过 Alt + F1 + 1 快捷键来定位当前文件所在 Project 组件窗口中的位置。

  • 如上图 Gif 所示,我们可以勾选此设置后,增加 Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示。

  • 如上图 Gif 所示,我们可以勾选此设置后,增加 Ctrl + 鼠标滚轮 快捷键来控制图片的大小显示。

  • 如上图红圈所示,默认 IntelliJ IDEA 是没有勾选 Show line numbers 显示行数的,但是我建议一般这个要勾选上。
  • 如上图红圈所示,默认 IntelliJ IDEA 是没有勾选 Show method separators 显示方法线的,这种线有助于我们区分开方法,所以也是建议勾选上的。

  • 如上图 Gif 所示,我们选中要被折叠的代码按 Ctrl + Alt + T 快捷键,选择自定义折叠代码区域功能。

  • 如上图 Gif 所示,当我们在编辑某个文件的时候,自动定位到当前文件所在的 Project 组件窗口位置。

  • 如上图 Gif 所示,即使我们项目没有使用版本控制功能,IntelliJ IDEA 也给我们提供了本地文件历史记录。除了简单的记录之外,我们还可以给当前版本加标签。

  • 如上图 Gif 所示,我们还可以根据选择的代码,查看该段代码的本地历史,这样就省去了查看文件中其他内容的历史了。除了对文件可以查看历史,文件夹也是可以查看各个文件变化的历史。

  • 如上图 Gif 所示,IntelliJ IDEA 自带了代码检查功能,可以帮我们分析一些简单的语法问题和一些代码细节。

  • 如上图 Gif 所示,IntelliJ IDEA 自带模拟请求工具 Rest Client,在开发时用来模拟请求是非常好用的。

前面介绍了一些基础的内存管理机制以及OOM的基础知识,那么在实践操作当中,有哪些指导性的规则可以参考呢?归纳下来,可以从四个方面着手,首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的内存泄露,最后是内存使用策略优化。

1)使用更加轻量的数据结构

例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构,下图演示了HashMap的简要工作原理,相比起Android系统专门为移动操作系统编写的ArrayMap容器,在大多数情况下,都显示效率低下,更占内存。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效在于他们避免了对key与value的autobox自动装箱,并且避免了装箱后的解箱。

2)避免在Android里面使用Enum

3)减小Bitmap对象的内存占用

Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用是很重要的,通常来说有下面2个措施:

inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。

decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。

4)使用更小的图片

在设计给到资源图片的时候,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用一张更小的图片。尽量使用更小的图片不仅仅可以减少内存的使用,还可以避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图的时候就会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM。

在Android上面最常用的一个缓存算法是LRU(Least Recently Use)

5)复用系统自带的资源

Android系统本身内置了很多的资源,例如字符串/颜色/图片/动画/样式以及简单布局等等,这些资源都可以在应用程序中直接引用。这样做不仅仅可以减少应用程序的自身负重,减小APK的大小,另外还可以一定程度上减少内存的开销,复用性更好。但是也有必要留意Android系统的版本差异性,对那些不同系统版本上表现存在很大差异,不符合需求的情况,还是需要应用程序自身内置进去。

6)注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用

7)Bitmap对象的复用

在ListView与GridView等显示大量图片的控件里面需要使用LRU的机制来缓存处理好的Bitmap。

利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率上的提升(3.0以及4.4以后存在一些使用限制上的差异)。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap会尝试去使用之前那张bitmap在heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小。

8)避免在onDraw方法里面执行对象的创建

类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。

9)StringBuilder

在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”。

避免对象的内存泄露

内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样一方面占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。显然,这还使得每级Generation的内存区域可用空间变小,gc就会更容易被触发,容易出现内存抖动,从而引起性能问题。

10)注意Activity的泄漏

通常来说,Activity的泄漏是内存泄漏里面最严重的问题,它占用的内存多,影响面广,我们需要特别注意以下两种情况导致的Activity泄漏:

内部类引用导致Activity的泄漏

最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -> Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。

Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏。

内部类引起的泄漏不仅仅会发生在Activity上,其他任何内部类出现的地方,都需要特别留意!我们可以考虑尽量使用static类型的内部类,同时使用WeakReference的机制来避免因为互相引用而出现的泄露。

11)考虑使用Application Context而不是Activity Context

对于大部分非必须使用Activity Context的情况(Dialog的Context就必须是Activity Context),我们都可以考虑使用Application Context而不是Activity的Context,这样可以避免不经意的Activity泄露。

12)注意临时Bitmap对象的及时回收

虽然在大多数情况下,我们会对Bitmap增加缓存机制,但是在某些时候,部分Bitmap是需要及时回收的。例如临时创建的某个相对比较大的bitmap对象,在经过变换得到新的bitmap对象之后,应该尽快回收原始的bitmap,这样能够更快释放原始bitmap所占用的空间。

需要特别留意的是Bitmap类里面提供的createBitmap()方法:

这个函数返回的bitmap有可能和source bitmap是同一个,在回收的时候,需要特别检查source bitmap与return bitmap的引用是否相同,只有在不等的情况下,才能够执行source bitmap的recycle方法。

13)注意WebView的泄漏

Android中的WebView存在很大的兼容性问题,不仅仅是Android系统版本的不同对WebView产生很大的差异,另外不同的厂商出货的ROM里面WebView也存在着很大的差异。更严重的是标准的WebView存在内存泄露的问题,看这里WebView causes memory leak - leaks the parent Activity。所以通常根治这个问题的办法是为WebView开启另外一个进程,通过AIDL与主进程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。

14)资源文件需要选择合适的文件夹进行存放

我们知道hdpi/xhdpi/xxhdpi等等不同dpi的文件夹下的图片在不同的设备上会经过scale的处理。例如我们只在hdpi的目录下放置了一张100100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到assets或者nodpi的目录下。

15)谨慎使用static对象

因为static的生命周期过长,和应用的进程保持一致,使用不当很可能导致对象泄漏,在Android中应该谨慎使用static对象。

16)特别留意单例对象中不合理的持有

虽然单例模式简单实用,提供了很多便利性,但是因为单例的生命周期和应用保持一致,使用不合理很容易出现持有对象的泄漏。

17)珍惜Services资源

18)优化布局层次,减少内存消耗

越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。

19)谨慎使用“抽象”编程

很多时候,开发者会使用抽象类作为”好的编程实践”,因为抽象能够提升代码的灵活性与可维护性。然而,抽象会导致一个显著的额外内存开销:他们需要同等量的代码用于可执行,那些代码会被mapping到内存中,因此如果你的抽象没有显著的提升效率,应该尽量避免他们。

20)谨慎使用多进程

使用多进程可以把应用中的部分组件运行在单独的进程当中,这样可以扩大应用的内存占用范围,但是这个技术必须谨慎使用,绝大多数应用都不应该贸然使用多进程,一方面是因为使用多进程会使得代码逻辑更加复杂,另外如果使用不当,它可能反而会导致显著增加内存。当你的应用需要运行一个常驻后台的任务,而且这个任务并不轻量,可以考虑使用这个技术。

一个典型的例子是创建一个可以长时间后台播放的Music Player。如果整个应用都运行在一个进程中,当后台播放的时候,前台的那些UI资源也没有办法得到释放。类似这样的应用可以切分成2个进程:一个用来操作UI,另外一个给后台的Service。

做好内存优化是一项长期的工作, 需要在很多地方注意,且行且珍惜!

最近发现了evi这个工具,这个工具是android 测试用的,和我想要做的是同样的功能。不过有的手机上没有这个指令,所以想要类似功能的可以先尝试这个工具,如果不行的话可以尝试在手机里push一个evi,或者换用分割线一下的方法。

用法很简单: 

1 输入 adb shell evi record 后,做自己想要重复执行的操作。 

2 输入 adb shell evi replay -t n ,即可重复执行操作,n代表想要重复执行的次数。

adb shell evi 
Usage:
evi record [-f <file>] [<events...>]
    - record system events to <file>
      If no -f option is supplied then the data is written
      to "/sdcard/events"
      (<events...> is the list of events to be backed up.
      For example, "1 3 5" means event1, event3 and event5.
      By default, event0, event1, event3, event4, event6
      and event7 are included.)

evi replay [-f <file>] [-t <times>]
- replay system events from <file>
If no -f option is supplied then “/sdcard/events” is used.
If no -t option is supplied then events will be replayed once.





—————————————————————————————————————————————————————————————————

根据上一篇 Android getevent/sendevent的使用,写了一个工具,专门用来把getevent转化为sendevent指令。


主要是16进制转化10进制太麻烦了,这么麻烦的东西,必须得写专门的工具来让电脑帮我完成。


这个工具的作用是把把getevent转化为sendevent指令,getevent指令中按回车空行每行转化为1秒延迟,并且组装成shell来循环执行。

(直接在工具里输入getevent事件,按q后回车结束输入)


没错,我就是想做个简易的按键录制工具。


可以直接下载我编译好的:点击下载


源码如下

   public static void main(String[] args) {

    System.out.println("请输入要转化的getevent指令(adb shell getevent)");

    Scanner scanner = new Scanner(System.in);
    StringBuilder result = new StringBuilder();
    result.append("#!/bin/sh\n");
    result.append("while :\n");
    result.append("do\n");
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if (line.trim().isEmpty()) {
            result.append("sleep 1\n");
            continue;
        }
        if (line.trim().equals("q")) break;
        String[] temp = line.split(" ");
        result.append("adb shell sendevent ")
                .append(temp[0] + " ")
                .delete(result.length() - 2, result.length() - 1)
                .append(temp[1] + " ")
                .append(String.format("%04d", Integer.parseInt(temp[2], 16)) + " ")
                .append(Long.parseLong(temp[3], 16) + " ");
        result.append("\n");
    }
    result.append("done\n");
    System.out.print(result.toString());

}</pre><br /><br /><p></p>

getevent&sendevent 是android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。

 

=== getevent ===

getevent 监控当前的事件,鼠标事件,按键事件,拖动滑动等

 

dd device 1: /dev/input/event0
  name: "qwerty2"
/dev/input/event0: 0001 001e 00000001
/dev/input/event0: 0001 001e 00000000

其中/dev/input/event0是device的名字 0001是type, 001e是键码, 最后一个根据type不同而不同
比如上面的倒数第二条就是按下a键的keydown,最后一个是按下a的keyup
具体的type,code,value的定义可以在源码/frameworks/base/core/java/android/view/KeyEvent.java中找到

/dev/input/event1: 0001 009e 00000001
/dev/input/event1: 0001 009e 00000000

009e 扫描码, 00000001 按下, 00000000 抬起


=== sendevent ===

 

命令格式2:adb shell sendevent [device] [type] [code] [value]

 

发送时间,格式和上面的一样,需要注意的是在get中code显示的是十六进制,而send中需要用十进制,例如

# sendevent /dev/input/event0 1 5 1
这个命令就是发送数字4的keydown消息,所以在屏幕上就会一直打印出很多个4(因为没有发送keyup)

 

如: adb shell sendevent /dev/input/event0 1 229 1 代表按下按下menu键

adb shell sendevent /dev/input/event0 1 229 0 代表按下松开menu键

说明:上述的命令需组合使用

另外所知道的命令如下:

Key Name                        CODE

MENU                                 229

HOME                                 102

BACK (back button)            158

CALL (call button)               231

END (end call button)         107

2. 发送鼠标事件(Touch):

命令格式:adb shell sendevent [device] [type] [code] [value]

情况1:在某坐标点上touch

如在屏幕的x坐标为40,y坐标为210的点上touch一下,命令如下

adb shell sendevent /dev/input/event0 3 0 40
adb shell sendevent /dev/input/event0 3 1 210
   
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0       //it must have
   
adb shell sendevent /dev/input/event0 1 330 0 //untouch
adb shell sendevent /dev/input/event0 0 0 0 //it must have

注:以上六组命令必须配合使用,缺一不可

情况2:模拟滑动轨迹(可下载并采用aPaint软件进行试验)

如下例是在aPaint软件上画出一条开始于(100,200),止于(108,200)的水平直线

adb shell sendevent /dev/input/event0 3 0 100 //start from point (100,200)
adb shell sendevent /dev/input/event0 3 1 200
   
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0
   
adb shell sendevent /dev/input/event0 3 0 101 //step to point (101,200)
adb shell sendevent /dev/input/event0 0 0 0
……………………                                                  //must list each step, here just skip
adb shell sendevent /dev/input/event0 3 0 108 //end point(108,200)
adb shell sendevent /dev/input/event0 0 0 0
   
adb shell sendevent /dev/input/event0 1 330 0 //untouch

adb shell sendevent /dev/input/event0 0 0 0


___________________________________________________________________________________________________________________

 /system/bin/input   命令也可以有类似的效果

130|root@cancro:/ # /system/bin/input                                          
Usage: input [<source>] <command> [<arg>...]
The sources are: 
      mouse
      keyboard
      joystick
      touchnavigation
      touchpad
      trackball
      stylus
      dpad
      touchscreen
      gamepad
The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)



转自:点击打开链接


通过命令行执行adb shell am broadcast发送广播通知。


adb shell am broadcast 后面的参数有:

[-a <ACTION>]
[-d <DATA_URI>]
[-t <MIME_TYPE>] 
[-c <CATEGORY> [-c <CATEGORY>] ...] 
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] 
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] 
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] 
[-n <COMPONENT>]
[-f <FLAGS>] [<URI>]


例如:

adb shell am broadcast -a com.android.test --es test_string "this is test string" --ei test_int 100 --ez test_boolean true


说明:蓝色为key,红色为value,分别为String类型,int类型,boolean类型


===========================================================================================

扩展阅读:

db shell am instrument [options] <COMPONENT>

作用:启动对instrument实例的监视。

参数[options]:

-e <key> <value> // -e选项需要放在-w选项之前

作用:提供了以键值对形式存在的测试选项。Android中提供了多种键值对,具体参见下表。
举例:-e class com.android.phone.FIncomingCallTests#testRejectCall

-r

作用:以原始形式输出测试结果。该选项通常是在性能测试时与-e perf true一起使用。

参数 <COMPONENT>:

-w <test_package_name>/<runner_class> //<test_package_name>和<runner_class>在测试工程的AndroidManifest.xml中查找

作用:保持adb shell打开直至测试完成
举例:-w com.android.phone.tests/com.android.phone.runners.FunctionalTestRunner

<key> <value>参考表

Key Value Description
package <Java_package_name> The fully-qualified Java package name for one of the packages in the test application. Any test case class that uses this package name is executed. Notice that this is not an Android package name; a test package has a single Android package name but may have several Java packages within it.
class <class_name> The fully-qualified Java class name for one of the test case classes. Only this test case class is executed.
<class_name>#method name A fully-qualified test case class name, and one of its methods. Only this method is executed. Note the hash mark (#) between the class name and the method name.
func true Runs all test classes that extend InstrumentationTestCase.
unit true Runs all test classes that do not extend either InstrumentationTestCase orPerformanceTestCase.
size [small | medium | large] Runs a test method annotated by size. The annotations are @SmallTest,@MediumTest, and @LargeTest.
perf true Runs all test classes that implement PerformanceTestCase. When you use this option, also specify the -r flag for am instrument, so that the output is kept in raw format and not re-formatted as test results.
debug true Runs tests in debug mode.
log true Loads and logs all specified tests, but does not run them. The test information appears in STDOUT. Use this to verify combinations of other filters and test specifications.
emma true Runs an EMMA code coverage analysis and writes the output to/data//coverage.ec on the device. To override the file location, use thecoverageFile key that is described in the following entry.

Note: This option requires an EMMA-instrumented build of the test application, which you can generate with the coverage target.

coverageFile <filename>

Overrides the default location of the EMMA coverage file on the device. Specify this value as a path and filename in UNIX format. The default filename is described in the entry for the emma key

 

adb shell am start [options] <INTENT>

作用:启动一个activity

举例:adb shell am start -a com.lt.test.action.SECOND

举例:adb shell am start -n com.lt.test/.MyActivity

说明:[options]与<INTENT>参见 http://developer.android.com/tools/help/adb.html#am

adb shell am startservice [options] <INTENT>

作用:启动一个service

举例:adb shell am startservice -a com.lt.test.action.ONESERVICE
举例:adb shell am startservice -n com.lt.test/.MyService

 

adb shell am force-stop <PACKAGE>
作用:强制关闭一个应用程序

举例:adb shell am force-stop com.lt.test

 

adb shell am broadcast [options] <INTENT>

作用:发送一个广播
举例:adb shell am broadcast -a "action_finish" (发送一个广播去关闭一个activity)
举例:adb shell am broadcast -a android.intent.action.MASTER_CLEAR(恢复出厂设置的方法,会清除内存所有内容)

举例:adb shell am broadcast -n com.lt.test/.MyBroadcast

 

adb shell pm list packages [options] <INTENT>

作用:列举出所有包含<INTENT>的package

举例:adb shell pm list packages com.lt

说明:[options]与<INTENT>参见 http://developer.android.com/tools/help/adb.html#pm

 

参考链接:

http://developer.android.com/tools/help/adb.html


==========================================================================================

扩展阅读:

第一部分:

1. ubuntu下配置环境anroid变量:

在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#set android environment

2. 运行Eclipse,还需要配置JAVA环境变量

#set java environment

JAVA_HOME=/home/loginname/jdk目录名

JRE_HOME=/home/loginname/jdk目录名/jre

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=/home/loginname/android-sdk-linux_86/tools:$PATH

保存后,重启

3. 加入设备ID标识到当前的android调试环境

在/home/loginname/.android文件中添加,android终端的设备标识ID

4. 更新sdk

【android update sdk】更新sdk

5. 常用命令:

【adb help】获取帮助

【adb get-serialno】获取设备串号

【adb root】获取root权限,对部分手机有用,大部分上市手机已经把这个功能给关闭了。获取root权限还可以通过豌豆夹等第三方工具。

【adb kill-server】杀死adb的server进程。

【adb start-server】启动adb的server进程。

【adb devices】查看建立连接的android终端。

【android list】显示所有android终端

【ddms】启动ddms

【adb remount】重新加载硬盘。

【adb reboot】重新启动终端。

【adb install /path/appname】安装应用程序

【adb uninstall com.android.helloworld】卸载helloworld,系统带的应用不可卸载。

【adb push /sourcepath/filename /destinationpath/filename】从pc端拷贝一个文件到终端

【adb pull /sourcepath/filename /destinationpath/filename】从终端拷贝一个文件到pc端

【adb logcat -v time -s TAGNAME】显示自定义的TAGNAME并显示时间

【adb ppp】通过usb启动ppp

【adb monkey -p /path/appname -v 100】对程序进行强制测试100次

【adb shell】在pc端启动shell命令终端。

以上命令需要pc端的root权限,命令失效时,可以尝试切换工作目录到sdk的tools下,例如:sudo ./adb kill-server,sudo ./adb start-server。

6. shell下命令,可以使用BusyBox工具集:

【am start -n {包名(package)}/{包名}.{活动activity名称}】启动某一个app的activity,配置参考AndroidManifest.xml,例如闹钟: 
 # am start -n com.android.alarmclock/com.android.alarmclock.AlarmClock

【am broadcast -a android.intent.action.ActionName】发送广播消息

【setprop KEY VALUE】设置key的property值位value

【getprop KEY】获取该key的property值

【getevent】获取所有事件

【watchprops】监听property值的变化

【stop SERVER】强行停止某一个服务

【start SERVER】启动某一个服务

【ioctl】控制设备

【dumpsys activity】显示活动栈信息

【top】显示瞬间的进程的资源占用等信息

【free】显示当前进程内存使用情况

【ps】显示进程的自身标识信息

【rm /path/filename】从终端删除一个文件

【mkdir】新建一个目录或者文件

【grep】查找特定内容

【ls】显示当前目录下的文件

【cd】切换当前目录

【chmod】更改文件属性

【cp】拷贝文件

【dd】复制文件

【mv】移动目录文件,或者改名

【cat】查看文件内容

【kill】杀死进程

【ipconfig】查看更改网络接口地址和参数

【ping】检测网络状态

【netstat】查看网络状态

【telnet】登录远程主机

【sqlite3 /path/DATABASENAME.db】打开某一个数据库。之后即可使用select,insert,delete等数据库操作命令

【tcpdump -p -nnn -vvv -s 0 -w /PATH/NAME.pcap port 80 and tcp】网络调试抓包

【gst-launch playbin uri=file:///system/media/audio/bootaudio.mp3】gst多媒体框架,播放音频文件

【alsa_amixer】音频调试命令,可以切换声道,调节音量,切换设备。不同的芯片厂家的参数设置有所不同。

【alsa_aplay -D AndroidPlayback_Speaker_normal  /cache/music/dial/0.wav】通过alsa播放pcm码流。

【alsa_arecord】通过alsa实现录音

【am start -n com.android.music/com.android.music.MediaPlaybackActivity -d /sdcard/bootaudio.mp3】启动android进程播放mp3

【stack --symbols-dir=./out/target/product/NAME/symbols ramdump】查看调用堆栈

【exit】退出shell

通过 adb shell, cd /system/bin,ls可以列表出大部分可用的命令。

7. 部分android手机的VenderID

# 0x0525 NXP芯片

# 0x18D1 Broadcom2457双卡芯片

# 0x2314 GHT Moke

# 0x04E8 AnyCall GT-I5508

# 0x22B8 Moto XT701 XT300

# 0x0BB4 HTC A8180

第二部分:

adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以很好的调试开发的程序,adb.exe在你安装的android的sdk开发包tools目录下,

adb使用方法:

adb [-d|-e|-s <serialNumber>] <command>

当你发出一个命令,系统启用Android客户端。客户端并不与模拟器实例相关,所以如果双服务器/设备是运行中的,你需要用-d选项去为应被控制的命令确定目标实例。关于使用这个选项的更多信息,可以查看模拟器/设备实例术语控制命令。

1、安装应用到模拟器:

你可以使用adb从你的开发电脑上复制一个应用程序,并且将其安装在一个模拟器/设备实例。像这样做,使用install命令。这个install命令要求你必须指定你所要安装的.apk文件的路径: 
adb install <path_to_apk> 
为了获取更多的关于怎样创建一个可以安装在模拟器/设备实例上的.apk文件的信息,可参照Android Asset Packaging Tool (aapt). 
要注意的是,如果你正在使用Eclipse IDE并且已经安装过ADT插件,那么就不需要直接使用adb(或者aapt)去安装模拟器/设备上的应用程序。否则,ADT插件代你全权处理应用程序的打包和安装. 
如果要删除某个应用,按下面操作,例如应用为test: 
adb shell 
cd /data/app 
rm test.apk

2、进入设备或模拟器的shell:

adb shell 
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式: 
adb shell [command] 
如:adb shell dmesg会打印出内核的调试信息。

3、发布端口:

可以设置任意的端口号,做为主机 向模拟器或设备的请求端口。如: 
adb forward tcp:5555 tcp:8000

4、从模拟器/设备中拷入或拷出文件:

可以使用adbpull ,push命令将文件复制到一个模拟器/设备实例的数据文件或是从数据文件中复制。install命令只将一个.apk文件复制到一个特定的位置,与其不 同的是,pull和push命令可令你复制任意的目录和文件到一个模拟器/设备实例的任何位置。 
从模拟器或者设备中复制文件或目录,使用(如下命): 
adb pull <remote> <local> 
将文件或目录复制到模拟器或者设备,使用(如下命令) 
adb push <local> <remote> 
在这些命令中,<local>和<remote>分别指通向自己的发展机(本地)和模拟器/设备实例(远程)上的目标文件/目录的路径 
下面是一个例子: 
adb push test.txt /data/dat/test/test.txt、

5、查询模拟器/设备实例:

在发布adb命令之前,有必要知道什么样的模拟器/设备实例与adb服务器是相连的。可以通过使用devices 
命令来得到一系列相关联的模拟器/设备: 
adb devices

作为回应,adb为每个实例都制定了相应的状态信息: 
序列号——由adb创建的一个字符串,这个字符串通过自己的控制端口<type>-<consolePort>唯一地识别一个模拟器/设备实例。 
下面是一个序列号的例子: 
emulator-5554 
实例的连接状态有三种状态: 
offline — 此实例没有与adb相连接或者无法响应. 
device — 此实例正与adb服务器连接。注意这个状态并不能百分之百地表示在运行和操作Android系统,因此这个实例是当系统正在运行的时候与adb连接的。然而,在系统启动之后,就是一个模拟器/设备状态的正常运行状态了. 
每个实例的输出都有如下固定的格式: 
[serialNumber] [state] 
下面是一个展示devices命令和输出的例子 : 
$ adb devices 
List of devices attached 
emulator-5554  device 
emulator-5556  device 
emulator-5558  device

如果当前没有模拟器/设备运行,adb则返回 no device .

6、查看bug报告:

adb bugreport

7、记录无线通讯日志:

一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录: 
adb shell 
logcat -b radio

8、获取设备的ID和序列号:

adb get-product 
adb get-serialno

9、访问数据库SQLite3

adb shell 
sqlite3

如要打开已存在数据库:

sqlite3 <路径>/dbname.db