解决Android8.1下不能单独编译SystemUI模块的问题

 分类:Android, Java 阅读 (2,803)  解决Android8.1下不能单独编译SystemUI模块的问题已关闭评论
12月 122019
 

在frameworks/base/packages/SystemUI目录下执行mm命令,提示找不到metrics-helper模块

不能单独编译模块,全编译系统很浪费时间

问度娘后发现子目录tests依赖于这个模块,将tests目录下的Android.mk改名后即可

另附ubuntu下自动编译SystemUI的shell脚本

 

 Posted by on 2019-12-12

Android中接收应用安装、覆盖安装、删除的广播(Android8.0+)

 分类:Android, Java 阅读 (6,448)  Android中接收应用安装、覆盖安装、删除的广播(Android8.0+)已关闭评论
12月 102019
 
一、Android8.0之前的版本

在Android8.0之前,可以通过注册静态广播来监听应用安装或者删除的广播

如下是在AndroidManifest.xml中注册静态广播的一段代码

唯一需要注意的是,有一个android:scheme属性是必须的,否则收不到广播

二、Android8.0之后的版本

Android8.0之后很多静态广播不能用了,想要接收应用安装、覆盖安装和删除的广播,需要动态注册广播。

代码如下:

需要注意的是,必须使用这句代码filter.addDataScheme(“package”);来指定DataScheme
 Posted by on 2019-12-10

FLAG_ACTIVITY_FORWARD_RESULT的使用

 分类:Android, Java 阅读 (1,338)  FLAG_ACTIVITY_FORWARD_RESULT的使用已关闭评论
12月 102019
 

这几天看安卓系统源码的时候,遇到FLAG_ACTIVITY_FORWARD_RESULT,用于跨Activity传递ActivityResult

记得有一次面试还有面试官问到这个问题,当时还以为是说要用eventbus或者本地广播

我们先用一个图片看看这个标志的作用

下面看看三个Activity的代码

ActivityA的代码

ActivityB的代码

ActivityC的代码

注意事项:

1.如果intent中设置了FLAG_ACTIVITY_FORWARD_RESULT就不能再使用startActivityForResult打开新的Activity了

2.setResult必须在super.finish()之前调用

3.这个标志是否适合于更多层Activity的转发?可以

 Posted by on 2019-12-10

Android8.1顶栏SystemUI下拉菜单中的快捷按钮修改

 分类:Android, Java 阅读 (3,236)  Android8.1顶栏SystemUI下拉菜单中的快捷按钮修改已关闭评论
12月 092019
 
1、默认的快捷按钮的项目在res/values/config.xml中

项目的名称:quick_settings_tiles_default

默认的值为:wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast

2、所有的快捷设置项

在res/value/config.xml中,项目名称:quick_settings_tiles_stock

项目值:wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,work,cast,night

  • wifi – 无线网络
  • bt – 蓝牙
  • dnd – 勿扰模式
  • flashlight – 手电筒?
  • rotation – 自动旋转
  • battery – 省电模式?
  • cell – ?
  • airplane – 飞行模式
  • cast – 投射
  • location – 位置信息
  • hotspot – 无线热点
  • inversion – 反色
  • saver – 流量节省程序
  • work – ?
  • night – 夜晚模式?
3、有个编辑按钮,可以编辑常用的快捷按钮

当编辑后,按钮的配置存储在系统数据库的Secure.QS_TILES常量中,常量值:sysui_qs_tiles

使用下面命令可以查看修改后的值:

adb shell settings get secure sysui_qs_tiles

 Posted by on 2019-12-09

Android系统源代码跟踪调试小技巧

 分类:Android, Java 阅读 (1,506)  Android系统源代码跟踪调试小技巧已关闭评论
12月 062019
 

本来一直是在源码中加Log的方法进行调试

但是有些函数很长,if分支也很多,而且还有一些是通过线程或者binder、sendMessage等异步的方式调用的,加上系统编译又很慢,调试起来真是费劲

后来想到程序报错时会输出java的函数栈,我们能不能利用这个呢?可以一直追踪到函数的前几个调用函数。

答案是可以的,我们可以在代码中加入下面的代码,让程序打印调用栈

new Exception().printStackTrace()

加上这个以后,会打印堆栈,但不是抛出异常,这样就很方便的知道函数的调用栈列表了

对于调用Aidl时客户端的堆栈跟踪

假如我们跟踪某段代码后,发现这段代码是通过aidl被调用的,那我们就跟踪不到调用端的代码了,那么我们可以通过throw一个Exception的方式还跟踪。调用端会触发RemoteException而打印出堆栈。

当然,如果客户端try catch了RemoteException这个方式可能就不起作用了

throw new IllegalStateException(“Throw an aidl remote exception.” );

客户端会报如下样式的错误:

 

 Posted by on 2019-12-06

修改Android8.1吉字节、千字节、光字节、太字节的问题

 分类:Android, Java 阅读 (1,709)  修改Android8.1吉字节、千字节、光字节、太字节的问题已关闭评论
12月 032019
 

Android8.1显示GB时默认显示吉字节

修改方法如下:

在源码目录下/external/icu/icu4c/source/data/unit中找到zh.txt文件

打开此文件,然后将其中的吉字节修改为GB,千字节修改为KB,兆字节修改为MB,太字节修改为TB,每一项可能有多个地方需要修改,然后保存

因为这个目录下的要单独编译,make clean都不管用,执行下面的命令:

将source/data/out/tmp/目录下的icudt58l.dat文件push到手机/system/usr/icu/目录下,重启手机即可查看效果

然后将source/data/out/tmp/目录下的icudt58l.dat文件拷贝到source/stubdata中,下次编译系统的时候就直接显示GB了。

 

转载自:https://www.jianshu.com/p/fadf33914875

 Posted by on 2019-12-03

imx8+Android8.1修改系统默认语言的方法

 分类:Android, Java 阅读 (1,048)  imx8+Android8.1修改系统默认语言的方法已关闭评论
12月 032019
 
一、修改方法

在文件device/fsl/mek_8q/BoardConfig.mk中增加一行

PRODUCT_LOCALES = zh_CN

设置变量PRODUCT_LOCALES的值为zh_CN

注意

1、别写在某个if判断中

2、不需要make clean,直接make就可生效

3、验证方法:可以查看out/target/product/mek_8q/system/build.prop中ro.product.locale的值验证,这里正确了再烧录验证

 

 

 Posted by on 2019-12-03

Android插件化初探之apk加载和反射调用函数

 分类:Android, Java 阅读 (1,317)  Android插件化初探之apk加载和反射调用函数已关闭评论
12月 022019
 
一、整体试验步骤

1.建立子apk,新建一个android应用项目,叫firstplugin

2.在java根目录下新建一个类,叫LoginImpl

3.在LoginImpl.java中实现一个静态方法, login(),此方法只输出一个Log

4.编译生成apk,push到手机的/sdcard目录,此处生成的文件名为firstplugin-debug.apk

5.开始建宿主apk,新建另外一个Android应用项目PlugInHostApp

6.在MainActivity的onCreate中增加如下代码:

7.编译运行,看log中是否输出了login这个字符串

二、遇到的问题和解决方法

1.java.lang.ClassNotFoundException: Didn’t find class “com.zht.car.firstplugin.LoginImpl” on path错误

解决方法:

  1. 查看是否有访问外部存储目录的权限(笔者遇到的就是这个问题,程序不会在new DexClassLoader时报无权限访问或者找不到文件的错误,而会在loadClass时报找不到类的错误)
  2. 关闭Android Studio的Instant run选项,在菜单Settings->Build, Execution, Deployment中(笔者是在Ubuntu中使用Android Studio,没找到此选项)
 Posted by on 2019-12-02

Android中获取应用的安装器名称

 分类:Android, Java 阅读 (1,021)  Android中获取应用的安装器名称已关闭评论
11月 292019
 

通过获取安装器的名称我们可以判断应用是来自哪个应用市场

当然现在普遍是通过配置gradle来区别应用的安装渠道,不过这个还可以用于判断用户是不是手动进行安装的

代码很简单,如下:

结果示例:

如:com.huawei.appmarket – 是华为应用市场

com.android.packageinstaller – 是用户手动安装的

 Posted by on 2019-11-29

通过action获取其他应用中的Activity

 分类:Android, Java 阅读 (1,214)  通过action获取其他应用中的Activity已关闭评论
11月 292019
 

测试环境:自己编译的Android8.1系统(userDebug模式)

首先目标应用的AndroidManifest.xml中定义Activity的时候,必须设置一个intent-filter以及action属性,如下:

上面的代码Test1Activity和Test2Activity都有一个intent-filter属性,以及他下面的action子属性

然后使用下面的代码就可以获取这个应用中的有action=”action_abc”的activity了。

 

 Posted by on 2019-11-29