LOCAL_MODULE_TAGS 选项说明

 分类:Uncategorized 阅读 (2,321)  LOCAL_MODULE_TAGS 选项说明已关闭评论
6月 132018
 

LOCAL_MODULE_TAGS :=user debug eng tests optional

user: 指该模块只在user版本下才编译

debug: 批该模块只在userdebug版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译(但只有在PRODUCT_PACKAGES中定义的模块才会被安装?)

 Posted by on 2018-06-13
5月 152018
 

1. gRPC – 远程RPC框架

适用平台:c++、Java、Python、Php、Js等多平台

2. Netty -基于Java NIO client-server的网络应用框架

适用平台:Java

3. thrift – 用于可扩展的跨语言服务开发,简单来说就是RPC远程调用,它是一个完整的 RPC 框架体系。 

适用平台:Actionscript 3.0、c_glib、C++、CSharp、D、Dart、Delphi、Go、Graphviz、Haxe Framework、Haskell、Java、Javascript、Node.js、OCaml、Perl、PHP、Python、Ruby

4. SOME/IP(vsomeip) – 用于车载的远程通讯框架,特点:服务发现\带宽预留,符合autosar(汽车开放系统架构)标准.SOME/IP是指协议栈,vsomeip是用c++的实现

适用平台:C/C++

 Posted by on 2018-05-15
4月 092018
 

疑问一:如果创建Handler没有为Handler指定Looper,那么Handler用的是哪个Looper?

答:如果没有指定Looper的话,程序会通过Looper.myLooper();来获取当前线程中保存的Looper对象.

扩展:如果一个线程中没有Looper实例,则在创建Handler时即会触发异常

疑问二:如果在程序中建立了多个Handler,都使用同一个Looper(如使用主线程的Looper),那么消息会在每个Handler中都被处理吗?

答:不会,可以看下Handler代码中,enqueueMessage函数里面,将msg.target设置为了Handler本身.而在Looper的loop函数中,是通过msg.target.dispatchMessage(msg);将消息分发出去的,所以不会造成Handler接收消息的错乱.

疑问三:一个线程能不能有多个Looper?

答:不能,Looper的构造函数是私有的,Looper只能通过它的静态方法prepare()函数来创建,这个函数会检查当前线程中是否已有Looper实例,如果已有会报异常,如果没有则创建一个新的.

疑问四:Handler内存泄漏的原理?

Handler内存泄漏是因为,如果创建非静态的内部Handler类,会隐式的持有外部类的实例,所以当Activity销毁时,Handler有未执行的消息时,就会造成内在的泄漏.

并不是有静态内部Handler类就会引起内存泄漏,假如在Activity销毁后,Handler没有继续要执行的工作,也不会造成内存泄漏。

 Posted by on 2018-04-09

adb remount 相关

 分类:Uncategorized 阅读 (2,302)  No Responses »
3月 302018
 

1.adb remount的作用就是重新挂载安卓的系统分区,使系统分区可读写

2.执行该功能其他的方法:

adb shell su #进入安卓命令行

mount -o rw,remount /system #将文件系统remount为读写权限

记得完事后remount回只读: mount -o ro,remount /system

3.另外一种方法

adb shell su #进入安卓命令行

mount -o rw,remount -t ext3 /dev/block/mmcblk1p21 /system

 Posted by on 2018-03-30
2月 202018
 

 具体请看下面的表格:

♠ frameworks/base/core/java/android/app/ActivityManagerNative.java

§ ActivityManagerNative.getDefault() 很简单,获取gDefault
§ gDefault 一个静态变量,是ActivityManagerService 的代理对象

♠ frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

ActivityRecord.isInStackLocked(token); 查询当前Activity是否还在Activity栈中?
如果还在继续执行Binder.clearCallingIdentity();保存此Activity在Binder中的id,稍候就会使用overridePendingAppTransition执行恢复的操作。
如果当前Activity的状态是活动状态或者将要暂停状态,执行WindowManagerService的overridePendingAppTransition

♠ frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

调用AppTransition的overridePendingAppTransition方法(将动画的设置信息都放在AppTransition中了)
然后WindowManagerService在进行Activity切换的时候就会根据AppTransition的动画设置来显示切换动画了。

 

总结:

1. 执行overridePendingTransition时的调用顺序ActivityManageService->WindowManageService

2. 最终设置的是WindowManagerService的overridePendingAppTransition

3. 和Windows编程中显示模式窗口不同,执行startActivity时并没有立即暂停当前Activity,而是通过Handler在下一个MessageQueue的处理中暂停的当前Activity

 Posted by on 2018-02-20

error: insufficient permissions for device问题解决

 分类:Uncategorized 阅读 (5,299)  error: insufficient permissions for device问题解决已关闭评论
6月 122017
 

一、问题

通过adb连接android设备时,出现了如下错误:

error: insufficient permissions for device: user in plugdev group; are your udev rules wrong?
See [http://developer.android.com/tools/device.html] for more information

二、解决办法

首先在插上usb设备和拔下设备时各执行一次lsusb命令,可以看到插上设备比拔掉设备时结果多出一行,如下:

可以看到多了一行

Bus 001 Device 007: ID 2207:0010

然后我们编辑/etc/udev/rules.d/下的51-android.rules文件(如果没有则新建一个此文件),执行命令:

然后在文件中增加一行如下内容:

保存文件后,给51-android.rules加上权限

再重新插上usb线就可以了。

 Posted by on 2017-06-12
5月 302017
 

  这个精度的损失给本人造成了精神损失! :cry: 

  整数相除,然后用ceil向上取整,本以为多简单个事,但是搞了半天,整数直接相除得到的结果必定是个整数,即使你把这个结果赋值给一个符点型的变量。

  后来才想起来需要强制转换其中一个为符点数然后再相除才可以。看下面的例子:

  输出结果:

  这个例子很简单,我就不解释啦!

  关键是有什么办法可以避免这个问题再发生?不能只凭记忆吧?!

 

 

 Posted by on 2017-05-30
4月 032017
 

需要对Android中的sdcard目录进行扫描,获取文件列表,而且要对文件进行排序

本文使用了非递归的方式进行扫描,用一个栈保存需要扫描的文件夹,用while循环所有目录和文件

排序分为在内部排序和整体排序:

  • 内部排序即每扫描到一个文件夹就对这个文件夹内的文件进行排序,然后再扫描他的子文件夹(某些场景会用到这种要求)
  • 外部排序即扫描完所有的文件后再进行排序。

根据最后的测试,外部排序速度明显优于内部排序,内部排序的时间约是外部排序的1.3倍。

基于此优化使用排序,如果场景不允许可以先内部排序满足某些条件后再改为外部排序。

下面为文件扫描类的代码FileScanner.java

github项目地址:https://github.com/wintergoes/AndroidFunctionTestApplication

 Posted by on 2017-04-03
1月 252017
 

  本文和上一篇文章类似,只是增大了圆角半径的值,所以左右两边看着像椭圆形状,我们先来看看完成后的效果图:

  首先,在res/drawable目录下新建一个shape形状,文件名为round_rect_oval_btn_normal.xml,代表按钮正常情况下的样子,代码为:

  第二步,为按钮按下状态新建一个文件,在res/drawable目录下新建文件名为round_rect_oval_btn_pressed.xml,文件内容为;

  接下来,把两个样式组合起来,使用selector资源,在res/drawable目录下新建文件round_rect_oval_btn_selector.xml,并输入文件的内容:

  好了,如果你现在想看一下按钮的效果,可以在activity上放一个TextView或者按钮,并设置它的background为@drawable/round_rect_oval_btn_selector。

  当然,为了保持代码的简洁和以后方便扩展,我们还是为这类按钮新建一个样式,在res/values/style.xml中新建一个名为round_rect_oval_btn_bkg的样式,并设置如下:

  现在再回到acitivy中为你的TextView或者按钮设置style属性为style=”@style/round_rect_oval_btn_bkg”就可以了。

 Posted by on 2017-01-25
1月 132016
 

  在Activity的finish中调用setResult时一定要注意顺序,setResult要在super.finish之前调用,否则返回的结果不正确!如下:

   如果不按这个顺序调用,在Activity中的onActivityResult中得到的resultCode是0!Android的坑真TM多啊!

 Posted by on 2016-01-13