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

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

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之类的了。

### Android Framework相关JAR下载及使用指南 Android FrameworkJAR通常系统级别的API和类库,这些内容在标准的Android SDK中不可见或不可用。开发者在需要调用隐藏API或进行系统级开发时,常常需要获取并使用这些JARFrameworkJAR主要来源于Android系统源码编译过程中生成的`framework.jar`和`classes.jar`等文件。这些文件通常位于Android源码目录下的如下路径: ``` out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/ ``` 在该路径下,可以找到编译生成的`framework.jar`文件,这是Android Framework的核心库之一[^2]。 #### 下载与获取方式 1. **从Android源码中编译获取** 如果需要特定版本的Framework JAR,可以通过编译Android源码来获取。例如,在Android 4.4版本中,可以获取如下两个JAR: - `classes.jar` - `classes2.jar` 这两个文件是调用系统API的关键依赖,可以通过以下路径获取: ``` out/target/common/obj/JAVA_LIBRARIES/framework2_intermediates/ out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/ ``` 2. **第三方资源** 某些第三方资源或社区可能提供预编译的Framework JAR。例如,一些开源项目或论坛可能会分享特定版本的`framework.jar`。开发者可以通过GitHub、Stack Overflow等平台搜索相关资源。 #### 使用指南 在Android Studio中使用Framework JAR时,需要注意以下步骤: 1. **将JAR放入项目** 将`framework.jar`或其他系统JAR拷贝到项目的`/libs`文件夹中。 2. **添加依赖** 在`build.gradle`文件中添加依赖项,确保使用`compileOnly`依赖方式,以避免将系统JAR到最终的APK中: ```gradle dependencies { compileOnly files('libs/framework.jar') } ``` 这种方式确保编译时可以引用系统API,但在最终打时不会含这些JAR文件[^1]。 3. **绑定到项目** 在Android Studio中,右键点击`framework.jar`文件,选择“Add as Library”,然后将其添加到当前模块中。这样可以确保JAR文件被正确识别为依赖项。 4. **调用系统API** 在代码中,可以直接引用Framework JAR中的类和方法。例如: ```java import android.os.ServiceManager; import android.hardware.ISensorService; ``` #### 注意事项 - **兼容性问题** 不同版本的Android Framework JAR可能存在差异,开发者需要确保使用的JAR与目标设备的系统版本兼容。 - **隐藏API限制** Framework中的某些API是隐藏的(如`@hide`标记的类或方法),即使通过JAR引入,也可能需要使用反射或其他方式调用。 - **构建环境依赖** 如果需要在系统应用中使用Framework JAR,可能需要构建完整的Android系统源码环境,并通过`Android.mk`文件引入第三方JAR。例如: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := weka:weka.jar include $(BUILD_MULTI_PREBUILT) ```[^4] ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值