androidstudioclass
『壹』 Android Studio 3.5導入AOSP編譯的classes.jar
一、適用場景
我們在寫應用時可能會需要調用系統隱藏的API,這些API是我們無法直接訪問的,報如下錯誤:
此時,我們需要將系統AOSP的out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar導入到Android Studio中,使app能夠訪問這些介面。
二、實現步驟
Step1 . 在app目錄下建立libs文件夾,並將classes.jar包放入該路徑
Step2 .在app目錄上右鍵【Open Mole Settings】,點擊左側【Dependencies】,選擇app,點擊【+】選擇【2 Jar Dependency】,添加
選擇我們的libs/classes.jar,點擊【OK】
Step3 .在Mole的build.gradle中,dependencies自動增加依賴配置,注釋掉下面一行
implementation fileTree(dir: 'libs', include: ['*.jar'])
並將implementation files('libs/classes.jar')改為
compileOnly files('libs/classes.jar')
最終如下圖所示
Step4 .修改Project的build.gradle,在allProjects中增加如下語句
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\classes.jar')
}
}
Step5 .修改jar包優先順序,在Moels的app.iml文件中找到我們的classes.jar包所在行,
<orderEntry type="library" name="Gradle: __local_aars__:/Users/mrwong/AndroidStudioProjects/uart_daemon/app/libs/classes.jar:unspecified@jar" level="project" />
將其移動到
<orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
這一行之上,最終如下圖所示:
至此,app可以優先訪問我們自己的jar包 。
『貳』 android studio 怎麼創建一個新的類
例我原AndroidGraphics2DTutorial改名AndroidGra
1
phics2DTutorial1重新創建類AndroidGraphics2DTutorial顯示示例列表打算使用三View顯示列表項圖標(例隨機使用些圖
標)文本框顯示示例Activity名稱另文本框顯示示例具體信息res\layout目錄創建
activitylist.xml內容:
圖" class="illustration_alink">
我AndroidManifest.xml讀取Activity列表使用String
Array資源res\value\string.xml 添加列Array資源:
<string-array name=activity_name> <item>Bezier</item> <item>Brush</item> <item>Colors</item> <item>Font</item> <item>Image</item> <item>Path</item> <item>Pen</item> <item>Shape</item> <item>Transform</item> </string-array> <string-array name=activity_info> <item>Bezier</item> <item>Pattern ,Gradients</item> <item>Colors</item> <item>FontDemo, FontTypes</item> <item>DrawMap, JumbleImage, SeeThroughImage</item> <item>Polys, Paths</item> <item>Lines, Dashes, LineCap,LineJoin</item> <item>Oval ,Pear ,Shape2DDemo</item> <item>Transform</item> </string-array>
定義些資源程序使用自定義Adapter顯示列表:
class ActivityInfo{ int iconIndex; String activityName; String activityInfo; } class ActivityInfoAdapter extends ArrayAdapter<ActivityInfo>{ int resource; public ActivityInfoAdapter(Context context, int resourceId, List<ActivityInfo> objects) { super(context, resourceId, objects); resource=resourceId; } @Override public View getView(int position,View ConvertView,ViewGroup parent){ LinearLayout activityInfoView; ActivityInfo activityInfo=getItem(position); String activity_Name=activityInfo.activityName; String activity_Info=activityInfo.activityInfo; int iconIndex=activityInfo.iconIndex; if(ConvertView==null){ activityInfoView=new LinearLayout(getContext()); String inflater=Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi; vi=(LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, activityInfoView,true); }else{ activityInfoView=(LinearLayout)ConvertView; } TextView activity_NameView =(TextView)activityInfoView.findViewById(R.id.activityName); TextView activity_InfoView =(TextView)activityInfoView.findViewById(R.id.activityInfo); ImageView iconView =(ImageView)activityInfoView.findViewById(R.id.iconImage); activity_NameView.setText(activity_Name); activity_InfoView.setText(activity_Info); iconView.setImageResource(iconIndex); return activityInfoView; } } public class AndroidGraphics2DTutorial extends ListActivity { private ArrayList<ActivityInfo> activityInfos =new ArrayList<ActivityInfo>(); private ActivityInfoAdapter aa; private final static String packgeName="com.pstreets.graphics2d"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Resources res = getResources(); String[] activity_Names = res.getStringArray(R.array.activity_name); String[] activity_Infos = res.getStringArray(R.array.activity_info); for(int i=0;i<activity_Names.length;i++){ ActivityInfo activityInfo=new ActivityInfo(); activityInfo.activityName=activity_Names[i]; activityInfo.activityInfo=activity_Infos[i]; activityInfo.iconIndex=R.drawable.icon1+i; activityInfos.add(activityInfo); } aa=new ActivityInfoAdapter(this,R.layout.activitylist,activityInfos); setListAdapter(aa); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { ActivityInfo activityInfo = (ActivityInfo) l.getItemAtPosition(position); Intent intent = new Intent(); intent.setClassName(this, packgeName+".example." +activityInfo.activityName); startActivity(intent); } }
類ActivityInfo定義列表每元素Data ModelActivityIcon資源IDActivity Name及Activity
Info.
類ActivityInfoAdapter自定義Adapter關鍵public View getView(int position,View
ConvertView,ViewGroup parent)函數返用顯示沒類別元素View示例
『叄』 Android studio .class文件手動生成dex
註:寫這篇文章是為了讓那些學習android 熱修復的童鞋了解下,當然如果是大牛可以略過。
點擊Build -->Rebuild project,點擊完成後需要打包成jar 的class文件會在下面所示的目錄中顯示,指出的就是我們需要打包的class文件,生成的class文件在app/build/intermediates/classes中
先做個例子:這邊取個.class文件,例如Test.class,用來生成dex
.class生成dex 需要用到androidstudio 支持的dx.bat ,我們找到android SDK 目錄下的
build-tools文件目錄。
打開cmd 運行 命令:
dx --dex --output 需要生成dex的目錄和名稱 class文件所在的目錄
例如:我需要生成dex文件在C盤的一個文件夾目錄下,而class 文件在C盤的一個目錄中
這時候只要在--dex 後面加上--no-strict 就可以了。
讓編譯器監測不那麼嚴格。
如下:dx --dex --no-strict --output
編譯通過,成功生成dex文件。