bcoder

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

MonkeyDevice

 分类:Android, Java 阅读 (694)  No Responses »
1月 302018
 

  MonkeyDevice用于控制安卓设备或者安卓模拟器,发送UI事件、发送广播、获取设备信息、安装删除应用和运行应用等。

  一般情况下使用MonkeyRunner.waitForConnection()可获取此类的实例,如下:

  下面是MonkeyDevice提供的一些方法列表:

Methods 描述 描述
void broadcastIntent (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, iterable flags)

Broadcasts an Intent to this device, as if the Intent were coming from an application.

描述
void drag (tuple start, tuple end, float duration, integer steps)

Simulates a drag gesture (touch, hold, and move) on this device’s screen.

描述
object getProperty (string key)

Given the name of a system environment variable, returns its value for this device. The available variable names are listed in the detailed description of this method.

描述
object getSystemProperty (string key)

. The API equivalent of adb shell getprop <key>. This is provided for use by platform developers.

描述
void installPackage (string path)

Installs the Android application or test package contained in packageFile onto this device. If the application or test package is already installed, it is replaced.

描述
dictionary instrument (string className, dictionary args)

Runs the specified component under Android instrumentation, and returns the results in a dictionary whose exact format is dictated by the component being run. The component must already be present on this device.

描述
void press (string name, dictionary type)

Sends the key event specified by type to the key specified by keycode.

描述
void reboot (string into)

Reboots this device into the bootloader specified by bootloadType.

void removePackage (string package)

Deletes the specified package from this device, including its data and cache.

描述
object shell (string cmd)

Executes an adb shell command and returns the result, if any.

描述
void startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)

Starts an Activity on this device by sending an Intent constructed from the supplied arguments.

描述
MonkeyImage takeSnapshot()

Captures the entire screen buffer of this device, yielding a MonkeyImage object containing a screen capture of the current display.
描述
void touch (integer x, integer y, integer type)

Sends a touch event specified by type to the screen location specified by x and y.

描述
void type (string message)

Sends the characters contained in message to this device, as if they had been typed on the device’s keyboard. This is equivalent to callingpress() for each keycode in message using the key event type DOWN_AND_UP.

描述
void wake ()

Wakes the screen of this device.

描述
1月 182018
 

  C++出现: 1 duplicate symbol for architecture x86_64可能的问题如下:

  1. 你可能在一个头文件中定义了一个变量或者函数,但是这个头文件被多个cpp文件include了
  2. 你可能把一个静态变量(static)定义了多次
  3. 你可能在一个cpp文件中将一个函数定义了多次

  可以查看详细的错误信息,看看是哪个变量或者函数被重复定义了。

  本人这此遇到此问题是因为把一个静态变量的定义放在头文件里了,应该放到cpp文件里就没问题了。

 

 Posted by on 2018-01-18

gradle打印依赖树

 分类:Android, Java 阅读 (4,566)  No Responses »
1月 132018
 

  本文适用于OSX和Linux系统,Windows系统用户可用来参考

  在Android Studio中进行了三方库的前期测试调研工作,然后要把工程转移到Android系统工程中,使用Android.mk进行编译,所有的三方jar包只能手动添加到工程中了。在使用Android Studio的dependency的时候除了显示添加到其中的三方库,三方库可能还会调用其他的依赖库,那怎么才能知道到底用了哪些库呢,只能使用gradle了。

  在命令行cd到工程所在的根目录,然后使用如下命令打印as工程中的库的依赖关系,其中app为要查看的模块的名称

  如果执行成功的话就会打印一大堆信息,其中一部分内容就是不同的gradle任务的类库依赖关系,类似如下形式:

已经下载的类库存在哪里?

  默认情况下gradle下载的文件在用户目录下的.gradle目录中,可以通过如下命令进行该目录

  然后通过find命令查找你想要的库就可以了,比如要查gson的jar包,可以用如下命令:

 

 Posted by on 2018-01-13

LeakCanary入门教程

 分类:Android, Java 阅读 (304)  No Responses »
1月 122018
 

首先在gradle中添加库的依赖,如下:

releaseImplementation依赖库是用于在release包中,只有LeakCanary的各种方法的壳,但是没有具体的实现,防止在给用户的release包中也进行内存检测操作。

然后新建一个Application类,并在此Application类的onCreate中加入以下代码

打开一个Activity,在关闭的时候如果有内存泄漏,LeakCanary将会在通知栏显示图片,点击图标即可看到详细的内存泄漏报告,如下图所示:

 Posted by on 2018-01-12

打包apk时出现Cannot recover key的错误

 分类:Android, Java 阅读 (1,408)  打包apk时出现Cannot recover key的错误已关闭评论
11月 252017
 

出现这种错误一般是输入的keystore的密钥有问题了

重新输入一下打包的密钥就可以了

 Posted by on 2017-11-25
11月 212017
 

需要安装的库(下载代码前):

sudo apt-get install curl

sudo apt-get install git

需要安装的库(编译前):

sudo apt-get install git git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev

sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev

sudo apt-get install lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown

sudo apt-get install lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown

sudo apt-get install lib32readline-gplv2-dev

sudo apt-get  install libxml2-utils

 Posted by on 2017-11-21
11月 172017
 

  每次下载安卓源码都要花1天的多的时间,而且在公司下载几十个G也占用别的人网速,所以对于只关注部分代码的人,可以只同步某些项目,这样节省时间和带宽。
本文所说内容是以你repo init成功为基础的。
  首先打开源码目录下的.repo目录,打开manifest.xml,里面是一个子项目列表,其中xml节点中的name属性为我们需要用的
比如下载platform/packages/apps/Bluetooth的命令如下:

  有的时候这个manifest.xml并没有你想要的那个项目,你可以根据安卓官方的源码结构添加进去,比如下面几个就是我手动添加的:

  另外如果你想同时下载多个项目也是支持的,在不同的项目后面加上空格分隔即可,如下:

 链接:

  1. 安卓官方源码库:https://android.googlesource.com/
  2. 清华镜像下载:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

 

 Posted by on 2017-11-17