一些常识:

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)

319页:“在Android Studio中建立一个过程”中的“过程”修改为“工程”。
 

20)

320页:第2行:“同时在自定义的Class-Loader中”中的“Class-Loader”修改为“ClassLoader”。
 
21)
320页
第13行:“但是AndroidAndroid系统源码中也有一些类”中的“AndroidAndroid”修改为“Android“
 
22)235页
那么就通过10.3.2介绍的proxyCreateService方法
 
10.3.2改为14.4.2
 
23)238页
ServiceManager(省略了10.3.1介绍的proloadServices和10.3.2介绍的proxyCreateService)
10.3.2改为14.4.2
10.3.1改为14.4.3
preloadServices 改为preLoadServices
 
24)P97
RefInvoke.setFieldObject(sPackageManager,”sPackageManager”,proxy);
修改为
RefInvoke.setFieldObject(currentActivityThread,”sPackageManager”,proxy);
 
25)P100
图5-2中 Context/Contexztimpi  修改为Context/ContextImpl
 
26)P5
为张勇的DroidPlugin添加脚注:
https://github.com/Qihoo360/DroidPlugin
 
27)P194
B准备好数据,写到A要求的内存地址上,A就可以直接使用这些数据了
改为
A准备好数据,写到B要求的内存地址上,B就可以直接使用这些数据了
 
28)P196
在B1中
改为
在A1中
 
29)230
设计一个ProxyServiceManager的例子,
修改为
设计一个ProxyServiceManager的单例
 
30)235
这时候,不能把插件Service1换成ProxyService
修改为
这时候,不能把插件MyService1换成ProxyService
 
31)P245
 在sendBroadcastReceiver的时候
改为
在sendBroadcast的时候
 
32) P25
AMN通过getDefault方法,从ServiceManager中取得一个名为activity的对象
改为
AMN通过getDefault方法,从ServiceManager中取得一个对象
 
33)P25
看到这里,你会发现AMP的startActivity方法,和AIDL的Proxy方法,是一模一样的
改为
看到这里,你会发现AMP扮演着AIDL中的Proxy的角色,我们在2.3节介绍过AIDL的Proxy类。
 
34) P42
删除以下两行代码

Intent intent = new Intent(this, MyService.class);

startService(intent);

35)P55,删除下面这2句话

在插件化编程中,我们反射ActivityThread获取apk包的信息,一般用于当前的宿主apk ,而不是插件apk。

ApplicationPackageManager实现了IPackageManager.Stub。

 
36) P181
dat改为data
 
 
 
 

《Android插件化开发指南》勘误的更多相关文章

  1. 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】

      老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf  下载地址:http://pan.bai ...

  2. 《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3

    内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编 ...

  3. C++ Primer Plus(第6版)中文版——课后练习程序代码

    博客内容经历了一次整理,以前发的博文太散.没什么水准,搞的随笔分类越来越多orz,这次把CPP这本书的课后练习的程序代码放到一起方便查阅与修改..嗯 9.6.1 #ifndef _9..1_H_ #d ...

  4. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  5. 《JavaScript权威指南 第六版 中文版》(一)

    <JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...

  6. C Primer Plus(第五版)1

    这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...

  7. 【原创】一起学C++ 之指针、数组、指针算术 ---------C++ primer plus(第6版)

    C++ Primer Plus 第6版 指针和数组基本等价的原因在于指针算术! 一.指针 ⑴整数变量+1后,其值将增加1: ⑵指针变量+1后,增加的量等于它指向的类型的字节数: ⑶C++将数组名解析为 ...

  8. 【原创】一起学C++ 之 字符串 ---------C++ primer plus(第6版)

    C++ Primer Plus 第6版 字符串:是存储在内存的连续字节中的一系列字符. C++处理字符串的方式有2种: 一.来自C语言.常被称为C-风格字符串(C-Style-string) 1)从字 ...

  9. JavaScript权威指南(第6版)(中文版)笔记

      JavaScript权威指南(第6版)(中文版)笔记      

  10. 《C++ Primer》 第四版 第7章 函数

    <C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/94 ...

随机推荐

  1. python 对Excel表格的写入

    python对Excel表格写入需要导入xlrd ,和xlutils两个库 from xlrd import open_workbook from xlutils.copy import copy o ...

  2. 写交互式脚本时,遇到到报错:not a regular file

    场景:在写两台ubuntu之间需要交互式登录操作shell脚本.就是在ubantu A上,做点什么事,然后远程到ubuntu B上进行操作,shell脚本存放在ubuntu A上. 我遇到这个报错:n ...

  3. 【玩转开源】BananaPi R2 —— 第三篇 基于Openwrt开发一个简单的路由器

    上一篇讲解了R2的网口配置,这一篇我们以BananaPi R2为例子来实现一个简单的路由器:那么一个简单的路由器应该具备什么样的功能呢?最简单的说就是wan+lan+ap这三个功能. 首先wan+la ...

  4. nginx 10054报错问题解决方案

    使用nginx代理,端口8000.tomcat用于后端服务器,端口8080.nginx的error.log中报如下错误: 2018/09/21 09:08:06 [error] 12488#11600 ...

  5. Linux服务器常用工具

    一.Ubuntu18版本 服务器 1)替换源.将原有的源注释掉 vi /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ bioni ...

  6. Python 官方文档解读(1):66 个内置函数

    Python 解释器 (CPython 3.7)内置有 66 个函数,这些函数在任何时刻都是可用的.此文是为了对这 66 个函数进行简单的梳理,便于以后可能用到它们时能想到. 1. abs(x) 返回 ...

  7. navicat连接centos7上mysql:2003-Can't connect to MySQL server (10060)

    问题解决步骤: 1.参考http://jingyan.baidu.com/article/95c9d20dac9040ec4f75617a.html,发现是防火墙未关闭: 2.关闭并禁止firewal ...

  8. Luogu P3381 (模板题) 最小费用最大流

    <题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...

  9. python字典去重

    今天实习的web大表哥说帮我看环境不过前提是要我帮他写个python合并列表的demo, 大概思路就是利用zip库进行keys和values的遍历,然后在输出就行 key1={'name1':'小明' ...

  10. MySQL系列

    目录: 一.初识数据库 二.库相关操作 三.表相关操作 四.记录相关操作 五.数据备份.pymysql模块 六.视图.触发器.事务.存储过程.函数 七.ORM框架SQLAlchemy 八.索引原理与慢 ...