版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Android開發(fā)最佳實踐從£^可苴箜公司Android開發(fā)者中學(xué)到的經(jīng)驗。遵循以下準(zhǔn)則,避免重復(fù)發(fā)明輪子。若您對開發(fā)iOS或WindowsPhone有興趣,請看iOSGoodPractices和WindowsclientGoodPractices這兩篇文章。摘要?使用Gradle和它推薦的工程結(jié)構(gòu)把密碼和敏感數(shù)據(jù)放在perties?不要自己寫HTTP客戶端,使用Volley或OkHttp庫?使用Jackson庫解析JSON數(shù)據(jù)避免使用Guava同時使用一些類庫來避免65kmethodlimi(一個Android程序中最多能執(zhí)行65536個方法)?使用Fragments來呈現(xiàn)UI視圖?使用Activities是為了管理FragmentsLayout布局是XMLs代碼,組織好它們?在layoutoutXMLs布局時,使用styles文件來避免使用重復(fù)的屬性?使用多個style文件來避免單一的一個大style文件?保持你的colors.xml簡短DRY(不要重復(fù)自己),只是定義調(diào)色板?總是使用dimens.xmlDRY(不要重復(fù)自己),定義通用常數(shù)?不要做一個深層次的ViewGroup?在使用WebViews時避免在客戶端做處理,當(dāng)心內(nèi)存泄露使用Robolectric單元測試,Robotium做UI測試?使用Genymotion作為你的模擬器總是使用ProGuard和DexGuard混淆來項目AndroidSDK將你的AndroidSDK放在你的home目錄或其他應(yīng)用程序無關(guān)的位置。當(dāng)安裝有些包含SDK的IDE的時候,可能會將SDK放在IDE同一目錄下,當(dāng)你需要升級(或重新安裝)IDE或更換的IDE時,會非常麻煩。此外,若果你的IDE是在普通用戶,不是在root下運行,還要避免吧SDK放到一下需要sudo權(quán)限的系統(tǒng)級別目錄下。構(gòu)建系統(tǒng)
你的默認(rèn)編譯環(huán)境應(yīng)該是Gradle.Ant有很多限制,也很冗余。使用Gradle,完成以下工作很方便:?構(gòu)建APP不同版本的變種?制作簡單類似腳本的任務(wù)?管理和下載依賴?自定義秘鑰?更多同時,AndroidGradle插件作為新標(biāo)準(zhǔn)的構(gòu)建系統(tǒng)正在被Google積極的開發(fā)。工程結(jié)構(gòu)有兩種流行的結(jié)構(gòu):老的Ant&EclipseADT工程結(jié)構(gòu),和新的Gradle&AndroidStudioX程結(jié)構(gòu),你應(yīng)該選擇新的工程結(jié)構(gòu),如果你的工程還在使用老的結(jié)構(gòu),考慮放棄吧,將工程移植到新的結(jié)構(gòu)。老的結(jié)構(gòu):old-structure—assets—libs—res—src」com/futurice/project—AndroidManifest.xml—build.gradle—perties」新的結(jié)構(gòu)new-structure—library-foobar一app一libs—src—androidTest1-java」com/futurice/project—main卜java」com/futurice/project—res—AndroidManifest.xml—build.gradle」—build.gradle」settings.gradle
主要的區(qū)別在于,新的結(jié)構(gòu)明確的分開了’sourcesetsma!n,androidTest),Gradle的一個理念。你可以做到,例如,添加源組‘paid’和‘free’在src中,這將成為您的應(yīng)用程序的付費和免費的兩種模式的源代碼。你的項目引用第三方項目庫時(例如,library-foobar,擁有一個頂級包名app從第三方庫項目區(qū)分你的應(yīng)用程序是非常有用的。然后settings.gradle不斷引用這些庫項目,其中app/build.gradle可以引用。Gradle配置Gradle配置=i常用結(jié)構(gòu)參考Google'sguideonGradleforAndroid小任務(wù)除了(shell,Python,Perl,這些腳本語言,你也可以使用Gradle制作任務(wù)。更多信息請參考Gradle'sdocumentation密碼在做版本release時你app的build.gradle你需要定義signingConfigs?此時你應(yīng)該避免以下內(nèi)容:不要做這個.這會出現(xiàn)在版本控制中。signingConfigs{release{store("myapp.keystore")storePassword"password123"keyAlias"thekey"keyPassword"password789"}}而是,建立一個不加入版本控制系統(tǒng)的perties文件。KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789那個文件是gradle自動引入的,你可以在buld.gradle文件中使用,例如:signingConfigs{release{try{store("myapp.keystore")storePasswordKEYSTORE_PASSWORDkeyAlias"thekey"keyPasswordKEY_PASSWORD}catch(ex){thrownewInvalidUserDataException("YoushoulddefineKEYSTORE_PASSWORDandKEY_PASSWORDinperties."))}}使用Maven依賴方案代替使用導(dǎo)入jar包方案如果在你的項目中你明確使用率ja文件,那么它們可能成為永久的版本,如2.1.1.下載jar包更新他們是很
繁瑣的,這個問題Maven很好的解決了,這在AndroidGradle構(gòu)建中也是推薦的方法。你可以指定版本的一個范圍,如2.1.+,然后Maven會自動升級到制定的最新版本,例如:dependencies{compile'flix.rxjava:rxjava-core:0.19.+'compile'flix.rxjava:rxjava-android:0.19.+'compile'com.fasterxml.jackson.core:jackson-databind:2.4.+'compile'com.fasterxml.jackson.core:jackson-core:2.4.+'compile'com.fasterxml.jackson.core:jackson-annotations:2.4.+'compile'com.squareup.okhttp:okhttp:2.0.+'compile'com.squareup.okhttp:okhttp-urlconnection:2.0.+'}IDEsandtexteditorsIDE集成開發(fā)環(huán)境和文本編輯器無論使用什么編輯器,一定要構(gòu)建一個良好的工程結(jié)構(gòu)編輯器每個人都有自己的選擇,讓你的編輯器根據(jù)工程結(jié)構(gòu)和構(gòu)建系統(tǒng)運作,那是你自己的責(zé)任。當(dāng)下首推AndroidStudi,因為他是由谷歌開發(fā),最接近Gradle,默認(rèn)使用最新的工程結(jié)構(gòu),已經(jīng)到beta階段(目前已經(jīng)有release1.(了),它就是為Android開發(fā)定制的。你也可以使用EclipseADT,但是你需要對它進(jìn)行配置,因為它使用了舊的工程結(jié)構(gòu)和Ant作為構(gòu)建系統(tǒng)。你甚至可以使用純文版編輯器如Vim,SublimeText,或者Emacs。如果那樣的話,你需要使用Gardle和adb命令行。如果使用Eclipse集成Gradle不適合你,你只是使用命令行構(gòu)建工程,或遷移到AndroidStudio中來吧。無論你使用何種開發(fā)工具,只要確保Gradle和新的項目結(jié)構(gòu)保持官方的方式構(gòu)建應(yīng)用程序,避免你的編輯器配置文件加入到版本控制。例如,避免加入Antbuild.xml文件。特別如果你改變Ant的配置,不要忘記保持build.gradle是最新和起作用的。同時,善待其他開發(fā)者,不要強(qiáng)制改變他們的開發(fā)工具和偏好。類庫Jackson是一個將java對象轉(zhuǎn)換成JSON與JSON轉(zhuǎn)化java類的類庫。Gson是解決這個問題的流行方案,然而我們發(fā)現(xiàn)Jackson更高效,因為它支持替代的方法處理JSON:流、內(nèi)存樹模型,和傳統(tǒng)JSON-POJO數(shù)據(jù)綁定。不過,請記住,Jsonkson庫比起GSON更大,所以根據(jù)你的情況選擇,你可能選擇GSON來避免APP65k個方法限制。其它選擇:Json-smartandBoonJSON網(wǎng)絡(luò)請求,緩存,圖片執(zhí)行請求后端服務(wù)器,有幾種交互的解決方案,你應(yīng)該考慮實現(xiàn)你自己的網(wǎng)絡(luò)客戶端。使用Volley或Retrof°tVolley同時提供圖片緩存類。若果你選擇使用Retrofit么考慮使用Picasso來加載圖片和緩存,同時使用OkHttp作為高效的網(wǎng)絡(luò)請求。RetrofitPicasso和OkHttp都是有同一家公司開發(fā)(注:是由Square公司開發(fā)),所以它們能很好的在一起運行。OkHttp同樣可以和Volley在一起使用Volle.RxJava是函數(shù)式反應(yīng)性的一個類庫,換句話說,能處理異步的事件。這是一個強(qiáng)大的和有前途的模式,同時也可能會造成混淆,因為它是如此的不同。我們建議在使用這個庫架構(gòu)整個應(yīng)用程序之前要謹(jǐn)慎考慮。有一些項目是使用RxJava完成的,如果你需要幫助可以跟這些人取得聯(lián)系:TimoTuominen,OlliSalonen,AndreMedeiros,MarkVoit,AnttiLammi,VeraIzrailit,JuhaRistolainen我們也寫了一些博客:旦,[2,[3,[4.如若你之前有使用過Rx的經(jīng)歷,開始從API響應(yīng)應(yīng)用它。另外,從簡單的UI事件處理開始運用,如單擊事件或在搜索欄輸入事件。若對你的Rx技術(shù)有信心,同時想要將它應(yīng)用到你的整體架構(gòu)中,那么請在復(fù)雜的部分寫好Javadocs文檔。請記住其他不熟悉RxJava的開發(fā)人員,可能會非常難理解整個項目。盡你的的全力幫助他們理解你的代碼和Rx。Retrolambda是一個在Android和預(yù)JDK8平臺上的使用Lambda表達(dá)式語法的Java類庫。它有助于保持你代碼的緊湊性和可讀性,特別當(dāng)你使用如RxJava函數(shù)風(fēng)格編程時。使用它時先安裝JDK8,在AndroidStudioT程結(jié)構(gòu)對話框中把它設(shè)置成為SDK路徑,同時設(shè)置JAVA8_HOME和JAVA7_HOME環(huán)境變量,然后在工程根目錄下配置build.gradledependencies{classpath'me.tatarka:gradle-retrolambda:2.4.+'}同時在每個module的build.gradl中添加applyplugin:'retrolambda'android{compileOptions{sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaVersion.VERSION_1_8}retrolambda{jdkSystem.getenv("JAVA8_HOME")oldJdkSystem.getenv("JAVA7_HOME")javaVersionJavaVersion.VERSION_1_7}AndroidStudio提供Java8lambdas表帶是代碼提示支持。如果你對lambdas不熟悉,只需參照以下開始學(xué)習(xí)吧:?任何只包含一個接口的方法都是"lambdafriendl同時代碼可以被折疊成更緊湊的語法?如果對參數(shù)或類似有疑問,就寫一個普通的匿名內(nèi)部類,然后讓AndroidStatus為你生成一個lambda。當(dāng)心dex方法數(shù)限制,同時避免使用過多的類庫Androidapps當(dāng)打包成一個dex文件時,有一個65535個應(yīng)用方法強(qiáng)硬限制口王里。當(dāng)你突破65k限制之后你會看到一個致命錯誤。因此,使用一個正常范圍的類庫文件,同時使用dex-method-counts工具來決定哪些類庫可以再65k限制之下使用,特別的避免使用Guava類庫,因為它包含超過13k個方法。ActivitiesandFragmentsFragments應(yīng)該作為你實現(xiàn)UI界面默認(rèn)選擇。你可以重復(fù)使用Fragments用戶接口來組合成你的應(yīng)用。我們強(qiáng)烈推薦使用Fragments而不是activit來呈現(xiàn)UI界面,理由如下:?提供多窗格布局解決方案Fragments的引入主要將手機(jī)應(yīng)用延伸到平板電腦,所以在平板電腦上你可能有A、B兩個窗格,但是在手機(jī)應(yīng)用上A、B可能分別充滿整個屏幕。如果你的應(yīng)用在最初就使用了fragments,那么以后將你的應(yīng)用適配到其他不同尺寸屏幕就會非常簡單。?屏幕間數(shù)據(jù)通信從一個Activit發(fā)送復(fù)雜數(shù)據(jù)0例如Java對象)到另外一個ActivityAndroid的API并沒有提供合適的方法。不過使用Fragment,你可以使用一個activit實例作為這個activit2子fragments的通信通道。即使這樣比Activit與Activit間的通信好,你也想考慮使用EventBus架構(gòu),使用如Otto或者greenrobotEventBus作為更簡潔的實現(xiàn)。如果你希望避免添加另外一個類庫,RxJava同樣可以實現(xiàn)一個EventBus。?Fragments一般通用的不只有UI你可以有一個沒有界面的fragment作為Activit提供后臺工作。進(jìn)一步你可以使用這個特性來創(chuàng)建一個fragment包含改變其它fragment的邏輯而不是把這個邏輯放在activity中。甚至ActionBar都可以使用內(nèi)部fragment來管理你可以選擇使用一個沒有UI界面的fragment來專門管理ActionBar或者你可以選擇使用在每個Fragment中添加它自己的action來作為父Activit的ActionBar.參考.很不幸,我們不建議廣泛的使用嵌套的fragments,因為有時會引起matryoshkabugs。我們只有當(dāng)它有意義(例如,在水平滑動的ViewPager在像屏幕一樣fragment中)或者他的確是一個明智的選擇的時候才廣泛的使用fragmento在一個架構(gòu)級別,你的APP應(yīng)該有一個頂級的activit來包含絕大部分業(yè)務(wù)相關(guān)的fragmento你也可能還有一些輔助的activity這些輔助的activit與主activit通信很簡單限制在這兩種方法Intent.setData()或Intent.setAction()或類似的方法。Java包結(jié)構(gòu)Android應(yīng)用程序在架構(gòu)上大致是Java中的Model-View-Controlle結(jié)構(gòu)。在Android中Fragment和Activit通常上是控制器類().換句話說,他們是用戶接口的部分,同樣也是Views視圖的部分。正是因為如此,才很難嚴(yán)格的將fragments或者activities)格的劃分成控制器controlloer還是視圖views。最還是將它們放在自己單獨的fragments包中。只要你遵循之前提到的建議,Activities可以放在頂級目錄下。若果你規(guī)劃有2到3個以上的activity那么還是同樣新建一個activities包吧。然而,這種架構(gòu)可以看做是另一種形式的MVC,包含要被解析API響應(yīng)的JSON數(shù)據(jù),來填充的POJO的models包中。和一個views包來包含你的自定義視圖、通知、導(dǎo)航視圖,widgets等等。適配器Adapter是在數(shù)據(jù)和視圖之間。然而他們通常需要通過getView()方法來導(dǎo)出一些視圖,所以你可以將adapters包放在views包里面。一些控制器角色的類是應(yīng)用程序級別的,同時是接近系統(tǒng)的。這些類放在managers包下面。一些繁雜的數(shù)據(jù)處理類,比如說〃。。七。赤訂,放在utils包下面。與后端交互負(fù)責(zé)網(wǎng)絡(luò)處理類,放在network包下面??偠灾宰罱咏脩舳皇亲罱咏蠖巳グ才潘麄?。ject
—network—models—managers—utils—fragments」views—adapters—actionbar—widgets」notifications資源文件Resources?命名遵循前綴表明類型的習(xí)慣,形如type_foo_bar.xml。例如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml?組織布局文件若果你不確定如何排版一個布局文件,遵循一下規(guī)則可能會有幫助。?每一個屬性一行,縮進(jìn)4個空格android:id總是作為第一個屬性android:layout_****屬性在上邊style屬性在底部?關(guān)閉標(biāo)簽/>單獨起一行,有助于調(diào)整和添加新的屬性考慮使用Designtimeattribut設(shè)計時布局屬性,AndroidStudio已經(jīng)提供支持,而不是硬編碼android:text譯者注:墻內(nèi)也可以參考stormzhang的這篇博客鏈接)。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="@string/name"style="@style/FancyText"/><includelayout="@layout/reusable_part"/>
</LinearLayout>作為一個經(jīng)驗法則,android:layout_****屬性應(yīng)該在layoutXML中定義,同時其它屬性android:****應(yīng)放在stylerXML中。此規(guī)則也有例外,不過大體工作的很好。這個思想整體是保持layout屬性(positioning,margin,siziBgbntent屬性在布局文件中,同時將所有的外觀細(xì)節(jié)屬性(colors,padding,f)n放在style文件中。例外有以下這些:android:id明顯應(yīng)該在layout文件中l(wèi)ayout^件中android:orientation對于一個LinearLayout布局通常更有意義android:text由于是定義內(nèi)容,應(yīng)該放在layout文件中?有時候?qū)ndroid:layout_width和android:layout_height屬性放到一個style中作為一個通用的風(fēng)格中更有意義,但是默認(rèn)情況下這些應(yīng)該放到layout文件中。使用styles幾乎每個項目都需要適當(dāng)?shù)氖褂胹tyle文件,因為對于一個視圖來說有一個重復(fù)的外觀是很常見的。在應(yīng)用中對于大多數(shù)文本內(nèi)容,最起碼你應(yīng)該有一個通用的style文件,例如:<stylename="ContentText"><itemname="android:textSize">@dimen/font_normal</item><itemname="android:textColor">@color/basic_black</item></style>應(yīng)用到TextView中:<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_contentandroid:text="@string/price"style="@style/ContentText"/>你或許需要為按鈕控件做同樣的事情,不要停止在那里。將一組相關(guān)的和重復(fù)android:****的屬性放到一個通用的style中。將一個大的Style文件分割成多個文件你可以有多個styles.xml文件。AndroidSDK支持其它文件,styles這個文件名稱并沒有作用,起作用的是在不用于資文件里xml的<style>標(biāo)簽。因此你可以有多個style文件不用于資styles.xml,style_home.xml,style_item_details.xml,styles_forms.xml。源文件路徑需要為系統(tǒng)構(gòu)建起的有意義,在res/values目錄下的文件可以任意命名。
colors.xml是一個調(diào)色板在你的colors.xml文件中應(yīng)該只是映射顏色的名稱一個RGBA值,而沒有其它的。不要使用它為不同的按鈕來定義RGBA值。不要這樣做<resources><colorname="button_foreground">#FFFFFF</color><colorname="button_background">#2A91BD</color><colorname="comment_background_inactive">#5F5F5F</color><colorname="comment_background_active">#939393</color><colorname="comment_foreground">#FFFFFF</color><colorname="comment_foreground_important">#FF9D2F</color>...<colorname="comment_shadow">#323232</color>使用這種格式,你會非常容易的開始重復(fù)定義RGBA值,這使如果需要改變基本色變的很復(fù)雜。同時,這些定義是跟一些環(huán)境關(guān)聯(lián)起來的,如button或者comment,應(yīng)該放到一個按鈕風(fēng)格中,而不是在color.xml文件中。相反,這樣做:<resources><!--grayscale--><color name="white" >#FFFFFF</color><colorname="gray_light">#DBDBDB</color><color name="gray" >#939393</color><color name="gray_dark">#5F5F5F</color><color name="black" >#323232</color><!--basiccolors--><colorname="green">#27D34D</color><colorname="blue">#2A91BD</color><colorname="orange">#FF9D2F</color><colorname="red">#FF432F</color></resources>向應(yīng)用設(shè)計者那里要這個調(diào)色板,名稱不需要跟"green”,"blue等等相同?!╞rand_primary〃,"brand_secondary”,"brand_negati這樣的名字也是完全可以接受的。像這樣規(guī)范的顏色很容易修改或重構(gòu),會使應(yīng)用一共使用了多少種不同的顏色變得非常清晰。通常一個具有審美價值的UI來說,減少使用顏色的種類是非常重要的。像對待colors.xml一樣對待dimens.xml文件與定義顏色調(diào)色板一樣,你同時也應(yīng)該定義一個空隙間隔和字體大小的“調(diào)色板”。一個好的例子,如下所示:<resources><!--fontsizes--><dimenname="font_larger">22sp</dimen><dimenname="font_large">18sp</dimen>
<dimenname="font_normal">15sp</dimen><dimenname="font_small">12sp</dimen><!--typicalspacingbetweentwoviews--><dimenname="spacing_huge">40dp</dimen><dimenname="spacing_large">24dp</dimen><dimenname="spacing_normal">14dp</dimen><dimenname="spacing_small">10dp</dimen><dimenname="spacing_tiny">4dp</dimen><!--typicalsizesofviews--><dimenname="button_height_tall">60dp</dimen><dimenname="button_height_normal">40dp</dimen><dimenname="button_height_short">32dp</dimen></resources>布局時在寫margins和paddings時,你應(yīng)該使用spacing_****尺寸格式來布局,而不是像對待String字符串一樣直接寫值。這樣寫會非常有感覺,會使組織和改變風(fēng)格或布局是非常容易。避免深層次的視圖結(jié)構(gòu)有時候為了擺放一個視圖,你可能嘗試添加另一個LinearLayout。你可能使用這種方法解決:<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parentandroid:orientation="vertical"><RelativeLayout???><LinearLayout???><LinearLayout???><LinearLayout???></LinearLayout></LinearLayout></LinearLayout></RelativeLayout></LinearLayout>
即使你沒有非常明確的在一個layout布局文件中這樣使用,如果你在Java文件中從一個viewinflate這個inflat翻譯不過去,大家理解就行)到其他views當(dāng)中,也是可能會發(fā)生的。可能會導(dǎo)致一系列的問題。你可能會遇到性能問題,因為處理起需要處理一個復(fù)雜的UI樹結(jié)構(gòu)。還可能會導(dǎo)致以下更嚴(yán)重的問題StackOverflowErro.因此盡量保持你的視圖tree學(xué)習(xí)如何使用RelativeLayou,如何optimize你的布局和如何使用<merge>標(biāo)簽.小心關(guān)于WebViews的問題.如果你必須顯示一個web視圖,比如說對于一個新聞文章,避免做客戶端處理HTML的工作,最好讓后端工程師協(xié)助,讓他返回一個’純〃HTML。WebViews也能導(dǎo)致內(nèi)存泄露當(dāng)保持引他們的Activity而不是被綁定到ApplicationContex中的時候。當(dāng)使用簡單的文字或按鈕時,避免使用WebView,這時使用TextView或Buttons更好。測試框架AndroidSDK的測試框架還處于初級階段,特別是關(guān)于UI測試方面。AndroidGradle目前實現(xiàn)了一個叫connectedAndroidTest的測試,它使用一個JUnit為Android提供的擴(kuò)展插件extensionofJUnitwithhelpersforA.可以跑你生成的JUnit測試,只當(dāng)做單元測試時使用Robolectric,views不用它是一個最求提供〃不連接設(shè)備的〃為了加速開發(fā)的測試,非常時候做models和viewmodels的單元測試。然而,使用Robolectri(測試時不精確的,也不完全對UI測試。當(dāng)你對有關(guān)動畫的UI元素、對話框等,測試時會有問題,這主要是因為你是在“在黑暗中工作”(在沒有可控的界面情況下測試)*Robotium使寫UI測試非常簡單。*對于UI測試你不需Robotium跑與設(shè)備連接的測試。但它可能會對你有益,是因為它有許多來幫助類的獲得和分析視圖,控制屏幕。測試用例看起來像這樣簡單:solo.sendKey(Solo.MENU);solo.clickOnText("More");//searchesforthefirstoccurenceof"More"andclicksonitsolo.clickOnText("Preferences");solo.clickOnText("Edit");Assert.assertTrue(solo.searchText("rtf"));模擬器如果你全職開發(fā)AndroidApp,那么買一個GenymotionemulatorlicenseP巴。Genymotion模擬器運行更快的秒幀的速度,比起典型的AVD模擬器。他有演示你APP的工具,高質(zhì)量的模擬網(wǎng)絡(luò)連接,GPS位置,等等。它同時還有理想的連接測試。你若涉及適配使用很多不同的設(shè)備,買一個Genymotion版權(quán)是比你買很多真設(shè)備便宜多的。注意:Genymotion模擬器沒有裝載所有的Google服務(wù),如GooglePlayStore和Maps。你也可能需要測試Samsung指定的API,若這樣的話你還是需要購買一個真實的Samsung設(shè)備。ProGuard是一個在Android項目中廣泛使用的壓縮和混淆打包的源碼的工具。你是否使用ProGuard取決你項目的配置,當(dāng)你構(gòu)建一個release版本的apk時,通常你應(yīng)該配置gradle文件。buildTypes{debug{minifyEnabledfalse}release{signingConfigsigningConfigs.releaseminifyEnabledtrueproguardFiles''}}為了決定哪些代碼應(yīng)該被保留,哪些代碼應(yīng)該被混淆,你不得不指定一個或多個實體類在你的代碼中。這些實體應(yīng)該是指定的類包含main方法,appletsmidletsactivities等等。Androidf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遙感應(yīng)用課程設(shè)計
- 非標(biāo)法蘭課程設(shè)計
- 龜兔賽跑課程設(shè)計
- 運動會系統(tǒng)課程設(shè)計
- 藝考形體走姿課程設(shè)計
- 椰汁雙效順流課程設(shè)計
- 運動課程設(shè)計與方法
- 雕塑課程設(shè)計范文
- 重慶大學(xué)防火課程設(shè)計
- 氣液壓課程設(shè)計jk63
- 米-伊林《十萬個為什么》閱讀練習(xí)+答案
- 碎屑巖油藏注水水質(zhì)指標(biāo)及分析方法
- 【S洲際酒店婚禮策劃方案設(shè)計6800字(論文)】
- 醫(yī)養(yǎng)康養(yǎng)園項目商業(yè)計劃書
- 《穿越迷宮》課件
- 《C語言從入門到精通》培訓(xùn)教程課件
- 2023年中國半導(dǎo)體行業(yè)薪酬及股權(quán)激勵白皮書
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動車棚新(擴(kuò))建及修建充電車棚施工方案(純方案-)
- 項目推進(jìn)與成果交付情況總結(jié)與評估
- 鐵路項目征地拆遷工作體會課件
評論
0/150
提交評論