赞
踩
先倒一下苦水T_T
刚开始的时候在网上找了个编译的说明,也参考了一些,但是因此也走了一些弯路,花了一周多才编译通过,并打包成有系统权限的apk
为什么要编译系统应用呢,因为要定制android系统桌面,而有些接口被隐藏了,普通应用用不了。通过在源码中查找相关方法,发现系统应用可以用,于是就打算曲线救国,先把系统应用编译通过,然后再看能不能把相关的jar拿出来使用,毕竟以前只写过几个简单的android应用,对Android也不熟悉。如果熟悉的话可以直接把源码编译好的jar拿出来使用。
编译方法:
网上都建议使用eclipse编译,编译完成后再导入到android studio,但是我一直用android studio(后面用AS表示)开发,所以我想直接用AS,我刚开始使用的是最新的版本:Android Studio Electric Eel | 2022.1.1 Patch 1,这个版本默认的SDK是33,JDK版本是11,但是android11(R)使用的是SDK版本30,JDK版本是8。但是AS创建工程的时候是不能指定编译版本的,只能指定最低编译版本,就算只留30的SDK,在创建工程的时候也会自动下载并使用最新的SDK。在降编译版本这块花了好大的力气也没有降成功,还有Gradle版本(现在对gradle版本还是很模糊)。所以打算按照网上说的用eclipse,下载好后发现eclipse最大支持的SDK版本是29,我把30的SDK拖进去也支持不了(哔了狗了)。又转战AS,先把当前的AS卸载了,重新下载了个AS4.1的版本(大于3.3都行)主要是查了一下发布时间,然后选了4.1,下载网址:Android Studio 下载文件归档 | Android Developers
JDK就选择8,至此编译环境准备好了
Setting的源码是./packages/apps/Settings(android系统源码中的位置)
在AS上创建一个No activity的工程,名称用Settings,包名用com.android.settings,要和原生的应用一样。替换Settings中的AndroidManifest.xml、src、res,res文件夹先删除掉原来,以防直接替换后还会有保留的。下来就可以开始编译了。
最开始编译报错的地方是资源文件,这些是加载本地的。
strings.xml:包里面有很多是为了支持不同语言的可以只保留英文和中文的value和value-zh-rCN,这个都不是主要问题,string中product属性太难处理了, 在string.xml中会遇到name相同而product不同的字串如下所示,编译时就会报重复了,找了很多也不知道怎么处理,索性就先把不是default的给删掉了,据说eclipse没有这个问题(也因为这个想使用eclipse的...)
<string name="xxx" product="nosdcard">xxx</string>
<string name="xxx" product="default">xxx</string>
strings.xml处理完后,有大量的layout drawable values 等等xml文件需要从源码里面找,因为我们Google不了。这是一项非常庞大的工作,没技术含量,主要是慢,这些文件主要分布在下面文件夹,可以用命令:grep -rn "xxxx"来查找,是在找不到就直接删了或者找其他相似的代替。
frameworks/base/packages/SettingsLib/res
packages/apps/Settings/res
external/setupcompat
external/setupdesign
不要怕麻烦,不要怕麻烦,不要怕麻烦
2.jar包
单独编译jar包我没有编译过,我是把android编译了,编译出来的路径是
out/target/commom/obj/JAVA_LIBRARIES/
需要引用的大部分jar都在这个文件夹中,需要哪个可以用grep查找,要是上面的路径找不到,那就在整个android源码文件夹中查找
下面是我找的,两个小红框中的不是在这个文件夹中,绿框都是,整个大红框都是我加的。
修改的是build.gradle(Module:Settings.app)
dependencies添加后还不算完,要保证添加的jar包优先系统SDK的使用,所以还要修改build.gradle和上面是一个文件
- andriod{
-
- ........//原来的代码,不变
-
-
- gradle.projectsEvaluated {
- tasks.withType(JavaCompile) {
- Set<File> fileSet = options.bootstrapClasspath.getFiles()
- List<File> newFileList = new ArrayList<>();
- //newFileList.add(new File("libs/android.jar"))
- newFileList.add(new File("libs/framework_intermediates/classes-header.jar"))
- newFileList.add(new File("libs/framework-minus-apex_intermediates/classes.jar"))
- newFileList.add(new File("libs/framework-wifi.com.android.wifi_intermediates/classes.jar"))
- newFileList.add(new File("libs/framework-tethering.com.android.tethering_intermediates/classes.jar"))
- newFileList.add(new File("libs/framework-statsd.com.android.os.statsd_intermediates/classes.jar"))
- newFileList.add(new File("libs/SystemUISharedLib_intermediates/classes.jar"))
- newFileList.add(new File("libs/SettingsLib_intermediates/classes.jar"))
- newFileList.add(new File("libs/SettingsLib_intermediates/SettingsLib-search.jar"))
- newFileList.add(new File("libs/core-libart.com.android.art.release_intermediates/classes.jar"))
- newFileList.add(new File("libs/core-icu4j.com.android.art.release_intermediates/classes.jar"))
- newFileList.add(new File("libs/core-oj.com.android.art.release_intermediates/classes.jar"))
- newFileList.add(new File("libs/Settings_intermediates/classes.jar"))
- newFileList.add(new File("libs/telephony-common_intermediates/classes.jar"))
- newFileList.add(new File("libs/setupcompat.jar"))
- newFileList.add(new File("libs/setupdesign.jar"))
- //最后将原始参数添加
- newFileList.addAll(fileSet)
- options.bootstrapClasspath = files(
- newFileList.toArray()
- )
- }
- }
-
- lintOptions {//也是为了解决一个什么问题加的,给忘掉了
- abortOnError false
- checkReleaseBuilds false
- disable 'MissingTranslation'
- }
- }
至此编译就可以通过了,然后就可以打包成apk,必要用系统签名,生成系统签名可以自行查找,有一点要注意的是生成签名时所用jkd的版本要和编译的jdk的版本一致
还没有在设备上运行,不知道编译是不是完全正确,等后面运行测试了在补充
编译的jar包:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。