有界面(Activity或其他View)的SDK项目混淆发布
来源:互联网 发布:多线程编程面试 编辑:程序博客网 时间:2024/06/06 12:38
1.首先,作为SDK的项目查找界面时不能按常规的套路来,之前的Activity设置界面是setContentView(R.layout.activity_main)。现在提供一个资源工具类(据说是一个天才少年写的,我直接复制给大家了),所有资源都通过该类查找。
/* * Copyright (C) 2015 pengjianbo(pengjianbosoft@gmail.com), Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.vzone.tmdsdk.tool;import java.lang.reflect.Field;import android.content.Context;/** * Desction: Author:pengjianbo Date:15/10/22 下午9:01 */public class ResourceUtils { /** * 获取 layout 布局文件 * * @param context * Context * @param resName * layout xml 的文件名 * @return layout */ public static int getLayoutId(Context context, String resName) { return context.getResources().getIdentifier(resName, "layout", context.getPackageName()); } /** * 获取 string 值 * * @param context * Context * @param resName * string name的名称 * @return string */ public static int getStringId(Context context, String resName) { return context.getResources().getIdentifier(resName, "string", context.getPackageName()); } /** * 获取 drawable 布局文件 或者 图片的 * * @param context * Context * @param resName * drawable 的名称 * @return drawable */ public static int getDrawableId(Context context, String resName) { return context.getResources().getIdentifier(resName, "drawable", context.getPackageName()); } /** * 获取 style * * @param context * Context * @param resName * style的名称 * @return style */ public static int getStyleId(Context context, String resName) { return context.getResources().getIdentifier(resName, "style", context.getPackageName()); } /** * 获取 styleable * * @param context * Context * @param resName * styleable 的名称 * @return styleable */ /*public static Object getStyleableId(Context context, String resName) { return context.getResources().getIdentifier(resName, "styleable", context.getPackageName()); }*/ /** * 获取 anim * * @param context * Context * @param resName * anim xml 文件名称 * @return anim */ public static int getAnimId(Context context, String resName) { return context.getResources().getIdentifier(resName, "anim", context.getPackageName()); } /** * 获取 id * * @param context * Context * @param resName * id 的名称 * @return */ public static int getId(Context context, String resName) { return context.getResources().getIdentifier(resName, "id", context.getPackageName()); } /** * color * * @param context * Context * @param resName * color 名称 * @return */ public static int getColorId(Context context, String resName) { return context.getResources().getIdentifier(resName, "color", context.getPackageName()); } private static Object getResourceId(Context context, String name, String type) { String className = context.getPackageName() + ".R"; try { Class<?> cls = Class.forName(className); for (Class<?> childClass : cls.getClasses()) { String simple = childClass.getSimpleName(); if (simple.equals(type)) { for (Field field : childClass.getFields()) { String fieldName = field.getName(); if (fieldName.equals(name)) { System.out.println(fieldName); return field.get(null); } } } } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取styleable的ID号数组 */ public static int[] getStyleableArray(Context context,String name) { return (int[])getResourceId(context, name,"styleable"); } /** *context.getResources().getIdentifier无法获取到styleable的数据 */ public static int getStyleable(Context context, String name) { return ((Integer)getResourceId(context, name,"styleable")).intValue(); }}
自定义view属性的获取:
TypedArray a = context.obtainStyledAttributes(attrs, ResourceUtils.getStyleableArray(context, "CircleImageView"), defStyle, 0); mBorderWidth = a.getDimensionPixelSize(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_width"), DEFAULT_BORDER_WIDTH); mBorderColor = a.getColor(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_color"), DEFAULT_BORDER_COLOR); mBorderOverlay = a.getBoolean(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_overlay"), DEFAULT_BORDER_OVERLAY); mFillColor = a.getColor(ResourceUtils.getStyleable(context, "CircleImageView_civ_fill_color"), DEFAULT_FILL_COLOR); a.recycle();
2.确保所有资源的名字唯一,比如预设的activity_main.xml最好改一个名字,因为引用SDK的人(后面称为Client)很可能也有一个xml文件叫做activity_main.xml。
3.所有涉及到声明的东西,必须在Client的AndroidManifest.xml中声明,比如权限、Activity、Service、BroadcastReceiver等(仅针对eclipse,AndroidStudio另算)。
4.lib打包成jar时,除了src以外其他都不能选择。
5.将jar包混淆,参考http://blog.csdn.net/ithouse/article/details/51605955
6.删除你之前SDK项目中src目录下的所有源码,拷贝混淆之后的jar包到SDK项目的libs目录下。
7.将该SDK项目发布出去,让Client引用该项目即可。
0 0
- 有界面(Activity或其他View)的SDK项目混淆发布
- 有界面(Activity或其他View)的SDK项目混淆发布
- Android项目打包发布的混淆配置
- Android 混淆及项目发布
- RCP中获得其他view或editor引用的方法
- VS2010项目打包发布和代码混淆的一起操作
- 修改加载Activity 的view之前的window界面
- 有硬件依赖或其他依赖的测试驱动开发
- cocos2dx 游戏界面跳转到其他activity
- 有参考或学习价值的项目
- eclipse打开或导入其他项目时乱码的解决方法
- 游戏里接入TD或者其他sdk再混淆后出现很多警告导致打包失败的处理
- 截屏 或 截取某个view的界面(给view拍照)
- 截屏 或 截取某个view的界面(给view拍照)
- Android-自定义View组件切换Activity界面
- GridView, ListView的item中嵌入button或其他view导致item点击失效的研究
- 设置ImageView(或其他View)透明或不透明
- 用到afinal注解的项目代码混淆后某些控件view点击事件无效
- Eclipse快捷键 10个最有用的快捷键
- ios7 页面适配问题---1
- 在学习HTML——form表单中的label标签时的一点小体会
- 日常代码
- pid max导致fork: Cannot allocate memory 的分析及解决办法
- 有界面(Activity或其他View)的SDK项目混淆发布
- android studio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决方案
- 丰田阿尔法(Alphard)原车屏升级效果
- 洛谷 P1541 乌龟棋
- List,Map和Set的区别
- Ubuntu系统下android开发环境配置
- HDU 1166 - 敌兵布阵(线段树,单点更新)
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- AsyncTask的使用和源码分析