使用以下命令可以查看android设备的屏幕尺寸
1 2 3 |
adb shell dumpsys window displays adb shell wm size |
如果两个命令都不能执行就只能自己写程序来获得尺寸了
使用以下命令可以查看android设备的屏幕尺寸
1 2 3 |
adb shell dumpsys window displays adb shell wm size |
如果两个命令都不能执行就只能自己写程序来获得尺寸了
1 2 3 4 5 6 7 |
usage: input ... input text <string> input keyevent <key code number or name> input [touchscreen|touchpad] tap <x> <y> input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2> input trackball press input trackball roll <dx> <dy> |
1 |
adb shell input text bcoder.com |
貌似不能输入中文
1 2 3 4 |
//模拟按下数字0键 adb shell input keyevent "KEYCODE_0" //模拟按下返回键 adb shell input keyevent 4 |
1 |
adb shell input touchscreen tap 110 66 |
1 |
adb shell input touchscreen swipe 450 66 110 66 |
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 |
0 --> "KEYCODE_UNKNOWN" 1 --> "KEYCODE_MENU" 2 --> "KEYCODE_SOFT_RIGHT" 3 --> "KEYCODE_HOME" 4 --> "KEYCODE_BACK" 5 --> "KEYCODE_CALL" 6 --> "KEYCODE_ENDCALL" 7 --> "KEYCODE_0" 8 --> "KEYCODE_1" 9 --> "KEYCODE_2" 10 --> "KEYCODE_3" 11 --> "KEYCODE_4" 12 --> "KEYCODE_5" 13 --> "KEYCODE_6" 14 --> "KEYCODE_7" 15 --> "KEYCODE_8" 16 --> "KEYCODE_9" 17 --> "KEYCODE_STAR" 18 --> "KEYCODE_POUND" 19 --> "KEYCODE_DPAD_UP" 20 --> "KEYCODE_DPAD_DOWN" 21 --> "KEYCODE_DPAD_LEFT" 22 --> "KEYCODE_DPAD_RIGHT" 23 --> "KEYCODE_DPAD_CENTER" 24 --> "KEYCODE_VOLUME_UP" 25 --> "KEYCODE_VOLUME_DOWN" 26 --> "KEYCODE_POWER" 27 --> "KEYCODE_CAMERA" 28 --> "KEYCODE_CLEAR" 29 --> "KEYCODE_A" 30 --> "KEYCODE_B" 31 --> "KEYCODE_C" 32 --> "KEYCODE_D" 33 --> "KEYCODE_E" 34 --> "KEYCODE_F" 35 --> "KEYCODE_G" 36 --> "KEYCODE_H" 37 --> "KEYCODE_I" 38 --> "KEYCODE_J" 39 --> "KEYCODE_K" 40 --> "KEYCODE_L" 41 --> "KEYCODE_M" 42 --> "KEYCODE_N" 43 --> "KEYCODE_O" 44 --> "KEYCODE_P" 45 --> "KEYCODE_Q" 46 --> "KEYCODE_R" 47 --> "KEYCODE_S" 48 --> "KEYCODE_T" 49 --> "KEYCODE_U" 50 --> "KEYCODE_V" 51 --> "KEYCODE_W" 52 --> "KEYCODE_X" 53 --> "KEYCODE_Y" 54 --> "KEYCODE_Z" 55 --> "KEYCODE_COMMA" 56 --> "KEYCODE_PERIOD" 57 --> "KEYCODE_ALT_LEFT" 58 --> "KEYCODE_ALT_RIGHT" 59 --> "KEYCODE_SHIFT_LEFT" 60 --> "KEYCODE_SHIFT_RIGHT" 61 --> "KEYCODE_TAB" 62 --> "KEYCODE_SPACE" 63 --> "KEYCODE_SYM" 64 --> "KEYCODE_EXPLORER" 65 --> "KEYCODE_ENVELOPE" 66 --> "KEYCODE_ENTER" 67 --> "KEYCODE_DEL" 68 --> "KEYCODE_GRAVE" 69 --> "KEYCODE_MINUS" 70 --> "KEYCODE_EQUALS" 71 --> "KEYCODE_LEFT_BRACKET" 72 --> "KEYCODE_RIGHT_BRACKET" 73 --> "KEYCODE_BACKSLASH" 74 --> "KEYCODE_SEMICOLON" 75 --> "KEYCODE_APOSTROPHE" 76 --> "KEYCODE_SLASH" 77 --> "KEYCODE_AT" 78 --> "KEYCODE_NUM" 79 --> "KEYCODE_HEADSETHOOK" 80 --> "KEYCODE_FOCUS" 81 --> "KEYCODE_PLUS" 82 --> "KEYCODE_MENU" 83 --> "KEYCODE_NOTIFICATION" 84 --> "KEYCODE_SEARCH" 85 --> "TAG_LAST_KEYCODE" |
使用如下命令,可以对android手机进行截图
adb shell screencap -p /sdcard/screen.png
adb shell /system/bin/screencap -p /sdcard/screenshot.png
命令执行后,截图存放在手机的/sdcard下的screen.png
使用adb pull可以将图片拷贝到本地电脑中
adb pull /sdcard/screen.png d:\
不支持图片旋转、压缩等选项,如需对图片自动化处理需要借用第三方命令行软件
在monkeyrunner执行python脚本的input函数时,输入内容按回车后,input命令无法结束,后面的脚本无法执行,这是jython中的一个bug,对应的版本是jython-standalone-2.5.3.jar。
解决办法是下载jython-standalone-2.5.4-rc1.jar,不能下载太高版本,比如jythone2.7,与2.5.3所使用的环境不一致,可能会无法运行。
jython-standalone-2.5.3.jar所在的目录为: {android sdk根目录}\tools\lib,下载新版本后把jython-standalone-2.5.3.jar删除,把jython-standalone-2.5.4-rc1.jar拷贝到此目录即可。下载地址如下:
http://www.jython.org/downloads.html
当我们的项目的某些属性和第三方库中的属性有冲突时或者我们想修改第三方库中某些资源的属性时,我们就需要使用tools:replace来处理。
1. 有冲突的情况
比如第三方库中也定义了application@icon, application@label属性,则会与你的项目发生冲突,编译时报如下错误:
1 2 3 4 5 6 7 8 9 10 11 |
Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:9 Error:(28, 9) Attribute application@theme value=(@style/ThemeActionBar) from AndroidManifest.xml:28:9 is also present at XXXX-trunk:XXXXLib:unspecified:15:9 value=(@style/AppTheme) Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:24:5 to override Error:Execution failed for task ':XXXX:processDebugManifest'. > Manifest merger failed with multiple errors, see logs 'tools:replace="android:theme" 'tools:replace="android:label" 'tools:replace="android:icon" |
那么解决办法就是在你的Application节点中加入tools:replace来表示替换三方库中的相关属性,如下:
1 2 3 4 5 6 7 |
<application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/box_icon" android:label="@string/app_name" android:theme="@style/AppTheme" tools:replace="android:icon, android:label"> |
2. 替换三方库中的属性
比如在使用二维码识别的支持库zxing-android-embedded时,需要自定义拍照Activity的屏幕方向,则在AndroidManifest.xml中加入相关的activity节点,并覆盖其属性,xml如下:
1 2 3 4 5 |
<!--二维码扫描界面 for zxing-android-embedded--> <activity android:name="com.journeyapps.barcodescanner.CaptureActivity" android:screenOrientation="portrait" tools:replace="screenOrientation" /> |
注意:
使用tools:replace需要在manifest根节点加上相关的引用,如下xmlns:tools那一行:
1 2 3 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.bcoder.app"> |
volatile保证共享变量在多程中的可见性
即一个共享变量在线程1中被修改在,在线程2中读取这个变量时,立即得到最新的值
volatile不能保证变量的原子性
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 |
public class ThreadTest { static volatile boolean isrunning = false; static class Thread1 extends Thread{ @Override public void run() { super.run(); isrunning = true; int counter = 0; while (true){ counter++; System.out.println("counter: " + counter); if(counter > 10000){ break; } } isrunning = false; System.out.println("thread1 finish"); } } static class Thread2 extends Thread{ @Override public void run() { super.run(); while (true){ if(!isrunning){ break; } } System.out.println("thread2 finish"); } } public static void main(String[] args){ Thread1 thread1 = new Thread1(); Thread2 thread2 = new Thread2(); thread1.start(); thread2.start(); } } |
如果isrunning不加volatile修饰,thread2一直无法停止,因为无法获取到isrunning的更新状态。
被volatile修饰的对象,当对象内所有成员的值变化时都会更新到主存中, 以确保成员的可见性?(未亲自测试过)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。 而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。 由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。 就跟C中的一样 禁止编译器进行优化~~~~ |
摘自:https://bbs.csdn.net/topics/390413948?page=1
关于monkey脚本所支持的事件,请参考android源码下的development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java
如下:
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 |
// event key word in the capture log private static final String EVENT_KEYWORD_POINTER = "DispatchPointer"; private static final String EVENT_KEYWORD_TRACKBALL = "DispatchTrackball"; private static final String EVENT_KEYWORD_ROTATION = "RotateScreen"; private static final String EVENT_KEYWORD_KEY = "DispatchKey"; private static final String EVENT_KEYWORD_FLIP = "DispatchFlip"; private static final String EVENT_KEYWORD_KEYPRESS = "DispatchPress"; private static final String EVENT_KEYWORD_ACTIVITY = "LaunchActivity"; private static final String EVENT_KEYWORD_INSTRUMENTATION = "LaunchInstrumentation"; private static final String EVENT_KEYWORD_WAIT = "UserWait"; private static final String EVENT_KEYWORD_LONGPRESS = "LongPress"; private static final String EVENT_KEYWORD_POWERLOG = "PowerLog"; private static final String EVENT_KEYWORD_WRITEPOWERLOG = "WriteLog"; private static final String EVENT_KEYWORD_RUNCMD = "RunCmd"; private static final String EVENT_KEYWORD_TAP = "Tap"; private static final String EVENT_KEYWORD_PROFILE_WAIT = "ProfileWait"; private static final String EVENT_KEYWORD_DEVICE_WAKEUP = "DeviceWakeUp"; private static final String EVENT_KEYWORD_INPUT_STRING = "DispatchString"; private static final String EVENT_KEYWORD_PRESSANDHOLD = "PressAndHold"; private static final String EVENT_KEYWORD_DRAG = "Drag"; private static final String EVENT_KEYWORD_PINCH_ZOOM = "PinchZoom"; private static final String EVENT_KEYWORD_START_FRAMERATE_CAPTURE = "StartCaptureFramerate"; private static final String EVENT_KEYWORD_END_FRAMERATE_CAPTURE = "EndCaptureFramerate"; private static final String EVENT_KEYWORD_START_APP_FRAMERATE_CAPTURE = "StartCaptureAppFramerate"; private static final String EVENT_KEYWORD_END_APP_FRAMERATE_CAPTURE = "EndCaptureAppFramerate"; |
滚动到底部:
1 2 3 4 5 6 |
mRootScrollView.post(new Runnable() { @Override public void run() { mRootScrollView.fullScroll(ScrollView.FOCUS_DOWN); } }); |
滚动到顶部:
1 2 3 4 5 6 |
mRootScrollView.post(new Runnable() { @Override public void run() { mRootScrollView.fullScroll(ScrollView.FOCUS_UP); } }); |
下面是我曾经使用过的感觉不错的Android开源框架,零零星星会做一些总结,如果大家有好的观点欢迎留言。
1. greenDao – 数据库对象关系映射(ORM)
github地址:https://github.com/greenrobot/greenDAO
2. logger – 日志记录类
github地址:https://github.com/orhanobut/logger
3. gson – json数据解析工具
github地址:https://github.com/google/gson
4. okhttp – 网络请求类
https://github.com/square/okhttp
放在res目录下的资源会生成id,放assets的不会…
存放一些二进制外挂文件,和res下的raw作用差不多。
在使用Android Studio开发时,放在下面这个位置src/main/assets