演示文稿主題怎么設置啊(怎么將演示文稿主題設置)
880
2022-05-29
App 的開發更偏向于用戶層面,從 UI 展示到業務邏輯處理,全程處理用戶的行為。而 SDK 面向的是開發者,開發更偏向于功能方面,注重功能的開發實現。在今天的文章中,我們一起來聊聊設計 SDK 的那些事。
一、什么是 SDK?
SDK 全稱 Software Development Kit,廣義上的 SDK 是為特定的軟件包、軟件框架、硬件平臺、操作系統等建立應用程序時所使用的開發工具的集合(在 iOS 項目中,SDK 也被稱為庫)。
在 iOS 開發或 Android 開發中,不可避免會需要使用第三方工具提升產品的開發效率,比如用于消息推送的極光,用于第三方支付與登錄的支付寶,微信等等。但大多數商用產品都不會直接給出源碼(可能只有為愛發電的開源項目才會無私提供源碼),而我們在開發 App 時就需要將這些第三方 SDK 集成在我們的項目之中。
二、SDK 設計的基本原則
一款好用且設計充分的 SDK 必須要遵循以下 4 條基本原則,即:
SDK 安全,穩定
統一的開發規范
Library 小而精
不依賴第三方 SDK
安全,穩定:考慮到 SDK 是需要嵌入到 App 里面去的,所以 SDK 最重要的特性就是安全性,不會因為亂開放接口而導致 App 數據泄露;其次重要的是 SDK 的穩定性, SDK 的 Crash 如果沒有被捕獲進行處理,則會導致應用徹底崩潰(這樣就會導致第三方接入的 App 體驗性非常差),甚至會直接導致接入方的用戶流失;
統一的開發規范:對于 SDK 開發規范來說,統一的命名規范很重要,最好的狀態是“接入方看到接口命名就能知道是哪家廠商的 SDK”,換句話說就是 SDK 的命名規范統一,形成自己公司的品牌效應,此外也方便開發者進行接入使用。此外也需要具有自己的編碼規范,你可以在網上找到大廠的規范模板,并通過借鑒整理出屬于自己的規范,從而盡早統一代碼風格;
Library 小而精:小是指要避免造成接入方的App增加很大,不然會引起接入方的不滿,甚至下架。精是指功能要專注,比如極光推送,就是專注推送相關的功能;
不依賴第三方 SDK:這個也很好理解,SDK 中如果又依賴其他第三方 SDK, 不僅會導致 SDK 的體積變大,也會影響接入方集成 SDK 的相關成本。
三、在 iOS 環境下開發 SDK
1. iOS 環境下的 SDK
如同上文所說,在 iOS 開發中,我們將 SDK 稱為“庫”,我們是這樣對其定義的:
一般是給應用提供通用服務的,非獨立運行的程序集合;
一般都是編譯過的,方便使用。
我們會根據庫的調用方法分為“靜態庫”和“動態庫”兩種:
靜態連接:一般是指在創建應用程序的時候,將庫集成進去,這樣做的好處就是應用程序包自身可以獨立運行,而不好的地方就是包會略顯臃腫,庫不能共享(靜態庫經常以 .a 結尾);
動態連接:創建應用的時候只約定好與庫之間的調用關系,而不徹底將庫包集成進應用。這樣在應用運行時,需要運行環境中提供庫,并且連接裝載。優劣與靜態庫相反,動態鏈接庫需要庫環境,但由于本身不集成庫內容,會比較小,同時也為和其他應用共享庫的使用提供了可能(常見的動態庫是 Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib/.tbd)。
2. 靜態庫和動態庫的區別
如果說要找出靜態庫與動態庫的區別,那可以從文件鏈接(每個源代碼模塊獨立編譯,然后按照需要將他們組裝起來,這個組裝模塊的過程,就是鏈接)的角度進行解釋:
靜態庫:鏈接時會被完整的復制到可執行文件中,所以如果兩個程序都用了某個靜態庫,那么每個二進制可執行文件里面,都會含有這份靜態庫的代碼;
動態庫:鏈接時不復制,而是在程序啟動后動態加載,然后再進行符號決議(符號綁定)。理論上動態庫只存在一份就可以了。其他的程序都可以動態鏈接到這個動態庫上面,從而節省內存(內存中只有一份動態庫)。另外一個好處是,由于動態庫并不綁定到可執行程序上,所以我們想升級這個動態庫就很容易,windows和linux上面一般插件和模塊機制都是這樣實現的。
具體的優劣勢可以看這張表:
庫類型
優點
缺點
靜態庫
1. 目標程序沒有外部依賴,直接就可以運行。
2. 效率較動態庫高。
1. 會使用目標程序的體積增大。
動態庫
1. 不需要拷貝到目標程序中,不會影響目標程序的體積。
2. 同一份庫可以被多個程序使用(因為這個原因,動態庫也被稱作共享庫)。
3. 編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼。實現動態更新
1. 動態載入會帶來一部分性能損失(可以忽略不計)
2. 動態庫也會使得程序依賴于外部環境。如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行(Linux lib not found 錯誤)。
3. 了解 iOS 的動態庫(即被閹割的動態庫)
有一個背景知識需要注意,iOS 官方規定不允許存在動態庫,并且所有的 IPA 都需要經過 Apple 的私鑰加密后才能用,即使你用了動態庫也會因為簽名錯誤而無法加載(越獄和非 App Store 除外)。于是這就把開發者自己開發動態庫這件事變成為了天方夜譚。
iOS8 之前的 iOS 應用都是運行在沙盒當中的,不同程序之間不能共享代碼,并且 iOS 又是單進程運行的(也就是某一時刻只有一個進程在運行),那么即使你寫個共享庫也無法共享給他人。
而動態下載代碼又是被蘋果官方明令禁止的,也就是說動態庫的優勢完全無法發揮,所以動態庫也就沒有存在的必要了。
由于 iOS 主 App 需要和 Extension 共享代碼,Swift 語言機制也需要動態庫,于是蘋果后來提出了 Embedded Framework,這種動態庫允許 APP 和 App Extension 共享代碼(動態庫的生命被限定在一個APP進程內)。
盡管如此,這種動態庫(Embedded Framework) 和系統的 UIKit.Framework 還是有很大區別的。傳統的動態庫是給多個進程使用的,而這里的動態庫(Embedded Framework)是給單個進程里面多個可執行文件用的。
系統的 Framework 不再需要拷貝到目標程序中,我們自己做出來的動態庫(Embedded Framework) 哪怕是動態的,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的)。所以蘋果沒有直接把這種 Embedded Framework稱作動態庫而是叫 Embedded Framework。
上面提到的 Swift 也有原因,在 Swift 的項目中如果要在項目中使用外部代碼,可選的方式只有兩種,一種是把代碼拷貝到工程中,另一種是用動態 Framework。使用靜態庫是不支持的。
這個問題的根本原因是, Swift 的運行庫沒有被包含在 iOS 系統中,反而會被打包進 App 中(這也是造成 Swift App 體積大的原因),靜態庫會導致最終的目標程序中包含重復的運行庫。
4. 以動態庫為例,開始制作SDK
第一步:創建 App 工程,命名為 RealDemo
如果不清楚怎么創建,可以點擊 這里
第二步:關閉 RealDemo 工程,然后在 RealDemo 目錄下創建 Framework 工程,命名為 RealSDK
選擇下方的 Framework 進行創建切記目錄不要選擇錯誤
第三步:設置 Framework 工程的 Build Settings
創建動態庫需要選擇 Dynamic Library,如果要制作靜態庫則要選擇 Static Library
第四步:關閉RealSDK工程,創建 WorkSpace,命名為 RealDemo
逐次點擊 File - New - Workspace創建后會出現對應的 workspace 文件
第五步:連接 Framework 工程和 App 工程
我們需要先打開 RealDemo.xcworkspace,打開后你會發現這里空空如也。
然后我們直接把需要連接的 Framework 工程(RealSDK.xcodeproj)和 App 工程(RealDemo.xcodeproj)拖進來就可以了!
直接拖拽進 Xcode 即可拖拽后你會發現兩者的層級關系相同
第六步:把 Framework 添加到 App 工程中
逐次點擊,不要點錯了選擇前面創建的 framework
第七步:給 Framework 加點功能
我們需要增加一個 RealDog 類,定義一個 eat 方法,實現里面打印一句話“吃骨頭”。然后修改 RealDog.h 的 Target Membership 為 Public,意思為公開頭文件。
在這里我定義了 eat 方法
RealDog的實現如下:
@implementation RealDog + (void)eat { NSLog(@"吃骨頭"); } @end
第八步:在 App 的 ViewController 調用一下 SDK 的方法
#import "ViewController.h" #import
第九步:運行一下,可以發現App工程成功調用了SDK的方法
OK,實時聯調到此結束
5. 使用腳本合并真機、模擬器等多種架構的 Framework
第一步:添加一個 Aggregate Target
RealSDK Project -> TARGETS -> "+"(左下角) -> Cross-platform - Other -> Aggregate
第二步:將 Aggregate Target 命名為“RealSDK-Script”
命名后點擊 Finish 即可
第三步:依賴 RealSDK
在 Dependencies 中配置依賴關系
第四步:添加腳本
點擊這里的 New Run Script Phase復制下方腳本即可
這個腳本是通用的,各位同學直接復制粘貼即可:
# Type a script or drag a script file from your workspace to insert its path. UNIVERSAL_OUTPUTFOLDER=../Framework/ # 創建輸出目錄,并刪除之前的framework文件 mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" rm -rf "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" # 分別編譯模擬器和真機的Framework xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build # 定義真機、模擬器Build文件夾路徑變量 IPHONE_BUILD=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework SIMULATOR_BUILD=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework # 拷貝framework到univer目錄 cp -R "${IPHONE_BUILD}" "${UNIVERSAL_OUTPUTFOLDER}/" #cp -R "${SIMULATOR_BUILD}" "${UNIVERSAL_OUTPUTFOLDER}/" # 定義輸出路徑變量 OUTPUT_PATH=${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework # 合并framework,輸出最終的framework到build目錄 lipo -create "${IPHONE_BUILD}/${PROJECT_NAME}" "${SIMULATOR_BUILD}/${PROJECT_NAME}" -output "${OUTPUT_PATH}/${PROJECT_NAME}"
第五步:運行腳本
依然是點擊左側的播放按鈕
第六步:查看結果
能看到這個文件夾就代表編譯成功啦!
fatal error: lipo: /Users/hujianhui/Library/Developer/Xcode/DerivedData/RealDemo-ckvcidkkuvgpadeiqrvgjdyikcdc/Build/Products/Debug-iphoneos/RealSDK.framework/RealSDK and /Users/hujianhui/Library/Developer/Xcode/DerivedData/RealDemo-ckvcidkkuvgpadeiqrvgjdyikcdc/Build/Products/Debug-iphonesimulator/RealSDK.framework/RealSDK have the same architectures (arm64) and can't be in the same fat output file
你只需要去除 iOS 模擬器的 arm64 架構即可,方法如下:
點擊 arm64 前面的減號即可
6. 小貼士
1. Framework 中使用 Category
在 Framework 工程的 Build Setting 中添加 -ObjC。另外,使用我們 SDK 的 App 的 Build Setting 中也要添加 -ObjC。
2. Framework 支持 bitcode
四、在 Android 環境中開發 SDK
1. Android SDK 介紹
Android App 集成第三方 SDK 的文件類型,主要有三種,一種是 JAR 包文件,和 SO 文件 ,另外一種是 AAR 文件, JAR 包是 Java 提供的 SDK 文件類型,里面包含的是純 Java 編譯過后的代碼。SO 一般是 C 和 C++ 打包成庫的文件。
AAR 名字來源于 Android Archive,見名知義,是一個 Android 庫項目的二進制歸檔文件,使用 Android Studio ,非常簡單可以生成一個 AAR 文件。AAR 庫文件里面,包含了 JAR 和 SO,還有資源 Res 等文件,結構等同一個 App。
它可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。不過,Android 庫將編譯為您可以用作 Android 應用模塊依賴項的 Android ARchive (AAR) 文件,而不是編譯為在設備上運行的 APK。
與 JAR 文件不同,AAR 文件會為 Android 應用提供以下功能:
AAR 文件可以包含多項 Android 資源和一個清單文件,讓您除了能夠在 Java 類和方法中進行捆綁以外,還能夠在布局和可繪制對象等共享資源中進行捆綁;
AAR 文件可以包含 C/C++ 庫,供應用模塊的 C/C++ 代碼使用。
2. 創建 SDK 工程
打開上個章節我們創建的示例工程,在工程上創建一個 library module,命名為GPush,讓我們模擬實現一個推送簡短新聞的接口。
如果你忘記怎么做的話,可以點 這里選擇 Android Library,并在名稱中輸入 GPush添加成功后我們會在左側看到對應的 Libray 文件
3. 添加依賴項
如需在同一項目中的另一個應用或庫模塊中使用新的 Android 庫代碼,就需要這樣添加一個項目級依賴項:
依次轉到 File > Project Structure > Dependencies;
選擇要在其中使用庫的模塊;
在 Declared Dependencies 標簽頁中,點擊 +,然后在下拉菜單中選擇 Module Dependency。
先點擊加號,再選中對應的 Module Dependency將其加入依賴中
4. 接口設計
既然是做一個推送新聞的接口,那就必須要分為客戶端和推送端,即 Client#onReceiveMessage 和 GPush#pushMessage。
從下面給出 UML 圖可以看出,只需要一個方法就可以監聽到新聞推送了,GPushImpl#start(Client client)。
可以看我畫的 UML 圖,幫助你更進一步理解
GPush 類
package com.myname.library; interface GPush { void pushMessage(String msg); }
GPushImpl 類
package com.myname.library; import android.os.Handler; import android.os.HandlerThread; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; public class GPushImpl implements GPush { private List
Client 類
public interface Client { void onReceiveMessage(String msg); }
開始監聽新聞推送
GPushImpl.start { Toast.makeText(MainActivity@this,it,Toast.LENGTH_LONG).show() }
SDK 打包
./gradlew :GPush:assembleRelease
打包完成后就行生成一個 aar 文件, 這個文件就是我們打包的結果了
5. 最后注意事項 — 混淆
基于代碼保護的目的,Gradle 打包默認會根據 build.gradle 和 proguard-rules.pro 配置的混淆規則,來對代碼進行一個混淆, 如果 library 里面使用了如 GSON 或者反射等技術則需要對部分類進行 keep 操作。
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
-keep class com.myname.library.** {*;}
如果正確按照教程,那相信你已經成功的做出了屬于自己的第一個 iOS 與 Android SDK,本期教程依然基于 mac 電腦進行實現,如果你的電腦是 Windows 或者其他操作系統,還需要進行一些其他的靈活配置。
在下一期的文章中,我們將會一起聊聊如何引入 SDK ,敬請期待。
說明:本教學系列均由FinClip 工程師出品。
Android API/SDK
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。