Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Android打印机项目 涉及的技术:
- APP部分:
- 系统打印插件API
- APP基础:Activity、Broadcast、Service(四大组件中的三个)
- UI制作(Activity、Fragment、Dialog、Handler、各种Layout、Button、Listview)
- JAVA调用命令行使用Stream
- 线程池(管理命令的异步执行)
- 多线程同步(使用了synchronized、wait/notify,等待命令的stdout/stderr通道结束)
- AIDL(与通知栏进程通信,发送打印状态)
- Parcelable(数据序列化,给AIDL使用)
- 界面逻辑分离(MVC)
- 单例模式(线程池)
- 字符串匹配
- 移植CUPS部分:
- Change Root
- Android权限管理(添加自定义权限)
- Linux程序动态链接程序运行原理
- Linux系统调用
- Shell脚本
- CUPS的运行流程(epoll管理、PPD文件指定渲染流程、前后端过滤器、libusb连接USB打印机)
- Android源码编译、添加系统程序
- ---
- 遇到的坑
- 1. AlertDialog如何在非APP界面弹出
- alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- 但是在有的系统上无效。
- 2. PrintJob只能在主线程操作,否则操作无效
- (原因?)
- 3. APP进程退出,后台运行的CUPS进程也会退出
- 在Android中,APP所在进程被杀死,其启动的子进程也会被杀死。
- 解决方案一,在APP被杀死时,启动一个定时器,几秒后唤醒一个service。。。(暴力方法)
- 解决方案二,使用AIDL,启动两个APP/进程。
- (原因?)
- 4. Intent跨进程发送Parcelable数据,双方的类名必须相同
- 反序列化时类名,包括所在包名,必须完全相同。
- 5. 记得PrintJob是final类,而且不能Parcelable,使用反射来调用内部方法的。
- 但是找了半天,找不到在哪用的。。。
- 6. 在调用类的wait、notify方法时,必须使用synchronized。
- 防止并发操作,导致出错。
- 7. 调试网络打印时,发现无法打印,有问题。
- 使用tcpdump和wireshark抓包,发现无法打印的问题不在传输上。
- 8. USB打印出现问题,无法打印。
- 使用starce抓取系统调用,结合CUPS源码,发现问题出现libusb上面,自行编译libusb库解决。
- 9. 在AIDL中map不能使用泛型等
- 不使用泛型,可以用强转
- 10. 使用hpcups过滤器,无法使用以usb开头的地址。
- 在ubuntu中,系统会自动转换地址为 hp 开头,因此编写地址转换脚本,进行动态转换
- ---
- 如何组织项目
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement