Android11(R) 编译系统设置应用Settings

先倒一下苦水T_T

刚开始的时候在网上找了个编译的说明,也参考了一些,但是因此也走了一些弯路,花了一周多才编译通过,并打包成有系统权限的apk

为什么要编译系统应用呢,因为要定制android系统桌面,而有些接口被隐藏了,普通应用用不了。通过在源码中查找相关方法,发现系统应用可以用,于是就打算曲线救国,先把系统应用编译通过,然后再看能不能把相关的jar拿出来使用,毕竟以前只写过几个简单的android应用,对Android也不熟悉。如果熟悉的话可以直接把源码编译好的jar拿出来使用。

编译方法:

1、编译环境

       网上都建议使用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,至此编译环境准备好了

2、建工程

Setting的源码是./packages/apps/Settings(android系统源码中的位置)

在AS上创建一个No activity的工程,名称用Settings,包名用com.android.settings,要和原生的应用一样。替换Settings中的AndroidManifest.xml、src、res,res文件夹先删除掉原来,以防直接替换后还会有保留的。下来就可以开始编译了。

3、编译

  1. 资源文件(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包:

Android11(R)编译的jar包-Android文档类资源-CSDN文库

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值