一、Android8.0之前的版本
在Android8.0之前,可以通过注册静态广播来监听应用安装或者删除的广播
如下是在AndroidManifest.xml中注册静态广播的一段代码
唯一需要注意的是,有一个android:scheme属性是必须的,否则收不到广播
二、Android8.0之后的版本
Android8.0之后很多静态广播不能用了,想要接收应用安装、覆盖安装和删除的广播,需要动态注册广播。
代码如下:
在Android8.0之前,可以通过注册静态广播来监听应用安装或者删除的广播
如下是在AndroidManifest.xml中注册静态广播的一段代码
唯一需要注意的是,有一个android:scheme属性是必须的,否则收不到广播
Android8.0之后很多静态广播不能用了,想要接收应用安装、覆盖安装和删除的广播,需要动态注册广播。
代码如下:
这几天看安卓系统源码的时候,遇到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的转发?可以
项目的名称:quick_settings_tiles_default
默认的值为:wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast
在res/value/config.xml中,项目名称:quick_settings_tiles_stock
项目值:wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,work,cast,night
当编辑后,按钮的配置存储在系统数据库的Secure.QS_TILES常量中,常量值:sysui_qs_tiles
使用下面命令可以查看修改后的值:
adb shell settings get secure sysui_qs_tiles
本来一直是在源码中加Log的方法进行调试
但是有些函数很长,if分支也很多,而且还有一些是通过线程或者binder、sendMessage等异步的方式调用的,加上系统编译又很慢,调试起来真是费劲
后来想到程序报错时会输出java的函数栈,我们能不能利用这个呢?可以一直追踪到函数的前几个调用函数。
答案是可以的,我们可以在代码中加入下面的代码,让程序打印调用栈
new Exception().printStackTrace()
加上这个以后,会打印堆栈,但不是抛出异常,这样就很方便的知道函数的调用栈列表了
假如我们跟踪某段代码后,发现这段代码是通过aidl被调用的,那我们就跟踪不到调用端的代码了,那么我们可以通过throw一个Exception的方式还跟踪。调用端会触发RemoteException而打印出堆栈。
当然,如果客户端try catch了RemoteException这个方式可能就不起作用了
throw new IllegalStateException(“Throw an aidl remote exception.” );
客户端会报如下样式的错误:
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了。
在文件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的值验证,这里正确了再烧录验证
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错误
解决方法:
通过获取安装器的名称我们可以判断应用是来自哪个应用市场
当然现在普遍是通过配置gradle来区别应用的安装渠道,不过这个还可以用于判断用户是不是手动进行安装的
代码很简单,如下:
结果示例:
如:com.huawei.appmarket – 是华为应用市场
com.android.packageinstaller – 是用户手动安装的
测试环境:自己编译的Android8.1系统(userDebug模式)
首先目标应用的AndroidManifest.xml中定义Activity的时候,必须设置一个intent-filter以及action属性,如下:
上面的代码Test1Activity和Test2Activity都有一个intent-filter属性,以及他下面的action子属性
然后使用下面的代码就可以获取这个应用中的有action=”action_abc”的activity了。
博文背景:imx 8qxp主板,android8.1系统,系统编译模式userDebug模式
一、开启成功的步骤