当前位置:   article > 正文

android系统定制添加分辨率,density设置_android framework适配app分辨率

android framework适配app分辨率

本文基于qcom msm8909 android5.1平台,因为客户需求以及实际使用,主板接入的显示屏有各种尺寸,这样对屏幕的显示造成了极大的影响,因此着手开发了一个设置功能,主要针对屏幕分辨率和density等参数的设置。

首先想到的是调试过程中,在android4.3之后,官方引入了一个wm的命令工具(wm工具简介及使用),但在开发过程中,遇到个很蛋痛的问题,问题现象如下:

笔者采用jni的方式使用C popen函数执行wm 相关命令,这里解释下为什么引用popen函数,不是也可以用system,exec族么?原因是我们可以通过popen得到执行命令的结果。

但当所有代码噼里啪啦噼里啪啦的写完之后,运行发现:卧槽,为啥wm + 子命令 可以完美的执行,但wm+子命令+参数却毫无反应,jni执行下去,你真的没看错,毛反应都没有,然后我没办法,将jni中C 代码独立出来,单独编译成可执行程序放入系统中,执行,卧槽,没问题啊,完美执行啊,这TM是啥情况?搞了一天,脑子越搞越昏,完全不知道问题何在?(最终问题也没找到,有人知道的希望指导指导)

那么,时间比较紧,此路不同,当寻他路,笔记就开始一路百度,谷歌,突然,发现个比较闪眼的字眼--反射,脑子里闪过,反射是什么?(这里解释下,笔者涉及的知识面毕竟广,但都不精,而且从业经验还比较少,希望各路大佬不要鄙视)。

于是乎,又开始百度,谷歌,但是,问题又TM来了,我按照网上的教程,叫aidl文件导入工程,TM的简直是各种奇葩错误,无从下手啊,在挣扎了几个小时候,又放弃了,继续开始寻求他路,但寻路核心还是绕着反射这两个字以及我想要反射获取的方法的类。

终于,皇天不负有心人,突然找到个博客,这个博客也许对我没太大帮助,但,他告诉我,我可以在我得android工程中,使用系统隐藏的API,哈哈哈哈哈哈哈哈哈,既然可以这样,那TM就好办了啊。

博客地址:android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]_xudongdong99的博客-CSDN博客_android injectkeyevent

导入源码编译的jar,以供自己的android项目使用隐藏系统API:

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

将class.jar 导入 android项目

导入后发现报错了:Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug':unable to merge dex

这个应该是某些包名冲突了,但我表示很懒,不想一个个找是哪个冲突了啊,于是乎,百度到个救命稻草:

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'的解决办法_DimpleMe的博客-CSDN博客

然后,编译,哦豁,过了,nice!

既然可以使用系统隐藏的API,那我何不参照wm命令是怎么实现的呢?

找到wm命令的源码位置:vi frameworks/base/cmds/wm/

打开src/com/android/commands/wm/Wm.java

先分析下源码内容:分析内容

通过分析得到,原来他就用了这个aidl里面的方法:IWindowManager

所用部分方法:

wm size :getInitialDisplaySize,getBaseDisplaySize,setForcedDisplaySize,clearForcedDisplaySize

wm density:getInitialDisplayDensity,getBaseDisplayDensity,setForcedDisplayDensity,clearForcedDisplayDensity

其余的大家可以阅读源码自己分析下。

这样,我参照该源码实现,移植到我的项目工程中,然后编译,哦豁,完美,可以运行了,nice!

移植步骤可参考如下:

这样,就可以根据需要去调用IWindowManager里面的接口的方法了,简直是美滋滋。

哈哈哈哈哈哈,高兴之余,老天又开了个玩笑,滴滴,运行后执行修改操作,艹,报错了!!!

logcat 一看,去你大爷的,还好,问题不大,权限问题,哈哈哈,源码再手,不怕你权限问题。

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />权限报错

具体找不到log了,就是这个权限报错,那么,兵来将挡水来土掩啊,怕甚,搞个系统签名,NND,签名过后,install,run

nice,成功设置,完美!!!

Ps:同样的方法我应用到qcom msm8953 android7.1 平台上,遇到了一些其他问题,这里记录下。

1.导入android7.1 的 classes.jar,出现如下错误

解决办法:参考AndroidStudio 编译报错 DexArchiveBuilderException_T9的第三个三角的博客-CSDN博客

gradle.properties 中 添加 

android.enableD8 = true

2:IWindowManager中部分方法找不到

解决办法:相比android5.1,部分方法有点变动,阅读参考android7.1 WM源码,作相应的调整

3:给app应用系统签名打包出错

解决方法:

参考解决平台apk签名错误:no conscrypt_openjdk_jni in java.library.path_Hellolefty的博客-CSDN博客

解决方法:将以下所有文件放入同一个文件夹命名为sign
1、在Android系统源码中的\build\target\product\security目录下找到        platform.x509.pem 和platform.pk8两个文件;

2、在out/host/Linux-x86/framework目录下找到signapk.jar文件

3、找到 libconscrypt_openjdk_jni库
若是Linux系统
拷贝prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so
若是mac系统
拷贝prebuilts/sdk/tools/darwin/lib64/libconscrypt_openjdk_jni.dylib

4、需要进行系统签名的app.apk

5、进入sign目录执行如下命令即可完成签名:
java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app.apk app_sign.apk
 

【此做法在linux系统里才有效】java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk new.apk

文中语气词什么的比较多,还望各位看官莫要鄙视,有问题请多多指教,感谢!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/174265
推荐阅读
相关标签
  

闽ICP备14008679号