Android 系统开发笔记(二)

文章详细介绍了Android系统开发中的Android.bp文件结构,包括模块类型、变量、注释、运算符和条件语句的使用。此外,还讨论了Java端和Native端的堆栈打印方法,以及输入系统的dumpsys工具。特别强调了模块的命名规则和预编译模块的使用。
摘要由CSDN通过智能技术生成

Android 系统开发笔记(二)

内容太多,一篇无法完全发布,这里继续
上一篇地址:
Android系统开发笔记
每个模块必须有name属性,并且相应值在所有name文件中必须是唯一的,仅有两个例外情况是命名空间和预构建模块中的Android.bp属性值,这两个值可能会重复。

srcs属性以字符串列表的形式制定用于构建模块的源文件。您可以使用模块引用语法":"来引用生成源文件的其他模块的输出,如genrule或者filegroup。

tyThread.main(ActivityThread.java:7898)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)


4.5 类型

变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:

  • 布尔值(true或false)
  • 整数(int)
  • 字符串(“string”)
  • 字符串列表([“string1”, “string2”])
  • 映射({key1: “value1”, key2: [“value2”]})

映射可以包含任何类型的值,包括嵌套映射。列表和映射可能在最后一个值后面有终止逗号。

4.6 Glob

接受文件列表的属性(例如srcs)也可以使用glob模式。glob模式可以包含普通的UNIX通配符*,例如.java。glob模式还可以包含单个**通配符作为路径单元,与零个或多个路径元素匹配。例如java/**/*.java同时匹配 java/Main.java 和 java/com/android/Main.java模式

4.7变量

Android.bp 文件可能包含顶级变量赋值:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary{
	name:	"gzip",
	srcs:	gzip_srcs,
	shared_libs:	["libz"],
	stl:	"none",
}

变量作用域限定在声明它们的文件的其余部分,以及所有子BluePrint文件。变量是不可变的,但有一个例外情况:可以使用+=赋值将变量附加到别处,但只能在引用它们之前附加。

4.8 注释

Android.bp 文件可以包含C样式的多行/* */注释以及C++样式的单行//注释。

4.9运算符

可以使用+运算符附加字符串、字符串列表和映射。可以使用+运算符对整数求和。附加映射会生成两个映射中键的并集,并附加在两个映射中都存在的所有键值。

4.10 条件语句

Soong 不支持Android.bp文件中的条件语句。但是,编译规则中需要条件语句的复杂问题将在Go(在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理,大多数条件语句都会转换为映射属性,其中选择了映射中的某个值并将其附加到顶级属性。

例如,要支持特定与架构的文件,请使用以下命令:

cc_library{
	...
	srcs:	["generic.cpp"],
	arch:	{
		arm:{
			srcs:	["arm.cpp"],
		},
		x86:{
			srcs:	["x86.cpp"],
		},	
	},
}
五.特殊模块

一些特殊模块组具有独特的特征。

5.1 默认模块

默认模块可用于在多个模块中重复使用相同的属性。例如:

cc_defaults{
	name:	"gzip_defaults",
	shared_libs:	["libz"],
	stl:	"none",
}
cc_binary{
	name:	"gzip",
	defaults:	["gzip_defaults"],
	srcs:	["src/test/minigzip.c"],
}

5.2 预编译模块

某些预构建的模块类型允许模块与其基于源代码的对应模块具有相同的名称。例如,如果已有同名的cc*binary,也可以将cc_prebuilt_binary命名为foo。*这让开发者可以灵活地选择要纳入其最终产品中的版本。如果 build 配置包含两个版本,那么预编译模块定义中的 prefer 标志值会指示哪个版本具有优先级。请注意,某些预编译模块的名称不能以 prebuilt开头,例如 android_app_import

5.3 命名空间模块

在 Android 完全从 Make 转换为 Soong 之前,Make 产品配置必须指定 PRODUCT_SOONG_NAMESPACES 值。它的值应该是一个以空格分隔的列表,其中包含 Soong 导出到 Make 以使用 m 命令进行编译的命名空间。在 Android 完成到 Soong 的转换之后,启用命名空间的详细信息可能会发生变化。

Soong 可以让不同目录中的模块指定相同的名称,只要每个模块都在单独的命名空间中声明即可。可以按如下方式声明命名空间:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

请注意,命名空间没有 name 属性;其路径会自动指定为其名称。

系统会根据每个 Soong 模块在树中的位置为其分配命名空间。每个 Soong 模块都会被视为处于 Android.bp(位于当前目录或最近的父级目录中的 soong_namespace 文件内)定义的命名空间中。如果未找到此类 soong_namespace 模块,则认为该模块位于隐式根命名空间中。

下面是一个示例:Soong 尝试解析由模块 M 在名称空间 N(导入命名空间 I1、I2、I3…)中声明的依赖项 D。

  1. 如果 D 是 //namespace:module 格式的完全限定名称,系统将仅在指定的命名空间中搜索指定的模块名称。
  2. 否则,Soong 将首先查找在命名空间 N 中声明的名为 D 的模块。
  3. 如果该模块不存在,Soong 会在命名空间 I1、I2、I3…中查找名为 D 的模块。
  4. 最后,Soong 在根命名空间中查找。
六. java 端和native端堆栈打印
6.1 java 端堆栈打印
六. java 端和native端堆栈打印
6.1 java 端堆栈打印


// 低版本,具体多少没做验证,如果打印不出来,用下面的方式
Log.e(TAG, "onCreate: " , new Exception());

// 高版本,通过异常直接打印堆栈
new Exception().printStackTrace();



W/System.err: java.lang.Exception
W/System.err:     at com.example.test.MainActivity.onCreate(MainActivity.java:14)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8290)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8269)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loopOnce(Looper.java:201)
W/System.err:     at android.os.Looper.loop(Looper.java:288)
W/System.err:     at android.app.Activi
6.2 native端打印堆栈
C++ 中使用android::CallStack将所在线程的调用堆栈打印出来
基本用法:
1. 进入对应的cpp文件中,放开 #define LOG_NDEBUG 0 注释,且变成#define LOG_NDEBUG 1
2. 声明头文件
#include <utils/CallStack.h>
#include <utils/Log.h>

3. 调用方法
android::CallStack stack;
stack.update();
stack.log(debug);    // 输出到logcat
4. mk或者bp文件中需要链接以下so库
libutils
libcutils
三. input dumpsys
# 给触摸事件保存到一个txt中
adb shell dumpsys input > input.txt 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌的娃哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值