Kaede Akatsuki

中二病也要开发 Android

自动给你的博客的中英文间加上空格

关于“是否应该在中文和英文之间加上空格”的争论在 知乎 上的争论历来已久,我本喜欢加上空格,只是对于英文单词频繁穿插的中文句子来说实在是有点繁琐和难看(特别是技术向文章),自从发现了有自动在博客的中英文间加上空格的脚本后,就放弃手动加空格的做法,这些频繁的工作,就交给脚本去做吧。

阅读全文

Hexo 主题 Themia 1.7

Themia 是一个华丽的Hexo响应式主题,由 LouisBarranqueiro 开发的主题TranquiPeak的基础上改造而来,大部分功能都是原有主题的,只是为了我自己的需求做了小部分的修改,主要是针对中文适配做的修改。
特点

  1. 增加1080P等大屏显示器下的SideBar样式;
  2. 调整文章的样式,比如字体、字体大小、对齐等;
  3. 中英混排自动加入空格(参考 pangu.js);
  4. 同步更新至 TranquiPeak 1.7.1;

将项目根目录的所有文件复制进一个文件夹,并把该文件夹复制进Hexo项目的themes目录下,再把Hexo的配置文件_config.yml中的theme标签的指改为该文件夹的名称即可。

动态创建 Activity 模式

还记得我们在代理Activity模式里谈到启动插件APK里的Activity的两个难题吗,由于插件里的Activity没在主项目的Manifest里面注册,所以无法经历系统Framework层级的一系列初始化过程,最终导致获得的Activity实例并没有生命周期和无法使用res资源。

使用代理Activity能够解决这两个问题,但是有一些限制:

  • 实际运行的Activity实例其实都是ProxyActivity,并不是真正想要启动的Activity;
  • ProxyActivity只能指定一种LaunchMode,所以插件里的Activity无法自定义LaunchMode;
  • 不支持静态注册的BroadcastReceiver;
  • 往往不是所有的APK都可作为插件被加载,插件项目需要依赖特定的框架,还有需要遵循一定的”开发规范”;

特别是最后一个,无法直接把一个普通的APK作为插件使用。这个其实也不算是限制,如果我们需要进行插件化开发,我们总希望能够通过一些框架限制和规范插件的行为,在加载插件前就知道插件大概有哪些功能,这样不仅能方便对插件行为的控制,还能在一定程度上确保插件的安全(运行一个完全未知的可执行文件鬼知道它会做些什么)。不过这样做就要求插件必须依赖特定的框架,这对插件是一种侵入式开发,也就是说,开发插件时不能像开发普通APP那样自由。

那么有办法避开这些限制,做到完全非侵入式开发吗?比如,通过动态加载框架,不用安装就直接运行《Flappy Bird》的APK安装包。这听起来好像是只有获得ROOT权限才能做到的事情,要不然随便写个空壳的APK加载别人的游戏安装包就直接能运行了。不过,确实有人做到了,通过动态生成Activity类的方式。

阅读全文

双屏显示器配合机械键盘食用更佳

我一直计划着打造自己的工作室(工作平台),因为我觉得除了相关姿势扎实以外,优秀的生产工具也是提高办公效率的利器,而且好玩的生产工具还能提高自己工作的积极性,减少咸鱼状态。所以,适当地买一些优质的生产工具犒劳自己,也是我自己为数不多的乐趣。说到开发相关的生产工具,则莫过于大屏显示器和机械键盘了。

阅读全文

代理 Activity 模式

简单模式中,使用ClassLoader加载外部的Dex或Apk文件,可以加载一些本地APP不存在的类(或者更新本地已存在的类),从而执行一些新的代码逻辑,但是使用这种方法却不能直接启动插件里的Activity等组件,也没办法使用res资源,如果不解决这两个问题,则使用插件化的方式开发Android业务会非常繁琐。

阅读全文

魔都漫展 ComicCup18 Day1

转眼间来B站工作已经有2个月了,这是第一天粗来玩,9号一个人逛CP18,找基友章鱼的摊位,被安利了一张CD,现场许多萌妹子,发了不少牢骚(求个妹纸一起吃自助餐、看电影、逛漫展)。

简单的动态加载模式

从这个章节开始,加载SO库的问题算是告一段落,现在开始谈及的动态加载,主要是指基于ClassLoader的加载方式,这也是这个动态加载系列文章的核心。

Java程序中,JVM虚拟机是通过类加载器ClassLoader加载 .jar 文件里面的类的。Android也类似,不过Android用的是Dalvik/ART虚拟机,不是JVM,也不能直接加载 .jar 文件,而是加载 .dex 文件。

通过Android SDK提供的 DX工具.jar 文件优化成 .dex 文件,然后Android的虚拟机才能加载。注意,有的Android应用能直接加载 .jar 文件,那是因为这个 .jar 文件已经经过优化,只不过后缀名没改(其实已经是 .dex 文件)。

如果对ClassLoader的工作机制有兴趣,具体过程请参考 动态加载基础 ClassLoader的工作机制,这里不再赘述。

阅读全文

使用 so 库时要注意的一些问题

正好动态加载系列文章谈到了加载SO库的地方,我觉得这里可以顺便谈谈使用SO库时需要注意的一些问题。或许这些问题对于经常和SO库开发打交道的同学来说已经是老生长谈,但是既然要讨论一整个动态加载系列,我想还是有必要说说使用SO库时的一些问题。

在项目里使用SO库非常简单,在 加载SD卡中的SO库 中也有谈到,只需要把需要用到的SO库拷贝进 jniLibs(或者Eclipse项目里面的libs) 中,然后在JAVA代码中调用 System.loadLibrary(“xxx”) 加载对应的SO库,就可以使用JNI语句调用SO库里面的Native方法了。

但是有同学注意到了,SO库文件可以随便改文件名,却不能任意修改文件夹路径,而是“armeabi”、“armeabi-v7a”、“x86”等文件夹名有着严格的要求,这些文件夹名有什么意义么?

阅读全文

如何加载 SD 卡中的 so 库

Android中JNI的使用其实就包含了动态加载,APP运行时动态加载.so库并通过JNI调用其封装好的方法。后者一般是使用NDK工具从C/C++代码编译而成,运行在Native层,效率会比执行在虚拟机的Java代码高很多,所以Android中经常通过动态加载.so库来完成一些对性能比较有需求的工作(比如T9搜索、或者Bitmap的解码、图片高斯模糊处理等)。此外,由于.so库是由C++编译而来的,只能被反编译成汇编代码,相比Smali更难被破解,因此.so库也可以被用于安全领域。

与我们常说的基于ClassLoader的动态加载不同,SO库的加载是使用System类的(由此可见对SO库的支持也是Android的基础功能),所以这里这是作为补充说明。不过,如果使用ClassLoader加载SD卡里插件APK,而插件APK里面包含有SO库,这就涉及到了对插件APK里的SO库的加载,所以我们也要知道如何加载SD卡里面的SO库。

阅读全文

123456