android空格符
1. android去掉字元串所有空格
在開發項目過程中,有時候請求介面時需要給伺服器傳遞數據,而自己在輸入框中輸入的數據有可能會帶有空格,這個空格有可能是首尾有空格,有可能是字元串中間有空格,而這個空格是必須去掉的,我們可以採用下邊方式來去掉空格。
去掉首尾空格 - trim():
str.getText().toString().trim();
去掉所有空格 - replaceAll(" " , 「」) ;
str.getText().toString().replaceAll(" " , 「」) ;
2. android makefile 將有空格的字元串賦給變數編譯報錯
想要了解一個系統,我常從makefile或是building system下手,以了解系統組成元素為何?目錄結構為何?對於Android,我也不例外。透過了解building system,我們能知道如何新增、修改、刪除程序,並保持其完整性,順利編譯出結果。
設置文件
Android building system 包括幾種重要的設置文件,
·
Android.mk
·
AndroidProcts.mk
·
target_-.mk, host_-.mk and -.mk
o
BoardConfig.mk
o
buildspec.mk
Android.mk 是 mole 和 package 的設置文件,每個 mole/package 的目錄下都會有一個 Android.mk。所謂的 mole 是指系統的 native code ,相對於用 java 寫成的 Android application 稱為 package。
AndroidProcts.mk 則設定 proct 配置。 proct 即特定系統版本,透過編譯不同 proct ,產生不同軟體配置內容,安裝不同的 application。 Proct 可視為特定項目,產生特定規格系統。
BoardConfig.mk 是為 proct 主板做設定,像是 driver 選擇、設定。*-.mk 則是針對選擇的操作系統和 CPU 架構,進行相關設定。
buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的 proct 、平台、額外的mole/package 等。
參數
build/envsetup.sh 實作一個 mm 指令,以編譯單一 mole,不需編譯整個 source tree。ONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用方法是在執行 make 時,將該變數指定為 mole 的 Android.mk。
o
make ONE_SHOT_MAKEFILE=
透過定義 CREATE_MODULE_INFO_FILE , building system 會將所有 mole 信息列在 $(PRODUCT_OUT)/mole-info.txt 檔案里。
o
make CREATE_MODULE_INFO_FILE=true
設定 BUILD_TINY_ANDROID=true , building system 產生一個簡單的 image ,以測試硬體的可用度。此功能用於移植的早期階段,以快速 bring up 。
HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 產生 binary 的目的為 debug 或 release 。透過設定此二變數,能產生包含 debug information 的 binry 。
o
debug
o
release
這些參數,也可設於 buildspec.mk 里,以避免開發過程不斷的重新指定。
Goals
一般編輯整個 Android 系統,就是使用 droid 這個 goal。 droid 會產生一個完整的系統,包括 bootloader、kernel、系統程序、模塊和應用程序。
showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。透過 showcommands 這個 goal, building system顯示過程中每一個步驟的詳細指令。
Makefile 的流程
o
初始化相關變數
o
偵測編譯環境和目標環境
o
決定目標 proct
o
讀取 proct 的設定
o
讀取 proct 所指定之目標平台架構設定
§
選擇 toolchain
§
指定編譯參數 (*-.mk)
o
清除輸出目錄
o
設定/檢查版本編號
o
讀取所有 BoardConfig.mk 檔案
o
讀取所有 mole 的設定
o
根據設定,產生必需的 rule
o
產生 image
以上的主要流程都是由 build/core/main.mk 所安排。
初始化和偵測
由 build/core/config.mk 所進行。 build/core/envsetup.mk 檢查 developer 的設定 (buildspec.mk) ,並檢查執行環境,以決定輸出目錄、項目。
build/core/config.mk 本身還依據參數,決定解譯時的相關參數。像是 compiler 的路徑、flags, lex 、yacc 的路徑參數等。
關於 proct 的相關設定,則是由 build/core/proct_config.mk 所處理,使用 build/core/proct.mk 提供之 macro 載入。根據AndroidProct.mk 的內容, proct_config.mk 決定了
o
PRODUCT_TAGS
o
OTA_PUBLIC_KEYS
o
PRODUCT_POLICY
o
......
Proct 設定的讀取
Android proct 的設定來自於 build/target/proct/AndroidProct.mk 和 vendor 子目錄下的 AndroidProct.mk 。 building system透過 find 指令,找出所有可能的 AndroidProct.mk。 AndroidProct.mk 里定義 PRODUCT_MAKEFILES 變數,列舉所有實際定義 proct 的 makefile。這些 makefile 各自定義獨立的 proct 。proct 相關參數,存成 PRODUCTS. .形式的變數。並將makefile 路徑存在 PRODUCTS 變數。因此,透過 PRODUCTS 能取得所有的 proct 路徑/名稱,並透過 PRODUCTS. .形式的變數取得內容。
Mole 設定的讀取
Mole 是指 native code 的軟體組件,而 Java application 則被稱為 package。 build/core/definitions.mk 定義 mole/package 相關macro ,讀取、檢查 mole/package 定義檔;分散 source tree 各處的 Android.mk 檔案。 build/core/main.mk 使用 find 指令,在這些子目錄下找出所有 Android.mk ,並將路徑存在 subdir_makefiles 變數里。最後,include 這些檔案。
這些 Android.mk 會 include 定義成變數 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等,和其目的相配的 makefile。這些makefile 會變 Android.mk 定義之內容,存成 ALL_MODULES. .mk>.形式。例如, Android.mk 定義了 LOCAL_MODULE_SUFFIX,變會存成 ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路徑,當樣會存於 ALL_MODULES 變數里
3. 用android 安卓手機建立的文本文檔,文檔中的換行和空格,在windows電腦端不顯示,或者將換
這是windows與linux系統的編碼模式不同造成的。android系統是linux內核,與windows不同。windows是採用的是DOS編碼方式,所用的換行符是DOS換行符CR/LF,也就是我們俗稱的\r\n,(如果不理解可以去網路一下轉義字元,一般程序員會用到這些知識),而linux系統的換行符為UNIX換行符LF,也就是\n,蘋果的MAC系統用的是MAC換行符CR,也就是\r,現在我想你也差不多理解了。你在android手機里建立的文檔肯定用的是UNIX換行符,也就是一個\n,但是這個文檔你拿到windows里用記事本打開的話,因為windows記事本是DOS換行符\r\n,所以你少了個\r,所以沒法識別成換行,只能給你識別成一個小方塊了,解決辦法很簡單,你可以用EditPlus或者UltraEdit軟體打開,UltraEdit也能轉換這些編碼模式,轉換成DOS模式就可以了。
4. android textview設置值代碼怎麼加空格
我不太理解你的問題,如果要是說TextView控制項對其,那麼需要使用的是其布局位置。如果是讓 TextView控制項內的文字對其,那麼可以利用字元串拼接的辦法添加空格使其對齊。如還有問題可以繼續追問
5. android集成分享sdk後怎麼代碼混淆
為了保護代碼被反編譯,android引入了混淆代碼的概念
1.設置混淆
在工程下找到project.properties文件
在文件中加入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt這個是系統的
也可以用自己的混淆文件(這樣就可以配置一些自己的東西),去sdk.dir}/tools/proguard/ 下復制proguard-android.txt文件到本地工程中
然後設置成proguard.config=proguard-android.txt
project.properties文件:
[java] view plain
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=proguard-android.txt
# Project target.
target=android-17
-injars androidtest.jar【jar包所在地址】
-outjars out【輸出地址】
-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用於解析injars所指定的jar類】
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
- 【指定不去忽略非公共的庫類。 】
-dontpreverify 【不預校驗】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優化】
-keep public class * extends android.app.Activity【不進行混淆保持原樣】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>; 【所有方法不進行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)】
native <methods>;
}
-keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保護指定的類文件和類的成員】
public static final android.os.Parcelable$Creator *;
}
=====================================常見異常===================================
參考:http://blog.csdn.net/vrix/article/details/7100841
加入第三方jar包之後常出現的幾個異常:
proguard returned with error code 1.See console
情況1:
Proguard returned with error code 1. See console
Error: C:/Documents (系統找不到指定文件)
後來發現是因為將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這裡面有空格,而proguard進行發編譯的時候是不允許有空格的
如果換了正確路徑還不好用的話,直接刪除proguard就好了
注意:SDK和程序路徑最好不要有空格符
情況2:
Proguard returned with error code 1. See console
異常:
java.lang.
解決辦法:將proguard.cfg中的"-dontpreverify"改成「-dontoptimize」
參考文章:http://groups.google.com/group/android-developers/browse_thread/thread/eca3b0f5ce6ad00f
我把項目中生成的proguard文件夾(此時文件夾是空的)刪掉,然後再重新運行項目,就OK 了。
情況3:
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] Proguard returned with error code 1. See console
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] java.io.IOException: Can't read [proguard.ClassPathEntry@106082] (No such file or directory)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:230)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:200)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:178)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.execute(InputReader.java:100)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.readInput(ProGuard.java:195)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.execute(ProGuard.java:78)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.main(ProGuard.java:499)
拋出這樣的異常的原因是第三方jar的引用路徑不對,沒有找到這個需要忽略混淆的jar包。
========================官方文檔翻譯========================================
原文
http://developer.android.com/guide/developing/tools/proguard.html
混淆器(ProGuard)
在本文中(In this document)
Enabling ProGuard
Configuring ProGuard
Decoding Obfuscated Stack Traces
Debugging considerations for published applications
參見
ProGuard Manual ?
ProGuard ReTrace Manual ?
混淆器通過刪除從未用過的代碼和使用晦澀名字重命名類、欄位和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。因此,當你的應用程序對安全敏感(要求高),例如當你授權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統中,所以你不必手動調用它。同時混淆器僅在發布模式下進行構建應用程序的時候才會運行起來,所以在調試模式下構建程序時,你不必處理混淆代碼。讓混淆器運行起來是可選擇的,但是推薦選上。
這個文檔描述了怎樣啟用並配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。
啟用混淆器Enabling ProGuard
當你新建了一個Android工程之後,一個proguard.cfg文件會在工程的根目錄下自動創建。這個文件定義了混淆器是怎樣優化和混淆你的代碼的,所以懂得怎樣根據你的需要來定製是非常重要的。預設的配置文件僅覆蓋到了通常情況,所以根據你的需求,很可能需要編輯它。接下來的內容是關於通過定製混淆器配置文件來對混淆器配置。
為了讓啟用混淆器作為Ant或者Eclipse構建過程中一部分,可以在<project_root>/default.properties文件中,設置proguard.config屬性。路徑可以是絕對路徑或者工程根目錄的相對路徑。
如果你讓proguard.cfg文件在預設位置(工程的根目錄),你可以像這樣指定位置:
proguard.config=proguard.cfg
同樣,你可以把該文件放到任意的位置,並指定它的絕對路徑。
proguard.config=/path/to/proguard.cfg
當你在發布模式下,或者通過運行ant release,或者通過使用Eclipse中的Export Wizard構建你的應用程序的時候,構建系統都會自動地去檢查proguard.config屬性是否被設置了。如果被設置了,混淆器在把所有東西打包成.apk文件之前,自動地對應用程序位元組碼進行混淆處理。而在調試模式中構建則不會調用混淆器,因為那樣調試會更加繁重。
運行混淆器之後輸出的文件有:
mp.txt
描述.apk包中所有class文件的內部結構。
mapping.txt
列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建之後得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
這些文件放在以下目錄中:
注意:每次在發布模式下構建時,這些文件都會被最新的文件覆蓋。所以每次發布程序時候,為了反混淆來自構建時產生的bug報告,請保存這些文件的一個拷貝。對於為什麼要保存這些文件的重要性的更多信息,請查看程序發布調試注意事項。
混淆器配置(proguard config)
某些情況下,proguard.cfg文件的預設配置可以滿足需求了。但是,對於混淆器來說,大多數情況做出正確的分析是困難的,並且它或許會刪除在它看來是無用的,但對於程序來說卻確實需要的代碼。一些例子如下:
一個僅引用於AndroidManifest.xml文件的類。
一個通過JNI調用的方法。
動態引用的屬性和方法。
<project_root>/bin/proguard 當你使用Ant時
<project_root>/proguard 當你使用Eclipse時
解碼混淆過的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)
當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然可以進行調試,但是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆後名字的映射。
Windows系統中retrace.bat腳本命令或者Linux和Mac OS X系統中retrace.sh腳本命令能把混淆後的堆棧調試信息轉換為可以理解的文件。它被放在<sdk_root>/tools/proguard/目錄下。運行retrace工具的命令語法是:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有為<stracktrace_file>指定值,那麼retrace工具從標准輸入讀取。
已發布應用程序的調試注意事項(Debugging considerations for published applications)
保存好每一個已發布給用戶的程序的mapping.txt文件。通過保存發布構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆後的堆棧調試跟蹤信息提交給你時,你可以進行調試從而修復問題。程序的mapping.txt文件在每次發布構建時都會被覆蓋,所以你一定要注意保存正確的版本。
例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接著你馬上啟動混淆器並創建一個新的發布版本。該操作把mapping.txt文件覆蓋了。一個用戶提交了來自當前發布版本的bug報告,該報告包含了堆棧調試信息。你再也不能對用戶的堆棧信息進行調試了,因為這個對應用戶本機上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對於每一個可能需要調試的版本,你都要確保有一份拷貝。
6. android assets會混淆么
-injars androidtest.jar【jar包所在地址】
-outjars out【輸出地址】
-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用於解析injars所指定的jar類】
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
- 【指定不去忽略非公共的庫類。 】
-dontpreverify 【不預校驗】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優化】
-keep public class * extends android.app.Activity【不進行混淆保持原樣】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>; 【所有方法不進行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)】
native <methods>;
}
-keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保護指定的類文件和類的成員】
public static final android.os.Parcelable$Creator *;
}
參考:http://blog.csdn.net/vrix/article/details/7100841
加入第三方jar包之後常出現的幾個異常:
proguard returned with error code 1.See console
情況1:
Proguard returned with error code 1. See console
Error: C:/Documents (系統找不到指定文件)
後來發現是因為將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這裡面有空格,而proguard進行發編譯的時候是不允許有空格的
如果換了正確路徑還不好用的話,直接刪除proguard就好了
注意:SDK和程序路徑最好不要有空格符
情況2:
Proguard returned with error code 1. See console
異常:
java.lang.ArrayIndexOutOfBound***ception
解決辦法:將proguard.cfg中的"-dontpreverify"改成「-dontoptimize」
7. android 一個漢字多少字元
在strings.xml中定義字元變數時一些字元需要轉義,否則獲取到的字元是錯誤的,常見的需要轉義的字元如下:
"
("
或
")
'
('
或
')
&
(&
或
&)
<
(<
或
<)
>
(>
或
>)
下面的字元在
[xml]中被定義為
空白(whitespace)字元:
空格
(
)
tab
(
)
回車
(
)
換行
(
)
8. android string中空格符號問題
在App的開發中,又是為了對齊文字,會用到空格。一般用 來表示一個中文空格, ---表示一個英文空格,兩個就是一個中文空格。但是在實際效果中,兩個英文空格比一個漢字要稍微窄一點;三個空格又會比一個中文字元寬一點。
解決方案:#160; 這樣就基本可以。也就是用一個窄的空格 替換掉一個#160;。
9. android TextView 怎麼加空格,對齊文字
外部改成RelativeLayout,兩個TextView分別設置 android:layout_alignParentLeft="true" android:layout_alignParentRight="true" 2.在中間加一個TextView,並設置 android:layout_weight="1" android:visibility="invisible" 推薦第一個
望採納
10. Android中怎樣獲取中間帶有空格的字元串 如:"aaaaa bbbbb"
你把我問暈了,這樣可以不?
String a = "aaaa aaaa";