android修改系统字体大小,使用隐藏类和方法以及怎么生成系统app使用系统权限

最近因为有个项目的需要,需要更改手机系统字体的大小,默认的手机字体从0.75f,1.0f,1.15f,1.3f变化一次为小,标准,大,超大级别;使用正常的api是实现不了的。

心酸的过程,自己各种百度,google,一步步的尝试,最终实现了需求效果,再次做下笔记以供以后参考,因为本人比较懒,所以这篇文章就不加图片了,主要目的还是自己以后查看方便,如果有人看不明白的可以交流下哈。


经过查阅,发现正常的api是实现不了的,或者这样的方法根本就没有,想想系统自带的设置就可以,所以我就在github上下载下来了系统settings的应用源码下来看,找到其中的Display Activity,发现系统是通过

ActivityManagerNative.getDefault().updateConfiguration(curConfig)实现的,但是ActivityManagerNative类是隐藏类,正常的api是看不到这个类的,先说下这个类的路径目录是android.app.ActivityManagerNative,既然是隐藏类,通过正常的api是调用不了的,所以你会想到,要么使用自己编译的android系统源码生成的api,当然你要把hide标签去了,就会看到;不过编译系统源码何其复杂,编译过的忽略,我是到现在还是编译过,一是下载源码都是个费时的工作,再有因为自己个人时间原因暂时搁置,所以既然这个走不通,那么我们会想到java中的反射机制。

    这个反射机制可真的很牛逼了,怎么个牛逼呢,就是不管你的系统api是隐藏的还是类中的方法和变量是私有的,他都可以通过反射机制获取到,从而引用,当然前提是你运行的android系统的设置是有这些类和方法的,只是你的api是看不到的,因为隐藏了。

    先看看通过反射实现修改系统字体大小

    

try

    //先通过类路径获取类ActivityManagerNative

            Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative"); 

    //再通过使用ActivityManagerNative类实例反射获取getDefault方法,再invoke使用该方法获得另一个实例类am

            Object am=activityManagerNative.getMethod("getDefault").invoke(activityManagerNative);  

    //使用am实例类反射获取getConfiguration方法,再invoke获取Configuration实例类config

            Object config=am.getClass().getMethod("getConfiguration").invoke(am);  

    //使用config实例类反射获取私有变量fontScale,再给改变量赋值scale

            config.getClass().getDeclaredField("fontScale").setFloat(config, scale);  

    //最后使用am实例类的updatePersistentConfiguration方法使用字体大小的更改

            object= am.getClass().getMethod("updatePersistentConfiguration",Configuration.class).invoke(am,config); 

        }catch (Exception e) {  

            e.printStackTrace(); 

            return new CmdMsg(false, e.toString());

        }

    通过以上代码就可以实现系统字体的大小改变了,在虚拟机上测试没问题,同时在小米2s的4.1.1系统上测试也没问题,以上的操作需要

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />

    这两个权限,而android.permission.CHANGE_CONFIGURATION更是得需要系统app才能使用的权限,所以我们又有了难题,功能实现了,但是没有权限,因为我们的app是应用app,根本没法使用到CHANGE_CONFIGURATION这个权限,即使你加上了也没用。所以接下来我们要将我们的app生成系统app



    将一个app生成系统app需要以下步骤:

    1.在Application层添加android:sharedUserId="android.uid.system"这个

    2.需要将apk导出无签名的,再用系统签名签名,我用的就是android原生系统自带的签名,也就是通用版的

    3.然后将你签名后的apk导入到/system/app目录下,如果有so文件,需要将so文件导入到/system/lib目录下,首先使用cat /proc/cpuinfo查看该手机的CPU架构 信息,然后倒入相应的so文件到目录下

    4.然后重启手机adb reboot

    5.重启后的手机就会加载你的app了,再看你的app就是系统app了,同时一些系统功能也可以使用了。


    再实行上面的步骤的时候你会遇到一些问题,首先使用通用版的系统签名,你得保证系统厂商再嵌入自家系统的时候也是用的改签名,否则无效,所以我测试在虚拟机上是可行的,同时的小米2s的4.1.1系统上也是可行的,在魅族5的5.1系统上就不行,提示获取CHANGE_CONFIGURATION权限失败。所以你要根据自己情况选择,我是系统和app一起发布的,所以没问题,我不是做系统方面的,我还是做应用层方面的额。


    再有就是你在导入apk和so文件到/system目录的时候会提示你只读的限制,这个好办

    adb shell就如到android命令后台,输入mount查看目前挂载的区域块的读写权限,找到system层

    

    你会看到我的system层的目录是rw读写的,可以写进去,但是如果是ro只读的话,使用下面的命令

    我说的都是针对真机的,对于虚拟机这些基本没有问题。

    mount -o remount /dev/block/platform/mtk-msdc.0/by-name/system /system中间的空行不要省去额,如果提示权限不够,你的手机

    需要先root额,对于root我个人经验觉得root精灵的要root的彻底,什么叫root的彻底不彻底呢,如果你root不彻底,你再进行这些步骤的时候会遇到各种问题,比如我的手机魅族5使用的自带的root后,在cmd终端su是不行的,所以再用KingRoot再一次的root后才可以终端su,但是kingroot后的还是不彻底,我再使用上面的命令获取读写权限的时候,报mount:Invalid Argument,所以我说把手机系统升级后再用root精灵root后,这些命令就很好的通过了,前提你需要魅族官方的root后,不然这些root软件都是不支持的。至于是软件的问题呢还是我升级后的系统的问题的,总之就是出现这些问题很可能就是你root的问题,你需要再重新root下或升级或刷机等等,只是个人建议,不喜勿喷。

    执行完上面的命令后你的/system目录就有了读写权限了额,重启后就会失效。

    这时候你把你的系统签名的apk通过adb push new.apk /system/app目录下,同时吧你的so文件push到/system/lib目录下,注意so文件要对于该手机的CPU架构额,不然重启后打开app闪退的情况一般都是加载so文件的问题,因为一般的so文件都是在application层加载的吧。


    真是祸不单行,为什么我搞了一天呢,因为你在push的时候依然有问题,我在虚拟机和小米2s上没问题,但是在魅族上面就是从外面push不进去,提示权限不够,OK,要权限是吧,我先push到sdcard中,再从sdcard中复制过去不行了,因为我到shell里面就可以su获取权限了,貌似这个可以额。所以我把apk和对应的so文件先push到了sdcard中,但是在我将这些文件复制到/system目录的时候,你会发现cp复制命令在android的shell里面没有,ok,我使用mv剪切命令吧,依然提示我没有,我查看了下其实mv命令是有的,这就是我的root不彻底或者root进入的su程序没有cp和mv,ok,我也懒得再弄了,我使用cat命令吧,cat还是有的cat new.apk > /system/app回车没错误,按说是ok的吧,进去目录看没有,我的乖乖,真是什么都有啊,我就在手机上装了ES文件浏览器,用它复制过去,但是一直是失败。妈的,没办法我就把系统先升级了再root了,因为我想刷机吧还没有支持的,所以我也只能先升级系统再root试试了。这次就可以了,但是这次还是不能从外面push进去,我依然还是从sdcard mv剪切过去,这次ok了。重启手机,运行app没问题,但是你再更改系统字体大小的时候提示权限不够,这就是我们刚才说的原生android系统的通用签名的问题,所以我就想这应该就是魅族自家的系统吧系统签名改了吧。咋办。

    到了这步我也没办法了,因为我的app是和系统一起可定制的,所以我到这步就已经ok可以了,至于有没有其他的方法等以后发现了再发上来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 很高兴为您解答。您可以使用Android Studio来开发电子书应用,首先需要安装Android Studio,然后创建新的项目,使用XML和Java语言,编写你的代码,然后编译,打包,发布应用程序,完成电子书App开发。 ### 回答2: 使用Android Studio编写一个电子书应用程序相对较简单。以下是一个简要的步骤: 1. 创建一个新的Android项目:在Android Studio中,选择“新建项目”。然后,填写应用程序的名称、包名等基本信息。 2. 设计应用程序的界面:使用Android Studio提供的布局编辑器设计应用程序的界面布局。可以在界面中添加文本视图、图像视图和按钮等组件来显示电子书的内容以及操作元素。 3. 添加必要的资源文件:在应用程序的资源文件夹中,以正确的格式存储电子书的内容。这可以是一个单独的文件夹,存放电子书的页面内容和相关的图像和音频等资源。 4. 创建与电子书相关的:为了管理电子书的加载和显示,可以创建一个Book,其中包含电子书的信息和内容。还可以创建一个BookReader,用于将电子书的内容呈现在应用程序的界面上。 5. 实施读取电子书的功能:在BookReader中,编写方法来读取电子书的内容,并通过文本视图和图像视图等组件来显示。 6. 添加用户交互功能:为了提供更好的用户体验,可以添加一些用户交互功能。例如,通过按钮或滑动手势来翻页,或者通过搜索功能来查找特定的内容等。 7. 进行测试和调试:使用Android Studio的模拟器或连接真实设备进行应用程序的测试和调试。确保应用程序在各种情况下都能正常运行,并处理异常情况。 8. 优化和打包应用程序:根据需要,对应用程序进行性能优化和界面美化。最后使用Android Studio的打包工具将应用程序打包为APK文件,以便在真实设备上安装和分发。 虽然以上步骤提供了一个大致的概述,但实际上在创建一个电子书应用程序时可能还会涉及其他更复杂的功能,如书签、目录、字体大小调整等。因此,根据应用程序需求,可能需要更多的开发工作。但Android Studio提供了强大的工具和支持,使开发者能够轻松地构建功能丰富的电子书应用程序。 ### 回答3: 使用Android Studio编写电子书应用是一种相对简单而强大的方法。以下是一些步骤: 1. 首先,安装并配置Android Studio。在官方网站上下载并安装Android Studio。一旦安装完毕,打开它并设置相关的SDK和虚拟设备。 2. 创建一个新项目。选择“新建项目”选项并填写项目的名称和包名。选择适当的最低和目标API级别,然后点击“下一步”。 3. 设计应用的用户界面。在“activity_main.xml”文件中创建应用的布局。可以使用不同的布局元素和小部件来设计主屏幕。 4. 创建相关方法。在“MainActivity.java”文件中创建一个,继承自“AppCompatActivity”。在中定义相关的方法,比如读取电子书文件和展示电子书内容等。 5. 添加必要的权限和依赖项。为了使应用能够读取和展示电子书,需要添加适当的权限。这可以通过在“AndroidManifest.xml”文件中添加权限声明来实现。 6. 将电子书文件添加到应用的资源中。将电子书文件(一般为PDF、ePub等格式)添加到项目中的“res/”目录或“assets/”目录下。 7. 实现电子书阅读功能。使用相应的库或API来读取电子书文件,并将其内容展示在应用的界面上。这可以通过编写特定的方法和逻辑来实现。 8. 测试应用。在虚拟设备或真机上进行测试,确保电子书能够正常加载和显示,并且用户界面与预期一致。 9. 修复和改进。根据测试结果和用户反馈,通过修改代码和增添功能来改进应用的性能和用户体验。 10. 打包和发布。完成应用的开发和测试后,将其打包成APK文件,并发布到Google Play商店或其他应用分发渠道。 以上是使用Android Studio编写电子书应用的一般步骤。根据具体需求和功能,还可以进行更多的定制和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值