42 Android Advanced Development Course Learning Takeaways

42 Android Advanced Development Course Learning Takeaways #

Hello, I’m Zhang Shaowen. From the first module to the last module titled “Architectural Evolution,” it feels like just yesterday that our column was first established. It has been almost eight months since the preparation of the “Advanced Android Development Course,” and I would like to express my heartfelt gratitude to our learning delegate, Sun Pengfei. Whether it was answering questions about the articles or providing practice samples, Pengfei has put in an enormous amount of effort for this column. I would like to sincerely thank him once again.

Both Pengfei and I have been reshaping our knowledge framework while writing this column. In the final article of the series, I specifically invited Pengfei to share his learning experience with everyone, as a way of bidding farewell. Pengfei is very familiar with underlying knowledge such as Android system framework, virtual machines, Linux, and more. How did he achieve this? It must be said that Pengfei is a very self-disciplined (+introverted) person, with the terrifying ability to wake up at 7 o’clock every morning and study for an hour and a half.

Recently, Pengfei has also been preparing for a new job, and I also wish him all the best in his new position. Next, let’s hear Pengfei’s reflections and thoughts on studying this column.

Hello everyone, I am Sun Pengfei. As the “Advanced Android Development Course” is coming to an end, today I will summarize the column from the perspective of a learner. The column covers all aspects of Android development, including technical knowledge, personal experiences, Q&A sessions, and some informative articles. In terms of content, it differs from the tutorials you would typically come across, as it doesn’t extensively cover Android basics. Instead, it provides new ideas and shares experiences. Many students find it challenging to learn, and I can relate to that. When I started preparing for this course, I also had to learn many things from scratch. Understanding a new concept from being vague to becoming clear is not an easy process. It may involve various intricate knowledge points about Android and Linux, requiring extensive reading to gain a solid understanding.

Now, let me summarize my learning process and some thoughts on this column, in hopes that it will inspire you.

Reflections on “Master Class” #

Recently, I have learned that some students are unsure how to get started with C++ and Linux. Here, I will share my learning process and related learning materials. You can start by learning the basic syntax and functions in the standard library of C++ through the book “C++ Primer Plus”. For example, you can learn about string operations, memory allocation, I/O operations, etc. Additionally, there is a great website to learn the C/C++ language called cppreference.com, where you can find information about the latest features as well.

As for Linux application development, you can refer to the book “Advanced Programming in the UNIX Environment” step by step. This book will help you become familiar with the standard I/O library, system data files and information, process environment, process control, process relationships, signals, threads, thread control, daemon processes, and various I/O and Inter-process Communication (IPC) mechanisms. You can also refer to the book “Linux/UNIX System Programming Manual”, which provides more detailed explanations. After gaining an understanding of Linux application development, you can delve into the knowledge of Linux kernel. I recommend the book “Linux Technology Insider” written by a Chinese author. It is relatively easier to read compared to some translated books, and it contains a large number of illustrations. However, due to length constraints, some topics are not covered.

As you can see from the column, some content involves ARM assembly. There is relatively less information available on ARM assembly, and it may not be very convenient to practice. I recommend a website called Writing ARM Assembly, where you can learn the basics of assembly programming. For practical experimentation, you can use the tool VisUAL, which allows step-by-step execution and real-time observation of register and memory values. Regarding assembly-related content, I believe it is more important to have a basic understanding, as it may not be extensively used in practice.

Android updates and iterations are rapid, and in such a fast-paced environment, we need to keep up with the latest features and also master methods of handling compatibility issues. Currently, the official documentation is updated quickly, and the Chinese documentation is also updated promptly. You can find detailed documentation for most functionalities, API, and new features on the Android official website, such as Android Q Features and API. Additionally, for each version, the official website provides a comprehensive API Diff Report. This report lists all modified and newly added APIs, allowing us to discover new functionalities.

As for updates related to the Android Virtual Machine (VM), I mainly refer to the official commit history. Specifically, you can refer to [Android Gerrit](https://android-review.googlesource.com/q/project: platform/art+status:open), where you can find every commit and detailed code diffs. The commit descriptions are generally clear, which helps us understand the code well and discover new tools and features.

Reflections on Column Study #

I often hear many classmates say that a certain technology is difficult, but I believe that most of the time it is not the difficulty of the technology, but rather its complexity. Most technologies have evolved over time, and this evolution is very similar to the iterative process of our business needs. For example, memory management has evolved from fixed partitioning and dynamic partitioning mechanisms to segment mechanisms, and then developed into the current paging mechanism. Hardware has also evolved accordingly, which can be considered an iterative process. Understanding the paging mechanism is not difficult, but the content involved in this knowledge point is very cumbersome and complex. For example, understanding how the system manages memory requires understanding memory layout, which involves memory partitioning. Memory partitioning also involves CPU operating modes, followed by how physical memory and virtual memory are mapped, which involves translation of page tables, allocation and release of physical pages, and buddy system algorithms to solve memory fragmentation in the buddy system and the like.

This series of content involved is very complex, but if each individual item is taken apart and studied and supplemented layer by layer, it will feel much easier. This point is actually reflected in business development as well. When we first take over a complex business, the code is huge, and there are few comments and documents. But after a period of time, you will still have more or less understanding of the entire business, and when you receive new business, you will not feel helpless and at most recognize its complexity. The same goes for underlying systems and frameworks. This is a process from point to face.

Learning in Busy State

Hong Yang wrote an article titled “How to Maintain Learning Ability When Working Overtime” which discusses how to maintain learning in a busy work state. I also felt this way after reading it. In the spare time, we read a technical article, and it doesn’t end with reading and bookmarking it. In this way, you may forget the content of the article in a short period of time. He divides reading an article into the following steps: extracting the problem that the article needs to solve, summarizing the technical points involved, and extracting key contents such as the reasons for the problem and its solving methods. Overall, this method is to extract key contents in a short period of time, and then record them for later revision. So we all need to record and review more, and we can use some tools to help ourselves develop the habit.

Leaving the Comfort Zone

It’s not about switching to a busier job, but about maintaining a sense of anxiety in both work and learning processes. However, this anxiety is not confusion and panic, but a clear recognition of one’s own inadequacies, and then filling in the gaps in work and spare time. When you concentrate on tackling a difficult point, you will find it an interesting thing. Many of my classmates around me are learning continuously, and everyone has different goals, such as what level to learn to and where to apply it. It requires a certain amount of pressure to produce better results, otherwise it is easy to get lost and lose focus. The team I used to be in had a learning plan, where each classmate researched in a certain direction, and we would allocate a certain amount of time during the weekly meeting to do technical sharing. I think this is a very good method. People’s attention is quite focused when they are under certain nervousness, which is the same principle as studying before exams or interviews. However, we cannot be too anxious. I often have a sense of anxiety, and my solution is to customize a plan for half a year or a year, and focus on completing one thing in a period of time. You will see that you have grown a lot.

Deliberate Practice Perhaps the business requirements we usually deal with in the company are often just patching up without involving complex content. A large amount of repetitive work can make it feel impossible to improve one’s technical skills. Moreover, the knowledge we learn in our spare time may become unfamiliar after a certain period of time. Some technologies may appear relatively simple in theory, but when implementing them, we encounter various issues, such as pluginization and hotfix. Without practicing these types of technologies, our understanding of them will remain at a theoretical level. In such cases, a deliberate practice method can be employed. After understanding the principles, try implementing a similar framework on your own. In this process, you will gain more practical experience compared to reading source code and articles. This can greatly deepen your understanding of a certain knowledge and develop your framework design abilities.

Reading Source Code

I usually read fewer source code analysis articles written by others, unless I encounter parts that are difficult to understand. Most of the content can be directly obtained from the code. Furthermore, there are few analysis articles on many source codes, such as Inline Hook, but there are many frameworks implementing that functionality. Thus, it is only possible to obtain related content from the code. For a framework with a certain functionality, you can find several frameworks with similar functionality and compare them to see if there are any differences in the implementation approaches. At the same time, compare the advantages and disadvantages of each implementation approach and record the technologies used by each framework. Even after understanding the implementation of a framework, it is still advisable to write a similar framework yourself. In the process of your own implementation, you will encounter various problems, and you can look for solutions from other frameworks, and then summarize them on your own. This way, you can understand the advantages of the framework. If asked about the strengths and weaknesses of a framework in an interview, you will be able to provide your own understanding rather than a uniform description found online.

Full Stack Development

In the so-called “winter” of the internet, it is necessary to continuously pay attention to technologies in other directions, in order to improve one’s competitiveness. Among the trends in front-end development and the development directions of various companies, “Full Stack” has become a necessary skill, which can be seen from the recruitment directions of major companies. Therefore, in the process of our usual learning, we can pay more attention to content related to Full Stack, cross-platform development, and Flutter. Nowadays, many companies and departments emphasize the integration of systems and end-to-end management of front-end and back-end. To grasp the dynamics of the entire business, you need to have a general understanding of both back-end and front-end technologies. Only focusing on a single technology is not beneficial to one’s own development in China’s internet environment. In other words, the more we pay attention, the more opportunities will come our way.

Personal Skill Improvement

Here, the term “ability” refers more to the improvement of soft skills. One is the technical perspective, which involves having a comprehensive understanding of a business system and developing the ability to think abstractly from top to bottom, rather than from the bottom up. Furthermore, it is important to focus on the “value” that a technology brings. In the past, I used to delve into some technical details simply because I found them interesting, but I rarely considered the “value” that these technical points could bring. In the process of promotion and job interviews, what is usually focused on is the “value”. We often talk about business iterations and module development, but rarely mention the value of the functions we implement. We may think that the technical implementation is relatively simple and there is nothing to talk about. However, we can summarize from the following aspects.

First, when we develop a new feature, make improvements, or introduce new technologies, we are usually mainly focused on implementing a business requirement, ensuring the use of the business function. This is the value generated by the function. When developing this requirement, have we considered its scalability, reusability, maintainability, performance, stability, and high availability? Performance improvements bring value to the user experience; Scalability and reusability bring increased development efficiency; Stability reduces maintenance costs, and so on. These are all the values generated by our technological outputs. We can go further and look at it from a business perspective. For example, how much has this business feature improved the user experience? How much has it promoted user growth, increased user engagement, or reduced costs? Since we usually embed various data statistics points during the development of each business, we should pay more attention to this business-related data in our spare time. Product managers usually have various data reports. We can summarize them as the value generated by completing a business requirement.

Final Thoughts #

Finally, I would like to thank all the students who have been following the “Android Development Expert Course” until the end. I believe that you have also learned valuable new knowledge from this column. I myself have been learning gradually since the column started, and I have gained many ideas and methods, as well as consolidated a lot of fundamental knowledge. However, the column cannot present all the fundamental knowledge in detail, so we still need to take this as a starting point and expand on it in our own study time, think more, and summarize more.

Lastly, I want to say that everyone will experience a painful period when they break through their own technical bottlenecks. Only with strong belief and relentless persistence can we come through it. Trust me, when you look back at the technologies and knowledge that you once thought were difficult to understand, you will have a broad and comprehensive understanding, and that is the greatest sense of achievement brought about by growth and progress.

Welcome to click on “Share with a Friend” and share today’s content with your friends, inviting them to study together.