《Android插件化开发指南》勘误
一些常识:
1)全书70个代码例子中,涉及到插件的例子,请先assemble插件的项目,这会在HostApp项目中生成assets目录,并在该目录下plugin1.apk。这样,HostApp才能正常运行。
2)本书基于Android6.0(API level 23)的源码进行分析,本书的代码在Android7.0(API level 24)手机上测试都是能正常工作的。对于Android 7.0以上版本,有些插件化的解决方案,已经过时了,比如AMN的gDefault字段。
3)针对于Android8.0(API 26),Android8.1(API 27),Android9(API 28),插件化所需要做的适配工作,参加以下3篇文章(第2版作为第23章会放入书中):
Android插件化的兼容性(上):Android O的适配
Android插件化的兼容性(中):Android P的适配
Android插件化的兼容性(下):突破Android P中灰黑名单的限制
-----------------------------------------------------------
2018年8月第1版第1次印刷和第2次印刷
1)前言
比如说AssetsManager的addAssetPath方法,ActivityThread的currentActivityThread方法。
这句话删除,举例不当。
2)第2章,P25
ActivityManagerNativ改为ActivityManagerNative
3)第3章,P73
如果只想获取类的所有public构造函数,就不能再使用Class的getConstructors方法了,而要使用getDeclaredConstructors方法。
这里写反了,订正如下:
如果只想获取类的所有public构造函数,只要调用Class的getConstructors方法就足够了。
4)第6章,P133
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
output.outputFile = new File(file.parent,
"plugin1.apk")
println("$buildDir/outputs/apk/")
println("$rootDir/HostApp/src/main/assets")
copy {
from "$buildDir/outputs/apk/plugin1.apk"
into "$rootDir/HostApp/src/main/assets"
}
}
}
上面这段脚本,有个瑕疵,要执行两次的插件项目中的assembleRelease命令,才能在HostApp的assets目录下生成plugin1.apk,订正如下:
assemble.doLast {
android.applicationVariants.all { variant ->
// Copy Release artifact to HostApp's assets and rename
if (variant.name == "release") {
variant.outputs.each { output ->
File originFile = output.outputFile
println originFile.absolutePath
copy {
from originFile
into "$rootDir/HostApp/src/main/assets"
rename(originFile.name, "plugin1.apk")
}
}
}
}
}
接下来,执行插件项目的assemble命令,只要1次,即可生成在HostApp的assets目录下生成plugin1.apk。
5)第2章 P32
App和ASM频繁地向对方发送消息
修改为:App和AMS频繁地向对方发送消息
6) 第2章,P44
2.9.2
在Service中,通过AMM/AMP
订正为:
在Service中,通过AMN/AMP
7)第2章,P37
仍然是通过AMM/AMP
订正为:仍然是通过AMN/AMP
8)前言,P5
把android-pluginmgr设计为对Instrumentation的思想进行Hook
订正为: 把android-pluginmgr设计为对Instrumentation进行Hook
9)第18章,P287
ZeusStudy和1.6之间不应该有空格
10)第2章 P21
AndvoidManifest修改为AndroidManifest
11)第2章 P22
哪个,修改为那个
12)P101
图中,多了一个-
13)P102,第9行末尾,重写的逻辑,把英文句点改为中文句号。
14)P56
“主要逻辑都再此实现”中的“再此”应该为“在此”
15)113页
“对AMN的getDafault方法进行Hook”中“getDafault”应该为“getDefault”。default写错了
16)110页
“currentActivity-Thread”多了一个横线“-”
17)124页:
倒数第三行“会把asset目录中的插件”中的“asset目录”应该为“assets目录”。缺个s
18)
292页:“它有一个getsSring函数”中的“getsSring”应该为“getString”
19)
20)
RefInvoke.setFieldObject(currentActivityThread,”sPackageManager”,proxy);
Intent intent = new Intent(this, MyService.class);
startService(intent);
在插件化编程中,我们反射ActivityThread获取apk包的信息,一般用于当前的宿主apk ,而不是插件apk。
ApplicationPackageManager实现了IPackageManager.Stub。
《Android插件化开发指南》勘误的更多相关文章
- 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】
老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf 下载地址:http://pan.bai ...
- 《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3
内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编 ...
- C++ Primer Plus(第6版)中文版——课后练习程序代码
博客内容经历了一次整理,以前发的博文太散.没什么水准,搞的随笔分类越来越多orz,这次把CPP这本书的课后练习的程序代码放到一起方便查阅与修改..嗯 9.6.1 #ifndef _9..1_H_ #d ...
- C++ Primer Plus 第六版笔记
C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...
- 《JavaScript权威指南 第六版 中文版》(一)
<JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...
- C Primer Plus(第五版)1
这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...
- 【原创】一起学C++ 之指针、数组、指针算术 ---------C++ primer plus(第6版)
C++ Primer Plus 第6版 指针和数组基本等价的原因在于指针算术! 一.指针 ⑴整数变量+1后,其值将增加1: ⑵指针变量+1后,增加的量等于它指向的类型的字节数: ⑶C++将数组名解析为 ...
- 【原创】一起学C++ 之 字符串 ---------C++ primer plus(第6版)
C++ Primer Plus 第6版 字符串:是存储在内存的连续字节中的一系列字符. C++处理字符串的方式有2种: 一.来自C语言.常被称为C-风格字符串(C-Style-string) 1)从字 ...
- JavaScript权威指南(第6版)(中文版)笔记
JavaScript权威指南(第6版)(中文版)笔记
- 《C++ Primer》 第四版 第7章 函数
<C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/94 ...
随机推荐
- 【spark】dataframe常见操作
spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持. 在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库. 首先加载数据集 ...
- web---资源的下载及中文乱码问题
1.html网页,超链接交由Servlet处理 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- TLS详解
TLS加密通信, 开始使用协商的秘钥进行加密通信 1.服务器也可以要求验证客户端,即实现双向的验证, 2.会话缓存握手过程,为了建立握手的速度,减少协议带来的性能方面的降低和资源方面的消耗,TLS协议 ...
- set操作
Set操作,Set集合就是不允许重复的列表 sadd(name,values) # name对应的集合中添加元素 scard(name) 获取name对应的集合中元素个数 sdiff(keys, *a ...
- 编译php-5.3.28
1. 下载php-5.3.28 2. 编译/安装 ./configure --prefix=/usr/local/php --enable-fpm --enable-maintainer-zts -- ...
- 爬虫-request和BeautifulSoup模块
requests简介 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工 ...
- 自定义Section
转载 :http://www.cnblogs.com/gaobing/p/6047746.html <configSections> 元素必须是 configuration 元素的第一个子 ...
- Spark SQL官网阅读笔记
Spark SQL是Spark中用于结构化数据处理的组件. Spark SQL可以从Hive中读取数据. 执行结果是Dataset/DataFrame. DataFrame是一个分布式数据容器.然而D ...
- 配置plsql远程连接oracle数据库
1.首先安装plsql工具.(plsql如何安装就不说明了) 2.在plsql安装目录下新建“network”文件夹,在network文件夹中新建“admin”文件夹,在admin中新建“tnsnam ...
- android studio 虚拟机adb.exe已停止工作的处理
在搭建完android studio 后使用虚拟机或真机调试程序,出现如下错误. 在运行里输入cmd,打开命令行工具,使用netstat -aon|findstr 5037查看adb.exe的50 ...