Android学习之往系统应用中添加framework层的jar包

本文详细探讨了Framework中的app在编译过程中为何需要从源码中获取必要包,以Systemeui为例,解释了SDK中@hide标记如何影响源码编译,并通过实际操作步骤演示了如何通过替换SDK中的android.jar包实现特定功能开发,最终揭示了Framework层jar包与SDK层差异背后的开发策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Framework中的app为什么在编译的时候需要到源码中编译:

因为缺少必要的包(源码)----在连接的时候是以class文件来连接编译的

 

以Systemeui为例:

 

缺少这个包

寻找android源码的时候可以找到这个包:


知道framework在编译的时候会打包自己的java源文件,于是在打包的out文件中寻找打包的这个 :其实也是能够找到的:


还有很多Permission denied(当然这是在别人权限下的查找……)

 

当然最后找到了


里面的jar包:


打开jar包里面是classes的dex文件:


但是dex文件暂时不知道怎么打开,因此搜索到此结束。但是大致理解为:

framework中有一些不需要作为对外接口调用的源码包,都以dex这种直接在android系统上跑的文件格式被已经编译过了,所以在eclipse中直接编译的时候就缺少必要的包,这些包因为不需要对外开放,已经被打包成了更彻底的dex文件,只是保证运行,而不对外开放 

/****************************/

反驳以上观点


已经证实了,并不是被编译成为了所谓的更彻底的dex文件,而是在sdk中标注了@hide所以在源码编译中是有该api而sdk中没有。因此可以通过更换sdk 中的api来达到效果。

 

看组图吧!

同样是在寻找 这个类。当然这次完成的项目中就是:

 

这种情况是为何呢?

程序当然是可以跑起来的,运行也没有问题。

具体操作步骤:(替换sdk中的android.jar包)

源码中编译的framework层的jar包文件

 

Sdk中的android.jar中的android文件(应该也基本上就是framework层的jar包)

 

两个文件中源码中的android文件夹要较于sdk中的大很多。这应该是很多源码中的类文件,及一些jar包被屏蔽或者hide掉了。打上了hide的标签。这样应该基本上是可以开发lancher或者setting之类的了。

<think>嗯,用户想在Android 8.1的framework源码中添加或导入jar。首先,我需要回想一下Android系统开发的基本结构。Androidframework代码通常位于frameworks/base目录下,这里含了系统核心服务的实现。添加外部jar可能需要修改构建系统,比如Makefile或者Android.bp文件。 记得在AOSP(Android Open Source Project)中,模块的依赖是通过Android.mk或Android.bp来管理的。用户需要将jar放到合适的目录,比如创建一个libs文件夹,然后把jar放进去。接着,在对应的模块定义中添加对该jar的依赖。例如,如果用户要修改frameworks/base下的某个模块,可能需要在该模块的Android.mk文件中添加LOCAL_STATIC_JAVA_LIBRARIES或者LOCAL_JAVA_LIBRARIES,具体要看是静态库还是动态库。 另外,权限问题也很重要。系统级别的jar可能需要签名,或者放置在系统指定的目录下,比如/system/framework。这时候可能需要修改设备的mk文件,确保jar被正确打系统镜像中。还有,如果jar含@hide的API,可能需要重新生成SDK,或者在编译时使用特定的标志来允许访问这些隐藏的API。 用户提到的是Android 8.1,也就是API 27,所以需要确认相关的构建配置是否与更高版本有所不同。可能需要参考AOSP的官方文档,比如引用中的build-numbers页面,来确认分支和标签是否正确。还有,在编译后,可能需要重新生成framework.jar,并在应用中引用它,如引用[5]提到的使用自己编译的framework.jar。 此外,环境配置也很关键。比如Java版本,引用[2]提到使用Java SDK 1.8,而构建目标可能是Android API 30,但用户是8.1,对应的API级别是27,所以需要确认环境是否匹配。还有,编译时的内存设置,如引用[3]中的-Xmx2048m参数,可能需要调整以避免内存不足。 最后,用户可能需要通过Android Studio导入整个源码,如引用[4]所述,方便查看和调试。这时候需要确保导入的配置正确,括SDK和依赖项。 可能的步骤括:将jar放入源码目录,修改构建文件,配置依赖,处理签名和权限,重新编译系统,以及测试修改后的framework。过程中需要注意模块的依赖关系,避免冲突,并确保编译通过。如果有错误,可能需要查看编译日志,调整配置或解决依赖问题。</think>在Android 8.1框架源码中导入JAR需要遵循系统级构建规范,以下是具体步骤和注意事项: ### 一、基础环境准备 1. 确认已建立完整的Android 8.1源码编译环境,Java SDK需使用1.8版本[^2] 2. 设置正确的构建参数,建议在编译命令前添加`java -Xmx2048m`避免内存溢出[^3] ### 二、JAR集成流程 1. **文件放置** - 在`frameworks/base`目录下创建`libs`子目录 - 将目标JAR(如`custom_lib.jar`)拷贝至该目录 2. **修改构建配置** ```makefile # 在对应模块的Android.mk中添加 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += custom_lib:libs/custom_lib.jar LOCAL_STATIC_JAVA_LIBRARIES := $(LOCAL_STATIC_JAVA_LIBRARIES) custom_lib ``` 3. **系统签名配置** ```bash # 使用平台签名密钥对修改后的framework进行签名 java -jar out/host/linux-x86/framework/signapk.jar \ build/target/product/security/platform.x509.pem \ build/target/product/security/platform.pk8 \ input.jar output_signed.jar ``` ### 三、特殊场景处理 1. 若需使用`@hide`接口: - 在`frameworks/base/Android.mk`中添加`LOCAL_JAVA_LIBRARIES := android_stubs_current` - 执行`make update-api`更新API列表[^5] 2. 模块级依赖配置: ```makefile LOCAL_JAVA_LIBRARIES := \ android.test.runner \ custom_lib \ services ``` ### 四、编译验证 1. 执行完整系统编译: ```bash source build/envsetup.sh lunch aosp_arm-eng make -j8 ``` 2. 通过Android Studio导入`ipr`项目文件验证引用关系[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值