1.3 History of Android Plug-in Programing
In July 27, 2012 , it was the first milestone in Android plug-in technology. Yimin Tu(mmin18 on Github), who worked for dianping.com , released the first Android plug-in open source project——AndroidDynamicLoader, and the App of dianping.com was based on this framework. It is a plug-in framework based on Fragment. Through the dynamic loading of the Fragments in the plug-in, the page switching was implemented in the APP, but there is only one Activity which as the container of Fragments. In the open source project, it is the first time for us to know how to use the addAssetPath method of AssetManager to handle the resources in the plug-in.
In 2013, 23Code appeared. 23Code provides a shell where plug-ins can be dynamically downloaded and run. We can write a variety of controls outside and run them in the framework. It is the Android plug-in framework. For about this project and related open source resources, I don’t know very clear,if anyone knows the author, please contact with me.
On March 27, 2013, BoKui, a developer of Taobao client, provide a technical sharing about Taobao's Atlas plug-in framework in the Alibaba Technology Salon No.16, including several classes of Hook, incremental update, downgrade, and compatibility such as ActivityThread and so on. Such video shows the plug-in technology from macroscopic view, and not to say how to implement it, not to mentioned as open source projects. This thinking is very advanced in 2013, but at that time, I’m still a student for Android programing.
At 8:20 on March 30, 2014, it was the second milestone of Android plug-in technology. Mr. Ren Yugang published an Android plug-in project named dynamic-load-apk, which is not the same as many other plug-in projects. It does not modify with the internal methods of the Android system, but to solve the problem from the application layer of the App by creating a class named ProxyActivity to distribute and start the plug-in Activity. Because Ren Yugang invented a keyword called "that” in this framework, so I call it as "that" framework in this book. In fact, the author does not like the nickname, and named it as DL. When he develop this framework, there were so many difficulties, because there was no enough information on plug-in technology that could be referred to, especially before 2014.
"That" framework only have the implementation of the plug-in activity at beginning. With the contribution of Xiao Tian and Siyu Song, the implementation of Service was available later. In April 2015, "that" framework was stabilized. At that time, I was the leader of App Technology at Tuniu. When I ever saw this framework, decided to introduce it into the Tuniu App resolutely (actually there was no other choice at that time). The developers of the specific operation were Liangliang Wang and Zhengbin Wei. They took the framework and transplanted it into the Tuniu App. The framework has withstood the verification of a million-activiation app. It is the first market App for plug-in technology.
At the same time, Tao Zhang was also contribute to the implementation of plug-in technology. In May 2014, after reading all the source codes of DL, he released his first plug-in framework——CJFrameForAndroid. This design is similar to "that", except that he called ProxyActivity and ProxyService as hosting sites. In addition, the CJFrameForAndroid framework also presents the Activity's LaunchMode solution, which is a very important contribution to the plug-in framework and can be ported directly to "that" framework.
In November 2014, houkx released a plug-in project named android-pluginmgr on GitHub. This framework first proposed to register a StubActivity in the AndroidManifest file to deceive AMS, but actually opened ActivityA in the plug-in. But he did not use the technology to modify with Instrumentation and ActivityThread, but through the dexmaker.jar tool dynamically generated StubActivity, StubActivity class inherited from the plug-in ActivityA.
Today, it seems that the idea of such dynamically generated classes does not a good solution for plug-in framework, but it was not easy to acquire this point at that time. Everyone interprets their roles well in the stage of plug-in and plays a specific role at a particular time.
At the same time, hookx also found that the permissions requested in the plug-in framework can not take effect, so you must apply for all permissions in the host app in advance.
Android-pluginmgr has two branches, the author's idea of plug-in is located in the dev branch. Then, Lody, a high school student, took part in the open source project, and modified android-pluginmgr with Instrumentation thoughts, implemented in the master branch, but this story was happened in November 2015.
On December 8, 2014, there was a good news, Android Studio V1.0 was available. Android developers began to abandon Eclipse gradually, and try to use Android Studio. Android Studio is compiled and packaged with Gradle, which makes the design of the plug-in framework much simpler, eliminating the inconvenience of using Eclipse to run the Android SDK.
2015 was coming.
Lody, the high school student, he was still a sophomore at the moment. He started studying the Android system source codes from junior school. His first well-known open source project was TurboDex, which can quickly load dex with high speed. This is very useful in plug-in frameworks because it takes a long time to load all the plug-ins for the initialization.
At the end of March 2015, Lody released the plug-in project: Direct-Load-apk. This framework combines Yugang Ren's static proxy thoughts of “that“ framework, Houkx's pluginmgr framework whose idea is deception AMS, and modified Instrumnetation. Unfortunately, Lody was a student at that time, and did not spend much time to talk about this framework, so that too many people did not know the existence of the framework.
The legend of Lody hasn't finished yet, he spend much time into the project of VirtualApp. It is an App just like virtual machine on the Android system, which is a deeper technical topic, and we'll talk it later.
In May 2015, limpoxe released plug-in framework: Android-Plugin-Framework.
In July 2015, kaedea released plug-in framework: android-dynamical-loading.
In August 27, 2015, it was the third milestone of Android plug-in technology, and Yong Zhang's DroidPlugin came out. Yong Zhang was a developer of the 360 Mobile Assistant App team, and DroidPlugin was the plug-in framework used by the mobile assistant App. The magic of this framework is that any App can be loaded into the host. You can write a host App based on this framework, and then you can load App written by others as plug-ins.
DroidPlugin puts the Hook to the highest.
DroidPlugin has a powerful features, but the cost is to modify with many internal code of Android. Due to no more documentation for the DroidPlugin project, this framework is difficult to be understood. There are many articles about DroidPlugin, but the best one is written by WeiShu Tian. At that time, he also worked for the same company with Yong Zhang, he wrote out a series of articles about DroidPlugin, including the principles of Binder and AIDL, the Hook mechanism, and the plug-in mechanism for the four major components.
2015 was the first year for Android plug-in development. Not only “that” framework and DroidPlugin, but also many plug-in frameworks were born at that time.
OpenAtlas, the project was released on Github in May and was renamed ACDD later. It proposes to modify and regenerate the AAPT command so that the resource id of the plug-in apk is no longer only fixed 0x7f, which can be modified to a value of 0x71. This solves the problem of resource ids conflicting after consolidating plug-in resources into HostApp resources in the host.
OpenAtlas is also based on ‘execStartActivity’ method, which was modified, in ‘Instrumentation’ which is belong to the internal code of Android. It can implementation the Activity as plug-in.
In addition, OpenAltas also modified the ContextWrapper, rewrites the getResource method. Because the Activity is the subclass of the ContextWrapper, the plug-in Activity will inherit the getResource methods to get the resources in the plug-in——this method is not be used now , we create a base class called BasePluginActivity for the plug-in Activity and override the getResource method to fetch plug-in resource.
Ctrip open source their plug-in framework DynamicAPK in October 2015, which is based on the OpenAltas framework and binds with Ctrip's own business logic.
At the end of December 2015, Guangliang Lin released the Small framework. At that time, he worked for a car trading platform at Fujian. This framework was tailored to the App for the car trading platform.
● Corresponding to the plug-in's ClassLoader, the Small framework inserted the dex file into the Host App's ClassLoader , so that Host App can load any class of any plug-in.
● The Small framework is an Activity, which starts the plug-ins through Hook Instrumentation. It is the same as the DroidPlugin, a StubActivity is declared in the AndroidManifest to trick the AMS.
● To support for the other three components in the Small framework is to declare the plug-in's Service, Receiver, and ContentProvider in HostApp's AndroidManifest.
● For the resources, the Small's solution has its own method. Using AssetManager's addAssetPath() method, all the plug-in resources are merged into the host's resources, if the resource id conflict occurs, Small did not use Atlas to modify the AAPT, but in the plug-in R.java and resource. After these two files generation, just change the prefix of all resources in the plug-in R.java from 0x7f to 0x71, and also change 0x7f to 0x71 in resource.arsc.
With the end of 2015, various technical issues involved in plug-in technology have already got one or more solutions. In this year, the plug-in technology is very varied. That period was dominated by the plug-in framework which was invented with individuals. It was basically divided into two categories. The dynamic replacement program represented by Yong Zhang's DroidPlugin, and Yugang Ren’s “That” framework is represented by a static proxy scheme.
In 2015, Android hot fix technology and React Native appeared in the developer's world, provided the same advantages as Android plug-in technology. Android plug-in technology is no longer the only choice for developers.
Since 2016, domestic Internet companies have gradually opened their own plug-in framework. No more technology has been adopted at this time, because all the solutions of the plug-in technology had been given by individual developers in 2015. Internet companies are the best platform to verify the feasibility of these plug-in technologies because their apps are used by millions of users.
Let us enumerate them in chronological order:
In August 2016, Palmeras launched Zeus.
In March 2017, Alibaba launched Atlas.
June 26, 2017, 360 mobile phone launched RePlugin.
On June 29, 2017, Didi launched VisualApk.
After reading the source code of these frameworks carefully, we can find that such open source frameworks are focus on:
● Plug-in compatibility, including the impact of the upgrade of the Android system on the plug-in framework, and the impact of different mobile phone ROMs.
● plug-in stability, for example, different kinds of unknown crashes.
● Management of plug-ins, including installation and uninstallation.
In spite of the fact, a few years have passed, various plug-in frameworks have gradually become stable. Developers who are now engaged in plug-in technology only need to pay attention to the upgrade of the Android system version each year and the impact on their own framework if they eliminate such kind of influence.
With the mature of plug-in framework, many authors of plug-in technology have begun to change their focus. Some of them are still in the area of Android. For example, based on the DroidPlugin framework, Yong Zhang is doing his startup project——lightning boxes based on DroidPlugin framework; some for the Blockchain, they focus on writing smart contracts with GO language every day.
Thanks to those who have contributed in the field of plug-in technology, including the authors of the open source project, as well as authors who wrote the article on preaching. If some people may have some frameworks that may not be mentioned, any suggestions are welcome.
相關推薦
1.3 History of Android Plug-in Programing
In July 27, 2012 , it was the first milestone in Android plug-in technology. Yimin Tu(mmin18 on Github), who worked for dianping.com , released the first A
Found 1 slaves: Use of uninitialized value in printf at /usr/local/percona-toolkit/bin/pt-online-schema-change line 8489
console val take file logs printf nbsp found try 1. problem description: as the title show, i miss the first problem using pt-online-s
1.7 All components require plug-in?
In Android, Activity, Service, ContentProvider, and BroadcastReceiver are called as four major components. Do all four components need convert t
1.4 The usage of plug-in
Once upon a time, we once thought naively that Android plug-in was intended to add new features or add a complete module. It took a lot of time
Useful plug-in collection of jenkins
bsp tle col href http beautiful use boa jenkins A beautiful Jenkins dashboard : https://jenkins.io/blog/2016/01/10/beautiful-jenkins-dash
Invalid Subledger (XLA) Packages In Release 12.1.3
see pen names cti nes confirm conf doc tdi In this Document Goal Solution 1.- Information
Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
activity oid 返回 反射 分享 -c lar 進行 是否 項目開發快到尾聲,突然發現之前一個模塊莫名其妙的奔潰了,我的內心也是奔潰的。以前一直都是好好的,也沒去動過它,為啥會出現這樣的問題呢? 下面我會根據自己的理解來看待問題 android是怎麽根據id查找
ionic3打包出錯ionic cordova build android(系列一):could not find an installed version of gradle either in android studio
lan 問題 打包 fail .html ascii failed contains ref 1.運行ionic cordova build android 時報錯:could not find an installed version of gradle either i
LeetCode 562. Longest Line of Consecutive One in Matrix(在矩陣中最長的連續1)$
find ive col discus hint 分開 arr public 標簽 Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be
What’s new for Spark SQL in Apache Spark 1.3(中英雙語)
block htm park -h apache HA log -a -- 文章標題 What’s new for Spark SQL in Apache Spark 1.3 作者介紹 Michael Armbrust 文章正文 參考文獻
3.1 The structure of an ARM ELF image
uri one cut hsi embedded name presence appears 技術分享 名詞 Extensible Linking Format(ELF) 3.1 The structure of an ARM ELF image ARM ELF映像包
j-3. .each(),for each ,for of ,for in-------待續
包裝 修改 -- 方式 () this指向 element sof UNC .each()是一個for循環的包裝叠代器.each()通過回調的方式處理,並且會有2個固定的實參,索引與元素(從0開始計數).each()回調方法中的this指向當前叠代的dom元素<but
Android Studio 3.1.3正式版的新坑。。。
androi exc process uil path time ESS RoCE IV Gradle編譯時沒問題,運行App時候出現: java.util.NoSuchElementException java.lang.RuntimeExcep
762. Prime Number of Set Bits in Binary Representation二進制中有質數個1的數量
nta 圖片 rime slist 代碼風格 輸出 -s turn 特殊 [抄題]: Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a
【跟我學oracle18c】第十八天:Multitenant Architecture:2.3 Overview of Applications in an Application Container
2.3 Overview of Applications in an Application Container 在應用程式容器中,應用程式是儲存在應用程式root中的命名的、版本化的公共資料和元資料集. 在應用程式容器的上下文中,術語“應用程式”指的是“主應用程式定義”。例如,應
Could not resolve com.android.support.constraint:constraint-layout:1.1.3.
背景 很久沒有新建Android專案,今天想新建一個專案然後學習一下模組依賴,剛新建的專案居然提示gradle編譯不通過,搞笑! 錯誤再現 新建專案,報錯如下: 意思就是無法依賴constraint-layout:1.1.3 解決方法 開啟Android Studio的設定
Found 2 versions of android-support-v4.jar in the dependency list,The type android.support.v4.app.Fr
1、 Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at t
Android 養成記-1 --1.3 標籤拾色器
直接上圖: 建立seekBarDialog ,並將拾色器整合到dialog 中: public class MySeekBarDialog extends AlertDialog implements TextWatcher { priva
COJ1160[一本通 5.3 例 1」Amount of Degrees
試題描述 求給定區間[X,Y]中滿足下列條件的整數個數:這個數恰好等於K個互不相等的B的整數次冪之和。例如,設X=15,Y=20,K=2,B=2,則有且僅有下列三個數滿足題意:17=2
android studio方法總數超過64K報錯Error:The number of method references in a .dex file cannot exceed 64K.
開發中記錄點滴 1.問題描述 Error:The number of method references in a .dex file cannot exceed 64K. Error:Execution failed for task ':app:transformC